confg 2.0.0 → 2.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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: