protobuf 2.2.5-java
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.
- data/.gitignore +17 -0
- data/.travis.yml +9 -0
- data/.yardopts +5 -0
- data/Gemfile +3 -0
- data/README.md +316 -0
- data/Rakefile +29 -0
- data/UPGRADING.md +60 -0
- data/bin/rpc_server +5 -0
- data/bin/rprotoc +62 -0
- data/examples/addressbook.pb.rb +55 -0
- data/examples/addressbook.proto +24 -0
- data/examples/reading_a_message.rb +32 -0
- data/examples/writing_a_message.rb +46 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
- data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
- data/ext/ruby_generator/Makefile +10 -0
- data/ext/ruby_generator/RubyGenerator.cpp +450 -0
- data/ext/ruby_generator/RubyGenerator.h +199 -0
- data/ext/ruby_generator/extconf.rb +36 -0
- data/ext/ruby_generator/protoc-ruby +0 -0
- data/lib/protobuf/cli.rb +188 -0
- data/lib/protobuf/enum.rb +58 -0
- data/lib/protobuf/enum_value.rb +59 -0
- data/lib/protobuf/evented.rb +22 -0
- data/lib/protobuf/exceptions.rb +11 -0
- data/lib/protobuf/ext/eventmachine.rb +14 -0
- data/lib/protobuf/field/base_field.rb +240 -0
- data/lib/protobuf/field/bool_field.rb +36 -0
- data/lib/protobuf/field/bytes_field.rb +38 -0
- data/lib/protobuf/field/double_field.rb +19 -0
- data/lib/protobuf/field/enum_field.rb +50 -0
- data/lib/protobuf/field/extension_fields.rb +32 -0
- data/lib/protobuf/field/field_array.rb +65 -0
- data/lib/protobuf/field/fixed32_field.rb +19 -0
- data/lib/protobuf/field/fixed64_field.rb +22 -0
- data/lib/protobuf/field/float_field.rb +31 -0
- data/lib/protobuf/field/int32_field.rb +12 -0
- data/lib/protobuf/field/int64_field.rb +12 -0
- data/lib/protobuf/field/integer_field.rb +19 -0
- data/lib/protobuf/field/message_field.rb +53 -0
- data/lib/protobuf/field/sfixed32_field.rb +21 -0
- data/lib/protobuf/field/sfixed64_field.rb +24 -0
- data/lib/protobuf/field/signed_integer_field.rb +23 -0
- data/lib/protobuf/field/sint32_field.rb +12 -0
- data/lib/protobuf/field/sint64_field.rb +12 -0
- data/lib/protobuf/field/string_field.rb +14 -0
- data/lib/protobuf/field/uint32_field.rb +12 -0
- data/lib/protobuf/field/uint64_field.rb +12 -0
- data/lib/protobuf/field/varint_field.rb +61 -0
- data/lib/protobuf/field.rb +57 -0
- data/lib/protobuf/logger.rb +86 -0
- data/lib/protobuf/message/decoder.rb +83 -0
- data/lib/protobuf/message/encoder.rb +48 -0
- data/lib/protobuf/message/extend.rb +8 -0
- data/lib/protobuf/message/message.rb +1 -0
- data/lib/protobuf/message.rb +320 -0
- data/lib/protobuf/rpc/buffer.rb +79 -0
- data/lib/protobuf/rpc/client.rb +166 -0
- data/lib/protobuf/rpc/connector.rb +19 -0
- data/lib/protobuf/rpc/connectors/base.rb +38 -0
- data/lib/protobuf/rpc/connectors/common.rb +156 -0
- data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
- data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
- data/lib/protobuf/rpc/connectors/socket.rb +73 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/error.rb +25 -0
- data/lib/protobuf/rpc/rpc.pb.rb +118 -0
- data/lib/protobuf/rpc/server.rb +89 -0
- data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
- data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
- data/lib/protobuf/rpc/service.rb +173 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
- data/lib/protobuf/rpc/service_filters.rb +267 -0
- data/lib/protobuf/rpc/stat.rb +83 -0
- data/lib/protobuf/socket.rb +22 -0
- data/lib/protobuf/version.rb +4 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/lib/protobuf.rb +86 -0
- data/proto/rpc.pb.rb +48 -0
- data/proto/rpc.proto +73 -0
- data/protobuf.gemspec +44 -0
- data/spec/benchmark/tasks.rb +179 -0
- data/spec/functional/embedded_service_spec.rb +7 -0
- data/spec/functional/evented_server_spec.rb +64 -0
- data/spec/functional/socket_server_spec.rb +58 -0
- data/spec/functional/zmq_server_spec.rb +58 -0
- data/spec/lib/protobuf/cli_spec.rb +212 -0
- data/spec/lib/protobuf/enum_spec.rb +98 -0
- data/spec/lib/protobuf/enum_value_spec.rb +15 -0
- data/spec/lib/protobuf/logger_spec.rb +131 -0
- data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
- data/spec/lib/protobuf/message_spec.rb +209 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
- data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
- data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
- data/spec/lib/protobuf_spec.rb +62 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/server.rb +101 -0
- data/spec/support/test/enum.pb.rb +34 -0
- data/spec/support/test/enum.proto +12 -0
- data/spec/support/test/resource.pb.rb +58 -0
- data/spec/support/test/resource.proto +31 -0
- data/spec/support/test/resource_service.rb +14 -0
- data/spec/support/test_app_file.rb +2 -0
- data/spec/support/tolerance_matcher.rb +40 -0
- data/test/data/data.bin +3 -0
- data/test/data/data_source.py +14 -0
- data/test/data/types.bin +0 -0
- data/test/data/types_source.py +22 -0
- data/test/data/unk.png +0 -0
- data/test/proto/addressbook.pb.rb +66 -0
- data/test/proto/addressbook.proto +33 -0
- data/test/proto/addressbook_base.pb.rb +58 -0
- data/test/proto/addressbook_base.proto +26 -0
- data/test/proto/addressbook_ext.pb.rb +20 -0
- data/test/proto/addressbook_ext.proto +6 -0
- data/test/proto/collision.pb.rb +17 -0
- data/test/proto/collision.proto +5 -0
- data/test/proto/ext_collision.pb.rb +24 -0
- data/test/proto/ext_collision.proto +8 -0
- data/test/proto/ext_range.pb.rb +22 -0
- data/test/proto/ext_range.proto +7 -0
- data/test/proto/float_default.proto +10 -0
- data/test/proto/lowercase.pb.rb +30 -0
- data/test/proto/lowercase.proto +9 -0
- data/test/proto/merge.pb.rb +39 -0
- data/test/proto/merge.proto +15 -0
- data/test/proto/nested.pb.rb +30 -0
- data/test/proto/nested.proto +9 -0
- data/test/proto/optional_field.pb.rb +35 -0
- data/test/proto/optional_field.proto +12 -0
- data/test/proto/packed.pb.rb +22 -0
- data/test/proto/packed.proto +6 -0
- data/test/proto/rpc.proto +6 -0
- data/test/proto/types.pb.rb +84 -0
- data/test/proto/types.proto +37 -0
- data/test/test_addressbook.rb +56 -0
- data/test/test_enum_value.rb +41 -0
- data/test/test_extension.rb +36 -0
- data/test/test_lowercase.rb +11 -0
- data/test/test_message.rb +128 -0
- data/test/test_optional_field.rb +103 -0
- data/test/test_packed_field.rb +40 -0
- data/test/test_parse.rb +15 -0
- data/test/test_repeated_types.rb +132 -0
- data/test/test_serialize.rb +61 -0
- data/test/test_standard_message.rb +96 -0
- data/test/test_types.rb +226 -0
- metadata +461 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'protobuf/field/varint_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class EnumField < VarintField
|
|
6
|
+
def acceptable?(val)
|
|
7
|
+
case val
|
|
8
|
+
when Symbol then
|
|
9
|
+
raise TypeError unless @type.const_defined?(val)
|
|
10
|
+
when EnumValue then
|
|
11
|
+
raise TypeError if val.parent_class != @type
|
|
12
|
+
else
|
|
13
|
+
raise TypeError unless @type.valid_tag?(val)
|
|
14
|
+
end
|
|
15
|
+
true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def encode(value)
|
|
19
|
+
super(value.to_i)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def typed_default_value
|
|
25
|
+
if @default.is_a?(Symbol)
|
|
26
|
+
@type.const_get(@default)
|
|
27
|
+
else
|
|
28
|
+
self.class.default
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def define_setter
|
|
33
|
+
field = self
|
|
34
|
+
@message_class.class_eval do
|
|
35
|
+
define_method("#{field.name}=") do |value|
|
|
36
|
+
orig_value = value
|
|
37
|
+
if value.nil?
|
|
38
|
+
@values.delete(field.name)
|
|
39
|
+
else
|
|
40
|
+
value = field.type.fetch(value)
|
|
41
|
+
raise TypeError, "Invalid ENUM value: #{orig_value.inspect} for #{field.name}" unless value
|
|
42
|
+
|
|
43
|
+
@values[field.name] = value
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Protobuf
|
|
2
|
+
module Field
|
|
3
|
+
class ExtensionFields < Array
|
|
4
|
+
##
|
|
5
|
+
# Constructor
|
|
6
|
+
#
|
|
7
|
+
def initialize
|
|
8
|
+
@ranges = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Public Instance Methods
|
|
13
|
+
#
|
|
14
|
+
|
|
15
|
+
# Append a range to the list of ranges.
|
|
16
|
+
def add_range(range = (0..-1))
|
|
17
|
+
@ranges << range
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Set value at tag location, if tag is in a valid range.
|
|
21
|
+
def []=(key, value)
|
|
22
|
+
raise RangeError, "#{key} is not in #{@ranges.join(', ')}" unless include_tag?(key)
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Check if the given tag exists in any of the defined ranges.
|
|
27
|
+
def include_tag?(tag)
|
|
28
|
+
@ranges.any? { |range| range.include?(tag) }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Protobuf
|
|
2
|
+
module Field
|
|
3
|
+
class FieldArray < Array
|
|
4
|
+
##
|
|
5
|
+
# Constructor
|
|
6
|
+
#
|
|
7
|
+
def initialize(field)
|
|
8
|
+
@field = field
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Public Instance Methods
|
|
13
|
+
#
|
|
14
|
+
def []=(nth, val)
|
|
15
|
+
super(nth, normalize(val))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def <<(val)
|
|
19
|
+
super(normalize(val))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def push(val)
|
|
23
|
+
super(normalize(val))
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def unshift(val)
|
|
27
|
+
super(normalize(val))
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def replace(val)
|
|
31
|
+
raise TypeError unless val.is_a?(Array)
|
|
32
|
+
val = val.map { |v| normalize(v)}
|
|
33
|
+
super(val)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Return a hash-representation of the given values for this field type.
|
|
37
|
+
# The value in this case would be an array.
|
|
38
|
+
def to_hash_value
|
|
39
|
+
self.map do |value|
|
|
40
|
+
value.respond_to?(:to_hash_value) ? value.to_hash_value : value
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s
|
|
45
|
+
"[#{@field.name}]"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Private Instance Methods
|
|
52
|
+
#
|
|
53
|
+
def normalize(value)
|
|
54
|
+
raise TypeError unless @field.acceptable?(value)
|
|
55
|
+
if @field.is_a?(::Protobuf::Field::EnumField)
|
|
56
|
+
@field.type.fetch(value)
|
|
57
|
+
elsif @field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash)
|
|
58
|
+
@field.type.new(value.to_hash)
|
|
59
|
+
else
|
|
60
|
+
value
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'protobuf/field/uint32_field.rb'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class Fixed32Field < Uint32Field
|
|
6
|
+
def wire_type
|
|
7
|
+
::Protobuf::WireType::FIXED32
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def decode(bytes)
|
|
11
|
+
bytes.unpack('V').first
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def encode(value)
|
|
15
|
+
[value].pack('V')
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'protobuf/field/uint64_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class Fixed64Field < Uint64Field
|
|
6
|
+
def wire_type
|
|
7
|
+
::Protobuf::WireType::FIXED64
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def decode(bytes)
|
|
11
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
|
12
|
+
values = bytes.unpack('VV')
|
|
13
|
+
values[0] + (values[1] << 32)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def encode(value)
|
|
17
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
|
18
|
+
[value & 0xffff_ffff, value >> 32].pack('VV')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'protobuf/field/base_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class FloatField < BaseField
|
|
6
|
+
def self.default; 0.0; end
|
|
7
|
+
def self.max; 1.0/0; end
|
|
8
|
+
def self.min; -1.0/0; end
|
|
9
|
+
def max; 1.0/0; end
|
|
10
|
+
def min; -1.0/0; end
|
|
11
|
+
|
|
12
|
+
def wire_type
|
|
13
|
+
WireType::FIXED32
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def decode(bytes)
|
|
17
|
+
bytes.unpack('e').first
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def encode(value)
|
|
21
|
+
[value].pack('e')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def acceptable?(val)
|
|
25
|
+
raise TypeError, val.class.name unless val.is_a?(Numeric)
|
|
26
|
+
raise RangeError if val < min || max < val
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'protobuf/field/varint_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class IntegerField < VarintField
|
|
6
|
+
|
|
7
|
+
def encode(value)
|
|
8
|
+
# original Google's library uses 64bits integer for negative value
|
|
9
|
+
VarintField.encode(value & 0xffff_ffff_ffff_ffff)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def decode(value)
|
|
13
|
+
value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
|
|
14
|
+
value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'protobuf/field/base_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class MessageField < BaseField
|
|
6
|
+
RAISE_TYPE = lambda { |field, val| raise TypeError, "Expected value of type '#{field.type}', but got '#{val.class}'" }
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Public Instance Methods
|
|
10
|
+
#
|
|
11
|
+
def acceptable?(val)
|
|
12
|
+
RAISE_TYPE.call(self, val) unless val.instance_of?(type) || val.respond_to?(:to_hash)
|
|
13
|
+
true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def decode(bytes)
|
|
17
|
+
message = type.new
|
|
18
|
+
message.parse_from_string(bytes)
|
|
19
|
+
message
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def encode(value)
|
|
23
|
+
bytes = value.serialize_to_string
|
|
24
|
+
result = VarintField.encode(bytes.size)
|
|
25
|
+
result << bytes
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def wire_type
|
|
29
|
+
::Protobuf::WireType::LENGTH_DELIMITED
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def define_setter
|
|
35
|
+
field = self
|
|
36
|
+
@message_class.class_eval do
|
|
37
|
+
define_method("#{field.name}=") do |val|
|
|
38
|
+
case
|
|
39
|
+
when val.nil? then
|
|
40
|
+
@values.delete(field.name)
|
|
41
|
+
when val.is_a?(field.type) then
|
|
42
|
+
@values[field.name] = val
|
|
43
|
+
when val.respond_to?(:to_hash) then
|
|
44
|
+
@values[field.name] = field.type.new(val.to_hash)
|
|
45
|
+
else
|
|
46
|
+
RAISE_TYPE.call(field, val)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'protobuf/field/int32_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class Sfixed32Field < Int32Field
|
|
6
|
+
def wire_type
|
|
7
|
+
::Protobuf::WireType::FIXED32
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def decode(bytes)
|
|
11
|
+
value = bytes.unpack('V').first
|
|
12
|
+
value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero?
|
|
13
|
+
value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def encode(value)
|
|
17
|
+
[value].pack('V')
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'protobuf/field/int64_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class Sfixed64Field < Int64Field
|
|
6
|
+
def wire_type
|
|
7
|
+
::Protobuf::WireType::FIXED64
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def decode(bytes)
|
|
11
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
|
12
|
+
values = bytes.unpack('VV')
|
|
13
|
+
value = values[0] + (values[1] << 32)
|
|
14
|
+
value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
|
|
15
|
+
value
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def encode(value)
|
|
19
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
|
20
|
+
[value & 0xffff_ffff, value >> 32].pack('VV')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'protobuf/field/varint_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class SignedIntegerField < VarintField
|
|
6
|
+
def decode(value)
|
|
7
|
+
if (value & 1).zero?
|
|
8
|
+
value >> 1 # positive value
|
|
9
|
+
else
|
|
10
|
+
~value >> 1 # negative value
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def encode(value)
|
|
15
|
+
if value >= 0
|
|
16
|
+
VarintField.encode(value << 1)
|
|
17
|
+
else
|
|
18
|
+
VarintField.encode(~(value << 1))
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'protobuf/field/bytes_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class StringField < BytesField
|
|
6
|
+
ENCODING = 'UTF-8'.freeze
|
|
7
|
+
|
|
8
|
+
def decode(bytes)
|
|
9
|
+
bytes.force_encoding(::Protobuf::Field::StringField::ENCODING) if bytes.respond_to?(:force_encoding)
|
|
10
|
+
bytes
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'protobuf/field/base_field'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
module Field
|
|
5
|
+
class VarintField < BaseField
|
|
6
|
+
INT32_MAX = 2**31 - 1
|
|
7
|
+
INT32_MIN = -2**31
|
|
8
|
+
INT64_MAX = 2**63 - 1
|
|
9
|
+
INT64_MIN = -2**63
|
|
10
|
+
UINT32_MAX = 2**32 - 1
|
|
11
|
+
UINT64_MAX = 2**64 - 1
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Class Methods
|
|
15
|
+
#
|
|
16
|
+
def self.default
|
|
17
|
+
0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.decode(bytes)
|
|
21
|
+
value = 0
|
|
22
|
+
bytes.each_with_index do |byte, index|
|
|
23
|
+
value |= byte << (7 * index)
|
|
24
|
+
end
|
|
25
|
+
value
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.encode(value)
|
|
29
|
+
return [value].pack('C') if value < 128
|
|
30
|
+
|
|
31
|
+
bytes = []
|
|
32
|
+
until value == 0
|
|
33
|
+
bytes << (0x80 | (value & 0x7f))
|
|
34
|
+
value >>= 7
|
|
35
|
+
end
|
|
36
|
+
bytes[-1] &= 0x7f
|
|
37
|
+
bytes.pack('C*')
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# Public Instance Methods
|
|
42
|
+
#
|
|
43
|
+
def acceptable?(val)
|
|
44
|
+
(val > min || val < max) rescue false
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def decode(value)
|
|
48
|
+
value
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def encode(value)
|
|
52
|
+
self.class.encode(value)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def wire_type
|
|
56
|
+
::Protobuf::WireType::VARINT
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'protobuf/field/base_field'
|
|
2
|
+
require 'protobuf/field/bytes_field'
|
|
3
|
+
require 'protobuf/field/float_field'
|
|
4
|
+
require 'protobuf/field/message_field'
|
|
5
|
+
require 'protobuf/field/varint_field'
|
|
6
|
+
require 'protobuf/field/string_field'
|
|
7
|
+
require 'protobuf/field/double_field'
|
|
8
|
+
require 'protobuf/field/enum_field'
|
|
9
|
+
require 'protobuf/field/integer_field'
|
|
10
|
+
require 'protobuf/field/signed_integer_field'
|
|
11
|
+
require 'protobuf/field/uint32_field'
|
|
12
|
+
require 'protobuf/field/uint64_field'
|
|
13
|
+
require 'protobuf/field/int32_field'
|
|
14
|
+
require 'protobuf/field/int64_field'
|
|
15
|
+
require 'protobuf/field/sint32_field'
|
|
16
|
+
require 'protobuf/field/sint64_field'
|
|
17
|
+
require 'protobuf/field/bool_field'
|
|
18
|
+
require 'protobuf/field/sfixed32_field'
|
|
19
|
+
require 'protobuf/field/sfixed64_field'
|
|
20
|
+
require 'protobuf/field/fixed32_field'
|
|
21
|
+
require 'protobuf/field/fixed64_field'
|
|
22
|
+
require 'protobuf/field/extension_fields'
|
|
23
|
+
|
|
24
|
+
module Protobuf
|
|
25
|
+
module Field
|
|
26
|
+
PREDEFINED_TYPES = [
|
|
27
|
+
::Protobuf::Field::DoubleField,
|
|
28
|
+
::Protobuf::Field::FloatField,
|
|
29
|
+
::Protobuf::Field::Int32Field,
|
|
30
|
+
::Protobuf::Field::Int64Field,
|
|
31
|
+
::Protobuf::Field::Uint32Field,
|
|
32
|
+
::Protobuf::Field::Uint64Field,
|
|
33
|
+
::Protobuf::Field::Sint32Field,
|
|
34
|
+
::Protobuf::Field::Sint64Field,
|
|
35
|
+
::Protobuf::Field::Fixed32Field,
|
|
36
|
+
::Protobuf::Field::Fixed64Field,
|
|
37
|
+
::Protobuf::Field::Sfixed32Field,
|
|
38
|
+
::Protobuf::Field::Sfixed64Field,
|
|
39
|
+
::Protobuf::Field::StringField,
|
|
40
|
+
::Protobuf::Field::BytesField,
|
|
41
|
+
::Protobuf::Field::BoolField
|
|
42
|
+
].freeze
|
|
43
|
+
|
|
44
|
+
def self.build(message_class, rule, type, name, tag, options = {})
|
|
45
|
+
field_class = type_message_or_enum(type)
|
|
46
|
+
field_class.new(message_class, rule, type, name, tag, options)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.type_message_or_enum(defined_type)
|
|
50
|
+
return defined_type if ::Protobuf::Field::PREDEFINED_TYPES.include?(defined_type)
|
|
51
|
+
return EnumField if defined_type < Enum
|
|
52
|
+
return MessageField if defined_type < Message
|
|
53
|
+
raise "lost in the wilderness #{defined_type}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'logger'
|
|
2
|
+
|
|
3
|
+
module Protobuf
|
|
4
|
+
class Logger < ::Logger
|
|
5
|
+
|
|
6
|
+
class << self
|
|
7
|
+
attr_accessor :file, :level
|
|
8
|
+
|
|
9
|
+
# Stub out the log methods for Protobuf::Logger as singleton methods
|
|
10
|
+
[:debug, :info, :warn, :error, :fatal, :any, :add, :log].each do |m|
|
|
11
|
+
define_method(m) do |*params, &block|
|
|
12
|
+
instance && instance.__send__(m, *params, &block)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# One-line file/level configuration
|
|
18
|
+
def self.configure(options)
|
|
19
|
+
self.file = options.fetch(:file, false)
|
|
20
|
+
self.level = options.fetch(:level, false)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Use to reset the instance
|
|
24
|
+
def self.reset_device!
|
|
25
|
+
self.file = self.level = @__instance = nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Singleton instance
|
|
29
|
+
def self.instance
|
|
30
|
+
@__instance ||= begin
|
|
31
|
+
log = nil
|
|
32
|
+
|
|
33
|
+
if @file && @level
|
|
34
|
+
log = new(self.file)
|
|
35
|
+
log.level = self.level
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
log
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# LogMethods module for log method including, e.g.:
|
|
44
|
+
#
|
|
45
|
+
# class MyClass
|
|
46
|
+
# include Protobuf::Logger::LogMethods
|
|
47
|
+
# ...
|
|
48
|
+
# end
|
|
49
|
+
#
|
|
50
|
+
# Produce a module to allow "include" in other classes to avoid
|
|
51
|
+
# cluttering the namespace of the including class with the other methods defined above
|
|
52
|
+
#
|
|
53
|
+
module LogMethods
|
|
54
|
+
[:debug, :info, :warn, :error, :fatal, :any, :add, :log].each do |m|
|
|
55
|
+
define_method("log_#{m}") do |*params, &block|
|
|
56
|
+
params.map! { |message| sign_message(message) }
|
|
57
|
+
::Protobuf::Logger.__send__(m, *params, &block)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# When included, also extend the LogMethods module for class access.
|
|
62
|
+
def self.included(base)
|
|
63
|
+
base.extend(LogMethods)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# We often want to log an exception, so let's make that a core
|
|
67
|
+
# concern of the logger.
|
|
68
|
+
#
|
|
69
|
+
def log_exception(ex)
|
|
70
|
+
log_error { ex.message }
|
|
71
|
+
log_error { ex.backtrace[0..5].join("\n") }
|
|
72
|
+
log_debug { ex.backtrace.join("\n") }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def log_signature
|
|
76
|
+
@_log_signature ||= "[#{self.class == Class ? self.name : self.class.name}]"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def sign_message(message)
|
|
80
|
+
"#{log_signature} #{message}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|