named_parameter 0.0.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/Gemfile +11 -0
- data/README +55 -0
- data/Rakefile +27 -0
- data/lib/.named_parameter.rb.swo +0 -0
- data/lib/named_parameter/error.rb +19 -0
- data/lib/named_parameter/errors/required_parameters.rb +26 -0
- data/lib/named_parameter/errors/undefined_parameters.rb +34 -0
- data/lib/named_parameter/errors.rb +2 -0
- data/lib/named_parameter/named_method.rb +37 -0
- data/lib/named_parameter/named_method_transmuter.rb +23 -0
- data/lib/named_parameter/named_parameter.rb +10 -0
- data/lib/named_parameter/parameters.rb +15 -0
- data/lib/named_parameter.rb +5 -0
- data/named_parameter.gemspec +65 -0
- data/spec/features/collective_named_methods_feature_spec.rb +60 -0
- data/spec/features/individual_named_method_feature_spec.rb +143 -0
- data/spec/interfaces/errors_interface.rb +9 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/interface_helper.rb +17 -0
- data/spec/unit/error_spec.rb +30 -0
- data/spec/unit/errors/required_parameters_spec.rb +130 -0
- data/spec/unit/errors/undefined_parameters_spec.rb +130 -0
- data/spec/unit/named_method_spec.rb +78 -0
- data/spec/unit/named_method_transmuter_spec.rb +74 -0
- metadata +103 -0
data/Gemfile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
group :development do
|
9
|
+
gem "bundler", "~> 1.0.0"
|
10
|
+
gem "jeweler", "~> 1.6.0"
|
11
|
+
end
|
data/README
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Named Parameter `v0.0.1`
|
2
|
+
|
3
|
+
## Description
|
4
|
+
That you ever dream with named parameter in Ruby? Well, you doesn't have to pray to
|
5
|
+
Ruby's 2.0 have this, just install this gem and have fun!
|
6
|
+
|
7
|
+
## How it works
|
8
|
+
Just extend the module NamedParameter in your class/module and use the method 'named'
|
9
|
+
before define your method, when you call it, use a hash that's key is the parameter
|
10
|
+
name. See this example:
|
11
|
+
|
12
|
+
class People
|
13
|
+
extend NamedParameter
|
14
|
+
|
15
|
+
named def say(phrase)
|
16
|
+
puts "People says: #{phrase}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
People.new.say phrase: "Awesome!"
|
21
|
+
|
22
|
+
Or maybe you want to define an optional parameter, no problem!
|
23
|
+
|
24
|
+
class People
|
25
|
+
extend NamedParameter
|
26
|
+
|
27
|
+
named def say(phrase="I'm mute")
|
28
|
+
puts "People says: #{phrase}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
People.new.say
|
33
|
+
|
34
|
+
Multiple arguments? Of course!
|
35
|
+
|
36
|
+
class Point
|
37
|
+
extend NamedParameter
|
38
|
+
|
39
|
+
named def move_to(x,y,z=0)
|
40
|
+
puts "Moving to [#{x},#{y},#{z}]"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Point.new.move_to(y: 30,x: 50)
|
45
|
+
|
46
|
+
## Use in production?
|
47
|
+
**You (maybe)**:"Oh! Magic! I'll use in my production projects!"
|
48
|
+
**Me**: Wait! Before use this in production, you have to know that gem
|
49
|
+
use the [method_added callback](http://ruby-doc.org/core/classes/Module.html#M000460), so if you want to use named parameter
|
50
|
+
and this callback in the same class, you have to use [around alias spell](https://gist.github.com/534772#file_around_alias.rb).
|
51
|
+
|
52
|
+
## How Install
|
53
|
+
Install the gem:
|
54
|
+
|
55
|
+
gem install named_parameter
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.version = "0.0.1"
|
18
|
+
gem.name = "named_parameter"
|
19
|
+
gem.homepage = "http://github.com/hugolnx/named_parameter"
|
20
|
+
gem.license = "MIT"
|
21
|
+
gem.summary = %Q{Allows named parameter in ruby}
|
22
|
+
gem.description = %Q{Allows named parameter in ruby}
|
23
|
+
gem.email = "hugolnx@gmail.com"
|
24
|
+
gem.authors = ["Hugo Roque (a.k.a HugoLnx)"]
|
25
|
+
# dependencies defined in Gemfile
|
26
|
+
end
|
27
|
+
Jeweler::RubygemsDotOrgTasks.new
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module NamedParameter
|
2
|
+
class Error
|
3
|
+
attr_reader :named_method
|
4
|
+
attr_reader :argument_name
|
5
|
+
attr_reader :backtrace
|
6
|
+
|
7
|
+
def initialize(named_method,argument_name,full_backtrace)
|
8
|
+
@named_method = named_method
|
9
|
+
@argument_name = argument_name
|
10
|
+
@backtrace = clean_backtrace(full_backtrace)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def clean_backtrace(backtrace)
|
16
|
+
backtrace[2..-1]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module NamedParameter::Errors
|
2
|
+
class RequiredParameters
|
3
|
+
def self.all_when(named_method,options)
|
4
|
+
args = options[:called_with]
|
5
|
+
named_method.required_parameters.collect do |parameter_name|
|
6
|
+
unless args.has_key?(parameter_name) || args.has_key?(parameter_name.to_sym)
|
7
|
+
error = NamedParameter::Error.new(named_method,parameter_name,caller)
|
8
|
+
RequiredParameters.new(error)
|
9
|
+
end
|
10
|
+
end.compact
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(error)
|
14
|
+
@error = error
|
15
|
+
end
|
16
|
+
|
17
|
+
def raise_args
|
18
|
+
[error_message,@error.backtrace]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def error_message
|
23
|
+
"undeclared parameter named '#{@error.argument_name}' for '#{@error.named_method.method.name}' method"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module NamedParameter::Errors
|
2
|
+
class UndefinedParameters
|
3
|
+
class << self
|
4
|
+
def all_when(named_method,options)
|
5
|
+
args = options[:called_with]
|
6
|
+
args.collect do |arg|
|
7
|
+
unless match?(named_method, arg)
|
8
|
+
error = NamedParameter::Error.new(named_method, arg.first, caller)
|
9
|
+
UndefinedParameters.new(error)
|
10
|
+
end
|
11
|
+
end.compact
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def match?(named_method,arg)
|
16
|
+
arg_name = arg.first
|
17
|
+
named_method.have_a_parameter_like? arg_name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(error)
|
22
|
+
@error = error
|
23
|
+
end
|
24
|
+
|
25
|
+
def raise_args
|
26
|
+
[error_message,@error.backtrace]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def error_message
|
31
|
+
"no parameter named '#{@error.argument_name}' for '#{@error.named_method.method.name}' method"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module NamedParameter
|
2
|
+
class NamedMethod
|
3
|
+
attr_accessor :method
|
4
|
+
|
5
|
+
def initialize(method)
|
6
|
+
method.owner.instance_eval do
|
7
|
+
alias_method :"___original_#{method.name}___",method.name.to_sym
|
8
|
+
end
|
9
|
+
@method = method
|
10
|
+
end
|
11
|
+
|
12
|
+
def name_of_original
|
13
|
+
:"___original_#{@method.name}___"
|
14
|
+
end
|
15
|
+
|
16
|
+
def errors_when_called_with(args={})
|
17
|
+
errors = []
|
18
|
+
errors += Errors::UndefinedParameters.all_when self,
|
19
|
+
:called_with => args
|
20
|
+
errors += Errors::RequiredParameters.all_when self,
|
21
|
+
:called_with => args
|
22
|
+
errors
|
23
|
+
end
|
24
|
+
|
25
|
+
def required_parameters
|
26
|
+
@method.parameters.collect do |parameter|
|
27
|
+
parameter.last if parameter.first == :req
|
28
|
+
end.compact
|
29
|
+
end
|
30
|
+
|
31
|
+
def have_a_parameter_like?(arg_name)
|
32
|
+
@method.parameters.any? do |method_parameter|
|
33
|
+
method_parameter[1].to_s == arg_name.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module NamedParameter
|
2
|
+
class NamedMethodTransmuter
|
3
|
+
def self.transmute(method)
|
4
|
+
named_method = NamedMethod.new(method)
|
5
|
+
|
6
|
+
method.owner.instance_eval do
|
7
|
+
define_method (method.name) do |options={}|
|
8
|
+
errors = named_method.errors_when_called_with options
|
9
|
+
raise ArgumentError,*errors.first.raise_args unless errors.empty?
|
10
|
+
|
11
|
+
original_parameters = []
|
12
|
+
method.parameters.each do |parameter|
|
13
|
+
parameter_name = parameter.last
|
14
|
+
original_parameters << options[parameter_name]
|
15
|
+
end
|
16
|
+
|
17
|
+
original_named_method = method(named_method.name_of_original)
|
18
|
+
original_named_method.call(*original_parameters.compact)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Parameters
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
attr_reader :entries
|
5
|
+
|
6
|
+
def initialize(parameters_array)
|
7
|
+
@entries = parameters_array.collect do |parameter_array|
|
8
|
+
Parameter.new(parameter_array
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
@entries.each(&block)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{named_parameter}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Hugo Roque (a.k.a HugoLnx)"]
|
12
|
+
s.date = %q{2011-05-12}
|
13
|
+
s.description = %q{Allows named parameter in ruby}
|
14
|
+
s.email = %q{hugolnx@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"Gemfile",
|
20
|
+
"README",
|
21
|
+
"Rakefile",
|
22
|
+
"lib/.named_parameter.rb.swo",
|
23
|
+
"lib/named_parameter.rb",
|
24
|
+
"lib/named_parameter/error.rb",
|
25
|
+
"lib/named_parameter/errors.rb",
|
26
|
+
"lib/named_parameter/errors/required_parameters.rb",
|
27
|
+
"lib/named_parameter/errors/undefined_parameters.rb",
|
28
|
+
"lib/named_parameter/named_method.rb",
|
29
|
+
"lib/named_parameter/named_method_transmuter.rb",
|
30
|
+
"lib/named_parameter/named_parameter.rb",
|
31
|
+
"lib/named_parameter/parameters.rb",
|
32
|
+
"named_parameter.gemspec",
|
33
|
+
"spec/features/collective_named_methods_feature_spec.rb",
|
34
|
+
"spec/features/individual_named_method_feature_spec.rb",
|
35
|
+
"spec/interfaces/errors_interface.rb",
|
36
|
+
"spec/spec_helper.rb",
|
37
|
+
"spec/support/interface_helper.rb",
|
38
|
+
"spec/unit/error_spec.rb",
|
39
|
+
"spec/unit/errors/required_parameters_spec.rb",
|
40
|
+
"spec/unit/errors/undefined_parameters_spec.rb",
|
41
|
+
"spec/unit/named_method_spec.rb",
|
42
|
+
"spec/unit/named_method_transmuter_spec.rb"
|
43
|
+
]
|
44
|
+
s.homepage = %q{http://github.com/hugolnx/named_parameter}
|
45
|
+
s.licenses = ["MIT"]
|
46
|
+
s.require_paths = ["lib"]
|
47
|
+
s.rubygems_version = %q{1.6.2}
|
48
|
+
s.summary = %q{Allows named parameter in ruby}
|
49
|
+
|
50
|
+
if s.respond_to? :specification_version then
|
51
|
+
s.specification_version = 3
|
52
|
+
|
53
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
54
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
55
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
58
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "collective named method feature" do
|
4
|
+
before :each do
|
5
|
+
pending "Collective named methods don't is supported yet"
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "named method" do
|
9
|
+
it "should be called with a hash like parameter" do
|
10
|
+
phrase = @test.say phrase: "Hi!"
|
11
|
+
phrase.should be == "Hi!"
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "parameter" do
|
15
|
+
it "should can be optional" do
|
16
|
+
@test.optional_say.should be == "I'm mute"
|
17
|
+
end
|
18
|
+
|
19
|
+
context "multiple" do
|
20
|
+
it "should can have any order" do
|
21
|
+
@test.move_to(y: 2, x:1).should be == [1,2]
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should can be optional" do
|
25
|
+
@test.three_params_first_optional(y:10,z:20).should be == [:x,10,20]
|
26
|
+
@test.three_params_middle_optional(z:20,x:10).should be == [10,:y,20]
|
27
|
+
@test.three_params_last_optional(x:20,y:10).should be == [20,10,:z]
|
28
|
+
@test.three_params_first_2_optionals(z:10).should be == [:x,:y,10]
|
29
|
+
@test.three_params_last_2_optionals(x:10).should be == [10,:y,:z]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "after reopen class" do
|
34
|
+
it "should be a no named method" do
|
35
|
+
pending :bug
|
36
|
+
@test.after_opened_say("hello").should be == "hello"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "ArgumentError when" do
|
41
|
+
it "called but not defined" do
|
42
|
+
lambda{@test.say(phrase: "hi!",undefined: "hugo")}.should raise_error ArgumentError, /'undefined'[\w\s]*'say'/
|
43
|
+
lambda{@test.say(undefined: "hugo")}.should raise_error ArgumentError
|
44
|
+
end
|
45
|
+
|
46
|
+
it "required but not called" do
|
47
|
+
lambda {@test.say}.should raise_error ArgumentError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "no named method" do
|
55
|
+
it "should be call with normal parameters" do
|
56
|
+
phrase = @test.no_named_say "Hi!"
|
57
|
+
phrase.should be == "Hi!"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "individual named method feature" do
|
4
|
+
describe "becomes possible:" do
|
5
|
+
describe 'Named Parameter' do
|
6
|
+
specify %q{
|
7
|
+
class People
|
8
|
+
extend NamedParameter
|
9
|
+
|
10
|
+
named def say(phrase)
|
11
|
+
phrase
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
People.new.say phrase: "Hi!"
|
16
|
+
# => "Hi!"
|
17
|
+
} do
|
18
|
+
class People
|
19
|
+
extend NamedParameter
|
20
|
+
|
21
|
+
named def say(phrase)
|
22
|
+
phrase
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
phrase = People.new.say phrase: "Hi!"
|
27
|
+
phrase.should be == "Hi!"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'Optional Named Parameter' do
|
32
|
+
specify %q{
|
33
|
+
class People
|
34
|
+
extend NamedParameter
|
35
|
+
|
36
|
+
named def say(phrase="I'm mute")
|
37
|
+
phrase
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
People.new.say
|
42
|
+
# => "I'm mute"
|
43
|
+
} do
|
44
|
+
class People
|
45
|
+
extend NamedParameter
|
46
|
+
|
47
|
+
named def say(phrase="I'm mute")
|
48
|
+
phrase
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
phrase = People.new.say
|
53
|
+
phrase.should be == "I'm mute"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'Multiple Named Parameter (in any order)' do
|
58
|
+
specify %q{
|
59
|
+
class Point
|
60
|
+
extend NamedParameter
|
61
|
+
|
62
|
+
named def move_to(x,y)
|
63
|
+
[x,y]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
Point.new.move_to x: 1,y: 2
|
68
|
+
# => [1,2]
|
69
|
+
|
70
|
+
Point.new.move_to y: 2, x: 1
|
71
|
+
# => [1,2]
|
72
|
+
} do
|
73
|
+
class Point
|
74
|
+
extend NamedParameter
|
75
|
+
|
76
|
+
named def move_to(x,y)
|
77
|
+
[x,y]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
position = Point.new.move_to x: 1,y: 2
|
82
|
+
position.should be == [1,2]
|
83
|
+
|
84
|
+
position = Point.new.move_to y: 2, x: 1
|
85
|
+
position.should be == [1,2]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe 'ArgumentError when given undefined args' do
|
90
|
+
specify %q{
|
91
|
+
class People
|
92
|
+
extend NamedParameter
|
93
|
+
named def say(phrase)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
People.new.say phrase: "hi!",undefined: "test"
|
98
|
+
#=> ArgumentError
|
99
|
+
} do
|
100
|
+
class People
|
101
|
+
named def say(phrase)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
lambda{People.new.say(phrase: "hi!",undefined: "hugo")}.should raise_error ArgumentError, /'undefined'[\w\s]*'say'/
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe 'ArgumentError when not given required args' do
|
110
|
+
specify %q{
|
111
|
+
class People
|
112
|
+
extend NamedParameter
|
113
|
+
named def say(phrase)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
People.new.say
|
118
|
+
#=> ArgumentError
|
119
|
+
} do
|
120
|
+
class People
|
121
|
+
extend NamedParameter
|
122
|
+
named def say(phrase)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
lambda {People.new.say}.should raise_error ArgumentError, /'phrase'[\w\s]*'say'/
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "no named method" do
|
132
|
+
it "can be called with normal parameters" do
|
133
|
+
class People
|
134
|
+
def no_named_say(phrase)
|
135
|
+
phrase
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
phrase = People.new.no_named_say "Hi!"
|
140
|
+
phrase.should be == "Hi!"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
here = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
interfaces_paths = Dir[File.join(here,'../interfaces/*_interface.rb')]
|
4
|
+
|
5
|
+
interfaces_paths.each do |interface_path|
|
6
|
+
interface_filename = File.basename(interface_path)[/^[^.]+/]
|
7
|
+
method_name = "respect_#{interface_filename}"
|
8
|
+
context_description = method_name.gsub(/_./){|a| a.sub('_',' ').upcase}
|
9
|
+
|
10
|
+
RSpec::Core::ExampleGroup.singleton_class.instance_eval do
|
11
|
+
define_method method_name do
|
12
|
+
context context_description do
|
13
|
+
eval File.read(interface_path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module NamedParameter
|
4
|
+
describe Error do
|
5
|
+
describe '#initialize(named_method,argument,full_backtrace)' do
|
6
|
+
describe 'initialize instance variables' do
|
7
|
+
before :each do
|
8
|
+
@named_method = stub :named_method
|
9
|
+
@argument_name = []
|
10
|
+
@full_backtrace = []
|
11
|
+
@error = Error.new(@named_method,@argument_name,@full_backtrace)
|
12
|
+
end
|
13
|
+
|
14
|
+
specify '@named_method its equal to named_method' do
|
15
|
+
@error.instance_variable_get(:@named_method).should be == @named_method
|
16
|
+
end
|
17
|
+
|
18
|
+
specify '@argument_name its equal to argument_name' do
|
19
|
+
@error.instance_variable_get(:@argument_name).should be == @argument_name
|
20
|
+
end
|
21
|
+
|
22
|
+
specify '@backtrace its equal to full_backtrace without two first slots' do
|
23
|
+
full_backtrace = [1,2,3]
|
24
|
+
error = Error.new(@named_method,@argument_name,full_backtrace)
|
25
|
+
error.instance_variable_get(:@backtrace).should be == [3]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module NamedParameter::Errors
|
4
|
+
describe RequiredParameters do
|
5
|
+
describe '#initialize(error)' do
|
6
|
+
describe 'initialize instance variables' do
|
7
|
+
specify '@error its equal to error' do
|
8
|
+
specific_error = RequiredParameters.new :error
|
9
|
+
specific_error.instance_variable_get(:@error).should be == :error
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#raise_args' do
|
15
|
+
before :each do
|
16
|
+
# prevention from dependencies
|
17
|
+
@error = stub(:error).as_null_object
|
18
|
+
@error.stub_chain('named_method.method.name')
|
19
|
+
end
|
20
|
+
|
21
|
+
let :instance do
|
22
|
+
RequiredParameters.new @error
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'return' do
|
26
|
+
let :the_return do
|
27
|
+
instance.raise_args
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is an array of 2 elements' do
|
31
|
+
the_return.should be_an Array
|
32
|
+
the_return.should have(2).elements
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
describe 'first element' do
|
37
|
+
let :first_element do
|
38
|
+
the_return.first
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'is a String of the error message' do
|
42
|
+
first_element.should be_a String
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'include the name of argument envolved in the error' do
|
46
|
+
@error.stub :argument_name => 'arg_name'
|
47
|
+
first_element.should include 'arg_name'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'include the name of method envolved in the error' do
|
51
|
+
@error.stub_chain('named_method.method.name').and_return('method_name')
|
52
|
+
first_element.should include 'method_name'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
describe 'second element' do
|
58
|
+
let :second_element do
|
59
|
+
the_return[1]
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'is an Array of backtrace' do
|
63
|
+
backtrace = [:backtrace]
|
64
|
+
@error.stub(:backtrace).and_return(backtrace)
|
65
|
+
second_element.should be == backtrace
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
describe 'integrations' do
|
73
|
+
after :each do
|
74
|
+
instance.raise_args
|
75
|
+
end
|
76
|
+
|
77
|
+
specify '@error.argument_name' do
|
78
|
+
@error.should_receive :argument_name
|
79
|
+
end
|
80
|
+
|
81
|
+
specify '@error.named_method' do
|
82
|
+
@error.should_receive :named_method
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.all_when(named_method,{called_with:arg})' do
|
88
|
+
describe 'return' do
|
89
|
+
before :each do
|
90
|
+
@named_method = stub(:named_method,
|
91
|
+
:parameters => [[:req,:param1]],
|
92
|
+
:required_parameters => [:param1],
|
93
|
+
:have_a_parameter_like? => false)
|
94
|
+
@args = {:arg_name => :value}
|
95
|
+
end
|
96
|
+
|
97
|
+
let :the_return do
|
98
|
+
RequiredParameters.all_when(@named_method,:called_with => @args)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'is an Array' do
|
102
|
+
the_return.should be_an Array
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'given some required parameter wasn\'t passed' do
|
106
|
+
it 'have one element' do
|
107
|
+
@args = {}
|
108
|
+
the_return.should have(1).element
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'given all required parameters was passed' do
|
113
|
+
it 'is empty' do
|
114
|
+
@args = {:param1 => 'value1'}
|
115
|
+
the_return.should be_empty
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe 'integrations' do
|
121
|
+
specify "named_method.required_parameters" do
|
122
|
+
named_method = stub(:named_method)
|
123
|
+
named_method.should_receive(:required_parameters)
|
124
|
+
.and_return([])
|
125
|
+
RequiredParameters.all_when(named_method,:called_with => [])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module NamedParameter::Errors
|
4
|
+
describe UndefinedParameters do
|
5
|
+
describe '#initialize(error)' do
|
6
|
+
describe 'initialize instance variables' do
|
7
|
+
specify '@error its equal to error' do
|
8
|
+
specific_error = UndefinedParameters.new :error
|
9
|
+
specific_error.instance_variable_get(:@error).should be == :error
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#raise_args' do
|
15
|
+
before :each do
|
16
|
+
# prevention from dependencies
|
17
|
+
@error = stub(:error).as_null_object
|
18
|
+
@error.stub_chain('named_method.method.name')
|
19
|
+
end
|
20
|
+
|
21
|
+
let :instance do
|
22
|
+
UndefinedParameters.new @error
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'return' do
|
26
|
+
let :the_return do
|
27
|
+
instance.raise_args
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'is an array of 2 elements' do
|
31
|
+
the_return.should be_an Array
|
32
|
+
the_return.should have(2).elements
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
describe 'first element' do
|
37
|
+
let :first_element do
|
38
|
+
the_return.first
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'is a String of the error message' do
|
42
|
+
first_element.should be_a String
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'include the name of argument envolved in the error' do
|
46
|
+
@error.stub :argument_name => 'arg_name'
|
47
|
+
first_element.should include 'arg_name'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'include the name of method envolved in the error' do
|
51
|
+
@error.stub_chain('named_method.method.name').and_return('method_name')
|
52
|
+
first_element.should include 'method_name'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
describe 'second element' do
|
58
|
+
let :second_element do
|
59
|
+
the_return[1]
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'is an Array of backtrace' do
|
63
|
+
backtrace = [:backtrace]
|
64
|
+
@error.stub(:backtrace).and_return(backtrace)
|
65
|
+
second_element.should be == backtrace
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
describe 'integrations' do
|
73
|
+
after :each do
|
74
|
+
instance.raise_args
|
75
|
+
end
|
76
|
+
|
77
|
+
specify '@error.argument_name' do
|
78
|
+
@error.should_receive :argument_name
|
79
|
+
end
|
80
|
+
|
81
|
+
specify '@error.named_method' do
|
82
|
+
@error.should_receive :named_method
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '.all_when(named_method,{called_with:args})' do
|
88
|
+
describe 'return' do
|
89
|
+
before :each do
|
90
|
+
@named_method = stub(:named_method,
|
91
|
+
:parameters => [[:req,:param1]],
|
92
|
+
:have_a_parameter_like? => false)
|
93
|
+
@args = {:arg_name => :value}
|
94
|
+
end
|
95
|
+
|
96
|
+
let :the_return do
|
97
|
+
UndefinedParameters.all_when(@named_method,:called_with => @args)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'is an Array' do
|
101
|
+
the_return.should be_an Array
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'given some arg does not exist in method parameters' do
|
105
|
+
it 'have one element' do
|
106
|
+
@named_method.stub!(:have_a_parameter_like? => false)
|
107
|
+
the_return.should have(1).element
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'given all arguments exist in method parameters' do
|
112
|
+
it 'is empty' do
|
113
|
+
@named_method.stub!(:have_a_parameter_like? => true)
|
114
|
+
the_return.should be == []
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe 'integrations' do
|
120
|
+
specify "named_method.have_a_parameter_like?(arg)" do
|
121
|
+
named_method = stub(:named_method)
|
122
|
+
args = {:arg_name => :value}
|
123
|
+
named_method.should_receive(:have_a_parameter_like?)
|
124
|
+
.with(:arg_name)
|
125
|
+
UndefinedParameters.all_when(named_method,:called_with => args)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module NamedParameter
|
4
|
+
describe NamedMethod do
|
5
|
+
before :each do
|
6
|
+
@method = stub(:method).as_null_object
|
7
|
+
@named_method = NamedMethod.new @method
|
8
|
+
end
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
class Klass
|
12
|
+
def method1
|
13
|
+
end
|
14
|
+
def method2(required_parameter,not_required_parameter="optional")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
@instance = Klass.new
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#initialize(method)" do
|
21
|
+
it "create an alias to method" do
|
22
|
+
method = @instance.method(:method1)
|
23
|
+
NamedMethod.new method
|
24
|
+
@instance.should respond_to :"___original_method1___"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#name_of_original" do
|
29
|
+
it "is the name of original method" do
|
30
|
+
method = @instance.method(:method1)
|
31
|
+
named_method = NamedMethod.new(method)
|
32
|
+
named_method.name_of_original.should be == :___original_method1___
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#required_parameters" do
|
37
|
+
it "is an array with all required parameters" do
|
38
|
+
method = @instance.method(:method2)
|
39
|
+
named_method = NamedMethod.new(method)
|
40
|
+
named_method.required_parameters.should be == [:required_parameter]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#have_a_parameter_like?(arg_name)" do
|
45
|
+
context 'given have a parameter named arg_name' do
|
46
|
+
it "is true" do
|
47
|
+
method = @instance.method(:method2)
|
48
|
+
named_method = NamedMethod.new(method)
|
49
|
+
the_return = named_method.have_a_parameter_like?(:required_parameter)
|
50
|
+
the_return.should be_true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#errors_when_called_with(parameters)" do
|
56
|
+
before :each do
|
57
|
+
Errors::RequiredParameters.stub!(:all_when).and_return([])
|
58
|
+
Errors::UndefinedParameters.stub!(:all_when).and_return([])
|
59
|
+
method = @instance.method(:method1)
|
60
|
+
@named_method = NamedMethod.new(method)
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "integrations" do
|
64
|
+
it "Errors::UndefinedParameters.all_when(method,{called_with:args})" do
|
65
|
+
Errors::UndefinedParameters.should_receive(:all_when)
|
66
|
+
.and_return([])
|
67
|
+
@named_method.errors_when_called_with(:args)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "Errors::RequiredParameters.all_when(method,{called_with:args})" do
|
71
|
+
Errors::RequiredParameters.should_receive(:all_when)
|
72
|
+
.and_return([])
|
73
|
+
@named_method.errors_when_called_with(:args)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module NamedParameter
|
4
|
+
describe NamedMethodTransmuter do
|
5
|
+
before :each do
|
6
|
+
@klass = Class.new do
|
7
|
+
def method1
|
8
|
+
end
|
9
|
+
|
10
|
+
def method2(param1)
|
11
|
+
param1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@instance = @klass.new
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".transmute(method)" do
|
18
|
+
describe "integrations" do
|
19
|
+
it "NamedMethod.new(method)" do
|
20
|
+
method = @klass.instance_method(:method1)
|
21
|
+
NamedMethod.should_receive(:new).with(method)
|
22
|
+
NamedMethodTransmuter.transmute method
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "override old method to a mirror that receive hash" do
|
27
|
+
method = @instance.method(:method2)
|
28
|
+
NamedMethodTransmuter.transmute method
|
29
|
+
@instance.should be_respond_to(:method2, param1: "teste")
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "mirror method" do
|
33
|
+
describe "integrations" do
|
34
|
+
specify "NamedMethod#name_of_original(parameters)" do
|
35
|
+
method = @klass.instance_method(:method1)
|
36
|
+
named_method = NamedMethod.new(method)
|
37
|
+
NamedMethod.stub!(:new => named_method)
|
38
|
+
@instance.stub_chain(:method,:call)
|
39
|
+
NamedMethodTransmuter.transmute method
|
40
|
+
named_method.should_receive(:name_of_original)
|
41
|
+
@instance.method1
|
42
|
+
end
|
43
|
+
|
44
|
+
specify "NamedMethod#errors_when_called_with(args)" do
|
45
|
+
NamedMethod.method_defined?(:errors_when_called_with).should be_true
|
46
|
+
method = @klass.instance_method(:method1)
|
47
|
+
named_method = NamedMethod.new(method)
|
48
|
+
NamedMethod.stub!(:new => named_method)
|
49
|
+
NamedMethodTransmuter.transmute method
|
50
|
+
named_method.should_receive(:errors_when_called_with)
|
51
|
+
.and_return([])
|
52
|
+
@instance.method1
|
53
|
+
end
|
54
|
+
|
55
|
+
specify "Errors::SomeError#raise_args" do
|
56
|
+
method = @klass.instance_method(:method1)
|
57
|
+
errors = stub(:errors)
|
58
|
+
NamedMethod.stub_chain(:new,:errors_when_called_with)
|
59
|
+
.and_return(errors)
|
60
|
+
error = stub(:error)
|
61
|
+
errors.stub!(:first)
|
62
|
+
.and_return(error)
|
63
|
+
errors.stub!(:empty?)
|
64
|
+
.and_return(false)
|
65
|
+
NamedMethodTransmuter.transmute method
|
66
|
+
error.should_receive(:raise_args)
|
67
|
+
.and_return([])
|
68
|
+
lambda{@instance.method1}.should raise_error ArgumentError
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: named_parameter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Hugo Roque (a.k.a HugoLnx)
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-12 00:00:00 -03:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: bundler
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.0.0
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jeweler
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.6.0
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Allows named parameter in ruby
|
39
|
+
email: hugolnx@gmail.com
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- README
|
46
|
+
files:
|
47
|
+
- Gemfile
|
48
|
+
- README
|
49
|
+
- Rakefile
|
50
|
+
- lib/.named_parameter.rb.swo
|
51
|
+
- lib/named_parameter.rb
|
52
|
+
- lib/named_parameter/error.rb
|
53
|
+
- lib/named_parameter/errors.rb
|
54
|
+
- lib/named_parameter/errors/required_parameters.rb
|
55
|
+
- lib/named_parameter/errors/undefined_parameters.rb
|
56
|
+
- lib/named_parameter/named_method.rb
|
57
|
+
- lib/named_parameter/named_method_transmuter.rb
|
58
|
+
- lib/named_parameter/named_parameter.rb
|
59
|
+
- lib/named_parameter/parameters.rb
|
60
|
+
- named_parameter.gemspec
|
61
|
+
- spec/features/collective_named_methods_feature_spec.rb
|
62
|
+
- spec/features/individual_named_method_feature_spec.rb
|
63
|
+
- spec/interfaces/errors_interface.rb
|
64
|
+
- spec/spec_helper.rb
|
65
|
+
- spec/support/interface_helper.rb
|
66
|
+
- spec/unit/error_spec.rb
|
67
|
+
- spec/unit/errors/required_parameters_spec.rb
|
68
|
+
- spec/unit/errors/undefined_parameters_spec.rb
|
69
|
+
- spec/unit/named_method_spec.rb
|
70
|
+
- spec/unit/named_method_transmuter_spec.rb
|
71
|
+
has_rdoc: true
|
72
|
+
homepage: http://github.com/hugolnx/named_parameter
|
73
|
+
licenses:
|
74
|
+
- MIT
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 270356975
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: "0"
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 1.6.2
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Allows named parameter in ruby
|
102
|
+
test_files: []
|
103
|
+
|