confg 2.0.0 → 2.1.0.rc1

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: 7d70e2bf601f771c6cc956dab4f21ca2afed56dcdf7159b24e5f17dfa4a8937b
4
- data.tar.gz: 4c710349770ca65473e363e949f2f27c071ca0d214dff3d3c509806c55b4cb9b
3
+ metadata.gz: fc9f4292ee8c5e8816455c7a49dd1bdd70d7fec552df2da425d98c03867fecab
4
+ data.tar.gz: eddb359546e89a16143da84ecf344d83162b460c62615e4ce3ad1995f0d3b74d
5
5
  SHA512:
6
- metadata.gz: 34a799c1d347f3dadc3030e526b14a964753810d663b76107383145891943592254e886fbe5a53b527dbec6cd08676e572513c0d8fa9e9f76818e7d2d52608a5
7
- data.tar.gz: cfda628b0bcfa7fffb1bed93cf987241bfebddff79f2c9ddc6d37fa494f877a334ddfb276e6a7e36f922a187ef110c168c564c5f585151b2391536832447cf42
6
+ metadata.gz: 17aac0fec22fbedeb2340a7d90b84d9e3eae13952aed5104785426b9e60229976ca2e84b3f024bad1cc37e0c531c4b8f8b77a334fa8765f63596bcafaee8cae4
7
+ data.tar.gz: 61ab852e489d70b2d16e67ff7bd11393828d42bb9667785eea99bc4c4844f8c06225c2a7bc052d01fef989f237d06233707edc6dc34c3cf560502d36c929ca83
@@ -8,6 +8,10 @@ module Confg
8
8
 
9
9
  class << self
10
10
 
11
+ def cache
12
+ @cache ||= {}
13
+ end
14
+
11
15
  def root
12
16
  return @root if defined?(@root)
13
17
 
@@ -27,12 +31,13 @@ module Confg
27
31
  self
28
32
  end
29
33
 
30
- def configure
31
- @configuration ||= ::Confg::Configuration.new(env: env, root: root)
32
- yield @configuration if block_given?
33
- @configuration
34
+ def config(env: self.env, root: self.root)
35
+ config_key = "#{env}--#{root}"
36
+ out = (cache[config_key] ||= ::Confg::Configuration.new(env: env, root: root))
37
+ yield out if block_given?
38
+ out
34
39
  end
35
- alias config configure
40
+ alias configure config
36
41
 
37
42
  def method_missing(method_name, *args, &block)
38
43
  config.send(method_name, *args, &block)
@@ -65,7 +70,7 @@ module Confg
65
70
  end
66
71
 
67
72
  def reset!
68
- remove_instance_variable("@configuration") if defined?(@configuration)
73
+ remove_instance_variable("@cache") if defined?(@cache)
69
74
  remove_instance_variable("@env") if defined?(@env)
70
75
  remove_instance_variable("@root") if defined?(@root)
71
76
  end
@@ -3,19 +3,18 @@
3
3
  require "yaml"
4
4
 
5
5
  module Confg
6
- class Configuration < ::SimpleDelegator
6
+ class Configuration
7
7
 
8
- attr_reader :confg_env, :confg_root
8
+ attr_reader :confg_env, :confg_root, :confg_data
9
9
 
10
10
  def initialize(env: Confg.env, root: Confg.root)
11
11
  @confg_env = env.to_s
12
12
  @confg_root = Pathname.new(root)
13
-
14
- super({})
13
+ @confg_data = {}
15
14
  end
16
15
 
17
16
  def inspect
18
- "#<#{self.class.name} #{__getobj__.inspect}>"
17
+ "#<#{self.class.name} #{confg_data.inspect}>"
19
18
  end
20
19
 
21
20
  def tmp(key, value)
@@ -34,24 +33,28 @@ module Confg
34
33
  alias merge! merge
35
34
 
36
35
  def to_h
37
- __getobj__.transform_values do |v|
36
+ confg_data.transform_values do |v|
38
37
  v.is_a?(self.class) ? v.to_h : v
39
38
  end
40
39
  end
41
40
 
41
+ def key?(key)
42
+ confg_data.key?(key.to_s)
43
+ end
44
+
42
45
  def get(key)
