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.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/dotenv/rails.rb', line 28

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.



92
93
94
# File 'lib/dotenv/rails.rb', line 92

def self.load
  instance.load
end

Instance Method Details

#deprecatorObject

:nodoc:



86
87
88
# File 'lib/dotenv/rails.rb', line 86

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



76
77
78
79
80
81
82
83
# File 'lib/dotenv/rails.rb', line 76

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.



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

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



65
66
67
68
# File 'lib/dotenv/rails.rb', line 65

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

#overloadObject



52
53
54
55
# File 'lib/dotenv/rails.rb', line 52

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.



60
61
62
# File 'lib/dotenv/rails.rb', line 60

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