named-parameters 0.0.8 → 0.0.9
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/.gitignore +21 -0
- data/README.md +23 -0
- data/RELEASENOTES +20 -0
- data/Rakefile +3 -10
- data/VERSION +1 -1
- data/lib/named-parameters/module.rb +39 -8
- data/lib/named-parameters.rb +3 -1
- data/named-parameters.gemspec +22 -27
- data/spec/named-parameters_spec.rb +24 -0
- metadata +8 -7
data/.gitignore
ADDED
data/README.md
CHANGED
@@ -140,6 +140,29 @@ in a class definition:
|
|
140
140
|
has_named_parameters :'self.new', :optional => params, :strict
|
141
141
|
has_named_parameters :initialize, :optional => params, :strict
|
142
142
|
|
143
|
+
What Was Declared?
|
144
|
+
------------------
|
145
|
+
You can get a list of declared parameters for a method by invoking
|
146
|
+
`recognized_parameters`:
|
147
|
+
|
148
|
+
class GoogleStorage
|
149
|
+
requires :'access-key', :'secret-key'
|
150
|
+
recognizes [ :'group-email', 'group@example.org' ], [ :'apps-domain', 'example.org' ]
|
151
|
+
|
152
|
+
def initialize options
|
153
|
+
# list the parameters declared
|
154
|
+
puts "#{recognized_parameters.join(' ')}"
|
155
|
+
|
156
|
+
# ... now do the googly stuff ...
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# create an instance of GoogleStorage
|
161
|
+
# and print: [ access-key, secret-key, group-email, apps-domain ]
|
162
|
+
GoogleStorage.new :'access-key' => '...', :'secret-key' => '...'
|
163
|
+
|
164
|
+
`recognized_parameters` is also accessible from singleton methods.
|
165
|
+
|
143
166
|
Permissive Mode
|
144
167
|
---------------
|
145
168
|
When a method is declared with `has_named_parameters` that method will only
|
data/RELEASENOTES
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
0.0.9 [Nov 24, 2010]
|
2
|
+
- [FEATURE] You can now query what parameters have been declared for a method:
|
3
|
+
|
4
|
+
class Foo
|
5
|
+
has_named_parameters :bar,
|
6
|
+
:required => :x, :optional => [ :y, :z ]
|
7
|
+
def bar options = { }
|
8
|
+
required_parameters.inspect
|
9
|
+
end
|
10
|
+
|
11
|
+
has_named_parameters :'self.zoo',
|
12
|
+
:required => :a, :optional => [ :b, :c ]
|
13
|
+
def self.zoo
|
14
|
+
required_parameters.inspect
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Foo.new.bar # => [ :x, :y, :z ]
|
19
|
+
Foo.zoo # => [ :a, :b, :c ]
|
20
|
+
|
1
21
|
0.0.8 [Nov 22, 2010]
|
2
22
|
- [INTERNAL] Parameter spec will no longer be shared between singleton and
|
3
23
|
instance methods. Bonus performance improvement: it no longer needs to keep
|
data/Rakefile
CHANGED
@@ -6,16 +6,9 @@ begin
|
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "named-parameters"
|
8
8
|
gem.summary = %Q{Poor man's named-parameters in Ruby}
|
9
|
-
gem.description = %Q{This gem simulates named-parameters in Ruby.
|
10
|
-
|
11
|
-
|
12
|
-
It does this by extending the language with a `has_named_parameters` clause
|
13
|
-
that allows a class to declare the parameters that are acceptable to a method.
|
14
|
-
|
15
|
-
The `has_named_parameters` dictates how the presence of these parameters are
|
16
|
-
enforced and raises an `ArgumentError` when a method invocation is made that
|
17
|
-
violates the rules for those parameters.
|
18
|
-
}
|
9
|
+
gem.description = %Q{This gem simulates named-parameters in Ruby.
|
10
|
+
It's a complement to the common Ruby idiom of using Hash args to emulate
|
11
|
+
the use of named parameters. }
|
19
12
|
gem.email = "jurisgalang@gmail.com"
|
20
13
|
gem.homepage = "http://github.com/jurisgalang/named-parameters"
|
21
14
|
gem.authors = ["Juris Galang"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
@@ -28,6 +28,36 @@ module NamedParameters
|
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
31
|
+
# Returns the list of declared parameters for the calling method, ie: the
|
32
|
+
# concatenation `:required`, `:optional`, and `:oneof` parameter list as
|
33
|
+
# declared in the the `has_named_parameters` clause, or the list specified
|
34
|
+
# in either the `requires` and `recognizes` clause.
|
35
|
+
#
|
36
|
+
# @returns [Array] list of symbols representing the name of the declared
|
37
|
+
# parameters.
|
38
|
+
#
|
39
|
+
def recognized_parameters
|
40
|
+
klazz = self.instance_of?(Class) ? self : self.class
|
41
|
+
specs = klazz.send :specs
|
42
|
+
|
43
|
+
method = self.instance_of?(Class) ? :"self.#{calling_method}" : calling_method
|
44
|
+
spec = specs[klazz.send(:key_for, method)]
|
45
|
+
|
46
|
+
mapper = lambda{ |entry| entry.instance_of?(Hash) ? entry.keys.first : entry }
|
47
|
+
sorter = lambda{ |x, y| x.to_s <=> y.to_s }
|
48
|
+
[ :required, :optional, :oneof ].map{ |k| spec[k].map(&mapper) }.flatten.sort(&sorter)
|
49
|
+
end
|
50
|
+
|
51
|
+
# returns the name of the current method
|
52
|
+
def current_method
|
53
|
+
caller[0][/`([^']*)'/, 1].to_sym
|
54
|
+
end
|
55
|
+
|
56
|
+
# returns the name of the calling method
|
57
|
+
def calling_method
|
58
|
+
caller[1][/`([^']*)'/, 1].to_sym
|
59
|
+
end
|
60
|
+
|
31
61
|
# this is the method used to validate the name of the received parameters
|
32
62
|
# (based on the defined spec) when an instrumented method is invoked.
|
33
63
|
#
|
@@ -39,14 +69,14 @@ module NamedParameters
|
|
39
69
|
|
40
70
|
# determine what keys are allowed, unless mode is :permissive
|
41
71
|
# in which case we don't care unless its listed as required or oneof
|
42
|
-
|
43
|
-
allowed = spec[:mode] == :permissive ? [] : (optional + required + oneof).sort(&
|
72
|
+
sorter = lambda{ |x, y| x.to_s <=> y.to_s }
|
73
|
+
allowed = spec[:mode] == :permissive ? [] : (optional + required + oneof).sort(&sorter)
|
44
74
|
|
45
75
|
# determine what keys were passed;
|
46
76
|
# also, plugin the names of parameters assigned with default values
|
47
77
|
keys = params.keys.map{ |k| k.to_sym }
|
48
|
-
keys.sort! &
|
49
|
-
required.sort! &
|
78
|
+
keys.sort! &sorter
|
79
|
+
required.sort! &sorter
|
50
80
|
|
51
81
|
# this lambda is used to present the list of parameters as a string
|
52
82
|
list = lambda{ |params| params.join(", ") }
|
@@ -77,7 +107,7 @@ module NamedParameters
|
|
77
107
|
"Unrecognized parameter specified on call to #{name}: #{list[k]}" \
|
78
108
|
unless k.empty?
|
79
109
|
end
|
80
|
-
|
110
|
+
|
81
111
|
module ClassMethods
|
82
112
|
# Declares that `method` will enforce named parameters behavior as
|
83
113
|
# described in `spec`; a method declared with `:required` and/or
|
@@ -191,7 +221,7 @@ module NamedParameters
|
|
191
221
|
def singleton_method_added name # :nodoc:
|
192
222
|
instrument :"self.#{name}" do
|
193
223
|
method = self.eigenclass.instance_method name
|
194
|
-
spec = specs
|
224
|
+
spec = specs[key_for :"self.#{name}"]
|
195
225
|
owner = "#{self.name}::"
|
196
226
|
eigenclass.instance_eval do
|
197
227
|
intercept method, owner, name, spec
|
@@ -204,7 +234,7 @@ module NamedParameters
|
|
204
234
|
def method_added name # :nodoc:
|
205
235
|
instrument name do
|
206
236
|
method = instance_method name
|
207
|
-
spec = specs
|
237
|
+
spec = specs[key_for name]
|
208
238
|
owner = "#{self.name}#"
|
209
239
|
intercept method, owner, name, spec
|
210
240
|
end
|
@@ -256,7 +286,8 @@ module NamedParameters
|
|
256
286
|
|
257
287
|
def key_for method
|
258
288
|
type = method.to_s =~ /^self\./ ? :singleton : :instance
|
259
|
-
|
289
|
+
name = method.to_s.sub(/^self\./, '')
|
290
|
+
:"#{self.name}::#{type}.#{name}"
|
260
291
|
end
|
261
292
|
|
262
293
|
# check if in the process of instrumenting a method
|
data/lib/named-parameters.rb
CHANGED
data/named-parameters.gemspec
CHANGED
@@ -1,52 +1,47 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{named-parameters}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.9"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Juris Galang"]
|
12
|
-
s.date = %q{2010-11-
|
13
|
-
s.description = %q{This gem simulates named-parameters in Ruby.
|
14
|
-
|
15
|
-
|
16
|
-
It does this by extending the language with a `has_named_parameters` clause
|
17
|
-
that allows a class to declare the parameters that are acceptable to a method.
|
18
|
-
|
19
|
-
The `has_named_parameters` dictates how the presence of these parameters are
|
20
|
-
enforced and raises an `ArgumentError` when a method invocation is made that
|
21
|
-
violates the rules for those parameters.
|
22
|
-
}
|
12
|
+
s.date = %q{2010-11-24}
|
13
|
+
s.description = %q{This gem simulates named-parameters in Ruby.
|
14
|
+
It's a complement to the common Ruby idiom of using Hash args to emulate
|
15
|
+
the use of named parameters. }
|
23
16
|
s.email = %q{jurisgalang@gmail.com}
|
24
17
|
s.extra_rdoc_files = [
|
25
18
|
"README.md"
|
26
19
|
]
|
27
20
|
s.files = [
|
28
21
|
".document",
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
22
|
+
".gitignore",
|
23
|
+
"GPL-LICENSE",
|
24
|
+
"MIT-LICENSE",
|
25
|
+
"README.md",
|
26
|
+
"RELEASENOTES",
|
27
|
+
"Rakefile",
|
28
|
+
"VERSION",
|
29
|
+
"lib/named-parameters.rb",
|
30
|
+
"lib/named-parameters/module.rb",
|
31
|
+
"lib/named-parameters/object.rb",
|
32
|
+
"named-parameters.gemspec",
|
33
|
+
"spec/named-parameters_spec.rb",
|
34
|
+
"spec/spec.opts",
|
35
|
+
"spec/spec_helper.rb"
|
42
36
|
]
|
43
37
|
s.homepage = %q{http://github.com/jurisgalang/named-parameters}
|
38
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
44
39
|
s.require_paths = ["lib"]
|
45
40
|
s.rubygems_version = %q{1.3.7}
|
46
41
|
s.summary = %q{Poor man's named-parameters in Ruby}
|
47
42
|
s.test_files = [
|
48
43
|
"spec/named-parameters_spec.rb",
|
49
|
-
|
44
|
+
"spec/spec_helper.rb"
|
50
45
|
]
|
51
46
|
|
52
47
|
if s.respond_to? :specification_version then
|
@@ -202,4 +202,28 @@ describe "NamedParameters" do
|
|
202
202
|
lambda { Required.new :y => :y }.should raise_error ArgumentError
|
203
203
|
lambda { Required.new :x => :x, :y => :y }.should_not raise_error
|
204
204
|
end
|
205
|
+
|
206
|
+
it "should be able to list of recognized parameters" do
|
207
|
+
class RecognizedParameters
|
208
|
+
requires :x, :y
|
209
|
+
recognizes :a, :b, :c
|
210
|
+
attr :parameters
|
211
|
+
|
212
|
+
def initialize opts = { }
|
213
|
+
@parameters = recognized_parameters
|
214
|
+
end
|
215
|
+
|
216
|
+
has_named_parameters :'self.singleton',
|
217
|
+
:required => [ :w ],
|
218
|
+
:optional => [ :x, [ :y, 1 ], { :z => 1 } ],
|
219
|
+
:oneof => [ :a, :b, :c ]
|
220
|
+
def self.singleton opts = { }
|
221
|
+
recognized_parameters
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
o = RecognizedParameters.new(:x => :x, :y => :y)
|
226
|
+
o.parameters.should eql [ :a, :b, :c, :x, :y ]
|
227
|
+
RecognizedParameters.singleton(:w => :w, :a => :a).should eql [ :a, :b, :c, :w, :x, :y, :z ]
|
228
|
+
end
|
205
229
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: named-parameters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Juris Galang
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-24 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -48,7 +48,7 @@ dependencies:
|
|
48
48
|
version: "0"
|
49
49
|
type: :development
|
50
50
|
version_requirements: *id002
|
51
|
-
description: "This gem simulates named-parameters in Ruby. It's a complement to the common
|
51
|
+
description: "This gem simulates named-parameters in Ruby. \n It's a complement to the common Ruby idiom of using Hash args to emulate \n the use of named parameters. "
|
52
52
|
email: jurisgalang@gmail.com
|
53
53
|
executables: []
|
54
54
|
|
@@ -58,6 +58,7 @@ extra_rdoc_files:
|
|
58
58
|
- README.md
|
59
59
|
files:
|
60
60
|
- .document
|
61
|
+
- .gitignore
|
61
62
|
- GPL-LICENSE
|
62
63
|
- MIT-LICENSE
|
63
64
|
- README.md
|
@@ -76,8 +77,8 @@ homepage: http://github.com/jurisgalang/named-parameters
|
|
76
77
|
licenses: []
|
77
78
|
|
78
79
|
post_install_message:
|
79
|
-
rdoc_options:
|
80
|
-
|
80
|
+
rdoc_options:
|
81
|
+
- --charset=UTF-8
|
81
82
|
require_paths:
|
82
83
|
- lib
|
83
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|