named_parameter 1.0.0 → 1.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/.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