methodic 0.2 → 1.1
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.
- data/AUTHORS +8 -0
- data/COPYRIGHT +24 -0
- data/ChangeLog +17 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +6 -0
- data/INSTALL +7 -0
- data/Rakefile +9 -0
- data/doc/manual.rdoc +70 -0
- data/lib/methodic.rb +244 -16
- data/methodic.gemspec +4 -3
- data/spec/methodic_spec.rb +363 -0
- data/ultragreen_roodi_coding_convention.yml +25 -0
- metadata +13 -15
data/AUTHORS
ADDED
data/COPYRIGHT
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
methodic Copyright (c) 2012 Ultragreen Software, Romain GEORGES
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions
|
6
|
+
are met:
|
7
|
+
1. Redistributions of source code must retain the above copyright
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright
|
10
|
+
notice, this list of conditions and the following disclaimer in the
|
11
|
+
documentation and/or other materials provided with the distribution.
|
12
|
+
|
13
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
14
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
15
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
16
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
17
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
18
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
19
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
20
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
21
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
22
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
23
|
+
SUCH DAMAGE.
|
24
|
+
|
data/ChangeLog
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
methodic :
|
2
|
+
- initial dev. version
|
3
|
+
- version 0.1 (unstable)
|
4
|
+
Romain GEORGES
|
5
|
+
- initial finished release
|
6
|
+
- version 0.2 (testing, released)
|
7
|
+
Romain GEORGES
|
8
|
+
- documented, specified and tested first production release
|
9
|
+
- version 1.0 (RC)
|
10
|
+
Romain GEORGES
|
11
|
+
- WARN : DEPRECATED : (NO COMPATIBILITY) method #specify_default_value_of become #specify_default_value
|
12
|
+
- WARN : DEPRECATED : (NO COMPATIBILITY) method #specify_defaults_values_of become #specify_defaults_values
|
13
|
+
- NEW : validate_known_options flag in Mehodic::get_options (second args)
|
14
|
+
- NEW : #specify_known_option and #specify_known_options for exhaustive options control (see manual)
|
15
|
+
- patched version
|
16
|
+
- version 1.1 (RC2)
|
17
|
+
Romain GEORGES
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -7,6 +7,8 @@ GEM
|
|
7
7
|
rcov (1.0.0)
|
8
8
|
rdoc (3.12)
|
9
9
|
json (~> 1.4)
|
10
|
+
roodi (2.2.0)
|
11
|
+
ruby_parser (~> 2.3.0)
|
10
12
|
rspec (2.9.0)
|
11
13
|
rspec-core (~> 2.9.0)
|
12
14
|
rspec-expectations (~> 2.9.0)
|
@@ -15,6 +17,9 @@ GEM
|
|
15
17
|
rspec-expectations (2.9.0)
|
16
18
|
diff-lcs (~> 1.1.3)
|
17
19
|
rspec-mocks (2.9.0)
|
20
|
+
ruby_parser (2.3.1)
|
21
|
+
sexp_processor (~> 3.0)
|
22
|
+
sexp_processor (3.2.0)
|
18
23
|
yard (0.7.5)
|
19
24
|
yard-rspec (0.1)
|
20
25
|
yard
|
@@ -26,6 +31,7 @@ DEPENDENCIES
|
|
26
31
|
rake
|
27
32
|
rcov
|
28
33
|
rdoc
|
34
|
+
roodi
|
29
35
|
rspec
|
30
36
|
yard
|
31
37
|
yard-rspec
|
data/INSTALL
ADDED
data/Rakefile
CHANGED
@@ -9,6 +9,15 @@ require 'code_statistics'
|
|
9
9
|
require 'rspec/core/rake_task'
|
10
10
|
require 'yard'
|
11
11
|
require 'yard/rake/yardoc_task.rb'
|
12
|
+
require "rake/tasklib"
|
13
|
+
require "roodi"
|
14
|
+
require "roodi_task"
|
15
|
+
|
16
|
+
|
17
|
+
RoodiTask.new() do | t |
|
18
|
+
t.patterns = %w(lib/**/*.rb spec/**/*.rb features/**/*.rb)
|
19
|
+
t.config = "ultragreen_roodi_coding_convention.yml"
|
20
|
+
end
|
12
21
|
|
13
22
|
|
14
23
|
CLEAN.include('*.tmp','*.old')
|
data/doc/manual.rdoc
CHANGED
@@ -1 +1,71 @@
|
|
1
1
|
=Methodic
|
2
|
+
|
3
|
+
== Content
|
4
|
+
|
5
|
+
Author:: Romain GEORGES <romain@ultragreen.net>
|
6
|
+
Version:: 1.2
|
7
|
+
WWW:: http://www.ultragreen.net/projects/methodic
|
8
|
+
|
9
|
+
== Description
|
10
|
+
|
11
|
+
Methodic is a macro-like utility to help test, validate, control options passed by an Hash param to a method, it could help you to merge with defaults values,
|
12
|
+
It raise explained exceptions and return false if the validations steps failed.
|
13
|
+
|
14
|
+
== Installation
|
15
|
+
|
16
|
+
In a valid Ruby environment :
|
17
|
+
|
18
|
+
$ sudo zsh
|
19
|
+
# gem ins methodic
|
20
|
+
|
21
|
+
== Implementation
|
22
|
+
|
23
|
+
* [Methodic]
|
24
|
+
* [Methodic::Options]
|
25
|
+
|
26
|
+
== Example
|
27
|
+
|
28
|
+
=== Without known options control
|
29
|
+
|
30
|
+
require 'rubygems'
|
31
|
+
require 'methodic'
|
32
|
+
[...]
|
33
|
+
# in a method
|
34
|
+
def amethod ( _options = {})
|
35
|
+
myOptions = Methodic::get_options(_options) do |m|
|
36
|
+
m.specify_default_value_of :country => 'France'
|
37
|
+
m.specify_classes_of :name => String, :surname => String, :age => Fixnum, :country => String
|
38
|
+
m.specify_presence_of :name
|
39
|
+
m.specify_presence_of :surname
|
40
|
+
m.specify_formats_of :name => /\w+/, :surname => /\w+/, :country => /\w+/
|
41
|
+
m.merge!
|
42
|
+
end
|
43
|
+
# processing method
|
44
|
+
end
|
45
|
+
[...]
|
46
|
+
|
47
|
+
=== With known options control
|
48
|
+
|
49
|
+
require 'rubygems'
|
50
|
+
require 'methodic'
|
51
|
+
[...]
|
52
|
+
# in a method
|
53
|
+
def amethod ( _options = {})
|
54
|
+
myOptions = Methodic::get_options(_options,true) do |m|
|
55
|
+
# all others definitions MUST be included in known options list (explained in Spec), so : m.specify_known_options [:country,:name,:surname, :age]
|
56
|
+
m.specify_default_value_of :country => 'France'
|
57
|
+
m.specify_classes_of :name => String, :surname => String, :age => Fixnum, :country => String
|
58
|
+
m.specify_presence_of :name
|
59
|
+
m.specify_presence_of :surname
|
60
|
+
m.specify_formats_of :name => /\w+/, :surname => /\w+/, :country => /\w+/
|
61
|
+
m.merge!
|
62
|
+
end
|
63
|
+
# processing method
|
64
|
+
end
|
65
|
+
[...]
|
66
|
+
|
67
|
+
|
68
|
+
== Copyright
|
69
|
+
|
70
|
+
<pre>Methodic (c) 2012 Romain GEORGES <romain@ultragreen.net> for Ultragreen Software </pre>
|
71
|
+
|
data/lib/methodic.rb
CHANGED
@@ -1,64 +1,260 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright Ultragreen (c) 2012
|
3
|
+
#---
|
4
|
+
# Author : Romain GEORGES
|
5
|
+
# type : gem component library
|
6
|
+
# obj : Methodic Module
|
7
|
+
#---
|
1
8
|
|
9
|
+
# module Methodic
|
10
|
+
# @author Romain GEORGES <romain@ultragreen.net>
|
11
|
+
# @see http://www.ultragreen.net/projects/methodic
|
12
|
+
# @version 0.2
|
13
|
+
# @note this module include a class, but please use the module method Methodic::get_options to Build a Methodic::Options instance
|
14
|
+
# @example Complete usage
|
15
|
+
# require 'rubygems'
|
16
|
+
# require 'methodic'
|
17
|
+
# [...]
|
18
|
+
# # in a method
|
19
|
+
# def amethod ( _options = {})
|
20
|
+
# myOptions = Methodic::get_options(_options,true) do |m|
|
21
|
+
# m.specify_known_options [:country,:name,:surname,:age]
|
22
|
+
# m.specify_default_value :country => 'France'
|
23
|
+
# m.specify_classes_of :name => String, :surname => String, :age => Fixnum, :country => String
|
24
|
+
# m.specify_presence_of :name
|
25
|
+
# m.specify_presence_of :surname
|
26
|
+
# m.specify_formats_of :name => /\w+/, :surname => /\w+/, :country => /\w+/
|
27
|
+
# m.merge
|
28
|
+
# end
|
29
|
+
# # processing method
|
30
|
+
# end
|
31
|
+
# [...]
|
2
32
|
module Methodic
|
33
|
+
|
34
|
+
# class Options
|
35
|
+
# an Options utility class
|
36
|
+
# @note please do not instantiate with Options::new use Methodic::get_options
|
37
|
+
# @example Complete usage
|
38
|
+
# require 'rubygems'
|
39
|
+
# require 'methodic'
|
40
|
+
# [...]
|
41
|
+
# # in a method
|
42
|
+
# def amethod ( _options = {})
|
43
|
+
# myOptions = Methodic::get_options(_options,true) do |m|
|
44
|
+
# m.specify_known_options [:country,:name,:surname,:age]
|
45
|
+
# m.specify_default_value :country => 'France'
|
46
|
+
# m.specify_classes_of :name => String, :surname => String, :age => Fixnum, :country => String
|
47
|
+
# m.specify_presence_of :name
|
48
|
+
# m.specify_presence_of :surname
|
49
|
+
# m.specify_formats_of :name => /\w+/, :surname => /\w+/, :country => /\w+/
|
50
|
+
# m.merge
|
51
|
+
# end
|
52
|
+
# # processing method
|
53
|
+
# end
|
54
|
+
# [...]
|
3
55
|
class Options < Hash
|
56
|
+
|
57
|
+
# @example writing
|
58
|
+
# myOptions = Methodic::get_options(options)
|
59
|
+
# myOptions.known = [:name]
|
60
|
+
# myOptions.known.push :surname
|
61
|
+
# @example reading
|
62
|
+
# p myOptions.known
|
63
|
+
# => [ :name, :surname ]
|
64
|
+
# @attr [Hash] the list of all options assumed for a method
|
65
|
+
attr_accessor :known
|
4
66
|
|
5
|
-
|
67
|
+
# @example writing
|
68
|
+
# myOptions = Methodic::get_options(options)
|
69
|
+
# myOptions.classes = {:name => String }
|
70
|
+
# myOptions.classes[:surname] = String
|
71
|
+
# @example reading
|
72
|
+
# p myOptions.classes
|
73
|
+
# => { :name => String, :surname => String }
|
74
|
+
# @attr [Hash] classes a hash table of some options associated with their corresponding types or classes
|
75
|
+
attr_accessor :classes
|
76
|
+
|
77
|
+
# @attr [Array] mandatories the full list of mandatories options
|
78
|
+
# @example writing
|
79
|
+
# myOptions = Methodic::get_options(options)
|
80
|
+
# myOptions.mandatories = [:name]
|
81
|
+
# myOptions.mandatories.push :surname
|
82
|
+
# @example reading
|
83
|
+
# p myOptions.mandatories
|
84
|
+
# => [ :name, :surname ]
|
6
85
|
attr_accessor :mandatories
|
86
|
+
|
87
|
+
# @attr [Hash] defaults a hash table of some options with defaults values
|
88
|
+
# @example writing
|
89
|
+
# myOptions = Methodic::get_options(options)
|
90
|
+
# myOptions.defaults = {:name => 'John' }
|
91
|
+
# myOptions.defaults[:surname] = 'Doe'
|
92
|
+
# @example reading
|
93
|
+
# p myOptions.defaults
|
94
|
+
# => { :name => 'John', :surname => 'Doe' }
|
7
95
|
attr_accessor :defaults
|
96
|
+
|
97
|
+
# @attr [Hash] formats a hash table of some options with their corresponding
|
98
|
+
# @example writing
|
99
|
+
# myOptions = Methodic::get_options(options)
|
100
|
+
# myOptions.formats = {:name => /\w+/ }
|
101
|
+
# myOptions.defaults[:surname] = /\w+/
|
102
|
+
# @example reading
|
103
|
+
# p myOptions.defaults
|
104
|
+
# => { :name => /\w+/, :surname => /\w+/ }
|
8
105
|
attr_accessor :formats
|
9
106
|
|
10
|
-
|
107
|
+
# initializer for [Options]
|
108
|
+
# @note please do not use standalone, build from module method Methodic::get_options
|
109
|
+
# @param [Hash] _options the options hash (define for the method you would prototype)
|
110
|
+
# @note _options keys must be symbols
|
111
|
+
# @example prototype for informational only
|
112
|
+
# Methodic::Options::new({:toto => 'titi', :tutu => 'tata'})
|
113
|
+
# @return [Options] self
|
114
|
+
def initialize(_options = {},_validate_known_options = false)
|
115
|
+
|
116
|
+
raise ArgumentError::new('Argument _options must be a Hash') unless _options.class == Hash or _options.class == Methodic::Options # ;) reintrance and cascading
|
117
|
+
raise ArgumentError::new('keys must be Symbol') unless _options.keys.select{|i| i.class == Symbol }.size == _options.keys.size
|
11
118
|
self.replace _options
|
12
119
|
@defaults = Hash::new
|
13
120
|
@formats = Hash::new
|
14
121
|
@classes = Hash::new
|
122
|
+
@known = Array::new
|
15
123
|
@mandatories = Array::new
|
124
|
+
@validate_known_options = _validate_known_options
|
125
|
+
yield self if block_given?
|
16
126
|
end
|
17
127
|
|
128
|
+
|
129
|
+
# read only accessor on the [Hash] slef keys
|
130
|
+
# @return [Array] self.keys the keys of The Options object itself
|
131
|
+
# @example usage
|
132
|
+
# options = {:name => 'Doe', :surname => 'John'}
|
133
|
+
# p myOptions = Methodic::get_options(options)
|
134
|
+
# => { :name => String, :surname => String }
|
135
|
+
# p myOptions.options
|
136
|
+
# => [:name, :surname]
|
18
137
|
def options
|
19
|
-
return
|
138
|
+
return self.keys
|
20
139
|
end
|
21
140
|
|
22
|
-
|
141
|
+
|
142
|
+
# pretty accessor for specifying the default(s) value(s) for options
|
143
|
+
# @param [Hash] values a value definition, keys are symbols
|
144
|
+
# @return [hash] @defaults merged with values
|
145
|
+
# @example usage
|
146
|
+
# myOptions = Methodic::get_options(_options)
|
147
|
+
# myOptions.specify_default_value :name => 'Doe'
|
148
|
+
# myOptions.specify_defaults_values :name => 'Doe', :surname => 'John'
|
149
|
+
def specify_default_value(values)
|
23
150
|
@defaults.merge! values
|
24
|
-
|
25
|
-
|
151
|
+
return @defaults
|
152
|
+
end
|
153
|
+
alias :specify_defaults_values :specify_default_value
|
26
154
|
|
155
|
+
# pretty accessor for specifying classes of options
|
156
|
+
# @param [Hash] values a value definition, keys are symbols
|
157
|
+
# @return [hash] @classes merged with values
|
158
|
+
# @note classes must be precised in Ruby not a string like Fixnum, Hash, Array, String
|
159
|
+
# @example usage
|
160
|
+
# myOptions = Methodic::get_options(_options)
|
161
|
+
# myOptions.specify_class_of :name => String
|
162
|
+
# myOptions.specify_classes_of :name => String, :surname => String
|
27
163
|
def specify_class_of(values)
|
164
|
+
|
28
165
|
@classes.merge! values
|
166
|
+
|
167
|
+
return @classes
|
168
|
+
|
29
169
|
end
|
30
170
|
alias :specify_classes_of :specify_class_of
|
31
171
|
|
172
|
+
# pretty accessor for specifying mandatories options
|
173
|
+
# @param [Array] values a Array of symbols or a unique symbol
|
174
|
+
# @return [Array] @mandatories merged with values
|
175
|
+
# @example usage
|
176
|
+
# myOptions = Methodic::get_options(_options)
|
177
|
+
# myOptions.specify_presence_of :name
|
178
|
+
# myOptions.specify_presences_of [ :name, :surname ]
|
32
179
|
def specify_presence_of(values)
|
33
180
|
@mandatories << values
|
34
181
|
@mandatories.flatten!
|
182
|
+
@mandatories.uniq!
|
183
|
+
return @mandatories
|
35
184
|
end
|
36
185
|
alias :specify_presences_of :specify_presence_of
|
186
|
+
|
187
|
+
|
188
|
+
# pretty accessor for specifying known options
|
189
|
+
# @param [Array] values a Array of symbols or a unique symbol
|
190
|
+
# @return [Array] @known merged with values
|
191
|
+
# @example usage
|
192
|
+
# myOptions = Methodic::get_options(_options)
|
193
|
+
# myOptions.specify_known_option :name
|
194
|
+
# myOptions.specify_known_options [ :name, :surname ]
|
195
|
+
def specify_known_option(values)
|
196
|
+
@known << values
|
197
|
+
@known.flatten!
|
198
|
+
@known.uniq!
|
199
|
+
return @known
|
200
|
+
end
|
201
|
+
alias :specify_known_options :specify_known_option
|
37
202
|
|
203
|
+
# pretty accessor for specifying the format of options
|
204
|
+
# @param [Hash] values a value definition, keys are symbols
|
205
|
+
# @return [hash] @formats merged with values
|
206
|
+
# @note formats must be Regular Expression
|
207
|
+
# @example usage
|
208
|
+
# myOptions = Methodic::get_options(_options)
|
209
|
+
# myOptions.specify_format_of :name => /\w+/
|
210
|
+
# myOptions.specify_formats_of :name => /\w+/, :surname => /\w+/
|
38
211
|
def specify_format_of(values)
|
39
212
|
@formats.merge! values
|
213
|
+
return @formats
|
40
214
|
end
|
41
215
|
alias :specify_formats_of :specify_format_of
|
42
216
|
|
217
|
+
# pretty accessor for specifying condition for options
|
218
|
+
# @todo implementation of conditions
|
43
219
|
def specify_condition_for
|
44
220
|
raise NotYetImplemented
|
45
221
|
end
|
46
222
|
alias :specify_conditions_for :specify_condition_for
|
47
223
|
|
224
|
+
# default values merge method
|
225
|
+
# merge @defaults with self
|
226
|
+
# @return [self|Options]
|
227
|
+
# @example usage
|
228
|
+
# myOptions = Methodic::get_options(:name = 'Walker')
|
229
|
+
# myOptions.specify_default_value_of :surname => 'John'
|
230
|
+
# p myOptions
|
231
|
+
# # =>{:surname=>"John", :name=>"Doe"}
|
232
|
+
# myOptions.merge
|
233
|
+
# p myOptions
|
234
|
+
# # =>{:surname=>"John", :name=>"Walker"}
|
48
235
|
def merge_with_defaults
|
49
|
-
self.replace(@defaults.merge self)
|
236
|
+
self.replace( @defaults.merge self)
|
237
|
+
return self
|
50
238
|
end
|
51
|
-
|
239
|
+
alias :merge :merge_with_defaults
|
240
|
+
# Validation method for options, start the validation for classes, options, formats, presences
|
241
|
+
# @return [true|false] if validations failed or succeed
|
242
|
+
# @raise ArgumentError for each kind of validations, that could failed
|
243
|
+
# @note order for validation and Exception raising : Options inclusion >> Classes matching >> Mandatories Options presences >> Formats matching
|
52
244
|
def validate
|
53
245
|
table = []
|
54
|
-
|
55
|
-
table.push
|
246
|
+
raise ArgumentError::new("Option : known list of options empty.") and return false if @known.empty? and @validate_known_options
|
247
|
+
table.push validate_known_options if @validate_known_options
|
248
|
+
table.push validate_classes unless @classes.empty?
|
56
249
|
table.push validate_presences unless @mandatories.empty?
|
250
|
+
table.push validate_formats unless @formats.empty?
|
251
|
+
|
57
252
|
return true unless table.include?(false)
|
58
253
|
end
|
59
254
|
alias :validate! :validate
|
60
255
|
|
61
256
|
private
|
257
|
+
# private method for the formats validation step
|
62
258
|
def validate_formats
|
63
259
|
self.each do |option,value|
|
64
260
|
if @formats.key? option then
|
@@ -69,6 +265,24 @@ module Methodic
|
|
69
265
|
return true
|
70
266
|
end
|
71
267
|
|
268
|
+
# private method for known options validation step
|
269
|
+
def validate_known_options
|
270
|
+
@mandatories.each do |mdt|
|
271
|
+
raise ArgumentError::new("Mandatories options :#{mdt} is not a known options") and return false unless @known.include?(mdt)
|
272
|
+
end
|
273
|
+
@classes.each do |aclass,value|
|
274
|
+
raise ArgumentError::new("Classes definition :#{aclass} => #{value} is not a known options") and return false unless @known.include?(aclass)
|
275
|
+
end
|
276
|
+
@formats.each do |format,value|
|
277
|
+
raise ArgumentError::new("Formats definition :#{format} => #{value} is not a known options") and return false unless @known.include?(format)
|
278
|
+
end
|
279
|
+
@defaults.each do |default,value|
|
280
|
+
raise ArgumentError::new("Defaults value definition :#{default} => #{value} is not a known options") and return false unless @known.include?(default)
|
281
|
+
end
|
282
|
+
return true
|
283
|
+
end
|
284
|
+
|
285
|
+
# private method for mandatories presence validation step
|
72
286
|
def validate_presences
|
73
287
|
@mandatories.each do |mdt|
|
74
288
|
raise ArgumentError::new("Missing option : #{mdt}") and return false unless self.include?(mdt)
|
@@ -76,15 +290,29 @@ module Methodic
|
|
76
290
|
return true
|
77
291
|
end
|
78
292
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
raise ArgumentError::new("Option : #{option} type mismatch must be a #{
|
293
|
+
# private method for classes validation step
|
294
|
+
def validate_classes
|
295
|
+
@classes.each do |option,value|
|
296
|
+
raise ArgumentError::new("Option : #{option} type mismatch must be a #{value}") and return false unless self[option].class == value
|
83
297
|
end
|
84
298
|
return true
|
85
299
|
end
|
86
300
|
end
|
87
|
-
|
88
|
-
|
301
|
+
|
302
|
+
# Module method factory to build [Options] instance
|
303
|
+
# @return [Options] instance
|
304
|
+
# @param [Hash] _options the options [Hash] from the method, you want to prototype
|
305
|
+
# @example usage
|
306
|
+
# myOptions = Methodic::get_options({:foo => 'bar'})
|
307
|
+
# p myOptions.class
|
308
|
+
# => Options
|
309
|
+
# @note _options key must be symbols
|
310
|
+
def Methodic::get_options(_options = {},_validate_known_options=false)
|
311
|
+
return Methodic::Options::new(_options,_validate_known_options)
|
89
312
|
end
|
313
|
+
|
314
|
+
# Exception Class for not yet implemented methods Exceptions
|
315
|
+
class NotYetImplemented < Exception; end
|
316
|
+
|
317
|
+
|
90
318
|
end
|
data/methodic.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{methodic}
|
3
3
|
s.author = "Romain GEORGES"
|
4
|
-
s.version = "
|
5
|
-
s.date = %q{
|
4
|
+
s.version = "1.1"
|
5
|
+
s.date = %q{2013-02-14}
|
6
6
|
s.summary = %q{Methodic : Hash table options specification and validation componant}
|
7
7
|
s.email = %q{romain@ultragreen.net}
|
8
8
|
s.homepage = %q{http://www.ultragreen.net}
|
@@ -12,6 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.bindir = nil
|
13
13
|
s.required_ruby_version = '>= 1.8.1'
|
14
14
|
s.add_development_dependency "rspec", ">= 2.0.0"
|
15
|
-
s.rdoc_options << '--title' << 'Methodic :
|
15
|
+
s.rdoc_options << '--title' << 'Methodic : Gem documentation' << '--main' << 'doc/manual.rdoc' << '--line-numbers'
|
16
|
+
# << '--diagram'
|
16
17
|
s.rubyforge_project = "nowarning"
|
17
18
|
end
|
@@ -0,0 +1,363 @@
|
|
1
|
+
require'rubygems'
|
2
|
+
require'rspec'
|
3
|
+
require 'lib/methodic'
|
4
|
+
|
5
|
+
describe Methodic do
|
6
|
+
|
7
|
+
before :all do
|
8
|
+
$test_methodic_options = Methodic::get_options :name => 'Doe', :surname => 'John'
|
9
|
+
$test_methodic_options_with_known_options = Methodic::get_options({:name => 'Doe', :surname => 'John'},true)
|
10
|
+
end
|
11
|
+
before :each do
|
12
|
+
$test_methodic_options.mandatories = []
|
13
|
+
$test_methodic_options.formats = {}
|
14
|
+
$test_methodic_options.defaults = {}
|
15
|
+
$test_methodic_options.classes = {}
|
16
|
+
end
|
17
|
+
subject { Methodic }
|
18
|
+
specify { subject.should be_an_instance_of Module}
|
19
|
+
context Methodic::Options do
|
20
|
+
subject { Methodic::Options }
|
21
|
+
specify { subject.should be_an_instance_of Class }
|
22
|
+
it "should respond to all methods of a Hash" do
|
23
|
+
Hash::new.methods.each do |method|
|
24
|
+
$test_methodic_options.should respond_to(method)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
context "#new(_options) (initialization)" do
|
28
|
+
context "Exception case" do
|
29
|
+
it "should raise ArgumentError if _options is not a Hash" do
|
30
|
+
[ 'a string', 12 ,Array::new,true,false].each do |item|
|
31
|
+
lambda{ Methodic::Options::new(item)}.should raise_error ArgumentError
|
32
|
+
end
|
33
|
+
end
|
34
|
+
it "should not raise ArgumentError if no arg is passed to initializer" do
|
35
|
+
lambda{ Methodic::Options::new}.should_not raise_error
|
36
|
+
end
|
37
|
+
it "should not raise ArgumentError if an Hash arg is passed to initializer" do
|
38
|
+
lambda{ Methodic::Options::new :name => 'Doe' }.should_not raise_error
|
39
|
+
end
|
40
|
+
it "should raise ArgumentError if an Hash arg is passed to initializer but with keys different of Symbol" do
|
41
|
+
lambda{ Methodic::Options::new 'titi' => 'tutu'}.should raise_error ArgumentError
|
42
|
+
end
|
43
|
+
it "should not raise ArgumentError if two arg is passed to initializer, second arg has a boolean value, must be object" do
|
44
|
+
lambda{ Methodic::Options::new({:name => 'Doe'},true) }.should_not raise_error ArgumentError
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should raise ArgumentError if more than two arg is passed to initializer" do
|
48
|
+
lambda{ Methodic::Options::new({:name => 'Doe'},{:surname => 'John'},true) }.should raise_error ArgumentError
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
context "Instance Attributs" do
|
55
|
+
context "#classes R/W" do
|
56
|
+
it { $test_methodic_options.should respond_to("classes") }
|
57
|
+
it { $test_methodic_options.should respond_to("classes=") }
|
58
|
+
|
59
|
+
it "should be true that #classes must return a Hash" do
|
60
|
+
$test_methodic_options.classes.class.should eq(Hash)
|
61
|
+
end
|
62
|
+
it "#classes[] affectation must be possible and #classes must respond this affectation" do
|
63
|
+
$test_methodic_options.classes[:test] = String
|
64
|
+
$test_methodic_options.classes.should eq({:test => String})
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
context "#defaults R/W" do
|
69
|
+
it { $test_methodic_options.should respond_to("defaults") }
|
70
|
+
it { $test_methodic_options.should respond_to("defaults=") }
|
71
|
+
|
72
|
+
it "should be true that #defaults must return a Hash" do
|
73
|
+
$test_methodic_options.defaults.class.should eq(Hash)
|
74
|
+
end
|
75
|
+
it "#defaults[] affectation must be possible and #defaults must respond this affectation" do
|
76
|
+
$test_methodic_options.defaults[:test] = "value"
|
77
|
+
$test_methodic_options.defaults.should eq({ :test => "value"})
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "#formats R/W" do
|
82
|
+
it { $test_methodic_options.should respond_to("formats") }
|
83
|
+
it { $test_methodic_options.should respond_to("formats=") }
|
84
|
+
|
85
|
+
it "should be true that #formats must return a Hash" do
|
86
|
+
$test_methodic_options.formats.class.should eq(Hash)
|
87
|
+
end
|
88
|
+
it "#formats[] affectation must be possible and #formats must respond this affectation" do
|
89
|
+
$test_methodic_options.formats[:test] = '.*'
|
90
|
+
$test_methodic_options.formats.should eq({ :test => '.*' })
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "#mandatories R/W" do
|
95
|
+
it { $test_methodic_options.should respond_to("mandatories") }
|
96
|
+
it { $test_methodic_options.should respond_to("mandatories=") }
|
97
|
+
|
98
|
+
it "should be true that #mandatories must return a Array" do
|
99
|
+
$test_methodic_options.mandatories.class.should eq(Array)
|
100
|
+
end
|
101
|
+
it "#mandatories.push affectation must be possible and #mandatories must respond this affectation" do
|
102
|
+
$test_methodic_options.mandatories.push :test
|
103
|
+
$test_methodic_options.mandatories.should eq([:test])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
context "#known R/W" do
|
107
|
+
it { $test_methodic_options.should respond_to("known") }
|
108
|
+
it { $test_methodic_options.should respond_to("known=") }
|
109
|
+
|
110
|
+
it "should be true that #known must return a Array" do
|
111
|
+
$test_methodic_options.known.class.should eq(Array)
|
112
|
+
end
|
113
|
+
it "#known.push affectation must be possible and #known must respond this affectation" do
|
114
|
+
$test_methodic_options.known.push :test
|
115
|
+
$test_methodic_options.known.should include :test
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
context "Instance methods" do
|
120
|
+
|
121
|
+
context "#options" do
|
122
|
+
it { $test_methodic_options.should respond_to("options") }
|
123
|
+
it "should be true that #options must return a Array" do
|
124
|
+
$test_methodic_options.options.class.should eq(Array)
|
125
|
+
end
|
126
|
+
it "should respond an Array of options keys" do
|
127
|
+
$test_methodic_options.options.each do |item|
|
128
|
+
[:name,:surname].should include item
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "#specify_default_value" do
|
134
|
+
it { $test_methodic_options.should respond_to("specify_default_value") }
|
135
|
+
it { $test_methodic_options.should respond_to("specify_defaults_values") }
|
136
|
+
it "should merge default value hash record in defaults attribut" do
|
137
|
+
|
138
|
+
$test_methodic_options.specify_default_value :test => 'value'
|
139
|
+
$test_methodic_options.defaults[:test].should eq 'value'
|
140
|
+
$test_methodic_options.defaults.count.should eq 1
|
141
|
+
end
|
142
|
+
it "should redefine a new default value for a previous key" do
|
143
|
+
$test_methodic_options.specify_default_value :test => 'value'
|
144
|
+
$test_methodic_options.defaults[:test].should eq 'value'
|
145
|
+
$test_methodic_options.specify_default_value :test => 'newvalue'
|
146
|
+
$test_methodic_options.defaults[:test].should eq 'newvalue'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "#specify_class_of" do
|
151
|
+
it { $test_methodic_options.should respond_to("specify_class_of") }
|
152
|
+
it { $test_methodic_options.should respond_to("specify_classes_of") }
|
153
|
+
it "should merge class hash record in classes attribut" do
|
154
|
+
|
155
|
+
$test_methodic_options.specify_class_of :test => String
|
156
|
+
$test_methodic_options.classes[:test].should eq String
|
157
|
+
$test_methodic_options.classes.count.should eq 1
|
158
|
+
end
|
159
|
+
it "should redefine a new class value for a previous key" do
|
160
|
+
$test_methodic_options.specify_class_of :test => String
|
161
|
+
$test_methodic_options.classes[:test].should eq String
|
162
|
+
$test_methodic_options.specify_class_of :test => Integer
|
163
|
+
$test_methodic_options.classes[:test].should eq Integer
|
164
|
+
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
context "#specify_condition_for" do
|
173
|
+
it { $test_methodic_options.should respond_to("specify_condition_for") }
|
174
|
+
it { $test_methodic_options.should respond_to("specify_conditions_for") }
|
175
|
+
it { lambda{ $test_methodic_options.specify_condition_for}.should raise_error Methodic::NotYetImplemented }
|
176
|
+
end
|
177
|
+
|
178
|
+
context "#specify_format_of" do
|
179
|
+
it { $test_methodic_options.should respond_to("specify_format_of") }
|
180
|
+
it { $test_methodic_options.should respond_to("specify_formats_of") }
|
181
|
+
it "should merge format hash record in formats attribut" do
|
182
|
+
$test_methodic_options.formats = {}
|
183
|
+
$test_methodic_options.specify_format_of :test => '.*'
|
184
|
+
$test_methodic_options.formats[:test].should eq '.*'
|
185
|
+
$test_methodic_options.formats.count.should eq 1
|
186
|
+
end
|
187
|
+
it "should redefine a new format value for a previous format key" do
|
188
|
+
$test_methodic_options.specify_format_of :test => '.*'
|
189
|
+
$test_methodic_options.formats[:test].should eq '.*'
|
190
|
+
$test_methodic_options.specify_format_of :test => '\d*'
|
191
|
+
$test_methodic_options.formats[:test].should eq '\d*'
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "#specify_presence_of" do
|
196
|
+
it { $test_methodic_options.should respond_to("specify_presence_of") }
|
197
|
+
it { $test_methodic_options.should respond_to("specify_presences_of") }
|
198
|
+
it "should merge presence Array record in mandatories attribut" do
|
199
|
+
$test_methodic_options.specify_presence_of :test
|
200
|
+
$test_methodic_options.mandatories.should include(:test)
|
201
|
+
$test_methodic_options.mandatories.count.should eq 1
|
202
|
+
$test_methodic_options.specify_presence_of :test
|
203
|
+
$test_methodic_options.mandatories.should include(:test)
|
204
|
+
$test_methodic_options.mandatories.count.should eq 1
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context "#specify_known_option" do
|
209
|
+
it { $test_methodic_options.should respond_to("specify_known_option") }
|
210
|
+
it { $test_methodic_options.should respond_to("specify_known_options") }
|
211
|
+
it "should merge known Array record in known attribut" do
|
212
|
+
$test_methodic_options.specify_known_option :test
|
213
|
+
$test_methodic_options.known.should include(:test)
|
214
|
+
$test_methodic_options.known.count.should eq 1
|
215
|
+
$test_methodic_options.specify_known_option :test
|
216
|
+
$test_methodic_options.known.should include(:test)
|
217
|
+
$test_methodic_options.known.count.should eq 1
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context "#validate" do
|
222
|
+
|
223
|
+
it { $test_methodic_options.should respond_to("validate") }
|
224
|
+
it { $test_methodic_options.should respond_to("validate!") }
|
225
|
+
|
226
|
+
|
227
|
+
context "1/ validate known options" do
|
228
|
+
context "@validate_known_options = false (default)" do
|
229
|
+
it "should not raise ArgumentError if mandatories is not fully include in the known options list" do
|
230
|
+
$test_methodic_options.known = []
|
231
|
+
$test_methodic_options.specify_presences_of [ :name, :surname]
|
232
|
+
$test_methodic_options.specify_known_options [ :surname]
|
233
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
234
|
+
end
|
235
|
+
it "should not raise ArgumentError if an option in options list not in the known options list" do
|
236
|
+
$test_methodic_options.known = []
|
237
|
+
$test_methodic_options.specify_known_options [ :surname ]
|
238
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
239
|
+
end
|
240
|
+
it "should not raise if all given options in options list is in known options " do
|
241
|
+
$test_methodic_options.known = []
|
242
|
+
$test_methodic_options.specify_known_options [ :name, :surname, :optional ]
|
243
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
244
|
+
end
|
245
|
+
it "should not raise ArgumentError if formats made a reference to an unknown options" do
|
246
|
+
$test_methodic_options.known = []
|
247
|
+
$test_methodic_options.specify_format_of :nickname => /.*/
|
248
|
+
$test_methodic_options.specify_known_options [ :surname, :name ]
|
249
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
250
|
+
end
|
251
|
+
it "should not raise ArgumentError if classes made a reference to an unknown options" do
|
252
|
+
$test_methodic_options.known = []
|
253
|
+
$test_methodic_options[:nickname] = 'Jeedoe'
|
254
|
+
$test_methodic_options.specify_class_of :nickname => String
|
255
|
+
$test_methodic_options.specify_known_options [ :surname, :name ]
|
256
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
257
|
+
end
|
258
|
+
it "should not raise ArgumentError if default made a reference to an unknown options" do
|
259
|
+
$test_methodic_options.known = []
|
260
|
+
$test_methodic_options.specify_default_value :nickname => 'Jeedoe'
|
261
|
+
$test_methodic_options.specify_known_options [ :surname, :name ]
|
262
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
263
|
+
end
|
264
|
+
|
265
|
+
end
|
266
|
+
context "@validate_known_options = true" do
|
267
|
+
it "should raise ArgumentError if mandatories is not fully include in the known options list" do
|
268
|
+
$test_methodic_options_with_known_options.known = []
|
269
|
+
$test_methodic_options_with_known_options.specify_presences_of [ :name, :surname ]
|
270
|
+
$test_methodic_options_with_known_options.specify_known_options [ :surname ]
|
271
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should raise_error ArgumentError
|
272
|
+
end
|
273
|
+
it "should raise ArgumentError if an option in options list not in the known options list" do
|
274
|
+
$test_methodic_options_with_known_options.known = []
|
275
|
+
$test_methodic_options_with_known_options.specify_known_options [ :surname]
|
276
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should raise_error ArgumentError
|
277
|
+
end
|
278
|
+
it "should not raise if all given options in options list is in known options " do
|
279
|
+
$test_methodic_options_with_known_options.known = []
|
280
|
+
$test_methodic_options_with_known_options.specify_known_options [ :name, :surname,:optional]
|
281
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should_not raise_error ArgumentError
|
282
|
+
end
|
283
|
+
it "should raise ArgumentError if formats made a reference to an unknown options" do
|
284
|
+
$test_methodic_options_with_known_options.known = []
|
285
|
+
$test_methodic_options_with_known_options.specify_format_of :nickname => /.*/
|
286
|
+
$test_methodic_options_with_known_options.specify_known_options [ :surname, :name ]
|
287
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should raise_error ArgumentError
|
288
|
+
end
|
289
|
+
it "should raise ArgumentError if classes made a reference to an unknown options" do
|
290
|
+
$test_methodic_options_with_known_options.known = []
|
291
|
+
$test_methodic_options_with_known_options[:nickname] = 'Jeedoe'
|
292
|
+
$test_methodic_options_with_known_options.specify_class_of :nickname => String
|
293
|
+
$test_methodic_options_with_known_options.specify_known_options [ :surname, :name ]
|
294
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should raise_error ArgumentError
|
295
|
+
end
|
296
|
+
it "should raise ArgumentError if default made a reference to an unknown options" do
|
297
|
+
$test_methodic_options_with_known_options.known = []
|
298
|
+
$test_methodic_options_with_known_options.specify_default_value :nickname => 'Jeedoe'
|
299
|
+
$test_methodic_options_with_known_options.specify_known_options [ :surname, :name ]
|
300
|
+
lambda{$test_methodic_options_with_known_options.validate!}.should raise_error ArgumentError
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
304
|
+
|
305
|
+
end
|
306
|
+
|
307
|
+
context "2/ validate classes" do
|
308
|
+
it "should raise ArgumentError if an options don't match a class definition" do
|
309
|
+
$test_methodic_options.specify_classes_of :name => Integer, :surname => String
|
310
|
+
lambda{$test_methodic_options.validate!}.should raise_error ArgumentError
|
311
|
+
|
312
|
+
end
|
313
|
+
it "should not raise if options match class definition" do
|
314
|
+
$test_methodic_options.specify_classes_of :name => String, :surname => String
|
315
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
316
|
+
end
|
317
|
+
end
|
318
|
+
context "3/ validate mandatories" do
|
319
|
+
it "should raise ArgumentError if a mandatory option not in options list" do
|
320
|
+
$test_methodic_options.specify_presences_of [ :name , :surname, :nickname, :age ]
|
321
|
+
lambda{$test_methodic_options.validate!}.should raise_error ArgumentError
|
322
|
+
|
323
|
+
end
|
324
|
+
it "should not raise if mandatory options and options list match" do
|
325
|
+
$test_methodic_options.specify_presences_of [ :name , :surname ]
|
326
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
327
|
+
end
|
328
|
+
end
|
329
|
+
context "4/ validate formats" do
|
330
|
+
it "should raise ArgumentError if an option in options list not have the good registered formats" do
|
331
|
+
$test_methodic_options.specify_formats_of :name => /.*/, :surname => /toto.*/
|
332
|
+
lambda{$test_methodic_options.validate!}.should raise_error ArgumentError
|
333
|
+
|
334
|
+
end
|
335
|
+
it "should not raise if all options in options list match formats definitions " do
|
336
|
+
$test_methodic_options.specify_formats_of :name => /.*/, :surname => /.*/
|
337
|
+
lambda{$test_methodic_options.validate!}.should_not raise_error ArgumentError
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
|
342
|
+
end
|
343
|
+
context "#merge_with_defaults" do
|
344
|
+
it { $test_methodic_options.should respond_to("merge_with_defaults") }
|
345
|
+
it { $test_methodic_options.should respond_to("merge") }
|
346
|
+
it "should merge defaults values and don't override with options" do
|
347
|
+
$test_methodic_options.specify_defaults_values :name => 'Smith', :surname => 'Paul', :nickname => 'Jeedoe'
|
348
|
+
$test_methodic_options.merge_with_defaults
|
349
|
+
$test_methodic_options[:name].should eq "Doe"
|
350
|
+
$test_methodic_options[:surname].should eq "John"
|
351
|
+
$test_methodic_options[:nickname].should eq "Jeedoe"
|
352
|
+
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
context "Methodic::get_options" do
|
358
|
+
it "should return a Methodic::Options Object" do
|
359
|
+
Methodic::get_options({:name => 'Doe', :surname => 'John'}).should be_an_instance_of Methodic::Options
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
AssignmentInConditionalCheck:
|
2
|
+
CaseMissingElseCheck:
|
3
|
+
ClassLineCountCheck:
|
4
|
+
line_count: 300
|
5
|
+
ClassNameCheck:
|
6
|
+
pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
|
7
|
+
#ClassVariableCheck:
|
8
|
+
CyclomaticComplexityBlockCheck:
|
9
|
+
complexity: 4
|
10
|
+
CyclomaticComplexityMethodCheck:
|
11
|
+
complexity: 10
|
12
|
+
EmptyRescueBodyCheck:
|
13
|
+
ForLoopCheck:
|
14
|
+
MethodLineCountCheck:
|
15
|
+
line_count: 30
|
16
|
+
MethodNameCheck:
|
17
|
+
pattern: !ruby/regexp /^[_a-z<>=\[|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
|
18
|
+
# MissingForeignKeyIndexCheck:
|
19
|
+
ModuleLineCountCheck:
|
20
|
+
line_count: 500
|
21
|
+
ModuleNameCheck:
|
22
|
+
pattern: !ruby/regexp /^[A-Z][a-zA-Z0-9]*$/
|
23
|
+
ParameterNumberCheck:
|
24
|
+
parameter_count: 5
|
25
|
+
|
metadata
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: methodic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: "
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
version: "1.1"
|
10
9
|
platform: ruby
|
11
10
|
authors:
|
12
11
|
- Romain GEORGES
|
@@ -14,18 +13,16 @@ autorequire:
|
|
14
13
|
bindir:
|
15
14
|
cert_chain: []
|
16
15
|
|
17
|
-
date:
|
16
|
+
date: 2013-02-14 00:00:00 +01:00
|
18
17
|
default_executable:
|
19
18
|
dependencies:
|
20
19
|
- !ruby/object:Gem::Dependency
|
21
20
|
name: rspec
|
22
21
|
prerelease: false
|
23
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
23
|
requirements:
|
26
24
|
- - ">="
|
27
25
|
- !ruby/object:Gem::Version
|
28
|
-
hash: 15
|
29
26
|
segments:
|
30
27
|
- 2
|
31
28
|
- 0
|
@@ -46,10 +43,16 @@ files:
|
|
46
43
|
- lib/methodic.rb
|
47
44
|
- spec/init_spec.rb
|
48
45
|
- spec/spec_helper.rb
|
46
|
+
- spec/methodic_spec.rb
|
49
47
|
- Gemfile
|
50
48
|
- Gemfile.lock
|
51
49
|
- methodic.gemspec
|
52
50
|
- Rakefile
|
51
|
+
- COPYRIGHT
|
52
|
+
- INSTALL
|
53
|
+
- AUTHORS
|
54
|
+
- ChangeLog
|
55
|
+
- ultragreen_roodi_coding_convention.yml
|
53
56
|
has_rdoc: true
|
54
57
|
homepage: http://www.ultragreen.net
|
55
58
|
licenses: []
|
@@ -57,37 +60,32 @@ licenses: []
|
|
57
60
|
post_install_message:
|
58
61
|
rdoc_options:
|
59
62
|
- --title
|
60
|
-
- "Methodic :
|
63
|
+
- "Methodic : Gem documentation"
|
61
64
|
- --main
|
62
65
|
- doc/manual.rdoc
|
63
66
|
- --line-numbers
|
64
|
-
- --diagram
|
65
67
|
require_paths:
|
66
68
|
- lib
|
67
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
70
|
requirements:
|
70
71
|
- - ">="
|
71
72
|
- !ruby/object:Gem::Version
|
72
|
-
hash: 53
|
73
73
|
segments:
|
74
74
|
- 1
|
75
75
|
- 8
|
76
76
|
- 1
|
77
77
|
version: 1.8.1
|
78
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
79
|
requirements:
|
81
80
|
- - ">="
|
82
81
|
- !ruby/object:Gem::Version
|
83
|
-
hash: 3
|
84
82
|
segments:
|
85
83
|
- 0
|
86
84
|
version: "0"
|
87
85
|
requirements: []
|
88
86
|
|
89
87
|
rubyforge_project: nowarning
|
90
|
-
rubygems_version: 1.
|
88
|
+
rubygems_version: 1.3.6
|
91
89
|
signing_key:
|
92
90
|
specification_version: 3
|
93
91
|
summary: "Methodic : Hash table options specification and validation componant"
|