gem_config 0.0.2 → 0.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 +6 -14
- data/Rakefile +5 -0
- data/gem_config.gemspec +5 -0
- data/lib/gem_config.rb +1 -1
- data/lib/gem_config/base.rb +2 -8
- data/lib/gem_config/configuration.rb +6 -10
- data/lib/gem_config/rules.rb +46 -0
- data/lib/gem_config/version.rb +1 -1
- data/spec/features/configuration_spec.rb +27 -0
- data/spec/lib/base_spec.rb +11 -0
- data/spec/lib/configuration_spec.rb +31 -0
- data/spec/lib/rules_spec.rb +112 -0
- data/spec/spec_helper.rb +13 -0
- metadata +61 -8
- data/lib/gem_config/configuration_rules.rb +0 -7
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ODAxNjg0OGNhN2JkMjgxMDZmNjliNmFkNjY5ZTJiZjMzZDIzYjlhYjgzZmFk
|
10
|
-
YjkxNTYwYTJjZmFhYTkzYzRiYWM0ZDRkMjc0Y2UxMmRhOWNkNzRjNmFmMDYx
|
11
|
-
M2U1MjJhMWU2YzE2NTU5YjA2ZDIxNTcxMzQ1NTA5M2VhODdjM2U=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZjQ4MjhhMjJjZWVhZThhNjhiMWJhZTg4MTk4ZmJkNDkxNmUyN2EyNGRjMGY5
|
14
|
-
YjZlZjQ0ZTZjYTBjYTViMjAzZWI0NmI3NWQ2MzFmYjY0ZWRjZjc4MDk0NGQ2
|
15
|
-
ODYxYmQ0N2U2YmE4YzE4Y2U0YmY2MmQ1ZWExYmRlMTkxMWUwNGE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9c0001fb2a37e49f309f7c050560a2ca0b809cba
|
4
|
+
data.tar.gz: 23ec574b1a07a169eed85427076150eae6fdf62b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1dc0f00e99dbf3d5592024f904dd2a22c65a808b21e4c34357c0f86e0d254027f2612d5cf43547fa941872f70398bf81d2e7c3198effab1e721ea1fce4593670
|
7
|
+
data.tar.gz: 1e7485ca57cf804347732159e6563457a51600548c612b27efa1ef8d3b1da20bb3d1cec817810bad204a4fcfdac1fea0bb32ba186793c6053057dc433753ecc9
|
data/Rakefile
ADDED
data/gem_config.gemspec
CHANGED
@@ -18,4 +18,9 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.executables = gem.files.grep(%r(^bin/)).map { |f| File.basename(f) }
|
19
19
|
gem.test_files = gem.files.grep(%r(^(test|spec|features)/))
|
20
20
|
gem.require_paths = ['lib']
|
21
|
+
|
22
|
+
gem.add_development_dependency 'rake', '>= 0.9.0'
|
23
|
+
gem.add_development_dependency 'rspec', '~> 2.13.0'
|
24
|
+
|
25
|
+
gem.add_runtime_dependency 'activesupport', '~> 3.0'
|
21
26
|
end
|
data/lib/gem_config.rb
CHANGED
data/lib/gem_config/base.rb
CHANGED
@@ -10,17 +10,11 @@ module GemConfig
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def configuration
|
13
|
-
@configuration ||= Configuration.new
|
13
|
+
@configuration ||= Configuration.new
|
14
14
|
end
|
15
15
|
|
16
16
|
def with_configuration(&block)
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def configuration_rules
|
23
|
-
@configuration_rules ||= ConfigurationRules.new
|
17
|
+
configuration.rules.instance_eval(&block)
|
24
18
|
end
|
25
19
|
end
|
26
20
|
end
|
@@ -1,30 +1,26 @@
|
|
1
1
|
module GemConfig
|
2
2
|
class Configuration
|
3
|
-
def initialize(configuration_rules)
|
4
|
-
@configuration_rules = configuration_rules
|
5
|
-
end
|
6
|
-
|
7
3
|
def rules
|
8
|
-
@
|
4
|
+
@rules ||= Rules.new
|
9
5
|
end
|
10
6
|
|
11
7
|
def current
|
12
|
-
|
8
|
+
self.rules.keys.each_with_object({}) do |key, hash|
|
13
9
|
hash[key] = get(key)
|
14
10
|
end
|
15
11
|
end
|
16
12
|
|
17
13
|
def reset
|
18
|
-
|
14
|
+
self.rules.keys.each do |key|
|
19
15
|
set key, nil
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
23
19
|
def method_missing(method, *args, &block)
|
24
20
|
case
|
25
|
-
when
|
21
|
+
when self.rules.keys.include?(method.to_sym)
|
26
22
|
get method
|
27
|
-
when (match = method.to_s.match(/\A(?<key>\w+)=\z/)) &&
|
23
|
+
when (match = method.to_s.match(/\A(?<key>\w+)=\z/)) && self.rules.keys.include?(match[:key].to_sym)
|
28
24
|
set match[:key], args.first
|
29
25
|
else
|
30
26
|
super method, *args, block
|
@@ -38,7 +34,7 @@ module GemConfig
|
|
38
34
|
end
|
39
35
|
|
40
36
|
def get(key)
|
41
|
-
self.instance_variable_get("@#{key}") ||
|
37
|
+
self.instance_variable_get("@#{key}") || self.rules[key.to_sym][:default]
|
42
38
|
end
|
43
39
|
end
|
44
40
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'active_support/core_ext/hash/keys'
|
2
|
+
|
3
|
+
module GemConfig
|
4
|
+
class Rules < Hash
|
5
|
+
def has(key, attrs = {})
|
6
|
+
check_attributes attrs
|
7
|
+
self[key.to_sym] = attrs
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def check_attributes(attrs)
|
13
|
+
attrs.assert_valid_keys :classes, :values, :default
|
14
|
+
|
15
|
+
if attrs.has_key?(:classes)
|
16
|
+
other_than_class = Array(attrs[:classes]).any? do |value|
|
17
|
+
!value.is_a?(Class)
|
18
|
+
end
|
19
|
+
raise ArgumentError, 'Value of :classes parameter must be a single class or an array of classes.' if other_than_class
|
20
|
+
end
|
21
|
+
|
22
|
+
if attrs.has_key?(:classes) && attrs.has_key?(:values)
|
23
|
+
value_not_in_classes = Array(attrs[:values]).any? do |value|
|
24
|
+
Array(attrs[:classes]).none? do |klass|
|
25
|
+
value.is_a?(klass)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
raise ArgumentError, 'Values of :values parameter must all have the type of one of the defined :classes.' if value_not_in_classes
|
29
|
+
end
|
30
|
+
|
31
|
+
if attrs.has_key?(:default)
|
32
|
+
if attrs.has_key?(:classes)
|
33
|
+
default_not_in_classes = Array(attrs[:classes]).none? do |klass|
|
34
|
+
attrs[:default].is_a?(klass)
|
35
|
+
end
|
36
|
+
raise ArgumentError, 'Value of :default parameter must have the type of one of the defined :classes.' if default_not_in_classes
|
37
|
+
end
|
38
|
+
|
39
|
+
if attrs.has_key?(:values)
|
40
|
+
default_not_in_values = !Array(attrs[:values]).include?(attrs[:default])
|
41
|
+
raise ArgumentError, 'Value of :default parameter must have the type of one of the defined :classes.' if default_not_in_values
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/gem_config/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'a module with configuration rules' do
|
4
|
+
subject do
|
5
|
+
Module.new do
|
6
|
+
include GemConfig::Base
|
7
|
+
|
8
|
+
with_configuration do
|
9
|
+
has :foo, classes: String
|
10
|
+
has :bar, classes: Numeric, default: 1
|
11
|
+
has :baz, values: %w(lorem ipsum dolor), default: 'lorem'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'can be configured' do
|
17
|
+
expect do
|
18
|
+
subject.configure do |config|
|
19
|
+
config.foo = 'bar'
|
20
|
+
config.baz = 'ipsum'
|
21
|
+
end
|
22
|
+
end.to_not raise_error
|
23
|
+
|
24
|
+
subject.configuration.foo.should eq('bar')
|
25
|
+
subject.configuration.baz.should eq('ipsum')
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GemConfig::Configuration do
|
4
|
+
subject do
|
5
|
+
GemConfig::Configuration.new.tap do |configuration|
|
6
|
+
configuration.rules.has :foo
|
7
|
+
configuration.rules.has :count
|
8
|
+
configuration.foo = 'bar'
|
9
|
+
configuration.count = 123
|
10
|
+
configuration
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#rules' do
|
15
|
+
it 'returns a Rules object' do
|
16
|
+
subject.rules.is_a?(GemConfig::Rules)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#current' do
|
21
|
+
it 'returns the current configuration' do
|
22
|
+
subject.current.should eq(foo: 'bar', count: 123)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#reset' do
|
27
|
+
it 'resets the configuration' do
|
28
|
+
subject.tap(&:reset).current.should eq(foo: nil, count: nil)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GemConfig::Rules do
|
4
|
+
subject { GemConfig::Rules.new }
|
5
|
+
|
6
|
+
describe '#has' do
|
7
|
+
it 'sets a rule' do
|
8
|
+
subject.has :foo
|
9
|
+
subject.should have_key(:foo)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'sets the parameters of a rule' do
|
13
|
+
params = { classes: String, values: %w(foo bar), default: 'foo' }
|
14
|
+
subject.has :foo, params
|
15
|
+
subject[:foo].should eq(params)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'only allows certain parameters' do
|
19
|
+
expect do
|
20
|
+
subject.has :foo, classes: String
|
21
|
+
end.to_not raise_error(ArgumentError)
|
22
|
+
|
23
|
+
expect do
|
24
|
+
subject.has :foo, values: 'bar'
|
25
|
+
end.to_not raise_error(ArgumentError)
|
26
|
+
|
27
|
+
expect do
|
28
|
+
subject.has :foo, default: 'bar'
|
29
|
+
end.to_not raise_error(ArgumentError)
|
30
|
+
|
31
|
+
expect do
|
32
|
+
subject.has :foo, foo: 'bar'
|
33
|
+
end.to raise_error(ArgumentError)
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'parameter :classes' do
|
37
|
+
it 'only allows a class or an array of classes as the value' do
|
38
|
+
expect do
|
39
|
+
subject.has :foo, classes: String
|
40
|
+
end.to_not raise_error(ArgumentError)
|
41
|
+
|
42
|
+
expect do
|
43
|
+
subject.has :foo, classes: [String, Numeric]
|
44
|
+
end.to_not raise_error(ArgumentError)
|
45
|
+
|
46
|
+
expect do
|
47
|
+
subject.has :foo, classes: 'foo'
|
48
|
+
end.to raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'parameter :values' do
|
53
|
+
context 'when :classes are defined' do
|
54
|
+
it 'only allows values of one of the specified classes' do
|
55
|
+
expect do
|
56
|
+
subject.has :foo, classes: String, values: 'foo'
|
57
|
+
end.to_not raise_error(ArgumentError)
|
58
|
+
|
59
|
+
expect do
|
60
|
+
subject.has :foo, classes: Numeric, values: 1
|
61
|
+
end.to_not raise_error(ArgumentError)
|
62
|
+
|
63
|
+
expect do
|
64
|
+
subject.has :foo, classes: [String, Numeric], values: ['foo', 1]
|
65
|
+
end.to_not raise_error(ArgumentError)
|
66
|
+
|
67
|
+
expect do
|
68
|
+
subject.has :foo, classes: String, values: ['foo', 1]
|
69
|
+
end.to raise_error(ArgumentError)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe 'parameter :default' do
|
75
|
+
context 'when :classes are defined' do
|
76
|
+
it 'only allows a value of one of the specified classes' do
|
77
|
+
expect do
|
78
|
+
subject.has :foo, classes: String, default: 'foo'
|
79
|
+
end.to_not raise_error(ArgumentError)
|
80
|
+
|
81
|
+
expect do
|
82
|
+
subject.has :foo, classes: Numeric, default: 1
|
83
|
+
end.to_not raise_error(ArgumentError)
|
84
|
+
|
85
|
+
expect do
|
86
|
+
subject.has :foo, classes: [String, Numeric], default: 'foo'
|
87
|
+
end.to_not raise_error(ArgumentError)
|
88
|
+
|
89
|
+
expect do
|
90
|
+
subject.has :foo, classes: Numeric, default: 'foo'
|
91
|
+
end.to raise_error(ArgumentError)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when :values are defined' do
|
96
|
+
it 'only allows one of the specified values' do
|
97
|
+
expect do
|
98
|
+
subject.has :foo, values: 'foo', default: 'foo'
|
99
|
+
end.to_not raise_error(ArgumentError)
|
100
|
+
|
101
|
+
expect do
|
102
|
+
subject.has :foo, values: ['foo', 1], default: 1
|
103
|
+
end.to_not raise_error(ArgumentError)
|
104
|
+
|
105
|
+
expect do
|
106
|
+
subject.has :foo, values: ['foo', 1], default: 'bar'
|
107
|
+
end.to raise_error(ArgumentError)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'gem_config'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
5
|
+
config.run_all_when_everything_filtered = true
|
6
|
+
config.filter_run :focus
|
7
|
+
|
8
|
+
# Run specs in random order to surface order dependencies. If you find an
|
9
|
+
# order dependency and want to debug it, you can fix the order by providing
|
10
|
+
# the seed, which is printed after each run.
|
11
|
+
# --seed 1234
|
12
|
+
config.order = 'random'
|
13
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem_config
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Meurer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
-
dependencies:
|
11
|
+
date: 2013-05-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.9.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.9.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.13.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.13.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
13
55
|
description: A nifty way to make your gem configurable.
|
14
56
|
email: manuel.meurer@gmail.com
|
15
57
|
executables: []
|
@@ -19,12 +61,18 @@ files:
|
|
19
61
|
- Gemfile
|
20
62
|
- LICENSE.txt
|
21
63
|
- README.md
|
64
|
+
- Rakefile
|
22
65
|
- gem_config.gemspec
|
23
66
|
- lib/gem_config.rb
|
24
67
|
- lib/gem_config/base.rb
|
25
68
|
- lib/gem_config/configuration.rb
|
26
|
-
- lib/gem_config/
|
69
|
+
- lib/gem_config/rules.rb
|
27
70
|
- lib/gem_config/version.rb
|
71
|
+
- spec/features/configuration_spec.rb
|
72
|
+
- spec/lib/base_spec.rb
|
73
|
+
- spec/lib/configuration_spec.rb
|
74
|
+
- spec/lib/rules_spec.rb
|
75
|
+
- spec/spec_helper.rb
|
28
76
|
homepage: https://github.com/krautcomputing/gem_config
|
29
77
|
licenses:
|
30
78
|
- MIT
|
@@ -35,18 +83,23 @@ require_paths:
|
|
35
83
|
- lib
|
36
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
37
85
|
requirements:
|
38
|
-
- -
|
86
|
+
- - '>='
|
39
87
|
- !ruby/object:Gem::Version
|
40
88
|
version: '0'
|
41
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
90
|
requirements:
|
43
|
-
- -
|
91
|
+
- - '>='
|
44
92
|
- !ruby/object:Gem::Version
|
45
93
|
version: '0'
|
46
94
|
requirements: []
|
47
95
|
rubyforge_project:
|
48
|
-
rubygems_version: 2.0.
|
96
|
+
rubygems_version: 2.0.2
|
49
97
|
signing_key:
|
50
98
|
specification_version: 4
|
51
99
|
summary: A nifty way to make your gem configurable.
|
52
|
-
test_files:
|
100
|
+
test_files:
|
101
|
+
- spec/features/configuration_spec.rb
|
102
|
+
- spec/lib/base_spec.rb
|
103
|
+
- spec/lib/configuration_spec.rb
|
104
|
+
- spec/lib/rules_spec.rb
|
105
|
+
- spec/spec_helper.rb
|