proto_pharm 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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: []