contrast-agent 6.3.0 → 6.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -3
  3. data/.simplecov +1 -0
  4. data/Rakefile +0 -27
  5. data/lib/contrast/agent/assess/policy/propagation_method.rb +0 -2
  6. data/lib/contrast/agent/assess/policy/trigger_method.rb +1 -1
  7. data/lib/contrast/agent/version.rb +1 -1
  8. data/lib/contrast/api/dtm.pb.rb +1 -1
  9. data/lib/contrast/api/settings.pb.rb +1 -1
  10. data/lib/contrast/utils/patching/policy/patch_utils.rb +5 -22
  11. data/lib/contrast.rb +34 -0
  12. data/lib/protobuf/code_generator.rb +129 -0
  13. data/lib/protobuf/decoder.rb +28 -0
  14. data/lib/protobuf/deprecation.rb +117 -0
  15. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +79 -0
  16. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +360 -0
  17. data/lib/protobuf/descriptors.rb +3 -0
  18. data/lib/protobuf/encoder.rb +11 -0
  19. data/lib/protobuf/enum.rb +365 -0
  20. data/lib/protobuf/exceptions.rb +9 -0
  21. data/lib/protobuf/field/base_field.rb +380 -0
  22. data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
  23. data/lib/protobuf/field/bool_field.rb +64 -0
  24. data/lib/protobuf/field/bytes_field.rb +67 -0
  25. data/lib/protobuf/field/double_field.rb +25 -0
  26. data/lib/protobuf/field/enum_field.rb +56 -0
  27. data/lib/protobuf/field/field_array.rb +102 -0
  28. data/lib/protobuf/field/field_hash.rb +122 -0
  29. data/lib/protobuf/field/fixed32_field.rb +25 -0
  30. data/lib/protobuf/field/fixed64_field.rb +28 -0
  31. data/lib/protobuf/field/float_field.rb +43 -0
  32. data/lib/protobuf/field/int32_field.rb +21 -0
  33. data/lib/protobuf/field/int64_field.rb +34 -0
  34. data/lib/protobuf/field/integer_field.rb +23 -0
  35. data/lib/protobuf/field/message_field.rb +51 -0
  36. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  37. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  38. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  39. data/lib/protobuf/field/sint32_field.rb +21 -0
  40. data/lib/protobuf/field/sint64_field.rb +21 -0
  41. data/lib/protobuf/field/string_field.rb +51 -0
  42. data/lib/protobuf/field/uint32_field.rb +21 -0
  43. data/lib/protobuf/field/uint64_field.rb +21 -0
  44. data/lib/protobuf/field/varint_field.rb +77 -0
  45. data/lib/protobuf/field.rb +74 -0
  46. data/lib/protobuf/generators/base.rb +85 -0
  47. data/lib/protobuf/generators/enum_generator.rb +39 -0
  48. data/lib/protobuf/generators/extension_generator.rb +27 -0
  49. data/lib/protobuf/generators/field_generator.rb +193 -0
  50. data/lib/protobuf/generators/file_generator.rb +262 -0
  51. data/lib/protobuf/generators/group_generator.rb +122 -0
  52. data/lib/protobuf/generators/message_generator.rb +104 -0
  53. data/lib/protobuf/generators/option_generator.rb +17 -0
  54. data/lib/protobuf/generators/printable.rb +160 -0
  55. data/lib/protobuf/generators/service_generator.rb +50 -0
  56. data/lib/protobuf/lifecycle.rb +33 -0
  57. data/lib/protobuf/logging.rb +39 -0
  58. data/lib/protobuf/message/fields.rb +233 -0
  59. data/lib/protobuf/message/serialization.rb +85 -0
  60. data/lib/protobuf/message.rb +241 -0
  61. data/lib/protobuf/optionable.rb +72 -0
  62. data/lib/protobuf/tasks/compile.rake +80 -0
  63. data/lib/protobuf/tasks.rb +1 -0
  64. data/lib/protobuf/varint.rb +20 -0
  65. data/lib/protobuf/varint_pure.rb +31 -0
  66. data/lib/protobuf/version.rb +3 -0
  67. data/lib/protobuf/wire_type.rb +10 -0
  68. data/lib/protobuf.rb +91 -0
  69. data/proto/dynamic_discovery.proto +46 -0
  70. data/proto/google/protobuf/compiler/plugin.proto +183 -0
  71. data/proto/google/protobuf/descriptor.proto +911 -0
  72. data/proto/rpc.proto +71 -0
  73. data/ruby-agent.gemspec +1 -1
  74. 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,21 @@
1
+ require 'protobuf/field/integer_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Int32Field < IntegerField
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,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
@@ -0,0 +1,21 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Uint32Field < VarintField
6
+
7
+ ##
8
+ # Class Methods
9
+ #
10
+
11
+ def self.max
12
+ UINT32_MAX
13
+ end
14
+
15
+ def self.min
16
+ 0
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'protobuf/field/varint_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class Uint64Field < VarintField
6
+
7
+ ##
8
+ # Class Methods
9
+ #
10
+
11
+ def self.max
12
+ UINT64_MAX
13
+ end
14
+
15
+ def self.min
16
+ 0
17
+ end
18
+
19
+ end
20
+ end
21
+ end