dotenvx 4.0.3 → 4.0.4

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: dbc11188493670e456723d7d984cb3118d3c9e3abaaba8652a5650f9b99c7d14
4
- data.tar.gz: eaa5409b065a89f9105109f3b955f0ae68c43e137c7a35cd99103fe290572240
3
+ metadata.gz: 064bf1a8af2ec748d2b4ee03c0dae6b81dd87b7816b090340f6f3b14634c3d42
4
+ data.tar.gz: 14d620741ee83316f1f94201815adf6b23af7ce97706a6cc479991d383ed4678
5
5
  SHA512:
6
- metadata.gz: 31b8875875fa83cdb13ff2ec5a3660ce9cf637c5eed17aa1cfa7ea3d66ab0ca451f5d8a9c1d31f6c7b0f739e0767b3e361e77b6e1b814660e4591886e931011c
7
- data.tar.gz: 720420e1e1f2018215c47d9b1064449ca6699b277bcc3cdfc6f4506f69b45d2255dc433b4182118a398ecf5578d8b3c6fd68e93c0faaf426b4533bb95c38f7dd
6
+ metadata.gz: 92653db2d9c3f96a6759e4593781bc62dafd9a4c02dab83514e9d8c24f108dcf4df846ad315fd70d4566d02e16a215f8119578705ce3ecb25a070fdc65c378a4
7
+ data.tar.gz: 022b6ed8bc4aca5cd7223511da36cfed75f7e9738430ba7f00cce84b7f8ef0f62b22f2d3da78d81a7eb7b3bc4a1bb12d3118786cb031fadac37fef7a9e8a35eb
data/CHANGELOG.md CHANGED
@@ -2,7 +2,11 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
- ## [Unreleased](https://github.com/dotenvx/dotenvx-ruby/compare/v4.0.0...main)
5
+ ## [Unreleased](https://github.com/dotenvx/dotenvx-ruby/compare/v4.0.4...main)
6
+
7
+ ## [4.0.4](https://github.com/dotenvx/dotenvx-ruby/compare/v4.0.3...v4.0.4)
8
+
9
+ - Report the unique variables injected from readable dotenv files.
6
10
 
7
11
  ## [4.0.0](https://github.com/dotenvx/dotenvx-ruby/compare/v0.0.2...v4.0.0)
8
12
 
