protobuffy 3.6.0 → 4.0.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +67 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +25 -5
- data/CHANGES.md +55 -0
- data/CONTRIBUTING.md +1 -1
- data/LICENSE.txt +17 -9
- data/README.md +13 -12
- data/Rakefile +15 -11
- data/bin/protoc-gen-ruby +8 -3
- data/bin/rpc_server +1 -0
- data/examples/lib/example/reverse-client.rb +2 -2
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +57 -53
- data/lib/protobuf/cli.rb +94 -74
- data/lib/protobuf/code_generator.rb +60 -9
- data/lib/protobuf/decoder.rb +19 -65
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +11 -1
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +55 -3
- data/lib/protobuf/encoder.rb +13 -53
- data/lib/protobuf/enum.rb +58 -63
- data/lib/protobuf/field.rb +4 -4
- data/lib/protobuf/field/base_field.rb +101 -173
- data/lib/protobuf/field/bool_field.rb +17 -11
- data/lib/protobuf/field/bytes_field.rb +21 -35
- data/lib/protobuf/field/double_field.rb +0 -1
- data/lib/protobuf/field/enum_field.rb +23 -22
- data/lib/protobuf/field/field_array.rb +5 -4
- data/lib/protobuf/field/fixed32_field.rb +1 -1
- data/lib/protobuf/field/fixed64_field.rb +0 -1
- data/lib/protobuf/field/float_field.rb +4 -1
- data/lib/protobuf/field/int32_field.rb +0 -1
- data/lib/protobuf/field/int64_field.rb +0 -1
- data/lib/protobuf/field/integer_field.rb +0 -1
- data/lib/protobuf/field/message_field.rb +13 -28
- data/lib/protobuf/field/sfixed32_field.rb +0 -1
- data/lib/protobuf/field/sfixed64_field.rb +0 -1
- data/lib/protobuf/field/signed_integer_field.rb +0 -1
- data/lib/protobuf/field/sint32_field.rb +0 -1
- data/lib/protobuf/field/sint64_field.rb +0 -1
- data/lib/protobuf/field/string_field.rb +2 -4
- data/lib/protobuf/field/uint32_field.rb +0 -1
- data/lib/protobuf/field/uint64_field.rb +0 -1
- data/lib/protobuf/field/varint_field.rb +30 -13
- data/lib/protobuf/generators/base.rb +30 -16
- data/lib/protobuf/generators/enum_generator.rb +6 -9
- data/lib/protobuf/generators/extension_generator.rb +1 -2
- data/lib/protobuf/generators/field_generator.rb +25 -13
- data/lib/protobuf/generators/file_generator.rb +157 -35
- data/lib/protobuf/generators/group_generator.rb +22 -17
- data/lib/protobuf/generators/message_generator.rb +13 -14
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +12 -13
- data/lib/protobuf/generators/service_generator.rb +2 -3
- data/lib/protobuf/http.rb +2 -2
- data/lib/protobuf/lifecycle.rb +20 -33
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +114 -47
- data/lib/protobuf/message/fields.rb +170 -88
- data/lib/protobuf/message/serialization.rb +19 -18
- data/lib/protobuf/optionable.rb +53 -6
- data/lib/protobuf/rpc/buffer.rb +18 -19
- data/lib/protobuf/rpc/client.rb +22 -50
- data/lib/protobuf/rpc/connectors/base.rb +177 -12
- data/lib/protobuf/rpc/connectors/http.rb +14 -9
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +13 -8
- data/lib/protobuf/rpc/connectors/zmq.rb +178 -73
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +4 -1
- data/lib/protobuf/rpc/env.rb +12 -12
- data/lib/protobuf/rpc/error.rb +3 -3
- data/lib/protobuf/rpc/error/client_error.rb +4 -4
- data/lib/protobuf/rpc/error/server_error.rb +9 -9
- data/lib/protobuf/rpc/middleware/exception_handler.rb +6 -2
- data/lib/protobuf/rpc/middleware/logger.rb +8 -4
- data/lib/protobuf/rpc/middleware/request_decoder.rb +17 -21
- data/lib/protobuf/rpc/middleware/response_encoder.rb +22 -27
- data/lib/protobuf/rpc/middleware/statsd.rb +3 -3
- data/lib/protobuf/rpc/rpc.pb.rb +4 -1
- data/lib/protobuf/rpc/server.rb +1 -1
- data/lib/protobuf/rpc/servers/http/server.rb +19 -17
- data/lib/protobuf/rpc/servers/socket/server.rb +78 -70
- data/lib/protobuf/rpc/servers/socket/worker.rb +4 -4
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -15
- data/lib/protobuf/rpc/servers/zmq/broker.rb +70 -31
- data/lib/protobuf/rpc/servers/zmq/server.rb +55 -47
- data/lib/protobuf/rpc/servers/zmq/util.rb +14 -13
- data/lib/protobuf/rpc/servers/zmq/worker.rb +16 -16
- data/lib/protobuf/rpc/servers/zmq_runner.rb +26 -7
- data/lib/protobuf/rpc/service.rb +21 -27
- data/lib/protobuf/rpc/service_directory.rb +43 -27
- data/lib/protobuf/rpc/service_dispatcher.rb +9 -10
- data/lib/protobuf/rpc/service_filters.rb +32 -55
- data/lib/protobuf/rpc/stat.rb +4 -8
- data/lib/protobuf/socket.rb +1 -2
- data/lib/protobuf/tasks/compile.rake +3 -4
- data/lib/protobuf/varint.rb +9 -0
- data/lib/protobuf/varint_pure.rb +13 -0
- data/lib/protobuf/version.rb +1 -1
- data/lib/protobuf/zmq.rb +2 -2
- data/proto/google/protobuf/descriptor.proto +190 -31
- data/protobuffy.gemspec +30 -17
- data/spec/benchmark/tasks.rb +27 -19
- data/spec/bin/protoc-gen-ruby_spec.rb +11 -6
- data/spec/encoding/all_types_spec.rb +96 -84
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +38 -0
- data/spec/functional/socket_server_spec.rb +15 -15
- data/spec/functional/zmq_server_spec.rb +29 -27
- data/spec/lib/protobuf/cli_spec.rb +82 -67
- data/spec/lib/protobuf/code_generator_spec.rb +37 -10
- data/spec/lib/protobuf/enum_spec.rb +77 -46
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +26 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +114 -1
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +44 -11
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +4 -6
- data/spec/lib/protobuf/generators/base_spec.rb +80 -13
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +35 -21
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +12 -13
- data/spec/lib/protobuf/generators/field_generator_spec.rb +73 -21
- data/spec/lib/protobuf/generators/file_generator_spec.rb +89 -6
- data/spec/lib/protobuf/generators/service_generator_spec.rb +25 -13
- data/spec/lib/protobuf/lifecycle_spec.rb +25 -20
- data/spec/lib/protobuf/message_spec.rb +578 -79
- data/spec/lib/protobuf/optionable_spec.rb +202 -26
- data/spec/lib/protobuf/rpc/client_spec.rb +16 -16
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +167 -13
- data/spec/lib/protobuf/rpc/connectors/connector_spec.rb +4 -5
- data/spec/lib/protobuf/rpc/connectors/http_spec.rb +13 -11
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +6 -7
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +35 -52
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +10 -10
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/middleware/statsd_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/http/server_spec.rb +47 -44
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +6 -6
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +12 -10
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +11 -11
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +7 -7
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +47 -49
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +8 -25
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +102 -69
- data/spec/lib/protobuf/rpc/service_spec.rb +37 -36
- data/spec/lib/protobuf/rpc/stat_spec.rb +7 -9
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +55 -28
- data/spec/spec_helper.rb +12 -27
- data/spec/support/all.rb +0 -1
- data/spec/support/packed_field.rb +4 -3
- data/spec/support/{test → protos}/all_types.data.bin +0 -0
- data/spec/support/{test → protos}/all_types.data.txt +0 -0
- data/spec/support/{test → protos}/enum.pb.rb +8 -4
- data/spec/support/{test → protos}/enum.proto +4 -1
- data/spec/support/{test → protos}/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/{test → protos}/google_unittest.proto +237 -66
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +268 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/{test → protos}/google_unittest_import.proto +19 -10
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/{test → protos}/google_unittest_import_public.proto +8 -5
- data/spec/support/{test → protos}/multi_field_extensions.pb.rb +5 -2
- data/spec/support/{test → protos}/multi_field_extensions.proto +2 -0
- data/spec/support/{test → protos}/resource.pb.rb +47 -11
- data/spec/support/{test → protos}/resource.proto +24 -1
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +32 -61
- metadata +119 -59
- data/lib/protobuf/deprecator.rb +0 -42
- data/lib/protobuf/logger.rb +0 -93
- data/lib/protobuf/rpc/connector.rb +0 -21
- data/lib/protobuf/rpc/connectors/common.rb +0 -172
- data/spec/data/data.bin +0 -3
- data/spec/data/types.bin +0 -0
- data/spec/lib/protobuf/logger_spec.rb +0 -145
- data/spec/lib/protobuf/rpc/connector_spec.rb +0 -26
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +0 -170
- data/spec/support/test/defaults.pb.rb +0 -25
- data/spec/support/test/defaults.proto +0 -9
- data/spec/support/test/extended.pb.rb +0 -22
- data/spec/support/test/extended.proto +0 -10
- data/spec/support/test/google_unittest.pb.rb +0 -543
- data/spec/support/test/google_unittest_import.pb.rb +0 -37
- data/spec/support/test/google_unittest_import_public.pb.rb +0 -8
- data/spec/support/test/resource_service.rb +0 -26
- data/spec/support/tolerance_matcher.rb +0 -40
@@ -9,15 +9,23 @@ require 'protobuf/rpc/dynamic_discovery.pb'
|
|
9
9
|
|
10
10
|
module Protobuf
|
11
11
|
module Rpc
|
12
|
+
def self.service_directory
|
13
|
+
@service_directory ||= ::Protobuf::Rpc::ServiceDirectory.instance
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.service_directory=(directory)
|
17
|
+
@service_directory = directory
|
18
|
+
end
|
19
|
+
|
12
20
|
class ServiceDirectory
|
13
21
|
include ::Singleton
|
14
|
-
include ::Protobuf::
|
22
|
+
include ::Protobuf::Logging
|
15
23
|
|
16
|
-
DEFAULT_ADDRESS =
|
24
|
+
DEFAULT_ADDRESS = '0.0.0.0'.freeze
|
17
25
|
DEFAULT_PORT = 53000
|
18
26
|
DEFAULT_TIMEOUT = 1
|
19
27
|
|
20
|
-
class Listing <
|
28
|
+
class Listing < SimpleDelegator
|
21
29
|
attr_reader :expires_at
|
22
30
|
|
23
31
|
def initialize(server)
|
@@ -45,13 +53,9 @@ module Protobuf
|
|
45
53
|
end
|
46
54
|
|
47
55
|
def update(server)
|
48
|
-
|
56
|
+
__setobj__(server)
|
49
57
|
@expires_at = Time.now.to_i + ttl
|
50
58
|
end
|
51
|
-
|
52
|
-
def __getobj__
|
53
|
-
@server
|
54
|
-
end
|
55
59
|
end
|
56
60
|
|
57
61
|
# Class Methods
|
@@ -70,11 +74,11 @@ module Protobuf
|
|
70
74
|
|
71
75
|
def self.start
|
72
76
|
yield(self) if block_given?
|
73
|
-
|
77
|
+
instance.start
|
74
78
|
end
|
75
79
|
|
76
80
|
def self.stop
|
77
|
-
|
81
|
+
instance.stop
|
78
82
|
end
|
79
83
|
|
80
84
|
#
|
@@ -86,6 +90,7 @@ module Protobuf
|
|
86
90
|
|
87
91
|
def all_listings_for(service)
|
88
92
|
if running? && @listings_by_service.key?(service.to_s)
|
93
|
+
start_listener_thread if listener_dead?
|
89
94
|
@listings_by_service[service.to_s].entries.shuffle
|
90
95
|
else
|
91
96
|
[]
|
@@ -93,15 +98,19 @@ module Protobuf
|
|
93
98
|
end
|
94
99
|
|
95
100
|
def each_listing(&block)
|
101
|
+
start_listener_thread if listener_dead?
|
96
102
|
@listings_by_uuid.each_value(&block)
|
97
103
|
end
|
98
104
|
|
99
105
|
def lookup(service)
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
106
|
+
return unless running?
|
107
|
+
start_listener_thread if listener_dead?
|
108
|
+
return unless @listings_by_service.key?(service.to_s)
|
109
|
+
@listings_by_service[service.to_s].entries.sample
|
110
|
+
end
|
111
|
+
|
112
|
+
def listener_dead?
|
113
|
+
@thread.nil? || !@thread.alive?
|
105
114
|
end
|
106
115
|
|
107
116
|
def restart
|
@@ -110,22 +119,29 @@ module Protobuf
|
|
110
119
|
end
|
111
120
|
|
112
121
|
def running?
|
113
|
-
!!@
|
122
|
+
!!@running
|
114
123
|
end
|
115
124
|
|
116
125
|
def start
|
117
126
|
unless running?
|
118
127
|
init_socket
|
119
|
-
|
120
|
-
@
|
128
|
+
logger.info { sign_message("listening to udp://#{self.class.address}:#{self.class.port}") }
|
129
|
+
@running = true
|
121
130
|
end
|
122
131
|
|
132
|
+
start_listener_thread if listener_dead?
|
123
133
|
self
|
124
134
|
end
|
125
135
|
|
136
|
+
def start_listener_thread
|
137
|
+
return if @thread.try(:alive?)
|
138
|
+
@thread = Thread.new { send(:run) }
|
139
|
+
end
|
140
|
+
|
126
141
|
def stop
|
127
|
-
|
142
|
+
logger.info { sign_message("Stopping directory") }
|
128
143
|
|
144
|
+
@running = false
|
129
145
|
@thread.try(:kill).try(:join)
|
130
146
|
@socket.try(:close)
|
131
147
|
|
@@ -151,7 +167,7 @@ module Protobuf
|
|
151
167
|
end
|
152
168
|
|
153
169
|
trigger(action, listing)
|
154
|
-
|
170
|
+
logger.debug { sign_message("#{action} server: #{server.inspect}") }
|
155
171
|
end
|
156
172
|
|
157
173
|
def init_socket
|
@@ -177,7 +193,7 @@ module Protobuf
|
|
177
193
|
remove_listing(uuid)
|
178
194
|
end
|
179
195
|
else
|
180
|
-
|
196
|
+
logger.info { sign_message("Ignoring incomplete beacon: #{beacon.inspect}") }
|
181
197
|
end
|
182
198
|
end
|
183
199
|
|
@@ -193,18 +209,18 @@ module Protobuf
|
|
193
209
|
end
|
194
210
|
|
195
211
|
def remove_expired_listings
|
196
|
-
|
212
|
+
logger.debug { sign_message("Removing expired listings") }
|
197
213
|
@listings_by_uuid.each do |uuid, listing|
|
198
214
|
remove_listing(uuid) if listing.expired?
|
199
215
|
end
|
200
216
|
end
|
201
217
|
|
202
218
|
def remove_listing(uuid)
|
203
|
-
listing = @listings_by_uuid[uuid]
|
219
|
+
listing = @listings_by_uuid[uuid] || return
|
204
220
|
|
205
|
-
|
221
|
+
logger.debug { sign_message("Removing listing: #{listing.inspect}") }
|
206
222
|
|
207
|
-
@listings_by_service.
|
223
|
+
@listings_by_service.each_value do |listings|
|
208
224
|
listings.delete(listing)
|
209
225
|
end
|
210
226
|
|
@@ -219,7 +235,7 @@ module Protobuf
|
|
219
235
|
end
|
220
236
|
|
221
237
|
def run
|
222
|
-
sweep_interval =
|
238
|
+
sweep_interval = 5 # sweep expired listings every 5 seconds
|
223
239
|
next_sweep = Time.now.to_i + sweep_interval
|
224
240
|
|
225
241
|
loop do
|
@@ -233,7 +249,7 @@ module Protobuf
|
|
233
249
|
end
|
234
250
|
end
|
235
251
|
rescue => e
|
236
|
-
|
252
|
+
logger.debug { sign_message("ERROR: (#{e.class}) #{e.message}\n#{e.backtrace.join("\n")}") }
|
237
253
|
retry
|
238
254
|
end
|
239
255
|
|
@@ -1,17 +1,21 @@
|
|
1
|
-
require 'protobuf/
|
1
|
+
require 'protobuf/logging'
|
2
2
|
|
3
3
|
module Protobuf
|
4
4
|
module Rpc
|
5
5
|
class ServiceDispatcher
|
6
|
-
include ::Protobuf::
|
6
|
+
include ::Protobuf::Logging
|
7
7
|
|
8
8
|
attr_reader :env
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(_app)
|
11
11
|
# End of the line...
|
12
12
|
end
|
13
13
|
|
14
14
|
def call(env)
|
15
|
+
dup._call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
def _call(env)
|
15
19
|
@env = env
|
16
20
|
|
17
21
|
env.response = dispatch_rpc_request
|
@@ -22,15 +26,10 @@ module Protobuf
|
|
22
26
|
@rpc_service ||= env.rpc_service.new(env)
|
23
27
|
end
|
24
28
|
|
25
|
-
|
29
|
+
private
|
26
30
|
|
27
|
-
# Call the given service method.
|
28
31
|
def dispatch_rpc_request
|
29
|
-
|
30
|
-
raise MethodNotFound.new("#{service_name}##{method_name} is not a publicly defined method.")
|
31
|
-
end
|
32
|
-
|
33
|
-
rpc_service.callable_rpc_method(method_name).call
|
32
|
+
rpc_service.call(method_name)
|
34
33
|
rpc_service.response
|
35
34
|
end
|
36
35
|
|
@@ -24,7 +24,7 @@ module Protobuf
|
|
24
24
|
# whose values are Sets.
|
25
25
|
#
|
26
26
|
def filters
|
27
|
-
@filters ||= Hash.new { |h,k| h[k] = [] }
|
27
|
+
@filters ||= Hash.new { |h, k| h[k] = [] }
|
28
28
|
end
|
29
29
|
|
30
30
|
# Filters hash keyed based on filter type (e.g. :before, :after, :around),
|
@@ -37,7 +37,7 @@ module Protobuf
|
|
37
37
|
def rescue_from(*ex_klasses, &block)
|
38
38
|
options = ex_klasses.last.is_a?(Hash) ? ex_klasses.pop : {}
|
39
39
|
callable = options.delete(:with) { block }
|
40
|
-
|
40
|
+
fail ArgumentError, 'Option :with missing from rescue_from options' if callable.nil?
|
41
41
|
ex_klasses.each { |ex_klass| rescue_filters[ex_klass] = callable }
|
42
42
|
end
|
43
43
|
|
@@ -45,12 +45,12 @@ module Protobuf
|
|
45
45
|
|
46
46
|
def define_filter(type, filter, options = {})
|
47
47
|
return if filter_defined?(type, filter)
|
48
|
-
filters[type] << options.merge(
|
48
|
+
filters[type] << options.merge(:callable => filter)
|
49
49
|
remember_filter(type, filter)
|
50
50
|
end
|
51
51
|
|
52
52
|
def defined_filters
|
53
|
-
@defined_filters ||= Hash.new { |h,k| h[k] = Set.new }
|
53
|
+
@defined_filters ||= Hash.new { |h, k| h[k] = Set.new }
|
54
54
|
end
|
55
55
|
|
56
56
|
# Check to see if the filter has been defined.
|
@@ -66,8 +66,8 @@ module Protobuf
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# Takes a list of actually (or potentially) callable objects.
|
69
|
-
# TODO add support for if/unless
|
70
|
-
# TODO add support for only/except sub-filters
|
69
|
+
# TODO: add support for if/unless
|
70
|
+
# TODO: add support for only/except sub-filters
|
71
71
|
#
|
72
72
|
def set_filters(type, *args)
|
73
73
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -94,10 +94,10 @@ module Protobuf
|
|
94
94
|
# if the filter should not be invoked, true if invocation should occur.
|
95
95
|
#
|
96
96
|
def invoke_filter?(rpc_method, filter)
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
invoke_via_only?(rpc_method, filter) &&
|
98
|
+
invoke_via_except?(rpc_method, filter) &&
|
99
|
+
invoke_via_if?(rpc_method, filter) &&
|
100
|
+
invoke_via_unless?(rpc_method, filter)
|
101
101
|
end
|
102
102
|
|
103
103
|
# If the target rpc endpoint method is listed under an :except option,
|
@@ -108,8 +108,8 @@ module Protobuf
|
|
108
108
|
# Value should be a symbol/string or an array of symbols/strings.
|
109
109
|
#
|
110
110
|
def invoke_via_except?(rpc_method, filter)
|
111
|
-
except = [
|
112
|
-
|
111
|
+
except = [filter.fetch(:except) { [] }].flatten
|
112
|
+
except.empty? || !except.include?(rpc_method)
|
113
113
|
end
|
114
114
|
|
115
115
|
# Invoke the given :if callable (if any) and return its return value.
|
@@ -119,16 +119,10 @@ module Protobuf
|
|
119
119
|
# Value can either be a symbol/string indicating an instance method to call
|
120
120
|
# or an object that responds to `call`.
|
121
121
|
#
|
122
|
-
def invoke_via_if?(
|
123
|
-
if_check = filter.fetch(:if)
|
124
|
-
|
125
|
-
|
126
|
-
true
|
127
|
-
else
|
128
|
-
call_or_send(if_check)
|
129
|
-
end
|
130
|
-
|
131
|
-
return do_invoke
|
122
|
+
def invoke_via_if?(_rpc_method, filter)
|
123
|
+
if_check = filter.fetch(:if, nil)
|
124
|
+
return true if if_check.nil?
|
125
|
+
call_or_send(if_check)
|
132
126
|
end
|
133
127
|
|
134
128
|
# If the target rpc endpoint method is listed in the :only option,
|
@@ -138,8 +132,8 @@ module Protobuf
|
|
138
132
|
# Value should be a symbol/string or an array of symbols/strings.
|
139
133
|
#
|
140
134
|
def invoke_via_only?(rpc_method, filter)
|
141
|
-
only = [
|
142
|
-
|
135
|
+
only = [filter.fetch(:only) { [] }].flatten
|
136
|
+
only.empty? || only.include?(rpc_method)
|
143
137
|
end
|
144
138
|
|
145
139
|
# Invoke the given :unless callable (if any) and return the opposite
|
@@ -149,16 +143,10 @@ module Protobuf
|
|
149
143
|
# Value can either be a symbol/string indicating an instance method to call
|
150
144
|
# or an object that responds to `call`.
|
151
145
|
#
|
152
|
-
def invoke_via_unless?(
|
153
|
-
unless_check = filter.fetch(:unless)
|
154
|
-
|
155
|
-
|
156
|
-
false
|
157
|
-
else
|
158
|
-
call_or_send(unless_check)
|
159
|
-
end
|
160
|
-
|
161
|
-
return ! skip_invoke
|
146
|
+
def invoke_via_unless?(_rpc_method, filter)
|
147
|
+
unless_check = filter.fetch(:unless, nil)
|
148
|
+
return true if unless_check.nil?
|
149
|
+
!call_or_send(unless_check)
|
162
150
|
end
|
163
151
|
|
164
152
|
def rescue_filters
|
@@ -176,7 +164,7 @@ module Protobuf
|
|
176
164
|
end
|
177
165
|
end
|
178
166
|
|
179
|
-
|
167
|
+
true
|
180
168
|
end
|
181
169
|
|
182
170
|
# Reverse build a chain of around filters. To implement an around chain,
|
@@ -209,17 +197,16 @@ module Protobuf
|
|
209
197
|
# end
|
210
198
|
#
|
211
199
|
def run_around_filters(rpc_method)
|
212
|
-
final =
|
213
|
-
filters[:around].reverse.
|
200
|
+
final = -> { __send__(rpc_method) }
|
201
|
+
filters[:around].reverse.reduce(final) do |previous, filter|
|
214
202
|
if invoke_filter?(rpc_method, filter)
|
215
|
-
|
203
|
+
-> { call_or_send(filter[:callable], &previous) }
|
216
204
|
else
|
217
205
|
previous
|
218
206
|
end
|
219
|
-
|
207
|
+
end.call
|
220
208
|
end
|
221
209
|
|
222
|
-
|
223
210
|
# Entry method to call each filter type in the appropriate order. This should
|
224
211
|
# be used instead of the other run methods directly.
|
225
212
|
#
|
@@ -240,10 +227,10 @@ module Protobuf
|
|
240
227
|
begin
|
241
228
|
yield
|
242
229
|
rescue *rescue_filters.keys => ex
|
243
|
-
callable = rescue_filters.fetch(ex.class)
|
244
|
-
mapped_klass = rescue_filters.keys.
|
230
|
+
callable = rescue_filters.fetch(ex.class) do
|
231
|
+
mapped_klass = rescue_filters.keys.find { |child_klass| ex.class < child_klass }
|
245
232
|
rescue_filters[mapped_klass]
|
246
|
-
|
233
|
+
end
|
247
234
|
|
248
235
|
call_or_send(callable, ex)
|
249
236
|
end
|
@@ -254,20 +241,10 @@ module Protobuf
|
|
254
241
|
# __send__ assuming that we respond_to it. Return the call's return value.
|
255
242
|
#
|
256
243
|
def call_or_send(callable, *args, &block)
|
257
|
-
|
258
|
-
|
259
|
-
callable.call(self, *args, &block)
|
260
|
-
when respond_to?(callable, true) then
|
261
|
-
__send__(callable, *args, &block)
|
262
|
-
else
|
263
|
-
raise "Object #{callable} is not callable"
|
264
|
-
end
|
265
|
-
|
266
|
-
return return_value
|
244
|
+
return callable.call(self, *args, &block) if callable.respond_to?(:call)
|
245
|
+
__send__(callable, *args, &block)
|
267
246
|
end
|
268
|
-
|
269
247
|
end
|
270
|
-
|
271
248
|
end
|
272
249
|
end
|
273
250
|
end
|
data/lib/protobuf/rpc/stat.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'time'
|
3
|
-
require 'protobuf/logger'
|
4
3
|
require 'protobuf/statsd'
|
5
4
|
|
6
5
|
module Protobuf
|
@@ -20,9 +19,7 @@ module Protobuf
|
|
20
19
|
start
|
21
20
|
end
|
22
21
|
|
23
|
-
|
24
|
-
@client = client_host
|
25
|
-
end
|
22
|
+
attr_writer :client
|
26
23
|
|
27
24
|
def client
|
28
25
|
@client || nil
|
@@ -37,7 +34,7 @@ module Protobuf
|
|
37
34
|
end
|
38
35
|
|
39
36
|
def server=(peer)
|
40
|
-
@server = {:port => peer[0], :ip => peer[1]}
|
37
|
+
@server = { :port => peer[0], :ip => peer[1] }
|
41
38
|
end
|
42
39
|
|
43
40
|
def server
|
@@ -75,7 +72,7 @@ module Protobuf
|
|
75
72
|
end
|
76
73
|
|
77
74
|
def stopped?
|
78
|
-
!
|
75
|
+
!end_time.nil?
|
79
76
|
end
|
80
77
|
|
81
78
|
def rpc
|
@@ -98,7 +95,7 @@ module Protobuf
|
|
98
95
|
rpc,
|
99
96
|
sizes,
|
100
97
|
elapsed_time,
|
101
|
-
@end_time.try(:iso8601)
|
98
|
+
@end_time.try(:iso8601),
|
102
99
|
].compact.join(' - ')
|
103
100
|
end
|
104
101
|
|
@@ -134,4 +131,3 @@ module Protobuf
|
|
134
131
|
end
|
135
132
|
end
|
136
133
|
end
|
137
|
-
|