dotenv 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3963c1ba53e439322c807f8312b8a8f9ebd0766e4d03757b41e5ce6b4bb43bc5
4
- data.tar.gz: a7f026d236de3dbac4a1bd08a28cee474159abedb750ff5a6b3e545f1aa5cf15
3
+ metadata.gz: 1dc708aad5fcaf487b064451b8f47d5b0e402a7c250385f234306ab3c77fcf20
4
+ data.tar.gz: e939eca5e64f2aef9aeb784bd9765e20a3201057d4ed69c1ea46b1405625920e
5
5
  SHA512:
6
- metadata.gz: 9bd6a081fb16b6115340a1d0751e5886a8333137061121c7adbe6c2757d8199cf3c23ae374bc9fa2dcac7faeb6c4533a30ce28f5e5eb34eac9fce1b9308cf10c
7
- data.tar.gz: deeb7d87a65e8e7f1af595a822abd1b81ade441a46fbe1b7188e1d511ad621ceb3c45b1509580e5ceab7c957b7b49ea2d3686eef0c91fb43d914c4a58f9d975c
6
+ metadata.gz: 3c7a9b929e7b419a1df9c07bd2dfa7959deea186bc6de9e0e8bdfdc671b7d4c183104715206ac956e81d4689b76d14907dd0a644eb995f4cd48437047e307ad1
7
+ data.tar.gz: de3d64ad2bf4fbec40e7c253c71de40cf1cab82875293f168c73a5098e7419554362014e6eb0c6339d485c41c12cccad82e0f854fee30f7fef18e7cc4afc26ef
data/README.md CHANGED
@@ -54,11 +54,11 @@ require 'dotenv'
54
54
  Dotenv.load('file1.env', 'file2.env')
