figleaf 0.2.5 → 0.2.6
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/figleaf/config.rb +55 -0
- data/lib/figleaf/settings.rb +32 -11
- data/lib/figleaf/version.rb +1 -1
- data/lib/figleaf.rb +1 -2
- data/spec/figleaf/config_spec.rb +60 -0
- data/spec/figleaf/settings_spec.rb +62 -32
- data/spec/fixtures/errors/bad_file.rb +1 -0
- data/spec/fixtures/extra/code.rb +21 -0
- data/spec/spec_helper.rb +0 -1
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d23035213f0420e9f22c4cb80640be461b048781
|
4
|
+
data.tar.gz: 71e650d1680977aa5353e1a60d71a52e44003ca1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abad1d584376dc35bfbdf421fd7969e7ab9fa731748e825237da18a961e5507a8c3fb859d2784612a719ac0645f313fdacbcabd79871f8bd4fbffe0b715817e2
|
7
|
+
data.tar.gz: 89742c7aad92c275d11e5b5e4aacb393de330a8b11cf9e3baf602398302f93bd5cc46f253c73da9623e12f13b1a34aa469e9563893795548134e45d9107a9722
|
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
module Figleaf
|
2
|
+
# Convert a ruby block to nested hash
|
3
|
+
class Config
|
4
|
+
def initialize
|
5
|
+
@property = LazyBlockHash.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(&block)
|
9
|
+
instance_eval(&block)
|
10
|
+
|
11
|
+
property
|
12
|
+
end
|
13
|
+
|
14
|
+
def method_missing(method_name, *args, &block)
|
15
|
+
process_method(method_name, *args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test(&block)
|
19
|
+
process_method(:test, [], &block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def process_method(method_name, *args, &block)
|
23
|
+
@property[method_name.to_s] =
|
24
|
+
if block_given?
|
25
|
+
obj = self.class.new
|
26
|
+
Proc.new { obj.call(&block) }
|
27
|
+
else
|
28
|
+
if args.count == 1
|
29
|
+
args[0]
|
30
|
+
else
|
31
|
+
args
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def respond_to_missing?(method_name, *args)
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
attr_reader :property
|
43
|
+
end
|
44
|
+
|
45
|
+
class LazyBlockHash < Hash
|
46
|
+
def [](attr)
|
47
|
+
val = super(attr)
|
48
|
+
if val.is_a?(Proc)
|
49
|
+
val.call
|
50
|
+
else
|
51
|
+
val
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/figleaf/settings.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Figleaf
|
2
2
|
class Settings
|
3
3
|
InvalidYAML = Class.new(RuntimeError)
|
4
|
+
InvalidRb = Class.new(RuntimeError)
|
4
5
|
|
5
6
|
class_attribute :auto_define
|
6
7
|
self.auto_define = false
|
@@ -41,12 +42,7 @@ module Figleaf
|
|
41
42
|
def load_settings(file_pattern = default_file_pattern, env_to_load = env)
|
42
43
|
configure_with_auto_define do
|
43
44
|
Dir.glob(file_pattern).each do |file|
|
44
|
-
property_name =
|
45
|
-
yaml_hash = load_file(file) or next
|
46
|
-
default = yaml_hash["default"]
|
47
|
-
property = yaml_hash[env_to_load]
|
48
|
-
|
49
|
-
property = default.merge(property) if !default.nil?
|
45
|
+
property_name, property = load_file(file, env_to_load)
|
50
46
|
|
51
47
|
next if property.nil?
|
52
48
|
|
@@ -61,10 +57,34 @@ module Figleaf
|
|
61
57
|
end
|
62
58
|
end
|
63
59
|
|
64
|
-
def load_file(
|
65
|
-
|
66
|
-
|
67
|
-
|
60
|
+
def load_file(file, env_to_load = env)
|
61
|
+
if file.end_with?('.rb')
|
62
|
+
property_name = File.basename(file, '.rb')
|
63
|
+
config = load_rb_file(file) or return nil
|
64
|
+
else
|
65
|
+
property_name = File.basename(file, '.yml')
|
66
|
+
config = load_yaml_file(file) or return nil
|
67
|
+
end
|
68
|
+
|
69
|
+
return if config.nil?
|
70
|
+
|
71
|
+
default = config["default"]
|
72
|
+
property = config[env_to_load]
|
73
|
+
property = default.merge(property) if !default.nil?
|
74
|
+
|
75
|
+
[property_name, use_hashie_if_hash(property)]
|
76
|
+
end
|
77
|
+
|
78
|
+
def load_rb_file(file_path, env = nil)
|
79
|
+
contents = File.read(file_path)
|
80
|
+
block = ->(*) { eval contents }
|
81
|
+
Config.new.call(&block)
|
82
|
+
rescue SyntaxError => e
|
83
|
+
raise InvalidRb, "#{file_path} has invalid Ruby\n" + e.message
|
84
|
+
end
|
85
|
+
|
86
|
+
def load_yaml_file(file_path)
|
87
|
+
YAML.load(ERB.new(IO.read(file_path)).result)
|
68
88
|
rescue Psych::SyntaxError => e
|
69
89
|
raise InvalidYAML, "#{file_path} has invalid YAML\n" + e.message
|
70
90
|
end
|
@@ -75,7 +95,8 @@ module Figleaf
|
|
75
95
|
end
|
76
96
|
|
77
97
|
def default_file_pattern
|
78
|
-
root.join('config/settings/*.yml')
|
98
|
+
root.join('config/settings/*.yml') +
|
99
|
+
root.join('config/settings/*.rb')
|
79
100
|
end
|
80
101
|
|
81
102
|
def env
|
data/lib/figleaf/version.rb
CHANGED
data/lib/figleaf.rb
CHANGED
@@ -8,9 +8,8 @@ require 'yaml'
|
|
8
8
|
require 'erb'
|
9
9
|
|
10
10
|
module Figleaf
|
11
|
+
autoload :Config, 'figleaf/config'
|
11
12
|
autoload :Fighash, 'figleaf/fighash'
|
12
|
-
autoload :Configuration, 'figleaf/configuration'
|
13
|
-
autoload :LoadSettings, 'figleaf/load_settings'
|
14
13
|
autoload :Settings, 'figleaf/settings'
|
15
14
|
autoload :VERSION, 'figleaf/version'
|
16
15
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Figleaf
|
4
|
+
RSpec.describe Config do
|
5
|
+
let(:code) do
|
6
|
+
proc do
|
7
|
+
setting_set_on_root "bar"
|
8
|
+
|
9
|
+
default do
|
10
|
+
foo "bar"
|
11
|
+
bar "baz"
|
12
|
+
end
|
13
|
+
|
14
|
+
production do
|
15
|
+
env "foo"
|
16
|
+
end
|
17
|
+
|
18
|
+
failer do
|
19
|
+
raise "Hello"
|
20
|
+
end
|
21
|
+
|
22
|
+
test do
|
23
|
+
foo "testbar"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
subject(:config) { described_class.new }
|
29
|
+
|
30
|
+
describe "#call" do
|
31
|
+
subject(:called) { config.call(&code) }
|
32
|
+
it "stores first level keywords as keys" do
|
33
|
+
expect(called.keys).to contain_exactly(*%w(
|
34
|
+
default
|
35
|
+
failer
|
36
|
+
production
|
37
|
+
setting_set_on_root
|
38
|
+
test
|
39
|
+
))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "expands default" do
|
43
|
+
expect(called["default"]).to eq(
|
44
|
+
"foo" => "bar",
|
45
|
+
"bar" => "baz"
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "expands test" do
|
50
|
+
expect(called["test"]).to eq(
|
51
|
+
"foo" => "testbar"
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "only raises when evaluating 'failer'" do
|
56
|
+
expect { called["failer"] }.to raise_error(RuntimeError)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,28 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Figleaf::Settings do
|
4
|
-
|
5
|
-
describe "self.load_file" do
|
6
|
-
before do
|
7
|
-
@fixture_path = File.expand_path("../../fixtures/service.yml", __FILE__)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "converts file settings from given env" do
|
11
|
-
settings = described_class.load_file(@fixture_path, "test")
|
12
|
-
expect(settings.foo).to eq("bar")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "allows env to be optional" do
|
16
|
-
settings = described_class.load_file(@fixture_path)
|
17
|
-
expect(settings.test.foo).to eq("bar")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns nil for missing env" do
|
21
|
-
settings = described_class.load_file(@fixture_path, "foo")
|
22
|
-
expect(settings).to eq(nil)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
4
|
describe "self.load_settings" do
|
27
5
|
before do
|
28
6
|
@fixtures_path = File.expand_path("../../fixtures/*.yml", __FILE__)
|
@@ -74,17 +52,28 @@ describe Figleaf::Settings do
|
|
74
52
|
end
|
75
53
|
|
76
54
|
it "raise exception when loading an undefined value" do
|
77
|
-
YAML.stub(:
|
55
|
+
YAML.stub(:load_yaml_file).and_return({ "test" => {} })
|
78
56
|
described_class.load_settings
|
79
57
|
expect { described_class.service.blah }.to raise_error NoMethodError
|
80
58
|
end
|
81
59
|
|
82
60
|
context "with bad files" do
|
83
|
-
|
61
|
+
context "yaml" do
|
62
|
+
let(:overload) { File.expand_path("../../fixtures/errors/*.yml", __FILE__) }
|
84
63
|
|
85
|
-
|
86
|
-
|
87
|
-
|
64
|
+
it "reports the file that has errors" do
|
65
|
+
expect { described_class.load_settings(overload, "test") }.
|
66
|
+
to raise_error(described_class::InvalidYAML)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "rb" do
|
71
|
+
let(:overload) { File.expand_path("../../fixtures/errors/*.rb", __FILE__) }
|
72
|
+
|
73
|
+
it "reports the file that has errors" do
|
74
|
+
expect { described_class.load_settings(overload, "test") }.
|
75
|
+
to raise_error(described_class::InvalidRb)
|
76
|
+
end
|
88
77
|
end
|
89
78
|
end
|
90
79
|
|
@@ -127,17 +116,58 @@ describe Figleaf::Settings do
|
|
127
116
|
|
128
117
|
context "using default as a YAML anchor is OK" do
|
129
118
|
before do
|
130
|
-
|
131
|
-
described_class.load_settings(
|
119
|
+
default_anchor = File.expand_path("../../fixtures/extra/default_anchor.yml", __FILE__)
|
120
|
+
described_class.load_settings(default_anchor, "test")
|
132
121
|
end
|
133
122
|
|
134
123
|
it "overrides values" do
|
135
|
-
expect(described_class.
|
124
|
+
expect(described_class.default_anchor.foo).to eq("overriden")
|
136
125
|
end
|
137
126
|
|
138
|
-
it "respects values set in
|
139
|
-
expect(described_class.
|
127
|
+
it "respects values set in default_anchor" do
|
128
|
+
expect(described_class.default_anchor.bar).to eq("baz")
|
140
129
|
end
|
141
130
|
end
|
142
131
|
end
|
132
|
+
|
133
|
+
context "load ruby files" do
|
134
|
+
before do
|
135
|
+
fixtures_path = File.expand_path("../../fixtures/extra/*.rb", __FILE__)
|
136
|
+
described_class.load_settings(fixtures_path, "test")
|
137
|
+
end
|
138
|
+
|
139
|
+
it "load indifferently the key names" do
|
140
|
+
expect(described_class.code["foo"]).to eq("bar")
|
141
|
+
expect(described_class.code[:foo]).to eq("bar")
|
142
|
+
end
|
143
|
+
|
144
|
+
it "create foo as a method" do
|
145
|
+
expect(described_class.code.foo).to eq("bar")
|
146
|
+
end
|
147
|
+
|
148
|
+
it "create bool_true? and return true" do
|
149
|
+
expect(described_class.code.bool_true?).to eq(true)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "create bool_false? and return false" do
|
153
|
+
expect(described_class.code.bool_false?).to eq(false)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "work for array as well", :aggregate_failures do
|
157
|
+
expect(described_class.code.array).to eq([1, 2, 3, 4])
|
158
|
+
expect(described_class.code.array_alt).to eq([1, 2, 3, 4])
|
159
|
+
end
|
160
|
+
|
161
|
+
it "and for boolean (true)" do
|
162
|
+
expect(described_class.code.bool_true).to eq(true)
|
163
|
+
end
|
164
|
+
|
165
|
+
it "and for boolean (false)" do
|
166
|
+
expect(described_class.code.bool_false).to eq(false)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "and for ENV values" do
|
170
|
+
expect(described_class.code.from_env).to eq('foo')
|
171
|
+
end
|
172
|
+
end
|
143
173
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
begin
|
@@ -0,0 +1,21 @@
|
|
1
|
+
default do
|
2
|
+
foo "bar"
|
3
|
+
bar "baz"
|
4
|
+
end
|
5
|
+
|
6
|
+
production do
|
7
|
+
env "foo"
|
8
|
+
end
|
9
|
+
|
10
|
+
dev_int do
|
11
|
+
bar "baz"
|
12
|
+
end
|
13
|
+
|
14
|
+
test do
|
15
|
+
foo "bar"
|
16
|
+
bool_true true
|
17
|
+
bool_false false
|
18
|
+
array 1, 2, 3, 4
|
19
|
+
array_alt [1, 2, 3, 4]
|
20
|
+
from_env ENV['FIGLEAF_TEST_FOO']
|
21
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,7 +9,6 @@ require "figleaf"
|
|
9
9
|
|
10
10
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
11
11
|
RSpec.configure do |config|
|
12
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
13
12
|
config.run_all_when_everything_filtered = true
|
14
13
|
config.filter_run :focus
|
15
14
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: figleaf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan C. Müller
|
@@ -57,18 +57,22 @@ files:
|
|
57
57
|
- Rakefile
|
58
58
|
- figleaf.gemspec
|
59
59
|
- lib/figleaf.rb
|
60
|
+
- lib/figleaf/config.rb
|
60
61
|
- lib/figleaf/fighash.rb
|
61
62
|
- lib/figleaf/settings.rb
|
62
63
|
- lib/figleaf/version.rb
|
64
|
+
- spec/figleaf/config_spec.rb
|
63
65
|
- spec/figleaf/configuration_spec.rb
|
64
66
|
- spec/figleaf/fighash_spec.rb
|
65
67
|
- spec/figleaf/settings_spec.rb
|
66
68
|
- spec/fixtures/array.yml
|
67
69
|
- spec/fixtures/boolean.yml
|
68
70
|
- spec/fixtures/erb.yml
|
71
|
+
- spec/fixtures/errors/bad_file.rb
|
69
72
|
- spec/fixtures/errors/bad_file.yml
|
70
73
|
- spec/fixtures/extra/array.yml
|
71
74
|
- spec/fixtures/extra/boolean.yml
|
75
|
+
- spec/fixtures/extra/code.rb
|
72
76
|
- spec/fixtures/extra/default.yml
|
73
77
|
- spec/fixtures/extra/default_anchor.yml
|
74
78
|
- spec/fixtures/extra/service.yml
|
@@ -99,15 +103,18 @@ signing_key:
|
|
99
103
|
specification_version: 4
|
100
104
|
summary: YAML based DRY settings manager.
|
101
105
|
test_files:
|
106
|
+
- spec/figleaf/config_spec.rb
|
102
107
|
- spec/figleaf/configuration_spec.rb
|
103
108
|
- spec/figleaf/fighash_spec.rb
|
104
109
|
- spec/figleaf/settings_spec.rb
|
105
110
|
- spec/fixtures/array.yml
|
106
111
|
- spec/fixtures/boolean.yml
|
107
112
|
- spec/fixtures/erb.yml
|
113
|
+
- spec/fixtures/errors/bad_file.rb
|
108
114
|
- spec/fixtures/errors/bad_file.yml
|
109
115
|
- spec/fixtures/extra/array.yml
|
110
116
|
- spec/fixtures/extra/boolean.yml
|
117
|
+
- spec/fixtures/extra/code.rb
|
111
118
|
- spec/fixtures/extra/default.yml
|
112
119
|
- spec/fixtures/extra/default_anchor.yml
|
113
120
|
- spec/fixtures/extra/service.yml
|