43
46
  fetch(key) { nil }
44
47
  end
45
48
  alias [] get
46
49
 
47
50
  def fetch(key, &block)
48
- __getobj__.fetch(key.to_s, &block)
51
+ confg_data.fetch(key.to_s, &block)
49
52
  end
50
53
 
51
54
  def set(key, value = nil)
52
- __getobj__[key.to_s] = case value
55
+ confg_data[key.to_s] = case value
53
56
  when ::Hash
54
- open_block(key) do |child|
57
+ open(key) do |child|
55
58
  value.each_pair do |k, v|
56
59
  child.set(k, v)
57
60
  end
@@ -62,6 +65,12 @@ module Confg
62
65
  end
63
66
  alias []= set
64
67
 
68
+ def open(key)
69
+ inner = get(key) || spawn_child
70
+ yield(inner)
71
+ set(key, inner)
72
+ end
73
+
65
74
  def load_key(key)
66
75
  # loads yaml file with given key
67
76
  load_yaml(key, key: key)
@@ -95,32 +104,28 @@ module Confg
95
104
  end
96
105
  alias load_yml load_yaml
97
106
 
98
- def method_missing(method_name, *args, &block)
99
- key = method_name.to_s
107
+ def method_missing(key, *args, &block)
108
+ key = key.to_s
109
+ return set(key[0...-1], args[0]) if key.end_with?("=")
110
+ return fetch(key) if key?(key)
100
111
 
101
- if __getobj__.respond_to?(key)
102
- super
103
- elsif key.end_with?("=") && !args.empty?
104
- set(key[0...-1], args[0])
105
- elsif block_given?
106
- open_block(key, &block)
107
- else
108
- fetch(key)
112
+ begin
113
+ confg_data.send(key, *args, &block)
114
+ rescue NoMethodError => e
115
+ raise KeyError, "Unrecognized key `#{key}`", e.backtrace
109
116
  end
110
117
  end
111
118
 
112
- def respond_to_missing?(*_args)
113
- true
119
+ def respond_to_missing?(key, include_private = false)
120
+ key = key.to_s
121
+ return true if key.end_with?("=")
122
+ return true if key?(key)
123
+
124
+ confg_data.respond_to?(key, include_private)
114
125
  end
115
126
 
116
127
  protected
117
128
 
118
- def open_block(key)
119
- inner = get(key) || spawn_child
120
- yield(inner)
121
- set(key, inner)
122
- end
123
-
124
129
  def find_config_yaml(path)
125
130
  path = path.to_s
126
131
  # give it back if it starts with a slash
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Confg
4
4
 
5
- VERSION = "2.0.0"
5
+ VERSION = "2.1.0.rc1"
6
6
 
7
7
  end
@@ -15,7 +15,7 @@ class ConfgTest < Minitest::Test
15
15
  end
16
16
 
17
17
  def test_a_child_block_can_be_opened
18
- config.foo do |child|
18
+ config.open :foo do |child|
19
19
  child.bar = "baz"
20
20
  end
21
21
 
@@ -65,4 +65,16 @@ class ConfgTest < Minitest::Test
65
65
  }, config.to_h)
66
66
  end
67
67
 
68
+ def test_top_level_configs_are_cached_in_root_namespace
69
+ ::Confg.send :reset!
70
+ assert_equal({}, ::Confg.cache)
71
+
72
+ default_config = ::Confg.config(env: "test", root: "/")
73
+ custom_config = ::Confg.config(env: "foobar", root: "/Users/x/")
74
+
75
+ refute_equal default_config.object_id, custom_config.object_id
76
+ assert_equal 2, ::Confg.cache.size
77
+ assert_equal %w[test--/ foobar--/Users/x/], ::Confg.cache.keys
78
+ end
79
+
68
80
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: confg
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Nelson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-02 00:00:00.000000000 Z
11
+ date: 2020-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,9 +99,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
99
  version: '0'
100
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - ">="
102
+ - - ">"
103
103
  - !ruby/object:Gem::Version
104
- version: '0'
104
+ version: 1.3.1
105
105
  requirements: []
106
106
  rubygems_version: 3.0.3
107
107
  signing_key: