contrast-agent 6.3.0 → 6.4.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 +0 -3
- data/.simplecov +1 -0
- data/Rakefile +0 -27
- data/lib/contrast/agent/assess/policy/propagation_method.rb +0 -2
- data/lib/contrast/agent/assess/policy/trigger_method.rb +1 -1
- data/lib/contrast/agent/version.rb +1 -1
- data/lib/contrast/api/dtm.pb.rb +1 -1
- data/lib/contrast/api/settings.pb.rb +1 -1
- data/lib/contrast/utils/patching/policy/patch_utils.rb +5 -22
- data/lib/contrast.rb +34 -0
- data/lib/protobuf/code_generator.rb +129 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +79 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +360 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +67 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +56 -0
- data/lib/protobuf/field/field_array.rb +102 -0
- data/lib/protobuf/field/field_hash.rb +122 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +51 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +77 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/message.rb +241 -0
- data/lib/protobuf/optionable.rb +72 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf.rb +91 -0
- data/proto/dynamic_discovery.proto +46 -0
- data/proto/google/protobuf/compiler/plugin.proto +183 -0
- data/proto/google/protobuf/descriptor.proto +911 -0
- data/proto/rpc.proto +71 -0
- data/ruby-agent.gemspec +1 -1
- metadata +71 -10
@@ -0,0 +1,102 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Field
|
3
|
+
class FieldArray < Array
|
4
|
+
|
5
|
+
##
|
6
|
+
# Attributes
|
7
|
+
#
|
8
|
+
|
9
|
+
attr_reader :field
|
10
|
+
|
11
|
+
##
|
12
|
+
# Constructor
|
13
|
+
#
|
14
|
+
|
15
|
+
def initialize(field)
|
16
|
+
@field = field
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Public Instance Methods
|
21
|
+
#
|
22
|
+
|
23
|
+
def []=(nth, val)
|
24
|
+
super(nth, normalize(val)) unless val.nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
def <<(val)
|
28
|
+
super(normalize(val)) unless val.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
def push(val)
|
32
|
+
super(normalize(val)) unless val.nil?
|
33
|
+
end
|
34
|
+
|
35
|
+
def replace(val)
|
36
|
+
raise_type_error(val) unless val.is_a?(Array)
|
37
|
+
val.map! { |v| normalize(v) }
|
38
|
+
super(val)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Return a hash-representation of the given values for this field type.
|
42
|
+
# The value in this case would be an array.
|
43
|
+
def to_hash_value
|
44
|
+
map do |value|
|
45
|
+
value.respond_to?(:to_hash_value) ? value.to_hash_value : value
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return a hash-representation of the given values for this field type
|
50
|
+
# that is safe to convert to JSON.
|
51
|
+
# The value in this case would be an array.
|
52
|
+
def to_json_hash_value
|
53
|
+
if field.respond_to?(:json_encode)
|
54
|
+
map do |value|
|
55
|
+
field.json_encode(value)
|
56
|
+
end
|
57
|
+
else
|
58
|
+
map do |value|
|
59
|
+
value.respond_to?(:to_json_hash_value) ? value.to_json_hash_value : value
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
"[#{field.name}]"
|
66
|
+
end
|
67
|
+
|
68
|
+
def unshift(val)
|
69
|
+
super(normalize(val)) unless val.nil?
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
##
|
75
|
+
# Private Instance Methods
|
76
|
+
#
|
77
|
+
|
78
|
+
def normalize(value)
|
79
|
+
value = value.to_proto if value.respond_to?(:to_proto)
|
80
|
+
fail TypeError, "Unacceptable value #{value} for field #{field.name} of type #{field.type_class}" unless field.acceptable?(value)
|
81
|
+
|
82
|
+
if field.is_a?(::Protobuf::Field::EnumField)
|
83
|
+
field.type_class.fetch(value)
|
84
|
+
elsif field.is_a?(::Protobuf::Field::MessageField) && value.is_a?(field.type_class)
|
85
|
+
value
|
86
|
+
elsif field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash)
|
87
|
+
field.type_class.new(value.to_hash)
|
88
|
+
else
|
89
|
+
value
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def raise_type_error(val)
|
94
|
+
fail TypeError, <<-TYPE_ERROR
|
95
|
+
Expected repeated value of type '#{field.type_class}'
|
96
|
+
Got '#{val.class}' for repeated protobuf field #{field.name}
|
97
|
+
TYPE_ERROR
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module Protobuf
|
2
|
+
module Field
|
3
|
+
class FieldHash < Hash
|
4
|
+
|
5
|
+
##
|
6
|
+
# Attributes
|
7
|
+
#
|
8
|
+
|
9
|
+
attr_reader :field, :key_field, :value_field
|
10
|
+
|
11
|
+
##
|
12
|
+
# Constructor
|
13
|
+
#
|
14
|
+
|
15
|
+
def initialize(field)
|
16
|
+
@field = field
|
17
|
+
@key_field = field.type_class.get_field(:key)
|
18
|
+
@value_field = field.type_class.get_field(:value)
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# Public Instance Methods
|
23
|
+
#
|
24
|
+
|
25
|
+
def []=(key, val)
|
26
|
+
super(normalize_key(key), normalize_val(val))
|
27
|
+
end
|
28
|
+
|
29
|
+
alias store []=
|
30
|
+
|
31
|
+
def replace(val)
|
32
|
+
raise_type_error(val) unless val.is_a?(Hash)
|
33
|
+
clear
|
34
|
+
update(val)
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge!(other)
|
38
|
+
raise_type_error(other) unless other.is_a?(Hash)
|
39
|
+
# keys and values will be normalized by []= above
|
40
|
+
other.each { |k, v| self[k] = v }
|
41
|
+
end
|
42
|
+
|
43
|
+
alias update merge!
|
44
|
+
|
45
|
+
# Return a hash-representation of the given values for this field type.
|
46
|
+
# The value in this case would be the hash itself, right? Unfortunately
|
47
|
+
# not because the values of the map could be messages themselves that we
|
48
|
+
# need to transform.
|
49
|
+
def to_hash_value
|
50
|
+
each_with_object({}) do |(key, value), hash|
|
51
|
+
hash[key] = value.respond_to?(:to_hash_value) ? value.to_hash_value : value
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return a hash-representation of the given values for this field type
|
56
|
+
# that is safe to convert to JSON.
|
57
|
+
#
|
58
|
+
# The value in this case would be the hash itself, right? Unfortunately
|
59
|
+
# not because the values of the map could be messages themselves that we
|
60
|
+
# need to transform.
|
61
|
+
def to_json_hash_value
|
62
|
+
if field.respond_to?(:json_encode)
|
63
|
+
each_with_object({}) do |(key, value), hash|
|
64
|
+
hash[key] = field.json_encode(value)
|
65
|
+
end
|
66
|
+
else
|
67
|
+
each_with_object({}) do |(key, value), hash|
|
68
|
+
hash[key] = value.respond_to?(:to_json_hash_value) ? value.to_json_hash_value : value
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_s
|
74
|
+
"{#{field.name}}"
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
##
|
80
|
+
# Private Instance Methods
|
81
|
+
#
|
82
|
+
|
83
|
+
def normalize_key(key)
|
84
|
+
normalize(:key, key, key_field)
|
85
|
+
end
|
86
|
+
|
87
|
+
def normalize_val(value)
|
88
|
+
normalize(:value, value, value_field)
|
89
|
+
end
|
90
|
+
|
91
|
+
def normalize(what, value, normalize_field)
|
92
|
+
raise_type_error(value) if value.nil?
|
93
|
+
value = value.to_proto if value.respond_to?(:to_proto)
|
94
|
+
fail TypeError, "Unacceptable #{what} #{value} for field #{field.name} of type #{normalize_field.type_class}" unless normalize_field.acceptable?(value)
|
95
|
+
|
96
|
+
if normalize_field.is_a?(::Protobuf::Field::EnumField)
|
97
|
+
fetch_enum(normalize_field.type_class, value)
|
98
|
+
elsif normalize_field.is_a?(::Protobuf::Field::MessageField) && value.is_a?(normalize_field.type_class)
|
99
|
+
value
|
100
|
+
elsif normalize_field.is_a?(::Protobuf::Field::MessageField) && value.respond_to?(:to_hash)
|
101
|
+
normalize_field.type_class.new(value.to_hash)
|
102
|
+
else
|
103
|
+
value
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def fetch_enum(type, val)
|
108
|
+
en = type.fetch(val)
|
109
|
+
raise_type_error(val) if en.nil?
|
110
|
+
en
|
111
|
+
end
|
112
|
+
|
113
|
+
def raise_type_error(val)
|
114
|
+
fail TypeError, <<-TYPE_ERROR
|
115
|
+
Expected map value of type '#{key_field.type_class} -> #{value_field.type_class}'
|
116
|
+
Got '#{val.class}' for map protobuf field #{field.name}
|
117
|
+
TYPE_ERROR
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'protobuf/field/uint32_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Fixed32Field < Uint32Field
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(bytes)
|
12
|
+
bytes.unpack('V').first
|
13
|
+
end
|
14
|
+
|
15
|
+
def encode(value)
|
16
|
+
[value].pack('V')
|
17
|
+
end
|
18
|
+
|
19
|
+
def wire_type
|
20
|
+
::Protobuf::WireType::FIXED32
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'protobuf/field/uint64_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Fixed64Field < Uint64Field
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(bytes)
|
12
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
13
|
+
values = bytes.unpack('VV')
|
14
|
+
values[0] + (values[1] << 32)
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode(value)
|
18
|
+
# we don't use 'Q' for pack/unpack. 'Q' is machine-dependent.
|
19
|
+
[value & 0xffff_ffff, value >> 32].pack('VV')
|
20
|
+
end
|
21
|
+
|
22
|
+
def wire_type
|
23
|
+
::Protobuf::WireType::FIXED64
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'protobuf/field/base_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class FloatField < BaseField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Class Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def self.default
|
12
|
+
0.0
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Public Instance Methods
|
17
|
+
#
|
18
|
+
|
19
|
+
def acceptable?(val)
|
20
|
+
val.respond_to?(:to_f)
|
21
|
+
end
|
22
|
+
|
23
|
+
def coerce!(val)
|
24
|
+
Float(val)
|
25
|
+
rescue ArgumentError
|
26
|
+
fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'"
|
27
|
+
end
|
28
|
+
|
29
|
+
def decode(bytes)
|
30
|
+
bytes.unpack('e').first
|
31
|
+
end
|
32
|
+
|
33
|
+
def encode(value)
|
34
|
+
[value].pack('e')
|
35
|
+
end
|
36
|
+
|
37
|
+
def wire_type
|
38
|
+
WireType::FIXED32
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'protobuf/field/integer_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Int64Field < IntegerField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Class Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def self.max
|
12
|
+
INT64_MAX
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.min
|
16
|
+
INT64_MIN
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Instance Methods
|
21
|
+
#
|
22
|
+
def acceptable?(val)
|
23
|
+
if val.is_a?(Integer) || val.is_a?(Numeric)
|
24
|
+
val >= INT64_MIN && val <= INT64_MAX
|
25
|
+
else
|
26
|
+
Integer(val, 10) >= INT64_MIN && Integer(val, 10) <= INT64_MAX
|
27
|
+
end
|
28
|
+
rescue
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'protobuf/field/varint_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class IntegerField < VarintField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(value)
|
12
|
+
value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero?
|
13
|
+
value
|
14
|
+
end
|
15
|
+
|
16
|
+
def encode(value)
|
17
|
+
# original CSGoogle's library uses 64bits integer for negative value
|
18
|
+
::Protobuf::Field::VarintField.encode(value & 0xffff_ffff_ffff_ffff)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'protobuf/field/base_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class MessageField < BaseField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def acceptable?(val)
|
12
|
+
val.is_a?(type_class) || val.respond_to?(:to_hash) || val.respond_to?(:to_proto)
|
13
|
+
end
|
14
|
+
|
15
|
+
def decode(bytes)
|
16
|
+
type_class.decode(bytes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def encode(value)
|
20
|
+
bytes = value.encode
|
21
|
+
result = ::Protobuf::Field::VarintField.encode(bytes.bytesize)
|
22
|
+
result << bytes
|
23
|
+
end
|
24
|
+
|
25
|
+
def message?
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def wire_type
|
30
|
+
::Protobuf::WireType::LENGTH_DELIMITED
|
31
|
+
end
|
32
|
+
|
33
|
+
def coerce!(value)
|
34
|
+
return nil if value.nil?
|
35
|
+
|
36
|
+
coerced_value = if value.respond_to?(:to_proto)
|
37
|
+
value.to_proto
|
38
|
+
elsif value.respond_to?(:to_hash)
|
39
|
+
type_class.new(value.to_hash)
|
40
|
+
else
|
41
|
+
value
|
42
|
+
end
|
43
|
+
|
44
|
+
return coerced_value if coerced_value.is_a?(type_class)
|
45
|
+
|
46
|
+
fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{value.class}'"
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'protobuf/field/int32_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Sfixed32Field < Int32Field
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(bytes)
|
12
|
+
value = bytes.unpack('V').first
|
13
|
+
value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero?
|
14
|
+
value
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode(value)
|
18
|
+
[value].pack('V')
|
19
|
+
end
|
20
|
+
|
21
|
+
def wire_type
|
22
|
+
::Protobuf::WireType::FIXED32
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'protobuf/field/int64_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Sfixed64Field < Int64Field
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(bytes)
|
12
|
+
values = bytes.unpack('VV') # 'Q' is machine-dependent, don't use
|
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
|
+
[value & 0xffff_ffff, value >> 32].pack('VV') # 'Q' is machine-dependent, don't use
|
20
|
+
end
|
21
|
+
|
22
|
+
def wire_type
|
23
|
+
::Protobuf::WireType::FIXED64
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'protobuf/field/varint_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class SignedIntegerField < VarintField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Public Instance Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def decode(value)
|
12
|
+
if (value & 1).zero?
|
13
|
+
value >> 1 # positive value
|
14
|
+
else
|
15
|
+
~value >> 1 # negative value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def encode(value)
|
20
|
+
if value >= 0
|
21
|
+
VarintField.encode(value << 1)
|
22
|
+
else
|
23
|
+
VarintField.encode(~(value << 1))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'protobuf/field/signed_integer_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Sint32Field < SignedIntegerField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Class Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def self.max
|
12
|
+
INT32_MAX
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.min
|
16
|
+
INT32_MIN
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'protobuf/field/signed_integer_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class Sint64Field < SignedIntegerField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Class Methods
|
9
|
+
#
|
10
|
+
|
11
|
+
def self.max
|
12
|
+
INT64_MAX
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.min
|
16
|
+
INT64_MIN
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'protobuf/field/bytes_field'
|
2
|
+
|
3
|
+
module Protobuf
|
4
|
+
module Field
|
5
|
+
class StringField < BytesField
|
6
|
+
|
7
|
+
##
|
8
|
+
# Constants
|
9
|
+
#
|
10
|
+
|
11
|
+
ENCODING = Encoding::UTF_8
|
12
|
+
|
13
|
+
##
|
14
|
+
# Public Instance Methods
|
15
|
+
#
|
16
|
+
|
17
|
+
def acceptable?(val)
|
18
|
+
val.is_a?(String) || val.nil? || val.is_a?(Symbol)
|
19
|
+
end
|
20
|
+
|
21
|
+
def coerce!(value)
|
22
|
+
if value.nil?
|
23
|
+
nil
|
24
|
+
elsif acceptable?(value)
|
25
|
+
value.to_s
|
26
|
+
else
|
27
|
+
fail TypeError, "Unacceptable value #{value} for field #{name} of type #{type_class}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def decode(bytes)
|
32
|
+
bytes.force_encoding(::Protobuf::Field::StringField::ENCODING)
|
33
|
+
bytes
|
34
|
+
end
|
35
|
+
|
36
|
+
def encode(value)
|
37
|
+
value_to_encode = "" + value # dup is slower
|
38
|
+
unless value_to_encode.encoding == ENCODING
|
39
|
+
value_to_encode.encode!(::Protobuf::Field::StringField::ENCODING, :invalid => :replace, :undef => :replace, :replace => "")
|
40
|
+
end
|
41
|
+
value_to_encode.force_encoding(::Protobuf::Field::BytesField::BYTES_ENCODING)
|
42
|
+
|
43
|
+
"#{::Protobuf::Field::VarintField.encode(value_to_encode.bytesize)}#{value_to_encode}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def json_encode(value)
|
47
|
+
value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|