invokr 0.0.4 → 0.0.5

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