webmock-twirp 0.1.2 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0264d26c4984559b4163ff5740fda0df43882736fa174881a63939c195e85331
4
- data.tar.gz: 9d0da633242e3f722d18c0c97042c5312b16ba4fb28fb6509479a04f5c4201eb
3
+ metadata.gz: b68a561786519f4bf91828a3a01e4ae803e36e03af7fd327af7780ba5da4d838
4
+ data.tar.gz: 151994b76bc7d4494be3f302f20633a19fdb681a092d4f1d489e694f89d43189
5
5
  SHA512:
6
- metadata.gz: 369e27e257599a09541feb244e9a4c1ff59a7b069c3df154c361c6567ce8f15f0e3b46cbfb0252ebe7c72beed20cb31bb8c947857d84372aec7ae3d697e21602
7
- data.tar.gz: 7aa1544321a07d5f8350203f16f331d2e9ee90b5b38928d29d1b4fb2750101109298796ff7b571684108af8aaf3c80d4b2d595a27cdef0b33715c888cb99f1cd
6
+ metadata.gz: b764858403de27f0b9cc28a6bddb7c827379308c1619be1b8bcbeff8d1824a3cb1c3f892644ce63c78c2bc4f1331e4fdb4a60eb88713541e0161d899a4ddaa1c
7
+ data.tar.gz: 43a24c5182e1aab84cbc16897faae7ea54098be328ad07e5754b939c6b89783985c23f1d565db89fa751fb5e1edb719d72a0fef264b64ae1ceadbc877e8b92d0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### v0.2.1 (2022-10-19)
2
+ - fix client matching
3
+
4
+ ### v0.2.0 (2022-10-17)
5
+ - improved matching
6
+
1
7
  ### v0.1.2 (2022-10-17)
2
8
  - improved matching
3
9
  - test coverage
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  WebMock::Twirp
2
2
  ======
