invokr 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f009f090d42fffdb02fe1cd916b919a28293514
4
- data.tar.gz: 782395ed64c4c75428814b1c19c0745a99395b1e
3
+ metadata.gz: 808ea736022fc954541d33ff6329fa5f08d97cba
4
+ data.tar.gz: 51e16c3ffd417e064e5012ae2a706d85641bf69c
5
5
  SHA512:
6
- metadata.gz: 89edb83a6244b666ecff82383ff770aa4620f2db555f7a94ce835b79f657ab63402628a3cfe48a208e05ed2d1d3b237e15412181e783403ef36e5f0303971a22
7
- data.tar.gz: a130fa4abcf671a293cd6bb46f43aaf7512a9638b826b1afb2156107ac57f11983fe6d1d5dea0fe6612757630a0df46d3669f1ae9f9eeff5d4506a81a8bae7bb
6
+ metadata.gz: 401bd351f434a91efa23ec097abed40ef186b2cbeb5b80dd294cfef9fe5d78a6283c0ddc864225199256a5d860c2bdc82c03445ec794147c4a2f9576571ab459
7
+ data.tar.gz: 62d71c2fd5e803f80dcfb5abfc6238b7ac28b44c5d5e5538f0fd331dacdfee84bf0608bad17c5f8ca80e9631a0115a7e6b8e7eb065dadcf7f7e6d8016031c75c
@@ -64,6 +64,11 @@ module Invokr
64
64
  @keyword_args[identifier] = injector[identifier]
65
65
  end
66
66
 
67
+ def handle_rest_arg identifier
68
+ raise UnsupportedArgumentsError.new(self, [identifier])
69
+ end
70
+ alias_method :handle_keyrest_arg, :handle_rest_arg
71
+
67
72
  def handle_block_arg identifier
68
73
  if injector.has_key? identifier and @implicit_block
69
74
  unused_args << identifier and return
@@ -9,9 +9,8 @@ module Invokr
9
9
 
10
10
  Injector = Struct.new :resolver, :klass do
11
11
  def inject
12
- invocation = Builder.build initializer, self, nil
13
- invocation.method = :new
14
- invocation.invoke! klass
12
+ method = Invokr.query_method klass.instance_method :initialize
13
+ method.invoke method: :new, with: self
15
14
  end
16
15
 
17
16
  def keys
@@ -49,6 +49,12 @@ module Invokr
49
49
  end
50
50
  end
51
51
 
