protobuffy 3.6.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|