3
+ ![Gem](https://img.shields.io/gem/dt/webmock-twirp?style=plastic)
4
+ [![codecov](https://codecov.io/gh/dpep/webmock-twirp/branch/main/graph/badge.svg)](https://codecov.io/gh/dpep/webmock-twirp)
5
+
3
6
  Twirp support for [WebMock](https://github.com/bblimke/webmock). All our favorite http request stubbing for Twirp RPCs - message and error serialization done automatically.
4
7
 
5
8
  ### Install
@@ -106,8 +109,3 @@ Yes please :)
106
109
  1. Commit your changes (`git commit -am 'awesome new feature'`)
107
110
  1. Push your branch (`git push origin my-feature`)
108
111
  1. Create a Pull Request
109
-
110
-
111
- ----
112
- ![Gem](https://img.shields.io/gem/dt/webmock-twirp?style=plastic)
113
- [![codecov](https://codecov.io/gh/dpep/webmock-twirp/branch/main/graph/badge.svg)](https://codecov.io/gh/dpep/webmock-twirp)
@@ -9,10 +9,66 @@ module WebMock
9
9
 
10
10
  refine Google::Protobuf::MessageExts do
11
11
  def normalized_hash(symbolize_keys: true)
12
- JSON.parse(
13
- to_json(preserve_proto_fieldnames: true),
14
- symbolize_names: symbolize_keys,
15
- )
12
+ res = {}
13
+
14
+ self.class.descriptor.each do |field|
15
+ key = symbolize_keys ? field.name.to_sym : field.name
16
+ value = field.get(self)
17
+
18
+ if value.is_a?(Google::Protobuf::MessageExts)
19
+ # recursively serialize sub-message
20
+ value = value.normalized_hash(symbolize_keys: symbolize_keys)
21
+ end
22
+
23
+ res[key] = value unless field.default == value
24
+ end
25
+
26
+ res
27
+ end
28
+
29
+ def include?(*args)
30
+ expected_attrs = Hash === args.last ? args.pop : {}
31
+
32
+ # ensure all enumerated keys are present
33
+ return false unless args.all? { |attr| respond_to?(attr) }
34
+
35
+ # ensure all enumerated attributes are present
36
+ return false unless expected_attrs.keys.all? { |attr| respond_to?(attr) }
37
+
38
+ # check expected attribute matches
39
+ expected_attrs.all? do |expected_attr, expected_value|
40
+ actual_value = send(expected_attr)
41
+
42
+ matches = expected_value === actual_value
43
+
44
+ if actual_value.is_a?(Google::Protobuf::MessageExts)
45
+ if expected_value.is_a?(Hash)
46
+ matches ||= actual_value.match?(**expected_value)
47
+ else
48
+ matches ||= expected_value === actual_value.to_h
49
+ # matches ||= expected_value === actual_value.normalized_hash
50
+ end
51
+ end
52
+
53
+ matches
54
+ end
55
+ end
56
+
57
+ def match?(**attrs)
58
+ # ensure all enumerated keys are present
59
+ return false unless attrs.keys.all? { |attr| respond_to?(attr) }
60
+
61
+ # ensure each field matches
62
+ self.class.descriptor.all? do |field|
63
+ actual_value = field.get(self)
64
+ expected_value = attrs[field.name.to_sym]
65
+
66
+ if actual_value.is_a?(Google::Protobuf::MessageExts) && expected_value.is_a?(Hash)
67
+ actual_value.match?(**expected_value)
68
+ else
69
+ attrs.fetch(field.name.to_sym, field.default) === actual_value
70
+ end
71
+ end
16
72
  end
17
73
  end
18
74
  end
@@ -21,7 +21,7 @@ module WebMock
21
21
 
22
22
  if client
23
23
  conn = client.instance_variable_get(:@conn)
24
- uri += conn.url_prefix.to_s if conn
24
+ uri += conn.url_prefix.to_s.chomp("/") if conn
25
25
  end
26
26
 
27
27
  if klass
@@ -71,27 +71,11 @@ module WebMock
71
71
 
72
72
  decoder = ->(request) do
73
73
  input_class = rpc_from_request(request)[:input_class]
74
-
75
- matched = true
76
74
  decoded_request = input_class.decode(request.body)
77
75
 
78
- if attrs.any?
79
- if defined?(RSpec::Matchers::BuiltIn::Include)
80
- matcher = RSpec::Matchers::BuiltIn::Include.new(attrs)
81
- attr_hash = decoded_request.to_h
82
- normalize = ->{ decoded_request.normalized_hash }
83
- else
84
- matcher = WebMock::Matchers::HashIncludingMatcher.new(attrs)
85
- attr_hash = WebMock::Util::HashKeysStringifier.stringify_keys!(decoded_request.to_h, deep: true)
86
- normalize = ->{ decoded_request.normalized_hash(symbolize_keys: false) }
87
- end
88
-
89
- matched &= (matcher === attr_hash || matcher === normalize.call)
90
- end
91
-
92
- if block
93
- matched &= block.call(decoded_request)
94
- end
76
+ matched = true
77
+ matched &= decoded_request.include?(attrs) if attrs.any?
78
+ matched &= block.call(decoded_request) if block
95
79
 
96
80
  matched
97
81
  end if attrs.any? || block_given?
@@ -1,5 +1,5 @@
1
1
  module WebMock
2
2
  module Twirp
3
- VERSION = "0.1.2"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
@@ -26,6 +26,8 @@ Gem::Specification.new do |s|
26
26
 
27
27
  s.add_development_dependency "byebug"
28
28
  s.add_development_dependency "codecov"
29
+ s.add_development_dependency "rack"
29
30
  s.add_development_dependency "rspec"
30
31
  s.add_development_dependency "simplecov"
32
+ s.add_development_dependency "webrick"
31
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmock-twirp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Pepper
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-17 00:00:00.000000000 Z
11
+ date: 2022-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webmock
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webrick
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  description: Twirp support for WebMock
98
126
  email:
99
127
  executables: []