55
55
  ```
56
56
 
57
- ## Autorestore in tests
57
+ ### Autorestore in tests
58
58
 
59
59
  Since 3.0, dotenv in a Rails app will automatically restore `ENV` after each test. This means you can modify `ENV` in your tests without fear of leaking state to other tests. It works with both `ActiveSupport::TestCase` and `Rspec`.
60
60
 
61
- To disable this behavior, set `config.dotenv.autorestore = false` in `config/application.rb` or `config/environments/test.rb`.
61
+ To disable this behavior, set `config.dotenv.autorestore = false` in `config/application.rb` or `config/environments/test.rb`. It is disabled by default if your app uses [climate_control](https://github.com/thoughtbot/climate_control) or [ice_age](https://github.com/dpep/ice_age_rb).
62
62
 
63
63
  To use this behavior outside of a Rails app, just `require "dotenv/autorestore"` in your test suite.
64
64
 
@@ -181,6 +181,8 @@ Available options:
181
181
 
182
182
  * `Dotenv::Rails.files` - list of files to be loaded, in order of precedence.
183
183
  * `Dotenv::Rails.overwrite` - Overwrite exiting `ENV` variables with contents of `.env*` files
184
+ * `Dotenv::Rails.logger` - The logger to use for dotenv's logging. Defaults to `Rails.logger`
185
+ * `Dotenv::Rails.autorestore` - Enable or disable [autorestore](#autorestore-in-tests)
184
186
 
185
187
  ### Multi-line values
186
188
 
data/lib/dotenv/rails.rb CHANGED
@@ -1,4 +1,9 @@
1
- require "dotenv"
1
+ # Since rubygems doesn't support optional dependencies, we have to manually check
2
+ unless Gem::Requirement.new(">= 6.1").satisfied_by?(Gem::Version.new(Rails.version))
3
+ warn "dotenv 3.0 only supports Rails 6.1 or later. Use dotenv ~> 2.0."
4
+ return
5
+ end
6
+
2
7
  require "dotenv/replay_logger"
3
8
  require "dotenv/log_subscriber"
4
9
 
@@ -18,7 +23,7 @@ end
18
23
  module Dotenv
19
24
  # Rails integration for using Dotenv to load ENV variables from a file
20
25
  class Rails < ::Rails::Railtie
21
- delegate :files, :files=, :overwrite, :overwrite=, :autorestore, :autorestore=, :logger, :logger=, to: "config.dotenv"
26
+ delegate :files, :files=, :overwrite, :overwrite=, :autorestore, :autorestore=, :logger, to: "config.dotenv"
22
27
 
23
28
  def initialize
24
29
  super()
@@ -27,12 +32,12 @@ module Dotenv
27
32
  logger: Dotenv::ReplayLogger.new,
28
33
  overwrite: false,
29
34
  files: [
30
- root.join(".env.#{env}.local"),
31
- (root.join(".env.local") unless env.test?),
32
- root.join(".env.#{env}"),
33
- root.join(".env")
35
+ ".env.#{env}.local",
36
+ (".env.local" unless env.test?),
37
+ ".env.#{env}",
38
+ ".env"
34
39
  ].compact,
35
- autorestore: env.test?
40
+ autorestore: env.test? && !defined?(ClimateControl) && !defined?(IceAge)
36
41
  )
37
42
  end
38
43
 
@@ -41,12 +46,12 @@ module Dotenv
41
46
  # This will get called during the `before_configuration` callback, but you
42
47
  # can manually call `Dotenv::Rails.load` if you needed it sooner.
43
48
  def load
44
- Dotenv.load(*files, overwrite: overwrite)
49
+ Dotenv.load(*files.map { |file| root.join(file).to_s }, overwrite: overwrite)
45
50
  end
46
51
 
47
52
  def overload
48
53
  deprecator.warn("Dotenv::Rails.overload is deprecated. Set `Dotenv::Rails.overwrite = true` and call Dotenv::Rails.load instead.")
49
- Dotenv.load(*files, overwrite: true)
54
+ Dotenv.load(*files.map { |file| root.join(file).to_s }, overwrite: true)
50
55
  end
51
56
 
52
57
  # Internal: `Rails.root` is nil in Rails 4.1 before the application is
@@ -56,6 +61,12 @@ module Dotenv
56
61
  ::Rails.root || Pathname.new(ENV["RAILS_ROOT"] || Dir.pwd)
57
62
  end
58
63
 
64
+ # Set a new logger and replay logs
65
+ def logger=(new_logger)
66
+ logger.replay new_logger if logger.is_a?(ReplayLogger)
67
+ config.dotenv.logger = new_logger
68
+ end
69
+
59
70
  # The current environment that the app is running in.
60
71
  #
61
72
  # When running `rake`, the Rails application is initialized in development, so we have to
@@ -83,10 +94,9 @@ module Dotenv
83
94
  end
84
95
 
85
96
  initializer "dotenv", after: :initialize_logger do |app|
86
- # Set up a new logger once Rails has initialized the logger and replay logs
87
- new_logger = ActiveSupport::TaggedLogging.new(::Rails.logger).tagged("dotenv")
88
- logger.replay new_logger if logger.respond_to?(:replay)
89
- self.logger = new_logger
97
+ if logger.is_a?(ReplayLogger)
98
+ self.logger = ActiveSupport::TaggedLogging.new(::Rails.logger).tagged("dotenv")
99
+ end
90
100
  end
91
101
 
92
102
  initializer "dotenv.deprecator" do |app|
@@ -1,20 +1,20 @@
1
1
  module Dotenv
2
2
  # A logger that can be used before the apps real logger is initialized.
3
- class ReplayLogger
3
+ class ReplayLogger < Logger
4
4
  def initialize
5
+ super(nil) # Doesn't matter what this is, it won't be used.
5
6
  @logs = []
6
7
  end
7
8
 
8
- def method_missing(name, *args, &block)
9
- @logs.push([name, args, block])
10
- end
11
-
12
- def respond_to_missing?(name, include_private = false)
13
- (include_private ? Logger.instance_methods : Logger.public_instance_methods).include?(name) || super
9
+ # Override the add method to store logs so we can replay them to a real logger later.
10
+ def add(*args, &block)
11
+ @logs.push([args, block])
14
12
  end
15
13
 
14
+ # Replay the store logs to a real logger.
16
15
  def replay(logger)
17
- @logs.each { |name, args, block| logger.send(name, *args, &block) }
16
+ @logs.each { |args, block| logger.add(*args, &block) }
17
+ @logs.clear
18
18
  end
19
19
  end
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module Dotenv
2
- VERSION = "3.0.0".freeze
2
+ VERSION = "3.1.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-12 00:00:00.000000000 Z
11
+ date: 2024-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake