proto_pharm 0.6.0 → 0.7.0

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
  SHA256:
3
- metadata.gz: 404f9289692becf1d216f4c8a3dbdb574394035f4fe80849565931b61ecba9ba
4
- data.tar.gz: 6bb014799feda5517ed91d065a92c3feb5955c253779d5bf312fd6abc81f7882
3
+ metadata.gz: '085284c66deb0cdd0054f9b2663d9e1ef0c1a71384cc9af964f7ff02382d187d'
4
+ data.tar.gz: b86a47f713e24e281c28378f89a6efe06aa5b971787d3a1b842b32d7e2954cc7
5
5
  SHA512:
6
- metadata.gz: 84fc28f8e009deb5dee062d15b8eff4091219bb3af1b9ad1d83dd90399c171e1c19b435eb271258fdfb449e60d7210ef4a57a6d61ab5a9d23c22282ef9df476e
7
- data.tar.gz: ed36363f230916dfcab696c78f517b78256e7d3e954e02665485d7a0faf8aa0eb518be92daba1f30c58d4f85b92b5d1556cade1ac1e986e4441433f288d74cb0
6
+ metadata.gz: fbf7f332455eb884bfc2fe52c1bdf7488b7d64aff8f5f54b972aa09b21e340cc64e47a7e55fa27d7da37d94dfe3b6fcbea02f8c648f4ad02bd5a1f2d978c3253
7
+ data.tar.gz: 753a2290f4529efae044337f00431cce790f2b831256a323e92c157cd289a04d71f04a5d063d7b2f94fd0ae1883f93abca2899a61e799ec16456f1096d23c60c
@@ -27,7 +27,7 @@ jobs:
27
27
  env:
28
28
  BUNDLE_GEM__FURY__IO: ${{ secrets.GEMFURY_DEPLOY_TOKEN }}
29
29
  run: |
30
- gem install bundler
30
+ gem install bundler -v "~> 2.1.0"
31
31
  bundle config path vendor/bundle
32
32
  bundle install --jobs 4 --retry 3
33
33
  - name: Run RSpec
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # Changelog
2
2
 
