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