data/Cargo.lock CHANGED
@@ -222,7 +222,7 @@ dependencies = [
222
222
 
223
223
  [[package]]
224
224
  name = "dotenvx_native"
225
- version = "4.0.3"
225
+ version = "4.0.4"
226
226
  dependencies = [
227
227
  "dotenvx-primitives",
228
228
  "magnus",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "dotenvx_native"
3
- version = "4.0.3"
3
+ version = "4.0.4"
4
4
  edition = "2021"
5
5
  rust-version = "1.83"
6
6
  publish = false
data/lib/dotenvx/rails.rb CHANGED
@@ -37,7 +37,10 @@ module Dotenvx
37
37
  config.before_configuration { Dotenvx::Railtie.instance.load }
38
38
 
39
39
  def load
40
+ return if @loaded
41
+
40
42
  Dotenvx.load(*dotenvx_files)
43
+ @loaded = true
41
44
  end
42
45
 
43
46
  private
@@ -1,3 +1,3 @@
1
1
  module Dotenvx
2
- VERSION = "4.0.3"
2
+ VERSION = "4.0.4"
3
3
  end
data/lib/dotenvx.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "dotenvx/version"
2
2
  require "dotenvx/dotenvx_native"
3
3
  require "json"
4
+ require "pathname"
4
5
 
5
6
  module Dotenvx
6
7
  class MissingKeys < RuntimeError
@@ -16,8 +17,14 @@ module Dotenvx
16
17
  attr_accessor :instrumenter
17
18
 
18
19
  def load(*filenames, overwrite: false, ignore: true)
19
- env = parse(*filenames, overwrite: overwrite, ignore: ignore)
20
- update(env, overwrite: overwrite)
20
+ env, injected_keys, loaded_paths = parse_files(
21
+ *filenames,
22
+ overwrite: overwrite,
23
+ ignore: ignore
24
+ )
25
+ changed = update(env, overwrite: overwrite)
26
+ log_injected(injected_keys, loaded_paths)
27
+ changed
21
28
  end
22
29
 
23
30
  def load!(*filenames)
@@ -35,31 +42,7 @@ module Dotenvx
35
42
  alias overload! overwrite!
36
43
 
37
44
  def parse(*filenames, overwrite: false, ignore: true)
38
- filenames = [".env"] if filenames.empty?
39
- filenames = filenames.flatten.reverse if overwrite
40
-
41
- process_env = ENV.to_h
42
- filenames.reduce({}) do |values, filename|
43
- path = File.expand_path(filename)
44
- begin
45
- source = File.binread(path).sub(/\A\xEF\xBB\xBF/, "").force_encoding(Encoding::UTF_8)
46
- rescue Errno::ENOENT, Errno::EISDIR
47
- raise unless ignore
48
- next values
49
- end
50
-
51
- parsed, = Native.parse_dotenv(JSON.generate(
52
- source: source,
53
- process_env: process_env,
54
- overwrite: overwrite == true,
55
- key_files: key_files(path)
56
- ))
57
- parsed = parsed.to_h
58
- process_env.merge!(parsed)
59
- values.merge!(parsed)
60
- yield Environment.new(path, parsed) if block_given?
61
- values
62
- end
45
+ parse_files(*filenames, overwrite: overwrite, ignore: ignore).first
63
46
  end
64
47
 
65
48
  def update(env = {}, overwrite: false)
@@ -89,6 +72,56 @@ module Dotenvx
89
72
 
90
73
  private
91
74
 
75
+ def parse_files(*filenames, overwrite: false, ignore: true)
76
+ filenames = [".env"] if filenames.empty?
77
+ filenames = filenames.flatten.reverse if overwrite
78
+
79
+ process_env = ENV.to_h
80
+ injected_keys = {}
81
+ loaded_paths = []
82
+ values = filenames.reduce({}) do |accumulator, filename|
83
+ path = File.expand_path(filename)
84
+ begin
85
+ source = File.binread(path).sub(/\A\xEF\xBB\xBF/, "").force_encoding(Encoding::UTF_8)
86
+ rescue Errno::ENOENT, Errno::EISDIR
87
+ raise unless ignore
88
+ next accumulator
89
+ end
90
+
91
+ parsed, injected = Native.parse_dotenv(JSON.generate(
92
+ source: source,
93
+ process_env: process_env,
94
+ overwrite: overwrite == true,
95
+ key_files: key_files(path)
96
+ ))
97
+ parsed = parsed.to_h
98
+ injected.each { |key, _value| injected_keys[key] = true }
99
+ loaded_paths << path
100
+ process_env.merge!(parsed)
101
+ accumulator.merge!(parsed)
102
+ yield Environment.new(path, parsed) if block_given?
103
+ accumulator
104
+ end
105
+ [values, injected_keys.keys, loaded_paths]
106
+ end
107
+
108
+ def log_injected(injected_keys, loaded_paths)
109
+ message = "⟐ injected env (#{injected_keys.length})"
110
+ unless loaded_paths.empty?
111
+ paths = loaded_paths.map { |path| readable_path(path) }
112
+ message = "#{message} from #{paths.join(", ")}"
113
+ end
114
+ warn message
115
+ end
116
+
117
+ def readable_path(path)
118
+ pathname = Pathname.new(path)
119
+ relative = pathname.relative_path_from(Pathname.pwd).to_s
120
+ relative.start_with?("../") ? pathname.to_s : relative
121
+ rescue ArgumentError
122
+ pathname.to_s
123
+ end
124
+
92
125
  def key_files(path)
93
126
  candidates = ["#{path}.keys", File.join(File.dirname(path), ".env.keys")]
94
127
  candidates.select { |candidate| File.file?(candidate) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dotenvx
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.3
4
+ version: 4.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - motdotla