3
- # 0.6.0
3
+ ## Upcoming
4
+
5
+ ## 0.7.0
6
+ *Release Date: 2021-02-19*
7
+
8
+ ### Additions
9
+ - Add configurable metadata serializer ([#6](https://github.com/Freshly/proto_pharm/pull/6))
10
+ - Add metadata serializer for Gruf ([#7](https://github.com/Freshly/proto_pharm/pull/7))
11
+ - Stub responses using a block ([#8](https://github.com/Freshly/proto_pharm/pull/8))
12
+ - Net connect method cleanup ([#9](https://github.com/Freshly/proto_pharm/pull/9))
13
+
14
+ ## 0.6.0
4
15
  *Release Date: 2020-12-07*
5
16
 
6
17
  - Rename gem to `proto_pharm`
data/Gemfile CHANGED
@@ -6,3 +6,5 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
7
  # Specify your gem's dependencies in proto_pharm.gemspec
8
8
  gemspec
9
+
10
+ gem "grpc", platform: :ruby
data/Gemfile.lock CHANGED
@@ -1,24 +1,32 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- proto_pharm (0.6.0)
4
+ proto_pharm (0.7.0)
5
5
  activesupport (>= 5.2.0)
6
+ directive
6
7
  grpc (>= 1.12.0, < 2)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
12
+ activemodel (6.0.3.4)
13
+ activesupport (= 6.0.3.4)
11
14
  activesupport (6.0.3.4)
12
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
16
  i18n (>= 0.7, < 2)
14
17
  minitest (~> 5.1)
15
18
  tzinfo (~> 1.1)
16
19
  zeitwerk (~> 2.2, >= 2.2.2)
20
+ around_the_world (0.25.4)
21
+ activesupport (>= 5.2.1)
17
22
  ast (2.4.1)
18
23
  byebug (11.1.1)
19
24
  coderay (1.1.2)
20
25
  concurrent-ruby (1.1.7)
21
26
  diff-lcs (1.4.4)
27
+ directive (0.25.4)
28
+ activesupport (>= 5.2.1)
29
+ spicerack (= 0.25.4)
22
30
  faker (2.14.0)
23
31
  i18n (>= 1.6, < 2)
24
32
  google-protobuf (3.14.0)
@@ -28,6 +36,12 @@ GEM
28
36
  google-protobuf (~> 3.13)
29
37
  googleapis-common-protos-types (~> 1.0)
30
38
  grpc-tools (1.32.0)
39
+ gruf (2.8.1)
40
+ activesupport (> 4)
41
+ concurrent-ruby (> 1)
42
+ grpc (~> 1.10)
43
+ grpc-tools (~> 1.10)
44
+ slop (~> 4.6)
31
45
  i18n (1.8.5)
32
46
  concurrent-ruby (~> 1.0)
33
47
  method_source (0.9.2)
@@ -44,6 +58,11 @@ GEM
44
58
  rack (2.2.3)
45
59
  rainbow (3.0.0)
46
60
  rake (13.0.1)
61
+ redis (4.2.5)
62
+ redis_hash (0.25.4)
63
+ activesupport (>= 5.2.1)
64
+ redis (>= 3.0)
65
+ tablesalt (= 0.25.4)
47
66
  regexp_parser (1.8.2)
48
67
  rexml (3.2.4)
49
68
  rspec (3.9.0)
@@ -83,11 +102,27 @@ GEM
83
102
  rubocop-rspec (1.43.2)
84
103
  rubocop (~> 0.87)
85
104
  ruby-progressbar (1.10.1)
105
+ short_circu_it (0.25.4)
106
+ activesupport (>= 5.2.1)
107
+ around_the_world (= 0.25.4)
108
+ slop (4.8.2)
109
+ spicerack (0.25.4)
110
+ around_the_world (= 0.25.4)
111
+ redis_hash (= 0.25.4)
112
+ short_circu_it (= 0.25.4)
113
+ tablesalt (= 0.25.4)
114
+ technologic (= 0.25.4)
86
115
  spicerack-styleguide (0.25.2)
87
116
  rubocop (~> 0.92.0)
88
117
  rubocop-performance (~> 1.8.0)
89
118
  rubocop-rails (~> 2.8.0)
90
119
  rubocop-rspec (~> 1.43.0)
120
+ tablesalt (0.25.4)
121
+ activemodel (>= 5.2.1)
122
+ activesupport (>= 5.2.1)
123
+ technologic (0.25.4)
124
+ activesupport (>= 5.2.1)
125
+ short_circu_it (= 0.25.4)
91
126
  thread_safe (0.3.6)
92
127
  tzinfo (1.2.8)
93
128
  thread_safe (~> 0.1)
@@ -100,7 +135,9 @@ PLATFORMS
100
135
  DEPENDENCIES
101
136
  bundler
102
137
  faker
138
+ grpc
103
139
  grpc-tools
140
+ gruf
104
141
  proto_pharm!
105
142
  pry-byebug
106
143
  rake (>= 12.3.3)
data/README.md CHANGED
@@ -60,6 +60,16 @@ client.hello(Hello::HelloRequest.new(msg: 'Hello?')) # => Sent to network
60
60
  client.hello(Hello::HelloRequest.new(msg: 'Hola?')) # => <Hello::HelloResponse: msg: "Bienvenidos!">
61
61
  ```
62
62
 
63
+ Or, stub the response with a block to perform some additional business logic:
64
+ _(Note - the `allow_grpc_service` syntax currently does not support block-stubbing)_
65
+ ```ruby
66
+ stub_grpc_action(Hello::Hello::Service, :Hello).to_return do |request|
67
+ { msg: request.msg.reverse }
68
+ end
69
+
70
+ client.hello(Hello::HelloRequest.new(msg: 'Hello?')) # => <Hello::HelloResponse: msg: "?olleH">
71
+ ```
72
+
63
73
  Stub a failure response:
64
74
  ```ruby
65
75
  allow_grpc_service(Hello::Hello)
@@ -150,7 +160,16 @@ client.hello(Hello::HelloRequest.new(msg: 'hi')) # => Hello::HelloResponse.ne
150
160
 
151
161
  ```
152
162
 
153
- ### You can user either proto objects or hash for stubbing requests
163
+ ### Stubbing with a block
164
+ ```ruby
165
+ ProtoPharm.stub_grpc_action(Hello::Hello::Service, :Hello).to_return do |request|
166
+ { msg: request.msg.reverse }
167
+ end
168
+
169
+ client.hello(Hello::HelloRequest.new(msg: 'Hello?')) # => <Hello::HelloResponse: msg: "?olleH">
170
+ ```
171
+
172
+ ### You can use either proto objects or hash for stubbing requests
154
173
 
155
174
  ```ruby
156
175
  ProtoPharm.stub_grpc_action(Hello::Hello::Service, :Hello).with(Hello::HelloRequest.new(msg: 'hi')).to_return(msg: 'test')
data/lib/proto_pharm.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/core_ext/module"
4
+ require "active_support/core_ext/object/blank"
5
+
6
+ require "directive"
4
7
  require "grpc"
5
8
 
6
9
  require_relative "proto_pharm/version"
@@ -13,12 +16,20 @@ require_relative "proto_pharm/adapter"
13
16
  require_relative "proto_pharm/grpc_stub_adapter"
14
17
  require_relative "proto_pharm/grpc_stub_adapter/mock_stub"
15
18
 
19
+ require_relative "proto_pharm/metadata_serializers/base"
20
+ require_relative "proto_pharm/metadata_serializers/gruf"
21
+ require_relative "proto_pharm/request_stub"
22
+ require_relative "proto_pharm/action_stub"
23
+ require_relative "proto_pharm/matchers/request_including_matcher"
16
24
  require_relative "proto_pharm/stub_registry"
17
25
  require_relative "proto_pharm/api"
18
26
 
19
27
  module ProtoPharm
20
28
  extend ProtoPharm::Api
21
29
 
30
+ include Directive::ConfigDelegation
31
+ delegates_to_configuration
32
+
22
33
  class << self
23
34
  delegate :enable!, :disable!, :enabled?, to: :adapter
24
35
 
@@ -33,10 +44,6 @@ module ProtoPharm
33
44
  def adapter
34
45
  @adapter ||= Adapter.new
35
46
  end
36
-
37
- def config
38
- @config ||= Configuration.new
39
- end
40
47
  end
41
48
 
42
49
  # Hook into GRPC::ClientStub
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/object/blank"
4
-
5
3
  module ProtoPharm
6
4
  class ActionStub < RequestStub
7
5
  include Introspection
@@ -26,7 +24,13 @@ module ProtoPharm
26
24
 
27
25
  # @param proto [Object] response proto object
28
26
  # @param request_kwargs [Hash] parameters to respond with
29
- def to_return(proto = nil, **request_kwargs)
27
+ def to_return(proto = nil, **request_kwargs, &block)
28
+ if block_given?
29
+ raise ArgumentError, "Cannot stub with static response if stubbing with a block" if proto.present? || request_kwargs.present?
30
+
31
+ return super(&block)
32
+ end
33
+
30
34
  super(endpoint.normalize_response_proto(proto, **request_kwargs))
31
35
  end
32
36
 
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "proto_pharm/request_stub"
4
- require "proto_pharm/action_stub"
5
- require "proto_pharm/matchers/request_including_matcher"
6
-
7
3
  module ProtoPharm
8
4
  module Api
9
5
  # @param path [String]
@@ -21,11 +17,15 @@ module ProtoPharm
21
17
  end
22
18
 
23
19
  def disable_net_connect!
24
- ProtoPharm.config.allow_net_connect = false
20
+ GrpcStubAdapter::MockStub.disable_net_connect!
25
21
  end
26
22
 
27
23
  def allow_net_connect!
28
- ProtoPharm.config.allow_net_connect = true
24
+ GrpcStubAdapter::MockStub.allow_net_connect!
25
+ end
26
+
27
+ def allow_net_connect?
28
+ GrpcStubAdapter::MockStub.allow_net_connect?
29
29
  end
30
30
  end
31
31
  end
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "directive"
4
+ require_relative "metadata_serializers/base"
5
+ require_relative "metadata_serializers/gruf"
6
+
3
7
  module ProtoPharm
4
- class Configuration
5
- attr_accessor :allow_net_connect
8
+ module Configuration
9
+ extend Directive
6
10
 
7
- def initialize
8
- @allow_net_connect = true
11
+ configuration_options do
12
+ option :metadata_serializer, default: MetadataSerializers::Base
9
13
  end
10
14
  end
11
15
  end
@@ -3,6 +3,20 @@
3
3
  module ProtoPharm
4
4
  class GrpcStubAdapter
5
5
  module MockStub
6
+ class << self
7
+ def disable_net_connect!
8
+ @allow_net_connect = false
9
+ end
10
+
11
+ def allow_net_connect!
12
+ @allow_net_connect = true
13
+ end
14
+
15
+ def allow_net_connect?
16
+ @allow_net_connect || false
17
+ end
18
+ end
19
+
6
20
  def request_response(method, request, *args, return_op: false, **opts)
7
21
  return super unless ProtoPharm.enabled?
8
22
 
@@ -11,11 +25,11 @@ module ProtoPharm
11
25
  if request_stub
12
26
  operation = OperationStub.new(metadata: opts[:metadata]) do
13
27
  request_stub.received!(request)
14
- request_stub.response.evaluate
28
+ request_stub.response.evaluate(request)
15
29
  end
16
30
 
17
31
  return_op ? operation : operation.execute
18
- elsif ProtoPharm.config.allow_net_connect
32
+ elsif _allow_net_connect?
19
33
  super
20
34
  else
21
35
  raise NetConnectNotAllowedError, method
@@ -32,7 +46,7 @@ module ProtoPharm
32
46
  if request_stub
33
47
  request_stub.received!(requests)
34
48
  request_stub.response.evaluate
35
- elsif ProtoPharm.config.allow_net_connect
49
+ elsif _allow_net_connect?
36
50
  super
37
51
  else
38
52
  raise NetConnectNotAllowedError, method
@@ -47,7 +61,7 @@ module ProtoPharm
47
61
  if request_stub
48
62
  request_stub.received!(request)
49
63
  request_stub.response.evaluate
50
- elsif ProtoPharm.config.allow_net_connect
64
+ elsif _allow_net_connect?
51
65
  super
52
66
  else
53
67
  raise NetConnectNotAllowedError, method
@@ -63,12 +77,18 @@ module ProtoPharm
63
77
  if request_stub
64
78
  request_stub.received!(requests)
65
79
  request_stub.response.evaluate
66
- elsif ProtoPharm.config.allow_net_connect
80
+ elsif _allow_net_connect?
67
81
  super
68
82
  else
69
83
  raise NetConnectNotAllowedError, method
70
84
  end
71
85
  end
86
+
87
+ private
88
+
89
+ def _allow_net_connect?
90
+ MockStub.allow_net_connect?
91
+ end
72
92
  end
73
93
  end
74
94
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProtoPharm
4
+ module MetadataSerializers
5
+ module Base
6
+ class << self
7
+ def serialize(**metadata)
8
+ metadata.fetch(:metadata, {})
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProtoPharm
4
+ module MetadataSerializers
5
+ module Freshly
6
+ class << self
7
+ def serialize(code:, app_code: nil, **kwargs)
8
+ metadata = kwargs.fetch(:metadata, {})
9
+
10
+ {
11
+ metadata: metadata,
12
+ }.tap do |hash|
13
+ if ::Gruf.append_server_errors_to_trailing_metadata
14
+ enc_metadata = Labyrinth::GrufComponents::ErrorSerializer.encoded_metadata_hash(metadata)
15
+
16
+ e = ::Gruf::Error.new(code: code, app_code: app_code, metadata: enc_metadata)
17
+ hash[::Gruf.error_metadata_key.to_sym] = e.serialize
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Serializes metadata for an application's Gruf configuration.
4
+ #
5
+ # Usage:
6
+ # Configuration.configure { |c| c.metadata_serializer = ProtoPharm::MetadataSerializers::Gruf }
7
+ #
8
+ # allow_grpc_service(AService)
9
+ # .to receive_rpc(:your_endpoint)
10
+ # .and_fail_with(
11
+ # code: :invalid_argument,
12
+ # app_code: :cant_let_you_do_that_star_fox
13
+ # metadata: { some: :meta }
14
+ # )
15
+ #
16
+ # begin
17
+ # Service.your_endpoint
18
+ # rescue Gruf::Client::Error::InvalidArgument => e
19
+ # e.error
20
+ module ProtoPharm
21
+ module MetadataSerializers
22
+ module Gruf
23
+ class << self
24
+ def serialize(code:, app_code: nil, **metadata)
25
+ {
26
+ **metadata.fetch(:metadata, {}),
27
+ }.tap do |hash|
28
+ if ::Gruf.append_server_errors_to_trailing_metadata
29
+ e = ::Gruf::Error.new(code: code, app_code: app_code, **metadata)
30
+ hash[::Gruf.error_metadata_key.to_sym] = e.serialize
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -23,9 +23,17 @@ module ProtoPharm
23
23
  self
24
24
  end
25
25
 
26
- def to_return(*values)
27
- responses = [*values].flatten.map { |v| Response::Value.new(v) }
26
+ def to_return(*values, &block)
27
+ if block_given?
28
+ raise ArgumentError, "Cannot stub with static response if stubbing with a block" if values.any?
29
+
30
+ responses = [ Response::Value.new(block) ]
31
+ else
32
+ responses = [*values].flatten.map { |v| Response::Value.new(v) }
33
+ end
34
+
28
35
  @response_sequence << ProtoPharm::ResponsesSequence.new(responses)
36
+
29
37
  self
30
38
  end
31
39
 
@@ -18,18 +18,24 @@ module ProtoPharm
18
18
  end
19
19
  end
20
20
 
21
- def evaluate
21
+ def evaluate(_request = nil)
22
22
  raise @exception.dup
23
23
  end
24
24
  end
25
25
 
26
26
  class Value
27
+ attr_reader :value
28
+
27
29
  def initialize(value)
28
30
  @value = value
29
31
  end
30
32
 
31
- def evaluate
32
- @value.dup
33
+ def evaluate(request = nil)
34
+ if value.respond_to?(:call)
35
+ value.call(request)
36
+ else
37
+ value.dup
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -1,15 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "active_support/core_ext/object/blank"
4
-
5
3
  module ProtoPharm
6
4
  module StubComponents
7
5
  module FailureResponse
8
6
  # @param code [String, Symbol] A gRPC failure code, such as not_found or invalid_argument. Default: :invalid_argument
9
7
  # @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))
8
+ # @param metadata [Hash] A hash of metadata to be passed back with the exception. See {ProtoPharm::MetadataSerializers::Base.serialize}.
9
+ def to_fail_with(code = :invalid_argument, message = "unknown cause", **metadata)
10
+ to_raise(exception_class(code).new(message, metadata_serializer.serialize(code: code, message: message, **metadata)))
13
11
  end
14
12
 
15
13
  def to_fail
@@ -18,6 +16,10 @@ module ProtoPharm
18
16
 
19
17
  private
20
18
 
19
+ def metadata_serializer
20
+ Configuration.config.metadata_serializer
21
+ end
22
+
21
23
  def exception_class(code)
22
24
  class_name = code.to_s.camelize
23
25
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProtoPharm
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
data/proto_pharm.gemspec CHANGED
@@ -24,10 +24,12 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ["lib"]
25
25
 
26
26
  spec.add_dependency "activesupport", ">= 5.2.0"
27
+ spec.add_dependency "directive"
27
28
  spec.add_dependency "grpc", ">= 1.12.0", "< 2"
28
29
 
29
30
  spec.add_development_dependency "bundler"
30
31
  spec.add_development_dependency "faker"
32
+ spec.add_development_dependency "gruf"
31
33
  spec.add_development_dependency "grpc-tools"
32
34
  spec.add_development_dependency "pry-byebug"
33
35
  spec.add_development_dependency "rake", ">= 12.3.3"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proto_pharm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuta Iwama
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-12-07 00:00:00.000000000 Z
12
+ date: 2021-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 5.2.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: directive
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: grpc
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -73,6 +87,20 @@ dependencies:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: gruf
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'
76
104
  - !ruby/object:Gem::Dependency
77
105
  name: grpc-tools
78
106
  requirement: !ruby/object:Gem::Requirement
@@ -207,6 +235,9 @@ files:
207
235
  - lib/proto_pharm/introspection/service_resolver.rb
208
236
  - lib/proto_pharm/matchers/hash_argument_matcher.rb
209
237
  - lib/proto_pharm/matchers/request_including_matcher.rb
238
+ - lib/proto_pharm/metadata_serializers/base.rb
239
+ - lib/proto_pharm/metadata_serializers/freshly.rb
240
+ - lib/proto_pharm/metadata_serializers/gruf.rb
210
241
  - lib/proto_pharm/operation_stub.rb
211
242
  - lib/proto_pharm/request_pattern.rb
212
243
  - lib/proto_pharm/request_stub.rb