proto_pharm 0.6.0

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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/rspec.yml +35 -0
  3. data/.gitignore +10 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +3 -0
  6. data/.travis.yml +7 -0
  7. data/CHANGELOG.md +12 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +113 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +238 -0
  12. data/Rakefile +8 -0
  13. data/bin/console +11 -0
  14. data/bin/regen_examples +7 -0
  15. data/bin/release +16 -0
  16. data/bin/setup +8 -0
  17. data/lib/proto_pharm.rb +47 -0
  18. data/lib/proto_pharm/action_stub.rb +57 -0
  19. data/lib/proto_pharm/adapter.rb +13 -0
  20. data/lib/proto_pharm/api.rb +31 -0
  21. data/lib/proto_pharm/configuration.rb +11 -0
  22. data/lib/proto_pharm/errors.rb +21 -0
  23. data/lib/proto_pharm/grpc_stub_adapter.rb +24 -0
  24. data/lib/proto_pharm/grpc_stub_adapter/mock_stub.rb +74 -0
  25. data/lib/proto_pharm/introspection.rb +18 -0
  26. data/lib/proto_pharm/introspection/rpc_inspector.rb +58 -0
  27. data/lib/proto_pharm/introspection/service_resolver.rb +24 -0
  28. data/lib/proto_pharm/matchers/hash_argument_matcher.rb +43 -0
  29. data/lib/proto_pharm/matchers/request_including_matcher.rb +39 -0
  30. data/lib/proto_pharm/operation_stub.rb +30 -0
  31. data/lib/proto_pharm/request_pattern.rb +29 -0
  32. data/lib/proto_pharm/request_stub.rb +67 -0
  33. data/lib/proto_pharm/response.rb +36 -0
  34. data/lib/proto_pharm/response_sequence.rb +40 -0
  35. data/lib/proto_pharm/rspec.rb +28 -0
  36. data/lib/proto_pharm/rspec/action_stub_builder.rb +37 -0
  37. data/lib/proto_pharm/rspec/action_stub_proxy.rb +58 -0
  38. data/lib/proto_pharm/rspec/dsl.rb +15 -0
  39. data/lib/proto_pharm/rspec/matchers/have_received_rpc.rb +72 -0
  40. data/lib/proto_pharm/stub_components/failure_response.rb +30 -0
  41. data/lib/proto_pharm/stub_registry.rb +36 -0
  42. data/lib/proto_pharm/version.rb +5 -0
  43. data/proto_pharm.gemspec +38 -0
  44. data/rakelib/regen_examples.rake +11 -0
  45. metadata +248 -0
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/object/blank"
4
+
5
+ module ProtoPharm
6
+ module StubComponents
7
+ module FailureResponse
8
+ # @param code [String, Symbol] A gRPC failure code, such as not_found or invalid_argument. Default: :invalid_argument
9
+ # @param message [String] A message to pass back with the exception
10
+ # @param metadata [Hash] A hash of metadata to be passed back with the exception
11
+ def to_fail_with(code = :invalid_argument, message = "unknown cause", metadata: {})
12
+ to_raise(exception_class(code).new(message, metadata))
13
+ end
14
+
15
+ def to_fail
16
+ to_fail_with
17
+ end
18
+
19
+ private
20
+
21
+ def exception_class(code)
22
+ class_name = code.to_s.camelize
23
+
24
+ (GRPC.const_get(class_name) if GRPC.const_defined?(class_name)).tap do |klass|
25
+ raise ArgumentError, "'#{code}' is not a valid gRPC failure code" unless klass.present? && klass < GRPC::BadStatus
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProtoPharm
4
+ class StubRegistry
5
+ attr_reader :request_stubs
6
+
7
+ def initialize
8
+ @request_stubs = {}
9
+ end
10
+
11
+ def reset!
12
+ @request_stubs = {}
13
+ end
14
+
15
+ # @param stub [ProtoPharm::RequestStub]
16
+ def register_request_stub(stub)
17
+ request_stubs[stub.path] ||= []
18
+ request_stubs[stub.path].unshift(stub)
19
+ stub
20
+ end
21
+
22
+ # @param path [String]
23
+ # @param request [Object] Optional; specify a request object to match against. Default: nil.
24
+ # @return [Array<ProtoPharm::RequestStub>] Array of all matching request stubs, if any. See {RequestPattern#match?} for matching logic.
25
+ def all_requests_matching(path, request = nil)
26
+ request_stubs[path]&.select { |stub| stub.match?(path, request) } || []
27
+ end
28
+
29
+ # @param path [String]
30
+ # @param request [Object]
31
+ # @return [ProtoPharm::RequestStub] RequestStub matching the given path/request, if found
32
+ def find_request_matching(path, request)
33
+ request_stubs[path]&.find { |stub| stub.match?(path, request) }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProtoPharm
4
+ VERSION = "0.6.0"
5
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ require_relative "lib/proto_pharm/version"
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "proto_pharm"
10
+ spec.version = ProtoPharm::VERSION
11
+ spec.authors = ["Yuta Iwama", "Allen Rettberg"]
12
+ spec.email = ["ganmacs@gmail.com", "allen.rettberg@freshly.com"]
13
+
14
+ spec.summary = "Stub your gRPCs with lab-grown proto objects"
15
+ spec.description = "Stub your gRPCs with lab-grown proto objects"
16
+ spec.homepage = "https://github.com/Freshly/proto_pharm"
17
+ spec.license = "MIT"
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ["lib"]
25
+
26
+ spec.add_dependency "activesupport", ">= 5.2.0"
27
+ spec.add_dependency "grpc", ">= 1.12.0", "< 2"
28
+
29
+ spec.add_development_dependency "bundler"
30
+ spec.add_development_dependency "faker"
31
+ spec.add_development_dependency "grpc-tools"
32
+ spec.add_development_dependency "pry-byebug"
33
+ spec.add_development_dependency "rake", ">= 12.3.3"
34
+ spec.add_development_dependency "rspec", "~> 3.0"
35
+ spec.add_development_dependency "rspice"
36
+ spec.add_development_dependency "rubocop"
37
+ spec.add_development_dependency "spicerack-styleguide"
38
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ task :regen_examples do
4
+ system <<~BASH
5
+ grpc_tools_ruby_protoc \
6
+ -I ./spec/examples/hello \
7
+ --ruby_out=./spec/examples/hello \
8
+ --grpc_out=./spec/examples/hello \
9
+ spec/examples/hello/hello.proto
10
+ BASH
11
+ end
metadata ADDED
@@ -0,0 +1,248 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: proto_pharm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuta Iwama
8
+ - Allen Rettberg
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2020-12-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 5.2.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 5.2.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: grpc
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.12.0
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '2'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 1.12.0
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ - !ruby/object:Gem::Dependency
49
+ name: bundler
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: faker
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: grpc-tools
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: pry-byebug
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ - !ruby/object:Gem::Dependency
105
+ name: rake
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 12.3.3
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 12.3.3
118
+ - !ruby/object:Gem::Dependency
119
+ name: rspec
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rspice
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ - !ruby/object:Gem::Dependency
147
+ name: rubocop
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ - !ruby/object:Gem::Dependency
161
+ name: spicerack-styleguide
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ description: Stub your gRPCs with lab-grown proto objects
175
+ email:
176
+ - ganmacs@gmail.com
177
+ - allen.rettberg@freshly.com
178
+ executables: []
179
+ extensions: []
180
+ extra_rdoc_files: []
181
+ files:
182
+ - ".github/workflows/rspec.yml"
183
+ - ".gitignore"
184
+ - ".rspec"
185
+ - ".rubocop.yml"
186
+ - ".travis.yml"
187
+ - CHANGELOG.md
188
+ - Gemfile
189
+ - Gemfile.lock
190
+ - LICENSE.txt
191
+ - README.md
192
+ - Rakefile
193
+ - bin/console
194
+ - bin/regen_examples
195
+ - bin/release
196
+ - bin/setup
197
+ - lib/proto_pharm.rb
198
+ - lib/proto_pharm/action_stub.rb
199
+ - lib/proto_pharm/adapter.rb
200
+ - lib/proto_pharm/api.rb
201
+ - lib/proto_pharm/configuration.rb
202
+ - lib/proto_pharm/errors.rb
203
+ - lib/proto_pharm/grpc_stub_adapter.rb
204
+ - lib/proto_pharm/grpc_stub_adapter/mock_stub.rb
205
+ - lib/proto_pharm/introspection.rb
206
+ - lib/proto_pharm/introspection/rpc_inspector.rb
207
+ - lib/proto_pharm/introspection/service_resolver.rb
208
+ - lib/proto_pharm/matchers/hash_argument_matcher.rb
209
+ - lib/proto_pharm/matchers/request_including_matcher.rb
210
+ - lib/proto_pharm/operation_stub.rb
211
+ - lib/proto_pharm/request_pattern.rb
212
+ - lib/proto_pharm/request_stub.rb
213
+ - lib/proto_pharm/response.rb
214
+ - lib/proto_pharm/response_sequence.rb
215
+ - lib/proto_pharm/rspec.rb
216
+ - lib/proto_pharm/rspec/action_stub_builder.rb
217
+ - lib/proto_pharm/rspec/action_stub_proxy.rb
218
+ - lib/proto_pharm/rspec/dsl.rb
219
+ - lib/proto_pharm/rspec/matchers/have_received_rpc.rb
220
+ - lib/proto_pharm/stub_components/failure_response.rb
221
+ - lib/proto_pharm/stub_registry.rb
222
+ - lib/proto_pharm/version.rb
223
+ - proto_pharm.gemspec
224
+ - rakelib/regen_examples.rake
225
+ homepage: https://github.com/Freshly/proto_pharm
226
+ licenses:
227
+ - MIT
228
+ metadata: {}
229
+ post_install_message:
230
+ rdoc_options: []
231
+ require_paths:
232
+ - lib
233
+ required_ruby_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ requirements: []
244
+ rubygems_version: 3.1.4
245
+ signing_key:
246
+ specification_version: 4
247
+ summary: Stub your gRPCs with lab-grown proto objects
248
+ test_files: []