named_parameter 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Named Parameter `v1.0.0`
1
+ # Named Parameter `v1.0.2`
2
2
 
3
3
  ## Description
4
4
  That you ever dream with named parameter in Ruby? Well, you doesn't have to pray to
@@ -0,0 +1,43 @@
1
+ module NamedParameter
2
+ module DefaultsExtractor
3
+ class DefaultParametersExtractor
4
+ def defaults_of(method)
5
+ filepath = method.source_location[0]
6
+ linenumber = method.source_location[1]
7
+
8
+ if filepath.downcase == "(irb)"
9
+ msg = NamedParameter::Errors::OnIrbException::MESSAGE
10
+ raise NamedParameter::Errors::OnIrbException, msg
11
+ end
12
+
13
+ rb_content = File.read(filepath)
14
+
15
+ extractor = SignatureExtractor.new
16
+ signature = extractor.signature_of(rb_content, linenumber);
17
+
18
+ created_method = method_with_signature(signature, method)
19
+
20
+ defaults = call_with_required_params(created_method)
21
+
22
+ defaults
23
+ end
24
+
25
+ def method_with_signature(signature, original)
26
+ argnames = original.parameters.map{|(_, name)| name}
27
+ method_code = "#{signature}; return [#{argnames.join(",")}];end"
28
+ eval(method_code)
29
+
30
+ method(original.name)
31
+ end
32
+
33
+ def call_with_required_params(method)
34
+ required = method.parameters
35
+ .find_all{|(tag, _)| tag == :req}
36
+ .map{|(_, name)| name}
37
+
38
+ args = [nil] * required.size
39
+ method.call(*args)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,48 @@
1
+ module NamedParameter
2
+ module DefaultsExtractor
3
+ class SignatureExtractor
4
+ module EndLineValidators
5
+ WITH_PARENTESIS = lambda{|line| line.strip.end_with?(")")}
6
+ WITHOUT_PARENTESIS = lambda{|line| !line.strip.end_with?(",")}
7
+ end
8
+
9
+ def signature_of(content, linenumber)
10
+ content = extract_until_signature_starts(content, linenumber)
11
+
12
+ signature_end = find_signature_end content
13
+
14
+ signature = content[0..signature_end].split("\n").map{|line| line.strip}.join
15
+
16
+ signature
17
+ end
18
+
19
+ def extract_until_signature_starts(content, linenumber)
20
+ content
21
+ .split("\n")[(linenumber-1)..-1]
22
+ .join("\n")
23
+ .gsub(";", "\n")
24
+ .strip
25
+ .reverse.gsub(/ fed.*$/, " fed").reverse
26
+ end
27
+
28
+ def find_signature_end(signature)
29
+ if signature =~ /^def +[A-Za-z_\?]+ *\(/
30
+ sign_end_validator = EndLineValidators::WITH_PARENTESIS
31
+ else
32
+ sign_end_validator = EndLineValidators::WITHOUT_PARENTESIS
33
+ end
34
+
35
+ lines = signature.split("\n")
36
+ sign_end = 0
37
+ i = 0
38
+ until sign_end_validator.call(lines[i])
39
+ sign_end += lines[i].size + 1
40
+ i += 1
41
+ end
42
+ sign_end += lines[i].size
43
+
44
+ sign_end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,2 @@
1
+ require 'named_parameter/defaults_extractor/default_parameters_extractor'
2
+ require 'named_parameter/defaults_extractor/signature_extractor'
@@ -33,54 +33,16 @@ module NamedParameter
33
33
  end
34
34
 
35
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
36
+ extractor = DefaultsExtractor::DefaultParametersExtractor.new
37
+ defaults = extractor.defaults_of(@method)
45
38
 
46
- default_values = extract_default_values content
47
-
48
39
  arguments.map!.with_index do |arg, i|
49
40
  no_argument = arg.equal? NO_ARGUMENT
50
- no_argument ? default_values[i] : arg
41
+ no_argument ? defaults[i] : arg
51
42
  end
52
43
  end
53
44
 
54
45
  return arguments
55
46
  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
47
  end
86
48
  end
@@ -1,3 +1,3 @@
1
1
  module NamedParameter
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -7,3 +7,4 @@ require 'named_parameter/named_above'
7
7
  require 'named_parameter/named_inline'
8
8
  require 'named_parameter/named_parameter'
9
9
  require 'named_parameter/parameters_adapter'
10
+ require 'named_parameter/defaults_extractor'
@@ -87,7 +87,7 @@ describe "BugFix: should suport any kind use combination of optional parameters"
87
87
  end
88
88
 
89
89
 
90
- context %q{named def whatever(a="z",b="z",c="z", d="z",e,f)} do
90
+ context %q{named def whatever(a,b,c="z", d="z",e="z",f="z")} do
91
91
  specify "inline" do
92
92
  class SomeClass
93
93
  extend NamedParameter
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module NamedParameter
4
+ module DefaultsExtractor
5
+ describe DefaultParametersExtractor do
6
+ it 'extract for parameters with one required at right' do
7
+ def sample(a="a", b="b", c)
8
+ end
9
+
10
+ extractor = DefaultParametersExtractor.new
11
+ defaults = extractor.defaults_of(method(:sample))
12
+
13
+ defaults.should == ["a", "b", nil]
14
+ end
15
+
16
+ it 'extract for parameters with ;' do
17
+ def sample(a="a", b="b", c, d);end
18
+
19
+ extractor = DefaultParametersExtractor.new
20
+ defaults = extractor.defaults_of(method(:sample))
21
+
22
+ defaults.should == ["a", "b", nil, nil]
23
+ end
24
+
25
+ it 'extract from 2 required at left' do
26
+ def sample(a,b,c="c", d="d",e="e",f="f");end
27
+
28
+ extractor = DefaultParametersExtractor.new
29
+ defaults = extractor.defaults_of(method(:sample))
30
+
31
+ defaults.should == [nil, nil, "c", "d", "e", "f"]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,93 @@
1
+ require 'spec_helper'
2
+
3
+ module NamedParameter
4
+ module DefaultsExtractor
5
+ describe SignatureExtractor do
6
+ it 'extract for parameters with simple strings as defaults' do
7
+ code =
8
+ %q{class Teste
9
+ def sample(a="a", b="b", c)
10
+ end
11
+ end}
12
+
13
+ extractor = SignatureExtractor.new
14
+ signature = extractor.signature_of(code, 2)
15
+
16
+ signature.should == %q{def sample(a="a", b="b", c)}
17
+ end
18
+
19
+ it 'extract from no parentesis methods' do
20
+ code =
21
+ %q{class Teste
22
+ def sample a="a", b="b", c
23
+ end
24
+ end}
25
+
26
+ extractor = SignatureExtractor.new
27
+ signature = extractor.signature_of(code, 2)
28
+
29
+ signature.should == %q{def sample a="a", b="b", c}
30
+ end
31
+
32
+ it 'extract from methods with more than one line' do
33
+ code =
34
+ %q{class Teste
35
+ def sample a="a",
36
+ b="b",
37
+ c
38
+ end
39
+ end}
40
+
41
+ extractor = SignatureExtractor.new
42
+ signature = extractor.signature_of(code, 2)
43
+
44
+ signature.should == %q{def sample a="a",b="b",c}
45
+ end
46
+
47
+ it 'extract from methods with more than one line and parentesis' do
48
+ code =
49
+ %q{class Teste
50
+ def sample(a="a",
51
+ b="b",
52
+ c
53
+ )
54
+ end
55
+ end}
56
+
57
+ extractor = SignatureExtractor.new
58
+ signature = extractor.signature_of(code, 2)
59
+
60
+ signature.should == %q{def sample(a="a",b="b",c)}
61
+ end
62
+
63
+ it 'extract from methods with something before def' do
64
+ code =
65
+ %q{class Teste
66
+ named def sample(a="a",
67
+ b="b",
68
+ c
69
+ )
70
+ end
71
+ end}
72
+
73
+ extractor = SignatureExtractor.new
74
+ signature = extractor.signature_of(code, 2)
75
+
76
+ signature.should == %q{def sample(a="a",b="b",c)}
77
+ end
78
+
79
+
80
+ it 'can have an "def" in the middle of the signature' do
81
+ code =
82
+ %q{class Teste
83
+ def sample(arg="default");end
84
+ end}
85
+
86
+ extractor = SignatureExtractor.new
87
+ signature = extractor.signature_of(code, 2)
88
+
89
+ signature.should == %q{def sample(arg="default")}
90
+ end
91
+ end
92
+ end
93
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: named_parameter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-09 00:00:00.000000000 Z
12
+ date: 2012-10-20 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Allows named parameter in ruby
15
15
  email:
@@ -23,6 +23,9 @@ files:
23
23
  - README.md
24
24
  - Rakefile
25
25
  - lib/named_parameter.rb
26
+ - lib/named_parameter/defaults_extractor.rb
27
+ - lib/named_parameter/defaults_extractor/default_parameters_extractor.rb
28
+ - lib/named_parameter/defaults_extractor/signature_extractor.rb
26
29
  - lib/named_parameter/error.rb
27
30
  - lib/named_parameter/errors.rb
28
31
  - lib/named_parameter/errors/not_hash.rb
@@ -46,6 +49,8 @@ files:
46
49
  - spec/features/named_inline/individual_named_method_feature_spec.rb
47
50
  - spec/features/named_inline/singleton_named_method_feature_spec.rb
48
51
  - spec/spec_helper.rb
52
+ - spec/unit/defaults_extractor/default_parameters_extractor_spec.rb
53
+ - spec/unit/defaults_extractor/signature_extractor_spec.rb
49
54
  - spec/unit/error_spec.rb
50
55
  - spec/unit/errors/not_hash_spec.rb
51
56
  - spec/unit/errors/required_parameters_spec.rb
@@ -76,7 +81,7 @@ rubyforge_project:
76
81
  rubygems_version: 1.8.15
77
82
  signing_key:
78
83
  specification_version: 3
79
- summary: named_parameter-1.0.1
84
+ summary: named_parameter-1.0.2
80
85
  test_files:
81
86
  - spec/bug_fixing/parameters_order_spec.rb
82
87
  - spec/features/named_above/class_self_named_method_feature_spec.rb
@@ -86,6 +91,8 @@ test_files:
86
91
  - spec/features/named_inline/individual_named_method_feature_spec.rb
87
92
  - spec/features/named_inline/singleton_named_method_feature_spec.rb
88
93
  - spec/spec_helper.rb
94
+ - spec/unit/defaults_extractor/default_parameters_extractor_spec.rb
95
+ - spec/unit/defaults_extractor/signature_extractor_spec.rb
89
96
  - spec/unit/error_spec.rb
90
97
  - spec/unit/errors/not_hash_spec.rb
91
98
  - spec/unit/errors/required_parameters_spec.rb
@@ -93,3 +100,4 @@ test_files:
93
100
  - spec/unit/named_method_spec.rb
94
101
  - spec/unit/named_method_transmuter_spec.rb
95
102
  - spec/unit/parameters_adapter_spec.rb
103
+ has_rdoc: