named_parameter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,2 @@
1
+ require 'named_parameter/errors/undefined_parameters'
2
+ require 'named_parameter/errors/required_parameters'
@@ -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,10 @@
1
+ module NamedParameter
2
+ def named(def_return)
3
+ method = self.instance_method(@last_method_added)
4
+ NamedParameter::NamedMethodTransmuter.transmute method
5
+ end
6
+
7
+ def method_added(method_name)
8
+ @last_method_added = method_name
9
+ end
10
+ 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,5 @@
1
+ require 'named_parameter/named_method'
2
+ require 'named_parameter/named_method_transmuter'
3
+ require 'named_parameter/errors'
4
+ require 'named_parameter/error'
5
+ require 'named_parameter/named_parameter'
@@ -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
@@ -0,0 +1,9 @@
1
+ specify ".new(error)" do
2
+ described_class.should respond_to(:new)
3
+ .with(1)
4
+ end
5
+
6
+ specify ".match?(method,arg)" do
7
+ described_class.should respond_to(:match?)
8
+ .with(2)
9
+ end
@@ -0,0 +1,2 @@
1
+ require 'named_parameter'
2
+ require 'support/interface_helper'
@@ -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
+