iqeo-conf 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.bundle/config CHANGED
@@ -1 +1,2 @@
1
- --- {}
1
+ ---
2
+ BUNDLE_BIN: bin
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  .idea/
2
+ .rvmrc
2
3
 
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile.lock CHANGED
@@ -1,14 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- iqeo-conf (0.0.1)
4
+ iqeo-conf (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ diff-lcs (1.1.3)
10
+ rake (0.9.2.2)
11
+ rspec (2.9.0)
12
+ rspec-core (~> 2.9.0)
13
+ rspec-expectations (~> 2.9.0)
14
+ rspec-mocks (~> 2.9.0)
15
+ rspec-core (2.9.0)
16
+ rspec-expectations (2.9.1)
17
+ diff-lcs (~> 1.1.3)
18
+ rspec-mocks (2.9.0)
9
19
 
10
20
  PLATFORMS
11
21
  ruby
12
22
 
13
23
  DEPENDENCIES
14
24
  iqeo-conf!
25
+ rake (~> 0.9.2)
26
+ rspec (~> 2.9.0)
data/README.md CHANGED
@@ -4,19 +4,7 @@ A DSL for writing configuration files.
4
4
 
5
5
  ## Installation
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- ```
10
- gem 'iqeo-conf'
11
- ```
12
-
13
- And then execute:
14
-
15
- ```
16
- $ bundle
17
- ```
18
-
19
- Or install it yourself as:
7
+ It's a gem...
20
8
 
21
9
  ```
22
10
  $ gem install iqeo-conf
@@ -26,9 +14,13 @@ $ gem install iqeo-conf
26
14
 
27
15
  ### Defining a configuration
28
16
 
17
+ ```ruby
18
+ require 'iqeo/configuration'
19
+ ```
20
+
29
21
  Set values...
30
22
 
31
- #### Defining a Configuration object directly
23
+ #### Directly on a configuration object
32
24
 
33
25
  ```ruby
34
26
  conf = Iqeo::Configuration.new
@@ -41,7 +33,7 @@ conf.charlie { :a => 1, :b => 2, :c => 3 }
41
33
  conf.delta [ 1, 2, 3 ]
42
34
  ```
43
35
 
44
- #### Configuration DSL - block yield style
36
+ #### Configuration DSL block yield style
45
37
 
46
38
  ```ruby
47
39
  conf = Iqeo::Configuration.new do |c|
@@ -54,7 +46,7 @@ conf = Iqeo::Configuration.new do |c|
54
46
  end
55
47
  ```
56
48
 
57
- ### Configuration DSL - freestyle
49
+ ### Configuration DSL instance_eval style
58
50
 
59
51
  ```ruby
60
52
  conf = Iqeo::Configuration.new do
@@ -78,13 +70,26 @@ conf.charlie => { :a => 1, :b => 2, :c => 3 }
78
70
  conf.delta => [ 1, 2, 3 ]
79
71
  ```
80
72
 
81
- ## Contributing
82
-
83
- 1. Fork it
84
- 2. Create your feature branch (`git checkout -b my-new-feature`)
85
- 3. Commit your changes (`git commit -am 'Added some feature'`)
86
- 4. Push to the branch (`git push origin my-new-feature`)
87
- 5. Create new Pull Request
73
+ ## Other features
74
+
75
+ This README may not be complete, see rspec tests for all features.
76
+
77
+ ## Todo
78
+
79
+ * Hash operators [] & []= - done!
80
+ * Nested configurations - done!
81
+ * Nested configurations inherit settings
82
+ * Nested configurations override inherited settings
83
+ * Indifferent hash access, symbol, strings, case sensitivity optional ?
84
+ * Iterate over items hash - access to hash / mixin enumerable / delegation to hash ?
85
+ * Load configurations from a string or file at creation
86
+ * Load configurations from a string or file after creation / in DSL
87
+ * Configuration file load path - array of Dir.glob like file specs ?
88
+ * Load other formats ? - No need... DSL is just ruby, just do it natively.
89
+ * Blank slate for DSL ? - optional ?
90
+ * Use an existing configuration for defaults
91
+ * Global configuration - watch for collisions ?
92
+ * Consider issues around deferred interpolation / procs / lambdas etc...
88
93
 
89
94
  ## License
90
95
 
data/Rakefile CHANGED
@@ -6,4 +6,9 @@ Rake::TestTask.new do |t|
6
6
  t.libs << "test"
7
7
  t.test_files = FileList['test/test*.rb']
8
8
  t.verbose = true
9
- end
9
+ end
10
+
11
+ require 'rspec/core/rake_task'
12
+ RSpec::Core::RakeTask.new('spec')
13
+
14
+ task :default => :spec
data/iqeo-conf.gemspec CHANGED
@@ -9,8 +9,12 @@ Gem::Specification.new do |gem|
9
9
  gem.homepage = "http://github.com/iqeo/iqeo-conf"
10
10
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
11
11
  gem.files = `git ls-files`.split("\n")
12
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
12
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
13
13
  gem.name = "iqeo-conf"
14
14
  gem.require_paths = ["lib"]
15
15
  gem.version = Iqeo::Configuration::VERSION
16
+
17
+ gem.add_development_dependency "rspec", "~> 2.9.0"
18
+ gem.add_development_dependency "rake", "~> 0.9.2"
19
+
16
20
  end
@@ -1,5 +1,5 @@
1
1
  module Iqeo
2
2
  class Configuration
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -1,12 +1,24 @@
1
1
 
2
2
  require_relative "configuration/version"
3
3
 
4
+ # todo: inherited settings for nested configurations - POLS ?
5
+ # todo: load configurations from string & file
6
+ # todo: configuration file load path
7
+ # todo: iterate over items hash - access to hash / mixin enumerable / delegation to hash ?
8
+ # todo: indifferent hash access
9
+ # todo: use an existing configuration for defaults
10
+ # todo: global configuration - watch for collisions ?
11
+ # todo: deferred interpolation / procs / lambdas etc...
12
+ # todo: blank slate for DSL - optional ?
13
+ # todo: load other formats from string & file - YAML, XML?
14
+
4
15
  module Iqeo
5
16
 
6
17
  class Configuration
7
18
 
8
- # todo: tests - init without block, with block & param, with plain block
9
- # todo: instance_eval vs. yield (arity == 0) ?
19
+ def self.version
20
+ VERSION
21
+ end
10
22
 
11
23
  def initialize &block
12
24
  @items = {}
@@ -19,16 +31,18 @@ module Iqeo
19
31
  end
20
32
  end
21
33
 
22
- # todo: tests - with value, without value, multiple values ?, optional '=' with value ?
23
- # todo: why does '=' break for instance eval ? - is it actually setting a local variable ???
24
-
25
- def method_missing name, *value
26
- name = name.to_s.chomp('=').to_sym
27
- return @items[name] if value.empty?
28
- @items[name] = value.first
34
+ def method_missing name, *values
35
+ case name
36
+ when :[]= then return @items[values.shift] = values.size > 1 ? values : values.first
37
+ when :[] then return @items[values.shift]
38
+ else
39
+ name = name.to_s.chomp('=').to_sym
40
+ return @items[name] if values.empty?
41
+ return @items[name] = values if values.size > 1
42
+ return @items[name] = values.first
43
+ end
29
44
  end
30
-
31
- end
45
+ end
32
46
 
33
47
  end
34
48
 
Binary file
Binary file
@@ -0,0 +1,280 @@
1
+ require 'spec_helper'
2
+ require 'iqeo/configuration'
3
+
4
+ include Iqeo
5
+
6
+ describe Configuration do
7
+
8
+ it 'reports the correct version' do
9
+ Configuration.version.should == Configuration::VERSION
10
+ end
11
+
12
+ context 'creation' do
13
+
14
+ it 'does not require a block' do
15
+ Configuration.new.should be_a Configuration
16
+ end
17
+
18
+ it 'accepts a block with arity 0' do
19
+ Configuration.new { }.should be_a Configuration
20
+ end
21
+
22
+ it 'instance_eval\'s block with arity 0' do
23
+ conf_eval = nil
24
+ conf_new = Configuration.new { conf_eval = self }
25
+ conf_new.should be conf_eval
26
+ end
27
+
28
+ it 'accepts a block with arity 1' do
29
+ Configuration.new { |arg| }.should be_a Configuration
30
+ end
31
+
32
+ it 'yields self to block with arity 1' do
33
+ conf_yielded = nil
34
+ conf_new = Configuration.new { |conf| conf_yielded = conf }
35
+ conf_new.should be conf_yielded
36
+ end
37
+
38
+ end
39
+
40
+ context 'settings retrieval' do
41
+
42
+ it 'returns nil for non-existent settings' do
43
+ conf = Configuration.new
44
+ conf.not_a_setting.should be_nil
45
+ end
46
+
47
+ end
48
+
49
+ context 'single value setting' do
50
+
51
+ it 'accepts simple values' do
52
+ conf = nil
53
+ expect do
54
+ conf = Configuration.new
55
+ conf.alpha 1
56
+ conf.bravo "two"
57
+ conf.charlie 3.0
58
+ conf.delta :four
59
+ end.to_not raise_error
60
+ conf.should_not be_nil
61
+ conf.alpha.should == 1 and conf.alpha.should be_a Fixnum
62
+ conf.bravo.should == "two" and conf.bravo.should be_a String
63
+ conf.charlie.should == 3.0 and conf.charlie.should be_a Float
64
+ conf.delta.should == :four and conf.delta.should be_a Symbol
65
+ end
66
+
67
+ it 'accepts complex values' do
68
+ conf = nil
69
+ expect do
70
+ conf = Configuration.new
71
+ conf.alpha = [ :a, :b, :c ]
72
+ conf.bravo = { :a => 1, :b => 2, :c => 3 }
73
+ end.to_not raise_error
74
+ conf.should_not be_nil
75
+ conf.alpha.should == [ :a, :b, :c] and conf.alpha.should be_an Array
76
+ conf.alpha.size.should == 3
77
+ conf.alpha[0].should == :a
78
+ conf.alpha[1].should == :b
79
+ conf.alpha[2].should == :c
80
+ conf.bravo.should == { :a => 1, :b => 2, :c => 3} and conf.bravo.should be_a Hash
81
+ conf.bravo.size.should == 3
82
+ conf.bravo[:a].should == 1
83
+ conf.bravo[:b].should == 2
84
+ conf.bravo[:c].should == 3
85
+ end
86
+
87
+ end
88
+
89
+ context 'multiple value setting' do
90
+
91
+ it 'accepts hash without brackets' do
92
+ conf = nil
93
+ expect do
94
+ conf = Configuration.new
95
+ conf.alpha :a => 1, :b => 2, :c => 3
96
+ end.to_not raise_error
97
+ conf.should_not be_nil
98
+ conf.alpha.should == { :a => 1, :b => 2, :c => 3} and conf.alpha.should be_a Hash
99
+ end
100
+
101
+ it 'treats multiple values as an array' do
102
+ conf = nil
103
+ expect do
104
+ conf = Configuration.new
105
+ conf.alpha :a, :b, :c
106
+ end.to_not raise_error
107
+ conf.should_not be_nil
108
+ conf.alpha.should == [ :a, :b, :c ] and conf.alpha.should be_an Array
109
+ end
110
+
111
+ it 'treats hash without brackets after multiple values as last element of array' do
112
+ conf = nil
113
+ expect do
114
+ conf = Configuration.new
115
+ conf.alpha 1, 2, 3, :a => 4, :b => 5, :c => 6
116
+ end.to_not raise_error
117
+ conf.should_not be_nil
118
+ conf.alpha.should == [ 1, 2, 3, { :a => 4, :b => 5, :c => 6} ] and conf.alpha.should be_a Array
119
+ end
120
+
121
+ end
122
+
123
+ context 'hash operators [] & []= access' do
124
+
125
+ it 'accepts symbol keys' do
126
+ conf = nil
127
+ expect do
128
+ conf = Configuration.new
129
+ conf[:alpha] = 1
130
+ end.to_not raise_error
131
+ conf[:alpha].should == 1
132
+ end
133
+
134
+ it 'accepts non-symbol (string) keys' do
135
+ conf = nil
136
+ expect do
137
+ conf = Configuration.new
138
+ conf['alpha'] = 1
139
+ end.to_not raise_error
140
+ conf.should_not be_nil
141
+ conf['alpha'].should == 1
142
+ end
143
+
144
+ end
145
+
146
+ context 'nested configuration' do
147
+
148
+ it 'is supported' do
149
+ conf = nil
150
+ expect do
151
+ conf = Configuration.new
152
+ conf.alpha Configuration.new
153
+ conf.alpha.bravo Configuration.new
154
+ conf.alpha.bravo.charlie true
155
+ end.to_not raise_error
156
+ conf.should_not be_nil
157
+ conf.alpha.should be_a Configuration
158
+ conf.alpha.bravo.should be_a Configuration
159
+ conf.alpha.bravo.charlie.should be_true
160
+ end
161
+
162
+ it 'inherits settings' do
163
+ pending 'todo'
164
+ end
165
+
166
+ it 'can override inherited settings' do
167
+ pending 'todo'
168
+ end
169
+
170
+ end
171
+
172
+ context 'yield DSL' do
173
+
174
+ it 'accepts settings without =' do
175
+ conf = nil
176
+ expect do
177
+ conf = Configuration.new do |c|
178
+ c.alpha :value
179
+ end
180
+ end.to_not raise_error
181
+ conf.should_not be_nil
182
+ conf.alpha.should == :value
183
+ end
184
+
185
+ it 'accepts settings with =' do
186
+ conf = nil
187
+ expect do
188
+ conf = Configuration.new do |c|
189
+ c.alpha = :value
190
+ end
191
+ end.to_not raise_error
192
+ conf.should_not be_nil
193
+ conf.alpha.should == :value
194
+ end
195
+
196
+ it 'can refer to an existing setting' do
197
+ conf = nil
198
+ expect do
199
+ conf = Configuration.new do |c|
200
+ c.alpha = :value
201
+ c.bravo = c.alpha
202
+ c.charlie c.bravo
203
+ end
204
+ end.to_not raise_error
205
+ conf.should_not be_nil
206
+ conf.alpha.should == :value
207
+ conf.bravo.should == :value
208
+ conf.charlie.should == :value
209
+ end
210
+
211
+ it 'returns value when creating/changing a setting' do
212
+ conf = nil
213
+ expect do
214
+ conf = Configuration.new do |c|
215
+ c.bravo = c.alpha = :value
216
+ end
217
+ end.to_not raise_error
218
+ conf.alpha.should == :value
219
+ conf.bravo.should == :value
220
+ end
221
+
222
+ end
223
+
224
+ context 'instance_eval DSL' do
225
+
226
+ it 'accepts settings without =' do
227
+ conf = nil
228
+ expect do
229
+ conf = Configuration.new do
230
+ alpha :value
231
+ end
232
+ end.to_not raise_error
233
+ conf.should_not be_nil
234
+ conf.alpha.should == :value
235
+ end
236
+
237
+ it 'sets local variables with =' do
238
+ conf = alpha = nil
239
+ expect do
240
+ alpha = nil
241
+ conf = Configuration.new do
242
+ alpha = :value
243
+ bravo alpha
244
+ end
245
+ end.to_not raise_error
246
+ conf.should_not be_nil
247
+ conf.alpha.should be_nil
248
+ conf.bravo.should == :value
249
+ alpha.should == :value # local alpha set by matching variables
250
+ end
251
+
252
+ it 'can refer to an existing setting' do
253
+ conf = nil
254
+ expect do
255
+ conf = Configuration.new do |c|
256
+ c.alpha :value
257
+ c.bravo c.alpha
258
+ c.charlie c.bravo
259
+ end
260
+ end.to_not raise_error
261
+ conf.should_not be_nil
262
+ conf.alpha.should == :value
263
+ conf.bravo.should == :value
264
+ conf.charlie.should == :value
265
+ end
266
+
267
+ it 'returns value when creating/changing a setting' do
268
+ conf = nil
269
+ expect do
270
+ conf = Configuration.new do
271
+ bravo alpha :value
272
+ end
273
+ end.to_not raise_error
274
+ conf.alpha.should == :value
275
+ conf.bravo.should == :value
276
+ end
277
+
278
+ end
279
+
280
+ end
@@ -0,0 +1,11 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iqeo-conf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-20 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2012-04-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.9.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.9.2
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.9.2
14
46
  description: A configuration DSL
15
47
  email:
16
48
  - gerard.fowley@iqeo.net
@@ -20,6 +52,7 @@ extra_rdoc_files: []
20
52
  files:
21
53
  - .bundle/config
22
54
  - .gitignore
55
+ - .rspec
23
56
  - .rvmrc
24
57
  - Gemfile
25
58
  - Gemfile.lock
@@ -29,7 +62,11 @@ files:
29
62
  - iqeo-conf.gemspec
30
63
  - lib/iqeo/configuration.rb
31
64
  - lib/iqeo/configuration/version.rb
65
+ - pkg/iqeo-conf-0.0.1.gem
66
+ - pkg/iqeo-conf-0.0.2.gem
32
67
  - scratch.txt
68
+ - spec/configuration_spec.rb
69
+ - spec/spec_helper.rb
33
70
  homepage: http://github.com/iqeo/iqeo-conf
34
71
  licenses: []
35
72
  post_install_message: