named-parameters 0.0.19 → 0.0.20
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/RELEASENOTES +5 -0
- data/VERSION +1 -1
- data/lib/named-parameters/module.rb +105 -34
- data/named-parameters.gemspec +2 -2
- data/spec/named-parameters_spec.rb +1 -1
- metadata +4 -4
data/RELEASENOTES
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.0.20 [Dec 12, 2010]
|
2
|
+
- [INTERNAL] Modified implementation for #intercept so that it works for Ruby
|
3
|
+
1.8.6, 1.8.7, and 1.9.2
|
4
|
+
- [INTERNAL] Intercepted methods will now be able to entertain blocks (again)
|
5
|
+
|
1
6
|
0.0.19 [Dec 11, 2010]
|
2
7
|
- [INTERNAL] Will no longer require "bundler/setup"
|
3
8
|
See: https://github.com/jurisgalang/named-parameters/issues#issue/2
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.20
|
@@ -185,6 +185,16 @@ module NamedParameters
|
|
185
185
|
end
|
186
186
|
|
187
187
|
module ClassMethods
|
188
|
+
ALIAS_PREFIX = :__intercepted__
|
189
|
+
|
190
|
+
def aliased name # :nodoc:
|
191
|
+
:"#{ALIAS_PREFIX}#{name}"
|
192
|
+
end
|
193
|
+
|
194
|
+
def unaliased name # :nodoc:
|
195
|
+
name.gsub(/^#{ALIAS_PREFIX}/, '')
|
196
|
+
end
|
197
|
+
|
188
198
|
# Declares that `method` will enforce named parameters behavior as
|
189
199
|
# described in `spec`; a method declared with `:required` and/or
|
190
200
|
# `:optional` parameters will raise an `ArgumentError` if it is invoked
|
@@ -313,11 +323,13 @@ module NamedParameters
|
|
313
323
|
# add instrumentation for class methods
|
314
324
|
def singleton_method_added name # :nodoc:
|
315
325
|
apply_method_spec :"self.#{name}" do
|
316
|
-
|
317
|
-
|
318
|
-
owner
|
326
|
+
self.metaclass.send :alias_method, aliased(name), name
|
327
|
+
#method = self.metaclass.instance_method name
|
328
|
+
owner = "#{self}::"
|
329
|
+
spec = method_specs[key_for(:"self.#{name}")]
|
319
330
|
metaclass.instance_eval do
|
320
|
-
intercept method, owner, name, spec
|
331
|
+
#intercept method, owner, name, spec
|
332
|
+
intercept owner, name, spec
|
321
333
|
end
|
322
334
|
end
|
323
335
|
super
|
@@ -326,10 +338,12 @@ module NamedParameters
|
|
326
338
|
# add instrumentation for instance methods
|
327
339
|
def method_added name # :nodoc:
|
328
340
|
apply_method_spec name do
|
329
|
-
|
330
|
-
|
331
|
-
owner
|
332
|
-
|
341
|
+
alias_method aliased(name), name
|
342
|
+
#method = instance_method name
|
343
|
+
owner = "#{self}#"
|
344
|
+
spec = method_specs[key_for(name)]
|
345
|
+
#intercept method, owner, name, spec
|
346
|
+
intercept owner, name, spec
|
333
347
|
end
|
334
348
|
super
|
335
349
|
end
|
@@ -344,34 +358,91 @@ module NamedParameters
|
|
344
358
|
end
|
345
359
|
end
|
346
360
|
|
361
|
+
## insert parameter validation prior to executing the instrumented method
|
362
|
+
#def intercept method, owner, name, spec # :nodoc:
|
363
|
+
# fullname = "#{owner}#{name}"
|
364
|
+
# define_method name do |*args, &block|
|
365
|
+
# # locate the argument representing the named parameters value
|
366
|
+
# # for the method invocation
|
367
|
+
# params = args.last
|
368
|
+
# args << (params = { }) unless params.instance_of? Hash
|
369
|
+
#
|
370
|
+
# # merge the declared default values for params into the arguments
|
371
|
+
# # used when the method is invoked
|
372
|
+
# defaults = { }
|
373
|
+
# spec.each do |k, v|
|
374
|
+
# next if k == :mode
|
375
|
+
# v.each{ |entry| defaults.merge! entry if entry.instance_of? Hash }
|
376
|
+
# end
|
377
|
+
# params = defaults.merge params
|
378
|
+
#
|
379
|
+
# # validate the parameters against the spec
|
380
|
+
# NamedParameters::validate_method_specs fullname, params, spec
|
381
|
+
#
|
382
|
+
# # inject the updated argument values for params into the arguments
|
383
|
+
# # before actually making method invocation
|
384
|
+
# args[args.length - 1] = params
|
385
|
+
# method.bind(self).call(*args, &block)
|
386
|
+
# end
|
387
|
+
#end
|
388
|
+
|
347
389
|
# insert parameter validation prior to executing the instrumented method
|
348
|
-
def intercept
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
390
|
+
def intercept owner, name, spec # :nodoc:
|
391
|
+
class_eval(<<-CODE, __FILE__, __LINE__)
|
392
|
+
def #{name}(*args, &block)
|
393
|
+
# compute the fully-qualified name of the method
|
394
|
+
# this is used when reporting argument errors
|
395
|
+
fullname = "#{owner}#{name}"
|
396
|
+
|
397
|
+
# locate the argument representing the named parameters value
|
398
|
+
# for the method invocation
|
399
|
+
params = args.last
|
400
|
+
args << (params = { }) unless params.instance_of? Hash
|
401
|
+
|
402
|
+
# merge the declared default values for params into the arguments
|
403
|
+
# used when the method is invoked
|
404
|
+
spec = #{spec.inspect}
|
405
|
+
defaults = { }
|
406
|
+
spec.each do |k, v|
|
407
|
+
next if k == :mode
|
408
|
+
v.each{ |entry| defaults.merge!(entry) if entry.instance_of? Hash }
|
409
|
+
end
|
410
|
+
params = defaults.merge(params)
|
411
|
+
|
412
|
+
# validate the parameters against the spec
|
413
|
+
NamedParameters::validate_method_specs fullname, params, spec
|
356
414
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
v.each{ |entry| defaults.merge! entry if entry.instance_of? Hash }
|
415
|
+
# inject the updated argument values for params into the arguments
|
416
|
+
# before actually making method invocation
|
417
|
+
args[args.length - 1] = params
|
418
|
+
method = :"#{ALIAS_PREFIX}#{name}"
|
419
|
+
send method, *args, &block
|
363
420
|
end
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
421
|
+
CODE
|
422
|
+
|
423
|
+
#define_method name do |*args, &block|
|
424
|
+
# # locate the argument representing the named parameters value
|
425
|
+
# # for the method invocation
|
426
|
+
# params = args.last
|
427
|
+
# args << (params = { }) unless params.instance_of? Hash
|
428
|
+
#
|
429
|
+
# # merge the declared default values for params into the arguments
|
430
|
+
# # used when the method is invoked
|
431
|
+
# defaults = { }
|
432
|
+
# spec.each do |k, v|
|
433
|
+
# next if k == :mode
|
434
|
+
# v.each{ |entry| defaults.merge! entry if entry.instance_of? Hash }
|
435
|
+
# end
|
436
|
+
# params = defaults.merge params
|
437
|
+
#
|
438
|
+
# # validate the parameters against the spec
|
439
|
+
# NamedParameters::validate_method_specs fullname, params, spec
|
440
|
+
#
|
441
|
+
# # inject the updated argument values for params into the arguments
|
442
|
+
# # before actually making method invocation
|
443
|
+
# args[args.length - 1] = params
|
444
|
+
# method.bind(self).call(*args, &block)
|
445
|
+
#end
|
375
446
|
end
|
376
447
|
|
377
448
|
# initialize specs table as needed
|
@@ -382,7 +453,7 @@ module NamedParameters
|
|
382
453
|
def key_for method
|
383
454
|
type = method.to_s =~ /^self\./ ? :singleton : :instance
|
384
455
|
name = method.to_s.sub(/^self\./, '')
|
385
|
-
:"#{self}::#{type}.#{name}"
|
456
|
+
:"#{self}::#{type}.#{unaliased name}"
|
386
457
|
end
|
387
458
|
|
388
459
|
# check if in the process of instrumenting a method
|
data/named-parameters.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
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.20"
|
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-12-
|
12
|
+
s.date = %q{2010-12-12}
|
13
13
|
s.description = %q{This gem simulates named-parameters in Ruby.
|
14
14
|
It's a complement to the common Ruby idiom of using Hash args to emulate
|
15
15
|
the use of named parameters. }
|
@@ -203,7 +203,7 @@ describe "NamedParameters" do
|
|
203
203
|
lambda { Required.new :x => :x, :y => :y }.should_not raise_error
|
204
204
|
end
|
205
205
|
|
206
|
-
it "should be able to list of recognized parameters" do
|
206
|
+
it "should be able to get the list of recognized parameters" do
|
207
207
|
class DeclaredParameters
|
208
208
|
requires :x, :y
|
209
209
|
recognizes :a, :b, :c
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 20
|
9
|
+
version: 0.0.20
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Juris Galang
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-12 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -128,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
hash:
|
131
|
+
hash: -1934925740006837865
|
132
132
|
segments:
|
133
133
|
- 0
|
134
134
|
version: "0"
|