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.
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,77 @@
1
+ require 'protobuf/field/base_field'
2
+
3
+ module Protobuf
4
+ module Field
5
+ class VarintField < BaseField
6
+
7
+ ##
8
+ # Constants
9
+ #
10
+ INT32_MAX = 2**31 - 1
11
+ INT32_MIN = -2**31
12
+ INT64_MAX = 2**63 - 1
13
+ INT64_MIN = -2**63
14
+ UINT32_MAX = 2**32 - 1
15
+ UINT64_MAX = 2**64 - 1
16
+
17
+ ##
18
+ # Class Methods
19
+ #
20
+
21
+ def self.default
22
+ 0
23
+ end
24
+
25
+ def self.encode(value)
26
+ ::Protobuf::Varint.encode(value)
27
+ end
28
+
29
+ ##
30
+ # Public Instance Methods
31
+ #
32
+ def acceptable?(val)
33
+ int_val = if val.is_a?(Integer)
34
+ return true if val >= 0 && val < INT32_MAX # return quickly for smallest integer size, hot code path
35
+ val
36
+ elsif val.is_a?(Numeric)
37
+ val.to_i
38
+ else
39
+ Integer(val, 10)
40
+ end
41
+
42
+ int_val >= self.class.min && int_val <= self.class.max
43
+ rescue
44
+ false
45
+ end
46
+
47
+ def coerce!(val)
48
+ if val.is_a?(Integer) && val >= 0 && val <= INT32_MAX
49
+ val
50
+ else
51
+ fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'" unless acceptable?(val)
52
+
53
+ if val.is_a?(Integer) || val.is_a?(Numeric)
54
+ val.to_i
55
+ else
56
+ Integer(val, 10)
57
+ end
58
+ end
59
+ rescue ArgumentError
60
+ fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'"
61
+ end
62
+
63
+ def decode(value)
64
+ value
65
+ end
66
+
67
+ def encode(value)
68
+ ::Protobuf::Field::VarintField.encode(value)
69
+ end
70
+
71
+ def wire_type
72
+ ::Protobuf::WireType::VARINT
73
+ end
74
+
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,74 @@
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
+
23
+ module Protobuf
24
+ module Field
25
+
26
+ PRIMITIVE_FIELD_MAP = {
27
+ :double => ::Protobuf::Field::DoubleField,
28
+ :float => ::Protobuf::Field::FloatField,
29
+ :int32 => ::Protobuf::Field::Int32Field,
30
+ :int64 => ::Protobuf::Field::Int64Field,
31
+ :uint32 => ::Protobuf::Field::Uint32Field,
32
+ :uint64 => ::Protobuf::Field::Uint64Field,
33
+ :sint32 => ::Protobuf::Field::Sint32Field,
34
+ :sint64 => ::Protobuf::Field::Sint64Field,
35
+ :fixed32 => ::Protobuf::Field::Fixed32Field,
36
+ :fixed64 => ::Protobuf::Field::Fixed64Field,
37
+ :sfixed32 => ::Protobuf::Field::Sfixed32Field,
38
+ :sfixed64 => ::Protobuf::Field::Sfixed64Field,
39
+ :string => ::Protobuf::Field::StringField,
40
+ :bytes => ::Protobuf::Field::BytesField,
41
+ :bool => ::Protobuf::Field::BoolField,
42
+ }.freeze
43
+
44
+ def self.build(message_class, rule, type, name, tag, simple_name, options = {})
45
+ field_class(type).new(message_class, rule, field_type(type), name, tag, simple_name, options)
46
+ end
47
+
48
+ # Returns the field class for primitives,
49
+ # EnumField for types that inherit from Protobuf::Enum,
50
+ # and MessageField for types that inherit from Protobuf::Message.
51
+ #
52
+ def self.field_class(type)
53
+ if PRIMITIVE_FIELD_MAP.key?(type)
54
+ PRIMITIVE_FIELD_MAP[type]
55
+ elsif type < ::Protobuf::Enum
56
+ EnumField
57
+ elsif type < ::Protobuf::Message
58
+ MessageField
59
+ elsif type < ::Protobuf::Field::BaseField
60
+ type
61
+ else
62
+ fail ArgumentError, "Invalid field type #{type}"
63
+ end
64
+ end
65
+
66
+ # Returns the mapped type for primitives,
67
+ # otherwise the given type is returned.
68
+ #
69
+ def self.field_type(type)
70
+ PRIMITIVE_FIELD_MAP.fetch(type) { type }
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,85 @@
1
+ require 'protobuf/generators/printable'
2
+
3
+ module Protobuf
4
+ module Generators
5
+ class Base
6
+ include ::Protobuf::Generators::Printable
7
+
8
+ def self.validate_tags(type_name, tags)
9
+ return if tags.empty?
10
+
11
+ unique_tags = tags.uniq
12
+
13
+ if unique_tags.size < tags.size
14
+ ::Protobuf::CodeGenerator.fatal("#{type_name} object has duplicate tags. Expected #{unique_tags.size} tags, but got #{tags.size}. Suppress with PB_NO_TAG_WARNINGS=1.")
15
+ end
16
+
17
+ unless ENV.key?('PB_NO_TAG_WARNINGS')
18
+ expected_size = tags.max - tags.min + 1
19
+ if tags.size < expected_size
20
+ ::Protobuf::CodeGenerator.print_tag_warning_suppress
21
+ ::Protobuf::CodeGenerator.warn("#{type_name} object should have #{expected_size} tags (#{tags.min}..#{tags.max}), but found #{tags.size} tags.")
22
+ end
23
+ end
24
+ end
25
+
26
+ attr_reader :descriptor, :namespace, :options
27
+
28
+ def initialize(descriptor, indent_level = 0, options = {})
29
+ @descriptor = descriptor
30
+ @options = options
31
+ @namespace = @options.fetch(:namespace) { [] }
32
+ init_printer(indent_level)
33
+ end
34
+
35
+ def fully_qualified_type_namespace
36
+ ".#{type_namespace.join('.')}"
37
+ end
38
+
39
+ def run_once(label)
40
+ tracker_ivar = "@_#{label}_compiled"
41
+ value_ivar = "@_#{label}_compiled_value"
42
+
43
+ if instance_variable_get(tracker_ivar)
44
+ return instance_variable_get(value_ivar)
45
+ end
46
+
47
+ return_value = yield
48
+ instance_variable_set(tracker_ivar, true)
49
+ instance_variable_set(value_ivar, return_value)
50
+ return_value
51
+ end
52
+
53
+ def to_s
54
+ compile
55
+ print_contents # see Printable
56
+ end
57
+
58
+ def type_namespace
59
+ @type_namespace ||= @namespace + [descriptor.name]
60
+ end
61
+
62
+ def serialize_value(value)
63
+ case value
64
+ when Message
65
+ fields = value.each_field.map do |field, inner_value|
66
+ next unless value.field?(field.name)
67
+ serialized_inner_value = serialize_value(inner_value)
68
+ "#{field.fully_qualified_name.inspect} => #{serialized_inner_value}"
69
+ end.compact
70
+ "{ #{fields.join(', ')} }"
71
+ when Enum
72
+ "::#{value.parent_class}::#{value.name}"
73
+ when String
74
+ value.inspect
75
+ when nil
76
+ "nil"
77
+ when Array
78
+ '[' + value.map { |x| serialize_value(x) }.join(', ') + ']'
79
+ else
80
+ value
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ require 'protobuf/generators/base'
2
+ require 'protobuf/generators/option_generator'
3
+
4
+ module Protobuf
5
+ module Generators
6
+ class EnumGenerator < Base
7
+
8
+ def compile
9
+ run_once(:compile) do
10
+ tags = []
11
+
12
+ print_class(descriptor.name, :enum) do
13
+ if descriptor.options
14
+ print OptionGenerator.new(descriptor.options, current_indent).to_s
15
+ puts
16
+ end
17
+
18
+ descriptor.value.each do |enum_value_descriptor|
19
+ tags << enum_value_descriptor.number
20
+ puts build_value(enum_value_descriptor)
21
+ end
22
+ end
23
+
24
+ unless descriptor.options.try(:allow_alias)
25
+ self.class.validate_tags(fully_qualified_type_namespace, tags)
26
+ end
27
+ end
28
+ end
29
+
30
+ def build_value(enum_value_descriptor)
31
+ name = enum_value_descriptor.name
32
+ name.upcase! if ENV.key?('PB_UPCASE_ENUMS')
33
+ number = enum_value_descriptor.number
34
+ "define :#{name}, #{number}"
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ require 'protobuf/generators/base'
2
+ require 'protobuf/generators/group_generator'
3
+
4
+ module Protobuf
5
+ module Generators
6
+ class ExtensionGenerator < Base
7
+
8
+ def initialize(message_type, field_descriptors, indent_level)
9
+ super(nil, indent_level)
10
+ @message_type = modulize(message_type)
11
+ @field_descriptors = field_descriptors
12
+ end
13
+
14
+ def compile
15
+ run_once(:compile) do
16
+ print_class(@message_type, :message) do
17
+ group = GroupGenerator.new(current_indent)
18
+ group.add_extension_fields(@field_descriptors)
19
+ group.order = [:extension_field]
20
+ print group.to_s
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,193 @@
1
+ require 'protobuf/generators/base'
2
+
3
+ module Protobuf
4
+ module Generators
5
+ class FieldGenerator < Base
6
+
7
+ ##
8
+ # Constants
9
+ #
10
+ PROTO_INFINITY_DEFAULT = /^inf$/i
11
+ PROTO_NEGATIVE_INFINITY_DEFAULT = /^-inf$/i
12
+ PROTO_NAN_DEFAULT = /^nan$/i
13
+ RUBY_INFINITY_DEFAULT = '::Float::INFINITY'.freeze
14
+ RUBY_NEGATIVE_INFINITY_DEFAULT = '-::Float::INFINITY'.freeze
15
+ RUBY_NAN_DEFAULT = '::Float::NAN'.freeze
16
+
17
+ ##
18
+ # Attributes
19
+ #
20
+ attr_reader :field_options
21
+
22
+ def initialize(field_descriptor, enclosing_msg_descriptor, indent_level)
23
+ super(field_descriptor, indent_level)
24
+ @enclosing_msg_descriptor = enclosing_msg_descriptor
25
+ end
26
+
27
+ def applicable_options
28
+ # Note on the strange use of `#inspect`:
29
+ # :boom.inspect #=> ":boom"
30
+ # :".boom.foo".inspect #=> ":\".boom.foo\""
31
+ # An alternative to `#inspect` would be always adding double quotes,
32
+ # but the generatated code looks un-idiomatic:
33
+ # ":\"#{:boom}\"" #=> ":\"boom\"" <-- Note the unnecessary double quotes
34
+ @applicable_options ||= field_options.map { |k, v| "#{k.inspect} => #{v}" }
35
+ end
36
+
37
+ def default_value
38
+ @default_value ||= begin
39
+ if defaulted?
40
+ case descriptor.type.name
41
+ when :TYPE_ENUM
42
+ enum_default_value
43
+ when :TYPE_STRING, :TYPE_BYTES
44
+ string_default_value
45
+ when :TYPE_FLOAT, :TYPE_DOUBLE
46
+ float_double_default_value
47
+ else
48
+ verbatim_default_value
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def defaulted?
55
+ descriptor.respond_to_has_and_present?(:default_value)
56
+ end
57
+
58
+ def deprecated?
59
+ descriptor.options.try(:deprecated?) { false }
60
+ end
61
+
62
+ def extension?
63
+ descriptor.respond_to_has_and_present?(:extendee)
64
+ end
65
+
66
+ def compile
67
+ run_once(:compile) do
68
+ field_definition = if map?
69
+ ["map #{map_key_type_name}", map_value_type_name, name, number, applicable_options]
70
+ else
71
+ ["#{label} #{type_name}", name, number, applicable_options]
72
+ end
73
+ puts field_definition.flatten.compact.join(', ')
74
+ end
75
+ end
76
+
77
+ def label
78
+ @label ||= descriptor.label.name.to_s.downcase.sub(/label_/, '') # required, optional, repeated
79
+ end
80
+
81
+ def name
82
+ @name ||= descriptor.name.to_sym.inspect
83
+ end
84
+
85
+ def number
86
+ @number ||= descriptor.number
87
+ end
88
+
89
+ def field_options
90
+ @field_options ||= begin
91
+ opts = {}
92
+ opts[:default] = default_value if defaulted?
93
+ opts[:packed] = 'true' if packed?
94
+ opts[:deprecated] = 'true' if deprecated?
95
+ opts[:extension] = 'true' if extension?
96
+ if descriptor.options
97
+ descriptor.options.each_field do |field_option|
98
+ next unless descriptor.options.field?(field_option.name)
99
+ option_value = descriptor.options[field_option.name]
100
+ opts[field_option.fully_qualified_name] = serialize_value(option_value)
101
+ end
102
+ end
103
+ opts
104
+ end
105
+ end
106
+
107
+ def packed?
108
+ descriptor.options.try(:packed?) { false }
109
+ end
110
+
111
+ # Determine the field type
112
+ def type_name
113
+ @type_name ||= determine_type_name(descriptor)
114
+ end
115
+
116
+ # If this field is a map field, this returns a message descriptor that
117
+ # represents the entries in the map. Returns nil if this field is not
118
+ # a map field.
119
+ def map_entry
120
+ @map_entry ||= determine_map_entry
121
+ end
122
+
123
+ def map?
124
+ !map_entry.nil?
125
+ end
126
+
127
+ def map_key_type_name
128
+ return nil if map_entry.nil?
129
+ determine_type_name(map_entry.field.find { |v| v.name == 'key' && v.number == 1 })
130
+ end
131
+
132
+ def map_value_type_name
133
+ return nil if map_entry.nil?
134
+ determine_type_name(map_entry.field.find { |v| v.name == 'value' && v.number == 2 })
135
+ end
136
+
137
+ private
138
+
139
+ def enum_default_value
140
+ optionally_upcased_default =
141
+ if ENV.key?('PB_UPCASE_ENUMS')
142
+ verbatim_default_value.upcase
143
+ else
144
+ verbatim_default_value
145
+ end
146
+ "#{type_name}::#{optionally_upcased_default}"
147
+ end
148
+
149
+ def float_double_default_value
150
+ case verbatim_default_value
151
+ when PROTO_INFINITY_DEFAULT then
152
+ RUBY_INFINITY_DEFAULT
153
+ when PROTO_NEGATIVE_INFINITY_DEFAULT then
154
+ RUBY_NEGATIVE_INFINITY_DEFAULT
155
+ when PROTO_NAN_DEFAULT then
156
+ RUBY_NAN_DEFAULT
157
+ else
158
+ verbatim_default_value
159
+ end
160
+ end
161
+
162
+ def string_default_value
163
+ %("#{verbatim_default_value.gsub(/'/, '\\\\\'')}")
164
+ end
165
+
166
+ def verbatim_default_value
167
+ descriptor.default_value
168
+ end
169
+
170
+ def determine_type_name(descriptor)
171
+ case descriptor.type.name
172
+ when :TYPE_MESSAGE, :TYPE_ENUM, :TYPE_GROUP then
173
+ modulize(descriptor.type_name)
174
+ else
175
+ type_name = descriptor.type.name.to_s.downcase.sub(/^type_/, '')
176
+ ":#{type_name}"
177
+ end
178
+ end
179
+
180
+ def determine_map_entry
181
+ return nil if @enclosing_msg_descriptor.nil?
182
+ return nil unless descriptor.label.name == :LABEL_REPEATED && descriptor.type.name == :TYPE_MESSAGE
183
+ # find nested message type
184
+ name_parts = descriptor.type_name.split(".")
185
+ return nil if name_parts.size < 2 || name_parts[-2] != @enclosing_msg_descriptor.name
186
+ nested = @enclosing_msg_descriptor.nested_type.find { |e| e.name == name_parts[-1] }
187
+ return nested if !nested.nil? && nested.options.try(:map_entry?)
188
+ nil
189
+ end
190
+
191
+ end
192
+ end
193
+ end