named_parameter 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|