Class: Dotenv::Rails

Inherits:
Rails::Railtie
  • Object
show all
Defined in:
lib/dotenv/rails.rb

Overview

Rails integration for using Dotenv to load ENV variables from a file

Constant Summary collapse

TEST_RAKE_TASKS =
/^(default$|test(:|$)|parallel:spec|spec(:|$))/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRails

Returns a new instance of Rails.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/dotenv/rails.rb', line 25

def initialize
  super
  config.dotenv = ActiveSupport::OrderedOptions.new.update(
    # Rails.logger is not available yet, so we'll save log messages and replay them when it is
    logger: Dotenv::ReplayLogger.new,
    overwrite: false,
    files: [
      ".env.#{env}.local",
      (".env.local" unless env.test?),
      ".env.#{env}",
      ".env"
    ].compact,
    autorestore: env.test? && !defined?(ClimateControl) && !defined?(IceAge)
  )
end

Class Method Details

.loadObject

Rails uses #method_missing to delegate all class methods to the instance, which means ‘Kernel#load` gets called here. We don’t want that.



89
90
91
# File 'lib/dotenv/rails.rb', line 89

def self.load
  instance.load
end

Instance Method Details

#deprecatorObject

:nodoc:



83
84
85
# File 'lib/dotenv/rails.rb', line 83

def deprecator # :nodoc:
  @deprecator ||= ActiveSupport::Deprecation.new
end

#envObject

The current environment that the app is running in.

When running rake, the Rails application is initialized in development, so we have to check which rake tasks are being run to determine the environment.

See github.com/bkeepers/dotenv/issues/219



73
74
75
76
77
78
79
80
# File 'lib/dotenv/rails.rb', line 73

def env
  @env ||= if defined?(Rake.application) && Rake.application.top_level_tasks.grep(TEST_RAKE_TASKS).any?
    env = Rake.application.options.show_tasks ? "development" : "test"
    ActiveSupport::EnvironmentInquirer.new(env)
  else
    ::Rails.env
  end
end

#loadObject

Public: Load dotenv

This will get called during the before_configuration callback, but you can manually call Dotenv::Rails.load if you needed it sooner.



45
46
47
# File 'lib/dotenv/rails.rb', line 45

def load
  Dotenv.load(*files.map { |file| root.join(file).to_s }, overwrite: overwrite)
end

#logger=(new_logger) ⇒ Object

Set a new logger and replay logs



62
63
64
65
# File 'lib/dotenv/rails.rb', line 62

def logger=(new_logger)
  logger.replay new_logger if logger.is_a?(ReplayLogger)
  config.dotenv.logger = new_logger
end

#overloadObject



49
50
51
52
# File 'lib/dotenv/rails.rb', line 49

def overload
  deprecator.warn("Dotenv::Rails.overload is deprecated. Set `Dotenv::Rails.overwrite = true` and call Dotenv::Rails.load instead.")
  Dotenv.load(*files.map { |file| root.join(file).to_s }, overwrite: true)
end

#rootObject

Internal: Rails.root is nil in Rails 4.1 before the application is initialized, so this falls back to the RAILS_ROOT environment variable, or the current working directory.



57
58
59
# File 'lib/dotenv/rails.rb', line 57

def root
  ::Rails.root || Pathname.new(ENV["RAILS_ROOT"] || Dir.pwd)
end