named_parameter 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.swp
2
+ *.swo
3
+ Gemfile.lock
4
+ pkg/
data/Gemfile CHANGED
@@ -1,11 +1,4 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
1
+ source 'https://rubygems.org'
5
2
 
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
3
+ # Specify your gem's dependencies in named_parameter.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Named Parameter `v0.0.5`
1
+ # Named Parameter `v1.0.0`
2
2
 
3
3
  ## Description
4
4
  That you ever dream with named parameter in Ruby? Well, you doesn't have to pray to
data/Rakefile CHANGED
@@ -1,27 +1,2 @@
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 = "1.0.0"
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
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,5 @@
1
+ module NamedParameter::Errors
2
+ class OnIrbException < Exception
3
+ MESSAGE = %q{This specific parameters don't work on IRB, just with ".rb" files.}
4
+ end
5
+ end
@@ -1,3 +1,4 @@
1
1
  require 'named_parameter/errors/undefined_parameters'
2
2
  require 'named_parameter/errors/required_parameters'
3
3
  require 'named_parameter/errors/not_hash'
4
+ require 'named_parameter/errors/on_irb_exception'
@@ -8,11 +8,8 @@ module NamedParameter
8
8
  errors = named_method.errors_when_called_with options
9
9
  raise ArgumentError,*errors.first.raise_args unless errors.empty?
10
10
 
11
- original_parameters = []
12
- method.parameters.each do |parameter|
13
- parameter_name = parameter.last
14
- original_parameters << options[parameter_name]
15
- end
11
+ adapter = NamedParameter::ParametersAdapter.new(method)
12
+ original_parameters = adapter.hash_to_args(options)
16
13
 
17
14
  original_named_method = method(named_method.name_of_original)
18
15
  original_named_method.call(*original_parameters.compact)
@@ -0,0 +1,86 @@
1
+ module NamedParameter
2
+ class ParametersAdapter
3
+ NO_ARGUMENT = Object.new
4
+
5
+ attr_reader :method
6
+
7
+ def initialize(method)
8
+ @method = method
9
+ end
10
+
11
+ def hash_to_args(options)
12
+ original_parameters = []
13
+ @method.parameters.each_with_index do |parameter, i|
14
+ parameter_name = parameter.last
15
+ if options.has_key? parameter_name
16
+ original_parameters << options[parameter_name]
17
+ else
18
+ original_parameters << NO_ARGUMENT
19
+ end
20
+ end
21
+
22
+ arguments = fill_no_arguments(original_parameters)
23
+
24
+ return arguments
25
+ end
26
+
27
+ private
28
+
29
+ def fill_no_arguments(arguments)
30
+ while arguments.last.equal? NO_ARGUMENT
31
+ last_index = arguments.size - 1
32
+ arguments.delete_at last_index
33
+ end
34
+
35
+ if arguments.any?{|arg| arg.equal? NO_ARGUMENT}
36
+ filepath = @method.source_location[0]
37
+ linenumber = @method.source_location[1]
38
+
39
+ if filepath.downcase == "(irb)"
40
+ msg = NamedParameter::Errors::OnIrbException::MESSAGE
41
+ raise NamedParameter::Errors::OnIrbException, msg
42
+ end
43
+
44
+ content = File.read(filepath).split("\n")[(linenumber-1)..-1].join.strip
45
+
46
+ default_values = extract_default_values content
47
+
48
+ arguments.map!.with_index do |arg, i|
49
+ no_argument = arg.equal? NO_ARGUMENT
50
+ no_argument ? default_values[i] : arg
51
+ end
52
+ end
53
+
54
+ return arguments
55
+ end
56
+
57
+ def extract_default_values(file_fragment)
58
+ match = file_fragment.match /^[^\(]*\(([^\)]*)\)/
59
+ args_fragment = match[1]
60
+ args_fragments = extract_args_fragments args_fragment
61
+ default_values = args_fragments.map{|frag| eval(frag.gsub(/^[^=]*(=|$)/, ""))}
62
+ return default_values
63
+ end
64
+
65
+ def extract_args_fragments(fragment)
66
+ base_frags = fragment.split ","
67
+ frags = []
68
+ i = 0
69
+ while i < base_frags.size
70
+ frag = base_frags[i]
71
+ while inconsistent_fragment?(frag)
72
+ i += 1
73
+ frag += ",#{base_frags[i]}"
74
+ end
75
+ frags << frag
76
+ i += 1;
77
+ end
78
+ return frags
79
+ end
80
+
81
+ def inconsistent_fragment?(fragment)
82
+ return fragment.count("([{") != fragment.count(")]}") ||
83
+ fragment.count(%q{"'/}).odd?
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module NamedParameter
2
+ VERSION = "1.0.1"
3
+ end
@@ -1,3 +1,4 @@
1
+ require 'named_parameter/version'
1
2
  require 'named_parameter/named_method'
2
3
  require 'named_parameter/named_method_transmuter'
3
4
  require 'named_parameter/errors'
@@ -5,3 +6,4 @@ require 'named_parameter/error'
5
6
  require 'named_parameter/named_above'
6
7
  require 'named_parameter/named_inline'
7
8
  require 'named_parameter/named_parameter'
9
+ require 'named_parameter/parameters_adapter'
@@ -1,70 +1,17 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/named_parameter/version', __FILE__)
5
3
 
6
- Gem::Specification.new do |s|
7
- s.name = "named_parameter"
8
- s.version = "1.0.0"
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Hugo Roque"]
6
+ gem.email = ["hugolnx@gmail.com"]
7
+ gem.description = %q{Allows named parameter in ruby}
8
+ gem.summary = %Q{named_parameter-#{NamedParameter::VERSION}}
9
+ gem.homepage = "http://github.com/hugolnx/named_parameter/"
9
10
 
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 = "2012-08-08"
13
- s.description = "Allows named parameter in ruby"
14
- s.email = "hugolnx@gmail.com"
15
- s.extra_rdoc_files = [
16
- "README.md"
17
- ]
18
- s.files = [
19
- "Gemfile",
20
- "README.md",
21
- "Rakefile",
22
- "lib/named_parameter.rb",
23
- "lib/named_parameter/error.rb",
24
- "lib/named_parameter/errors.rb",
25
- "lib/named_parameter/errors/not_hash.rb",
26
- "lib/named_parameter/errors/required_parameters.rb",
27
- "lib/named_parameter/errors/undefined_parameters.rb",
28
- "lib/named_parameter/named_above.rb",
29
- "lib/named_parameter/named_inline.rb",
30
- "lib/named_parameter/named_method.rb",
31
- "lib/named_parameter/named_method_transmuter.rb",
32
- "lib/named_parameter/named_parameter.rb",
33
- "lib/named_parameter/parameters.rb",
34
- "named_parameter.gemspec",
35
- "spec/features/named_above/class_self_named_method_feature_spec.rb",
36
- "spec/features/named_above/individual_named_method_feature_spec.rb",
37
- "spec/features/named_above/singleton_named_method_feature_spec.rb",
38
- "spec/features/named_inline/class_self_named_method_feature_spec.rb",
39
- "spec/features/named_inline/individual_named_method_feature_spec.rb",
40
- "spec/features/named_inline/singleton_named_method_feature_spec.rb",
41
- "spec/spec_helper.rb",
42
- "spec/unit/error_spec.rb",
43
- "spec/unit/errors/not_hash_spec.rb",
44
- "spec/unit/errors/required_parameters_spec.rb",
45
- "spec/unit/errors/undefined_parameters_spec.rb",
46
- "spec/unit/named_method_spec.rb",
47
- "spec/unit/named_method_transmuter_spec.rb"
48
- ]
49
- s.homepage = "http://github.com/hugolnx/named_parameter"
50
- s.licenses = ["MIT"]
51
- s.require_paths = ["lib"]
52
- s.rubygems_version = "1.8.15"
53
- s.summary = "Allows named parameter in ruby"
54
-
55
- if s.respond_to? :specification_version then
56
- s.specification_version = 3
57
-
58
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
60
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
61
- else
62
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
64
- end
65
- else
66
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
67
- s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
68
- end
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "named_parameter"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = NamedParameter::VERSION
69
17
  end
70
-
@@ -0,0 +1,253 @@
1
+ require 'spec_helper'
2
+
3
+ describe "BugFix: should suport any kind use combination of optional parameters" do
4
+ describe 'Named Parameter' do
5
+ context %q{named def whatever(a="z",b="z",c="z",d="z",e="z",f="z")} do
6
+ specify "inline" do
7
+ class SomeClass
8
+ extend NamedParameter
9
+
10
+ named def whatever(a="z",b="z",c="z",d="z",e="z",f="z")
11
+ return [a,b,c,d,e,f]
12
+ end
13
+ end
14
+
15
+ obj = SomeClass.new
16
+
17
+ obj.whatever(
18
+ a: "a",
19
+ c: "c",
20
+ d: "d",
21
+ f: "f"
22
+ ).should == %w{a z c d z f}
23
+ end
24
+
25
+ specify "above" do
26
+ class SomeClass
27
+ extend NamedParameter
28
+
29
+ named
30
+ def whatever(a="z",b="z",c="z",d="z",e="z",f="z")
31
+ return [a,b,c,d,e,f]
32
+ end
33
+ end
34
+
35
+ obj = SomeClass.new
36
+
37
+ obj.whatever(
38
+ a: "a",
39
+ c: "c",
40
+ d: "d",
41
+ f: "f"
42
+ ).should == %w{a z c d z f}
43
+ end
44
+ end
45
+
46
+ context %q{named def whatever(a="z",b="z",c="z", \n d="z",e="z",f="z")} do
47
+ specify "inline" do
48
+ class SomeClass
49
+ extend NamedParameter
50
+
51
+ named def whatever(a="z",b="z",c="z",
52
+ d="z",e="z",f="z")
53
+ return [a,b,c,d,e,f]
54
+ end
55
+ end
56
+
57
+ obj = SomeClass.new
58
+
59
+ obj.whatever(
60
+ a: "a",
61
+ c: "c",
62
+ d: "d",
63
+ f: "f"
64
+ ).should == %w{a z c d z f}
65
+ end
66
+
67
+ specify "above" do
68
+ class SomeClass
69
+ extend NamedParameter
70
+
71
+ named
72
+ def whatever(a="z",b="z",c="z",
73
+ d="z",e="z",f="z")
74
+ return [a,b,c,d,e,f]
75
+ end
76
+ end
77
+
78
+ obj = SomeClass.new
79
+
80
+ obj.whatever(
81
+ a: "a",
82
+ c: "c",
83
+ d: "d",
84
+ f: "f"
85
+ ).should == %w{a z c d z f}
86
+ end
87
+ end
88
+
89
+
90
+ context %q{named def whatever(a="z",b="z",c="z", d="z",e,f)} do
91
+ specify "inline" do
92
+ class SomeClass
93
+ extend NamedParameter
94
+
95
+ named def whatever(a,b,c="z", d="z",e="z",f="z")
96
+ return [a,b,c,d,e,f]
97
+ end
98
+ end
99
+
100
+ obj = SomeClass.new
101
+
102
+ obj.whatever(
103
+ a: "a",
104
+ b: "b",
105
+ c: "c",
106
+ d: "d",
107
+ f: "f"
108
+ ).should == %w{a b c d z f}
109
+ end
110
+
111
+ specify "above" do
112
+ class SomeClass
113
+ extend NamedParameter
114
+
115
+ named
116
+ def whatever(a,b,c="z", d="z",e="z",f="z")
117
+ return [a,b,c,d,e,f]
118
+ end
119
+ end
120
+
121
+ obj = SomeClass.new
122
+
123
+ obj.whatever(
124
+ a: "a",
125
+ b: "b",
126
+ c: "c",
127
+ d: "d",
128
+ f: "f"
129
+ ).should == %w{a b c d z f}
130
+ end
131
+ end
132
+
133
+ context %q{named def whatever(a,b="z",c=lambda{|arg1,arg2| arg1[1,2] + "test"})} do
134
+ specify "inline" do
135
+ class SomeClass
136
+ extend NamedParameter
137
+
138
+ named def whatever(a,b="z",c=lambda{|arg1,arg2| arg1[1,2] + "test"},d="z")
139
+ return [a,b,c,d]
140
+ end
141
+ end
142
+
143
+ obj = SomeClass.new
144
+
145
+ return_ = obj.whatever(
146
+ a: "a",
147
+ d: "d"
148
+ )
149
+ return_[0].should == "a"
150
+ return_[1].should == "z"
151
+ return_[2].should be_a Proc
152
+ return_[3].should == "d"
153
+ end
154
+
155
+ specify "above" do
156
+ class SomeClass
157
+ extend NamedParameter
158
+
159
+ named
160
+ def whatever(a,b="z",c=lambda{|arg1,arg2| arg1[1,2] + "test"},d="z")
161
+ return [a,b,c,d]
162
+ end
163
+ end
164
+
165
+ obj = SomeClass.new
166
+
167
+ return_ = obj.whatever(
168
+ a: "a",
169
+ d: "d"
170
+ )
171
+ return_[0].should == "a"
172
+ return_[1].should == "z"
173
+ return_[2].should be_a Proc
174
+ return_[3].should == "d"
175
+ end
176
+ end
177
+
178
+ context %q{named def whatever(a,b="z",c="z,z",d="z")} do
179
+ specify "inline" do
180
+ class SomeClass
181
+ extend NamedParameter
182
+
183
+ named def whatever(a,b="z",c="z,z",d="z")
184
+ return [a,b,c,d]
185
+ end
186
+ end
187
+
188
+ obj = SomeClass.new
189
+
190
+ obj.whatever(
191
+ a: "a",
192
+ d: "d"
193
+ ).should == %w{a z z,z d}
194
+ end
195
+
196
+ specify "above" do
197
+ class SomeClass
198
+ extend NamedParameter
199
+
200
+ named
201
+ def whatever(a,b="z",c="z,z",d="z")
202
+ return [a,b,c,d]
203
+ end
204
+ end
205
+
206
+ obj = SomeClass.new
207
+
208
+ obj.whatever(
209
+ a: "a",
210
+ d: "d"
211
+ ).should == %w{a z z,z d}
212
+ end
213
+ end
214
+
215
+ context %q{named def whatever(a,b="z",c=/z,z/,d="z")} do
216
+ specify "inline" do
217
+ class SomeClass
218
+ extend NamedParameter
219
+
220
+ named def whatever(a,b="z",c=/z,z/,d="z")
221
+ return [a,b,c,d]
222
+ end
223
+ end
224
+
225
+ obj = SomeClass.new
226
+
227
+ obj.whatever(
228
+ a: "a",
229
+ d: "d"
230
+ ).should == ["a", "z", /z,z/, "d"]
231
+ end
232
+
233
+ specify "above" do
234
+ class SomeClass
235
+ extend NamedParameter
236
+
237
+ named
238
+ def whatever(a,b="z",c=/z,z/,d="z")
239
+ return [a,b,c,d]
240
+ end
241
+ end
242
+
243
+ obj = SomeClass.new
244
+
245
+ obj.whatever(
246
+ a: "a",
247
+ d: "d"
248
+ ).should == ["a", "z", /z,z/, "d"]
249
+ end
250
+ end
251
+
252
+ end
253
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ module NamedParameter
4
+ describe ParametersAdapter do
5
+ context "two optional parameters" do
6
+ it 'maintain the default value in the middle too' do
7
+ def test_method(arg1 = "default1", arg2 = "default2");end
8
+
9
+ method = method(:test_method)
10
+ adapter = ParametersAdapter.new(method)
11
+ arguments = adapter.hash_to_args({arg2: "argument2"})
12
+
13
+ arguments.should == ["default1", "argument2"]
14
+ end
15
+ end
16
+
17
+ context "one parameter with default value as a lambda" do
18
+ it 'maintain the default value in the middle too' do
19
+ def test_method(a,b="z",c=lambda{|arg1,arg2| arg1 + "test"},d="z");end
20
+
21
+ method = method(:test_method)
22
+ adapter = ParametersAdapter.new(method)
23
+ arguments = adapter.hash_to_args({a: "a", d: "d"})
24
+
25
+ arguments[0].should == "a"
26
+ arguments[1].should == "z"
27
+ arguments[2].should be_a Proc
28
+ arguments[3].should == "d"
29
+ end
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -1,45 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: named_parameter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Hugo Roque (a.k.a HugoLnx)
8
+ - Hugo Roque
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-08 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: bundler
16
- requirement: &77836440 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ~>
20
- - !ruby/object:Gem::Version
21
- version: 1.0.0
22
- type: :development
23
- prerelease: false
24
- version_requirements: *77836440
25
- - !ruby/object:Gem::Dependency
26
- name: jeweler
27
- requirement: &77835570 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ~>
31
- - !ruby/object:Gem::Version
32
- version: 1.6.0
33
- type: :development
34
- prerelease: false
35
- version_requirements: *77835570
12
+ date: 2012-09-09 00:00:00.000000000 Z
13
+ dependencies: []
36
14
  description: Allows named parameter in ruby
37
- email: hugolnx@gmail.com
15
+ email:
16
+ - hugolnx@gmail.com
38
17
  executables: []
39
18
  extensions: []
40
- extra_rdoc_files:
41
- - README.md
19
+ extra_rdoc_files: []
42
20
  files:
21
+ - .gitignore
43
22
  - Gemfile
44
23
  - README.md
45
24
  - Rakefile
@@ -47,6 +26,7 @@ files:
47
26
  - lib/named_parameter/error.rb
48
27
  - lib/named_parameter/errors.rb
49
28
  - lib/named_parameter/errors/not_hash.rb
29
+ - lib/named_parameter/errors/on_irb_exception.rb
50
30
  - lib/named_parameter/errors/required_parameters.rb
51
31
  - lib/named_parameter/errors/undefined_parameters.rb
52
32
  - lib/named_parameter/named_above.rb
@@ -55,7 +35,10 @@ files:
55
35
  - lib/named_parameter/named_method_transmuter.rb
56
36
  - lib/named_parameter/named_parameter.rb
57
37
  - lib/named_parameter/parameters.rb
38
+ - lib/named_parameter/parameters_adapter.rb
39
+ - lib/named_parameter/version.rb
58
40
  - named_parameter.gemspec
41
+ - spec/bug_fixing/parameters_order_spec.rb
59
42
  - spec/features/named_above/class_self_named_method_feature_spec.rb
60
43
  - spec/features/named_above/individual_named_method_feature_spec.rb
61
44
  - spec/features/named_above/singleton_named_method_feature_spec.rb
@@ -69,9 +52,9 @@ files:
69
52
  - spec/unit/errors/undefined_parameters_spec.rb
70
53
  - spec/unit/named_method_spec.rb
71
54
  - spec/unit/named_method_transmuter_spec.rb
72
- homepage: http://github.com/hugolnx/named_parameter
73
- licenses:
74
- - MIT
55
+ - spec/unit/parameters_adapter_spec.rb
56
+ homepage: http://github.com/hugolnx/named_parameter/
57
+ licenses: []
75
58
  post_install_message:
76
59
  rdoc_options: []
77
60
  require_paths:
@@ -93,5 +76,20 @@ rubyforge_project:
93
76
  rubygems_version: 1.8.15
94
77
  signing_key:
95
78
  specification_version: 3
96
- summary: Allows named parameter in ruby
97
- test_files: []
79
+ summary: named_parameter-1.0.1
80
+ test_files:
81
+ - spec/bug_fixing/parameters_order_spec.rb
82
+ - spec/features/named_above/class_self_named_method_feature_spec.rb
83
+ - spec/features/named_above/individual_named_method_feature_spec.rb
84
+ - spec/features/named_above/singleton_named_method_feature_spec.rb
85
+ - spec/features/named_inline/class_self_named_method_feature_spec.rb
86
+ - spec/features/named_inline/individual_named_method_feature_spec.rb
87
+ - spec/features/named_inline/singleton_named_method_feature_spec.rb
88
+ - spec/spec_helper.rb
89
+ - spec/unit/error_spec.rb
90
+ - spec/unit/errors/not_hash_spec.rb
91
+ - spec/unit/errors/required_parameters_spec.rb
92
+ - spec/unit/errors/undefined_parameters_spec.rb
93
+ - spec/unit/named_method_spec.rb
94
+ - spec/unit/named_method_transmuter_spec.rb
95
+ - spec/unit/parameters_adapter_spec.rb