52
+ class UnsupportedArgumentsError < BadArgumentsError
53
+ def message
54
+ %(unsupported splat argument(s) #{formatted_args} when invoking method `#{builder.method.name}' on #{builder.method.owner.inspect})
55
+ end
56
+ end
57
+
52
58
  class OptionalPositionalArgumentError < StandardError
53
59
  attr :message
54
60
 
@@ -1,38 +1,50 @@
1
- Method = Struct.new :method do
2
- def invoke receiver = method.owner, hsh_args
3
- unless receiver == method.owner or receiver.kind_of? method.owner
4
- raise TypeError, "no implicit conversion of #{receiver.class} into #{method.owner.name}"
1
+ module Invokr
2
+ Method = Struct.new :method do
3
+ def invoke args = {}
4
+ receiver, method_name, hsh_args = extract_args! args
5
+ unless receiver == method.owner or receiver.kind_of? method.owner
6
+ raise TypeError, "no implicit conversion of #{receiver.class} into #{method.owner.name}"
7
+ end
8
+ invocation = Builder.build method, hsh_args, args[:block]
9
+ invocation.method = method_name unless method_name == method.name
10
+ invocation.invoke! receiver
5
11
  end
6
- Invokr.invoke method: method.name, on: receiver, with: hsh_args
7
- end
8
12
 
9
- def trim_args hsh_args
10
- hsh_args.select { |key, _| dependencies.include? key }
11
- end
13
+ def trim_args hsh_args
14
+ hsh_args.select { |key, _| dependencies.include? key }
15
+ end
12
16
 
13
- def dependencies
14
- map_identifiers parameters
15
- end
17
+ def dependencies
18
+ map_identifiers parameters
19
+ end
16
20
 
17
- def optional_dependencies
18
- map_identifiers select_parameters_by_type [:opt, :key]
19
- end
21
+ def optional_dependencies
22
+ map_identifiers select_parameters_by_type [:opt, :key]
23
+ end
20
24
 
21
- def required_dependencies
22
- map_identifiers select_parameters_by_type [:req, :keyreq]
23
- end
25
+ def required_dependencies
26
+ map_identifiers select_parameters_by_type [:req, :keyreq]
27
+ end
24
28
 
25
- def parameters
26
- method.parameters
27
- end
29
+ def parameters
30
+ method.parameters
31
+ end
28
32
 
29
- private
33
+ private
30
34
 
31
- def select_parameters_by_type types
32
- parameters.select do |type, _| types.include? type end
33
- end
35
+ def extract_args! args
36
+ receiver = args.fetch :receiver do method.owner end
37
+ method_name = args.fetch :method do method.name end
38
+ with = args.fetch :with
39
+ [receiver, method_name, with]
40
+ end
41
+
42
+ def select_parameters_by_type types
43
+ parameters.select do |type, _| types.include? type end
44
+ end
34
45
 
35
- def map_identifiers parameters
36
- parameters.map do |_, identifier| identifier end
46
+ def map_identifiers parameters
47
+ parameters.map do |_, identifier| identifier end
48
+ end
37
49
  end
38
50
  end
@@ -1,3 +1,3 @@
1
1
  module Invokr
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -29,6 +29,21 @@ module KeywordArgsTest
29
29
 
30
30
  assert_equal [:album], method.optional_dependencies
31
31
  end
32
+
33
+ def test_passing_in_splat_raises_error
34
+ error = assert_raises Invokr::UnsupportedArgumentsError do
35
+ Invokr.invoke(
36
+ method: :keyword_splat_argument,
37
+ on: TestMethodBank,
38
+ with: { guitarist: 'trey' },
39
+ )
40
+ end
41
+
42
+ assert_equal(
43
+ "unsupported splat argument(s) `rest' when invoking method `keyword_splat_argument' on #<TestMethodBank:0xdeadbeef>",
44
+ error.message,
45
+ )
46
+ end
32
47
  end
33
48
 
34
49
  class RequiredKeywordArgsTest < Minitest::Test
@@ -17,23 +17,31 @@ class QueryTest < Minitest::Test
17
17
  end
18
18
 
19
19
  def test_invoking_singleton_from_query_object
20
- assert_equal ['junta', 'trey'], @method.invoke(album: 'junta')
20
+ assert_equal ['junta', 'trey'], @method.invoke(with: { album: 'junta' })
21
21
  end
22
22
 
23
23
  def test_invoking_instance_from_query_object
24
24
  test_klass = define_test_klass
25
25
  method = Invokr.query_method test_klass.instance_method :upcase
26
26
 
27
- val = method.invoke test_klass.new, dep: 'phIsh'
27
+ val = method.invoke receiver: test_klass.new, with: { dep: 'phIsh' }
28
28
  assert_equal "PHISH", val
29
29
  end
30
30
 
31
+ def test_invoking_alternate_method
32
+ test_klass = define_test_klass
33
+ method = Invokr.query_method test_klass.instance_method :upcase
34
+
35
+ val = method.invoke receiver: test_klass.new, method: :downcase, with: { dep: 'PHiSH' }
36
+ assert_equal "phish", val
37
+ end
38
+
31
39
  def test_cannot_invoke_instance_not_type_other_than_method_owner
32
40
  test_klass = define_test_klass
33
41
  method = Invokr.query_method test_klass.instance_method :upcase
34
42
 
35
43
  error = assert_raises TypeError do
36
- method.invoke Array.new, dep: 'phIsh'
44
+ method.invoke receiver: Array.new, with: { dep: 'phIsh' }
37
45
  end
38
46
 
39
47
  assert_equal 'no implicit conversion of Array into TestKlass', error.message
@@ -55,6 +63,10 @@ class QueryTest < Minitest::Test
55
63
  def upcase dep
56
64
  dep.upcase
57
65
  end
66
+
67
+ def downcase dep
68
+ dep.downcase
69
+ end
58
70
  end
59
71
  end
60
72
  end
@@ -0,0 +1,16 @@
1
+ class RestArgsTest < Minitest::Test
2
+ def test_passing_in_splat
3
+ error = assert_raises Invokr::UnsupportedArgumentsError do
4
+ Invokr.invoke(
5
+ method: :splat_argument,
6
+ on: TestMethodBank,
7
+ with: { guitarist: 'trey' },
8
+ )
9
+ end
10
+
11
+ assert_equal(
12
+ "unsupported splat argument(s) `rest' when invoking method `splat_argument' on #<TestMethodBank:0xdeadbeef>",
13
+ error.message,
14
+ )
15
+ end
16
+ end
@@ -33,6 +33,10 @@ module TestMethodBank
33
33
  [album, guitarist]
34
34
  end
35
35
 
36
+ def splat_argument album = 'junta', *rest
37
+ [album, *rest]
38
+ end
39
+
36
40
  def just_yields
37
41
  yield
38
42
  end
@@ -46,6 +50,10 @@ module TestMethodBank
46
50
  def optional_keyword_argument album: 'pitcher_of_nectar'
47
51
  album
48
52
  end
53
+
54
+ def keyword_splat_argument album: 'pitcher_of_nectar', **rest
55
+ [album, **rest]
56
+ end
49
57
  RB
50
58
  end
51
59
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: invokr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - ntl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-30 00:00:00.000000000 Z
11
+ date: 2014-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -95,6 +95,7 @@ files:
95
95
  - test/optional_args_test.rb
96
96
  - test/query_test.rb
97
97
  - test/required_args_test.rb
98
+ - test/rest_args_test.rb
98
99
  - test/test_helper.rb
99
100
  homepage: https://github.com/ntl/invokr
100
101
  licenses:
@@ -128,4 +129,5 @@ test_files:
128
129
  - test/optional_args_test.rb
129
130
  - test/query_test.rb
130
131
  - test/required_args_test.rb
132
+ - test/rest_args_test.rb
131
133
  - test/test_helper.rb