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 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
+