protostar 0.1.0.beta1
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 +7 -0
- data/CHANGELOG.md +60 -0
- data/LICENSE.txt +21 -0
- data/README.md +647 -0
- data/THIRD_PARTY_NOTICES.md +61 -0
- data/exe/protoc-gen-protostar +7 -0
- data/exe/protostar +7 -0
- data/lib/protostar/builder/generator.rb +71 -0
- data/lib/protostar/builder/sink.rb +35 -0
- data/lib/protostar/builder.rb +965 -0
- data/lib/protostar/cli.rb +267 -0
- data/lib/protostar/codec/decode_generator.rb +199 -0
- data/lib/protostar/codec/decoder.rb +296 -0
- data/lib/protostar/codec/encode_generator.rb +224 -0
- data/lib/protostar/codec/encoder.rb +121 -0
- data/lib/protostar/codec/sizer.rb +91 -0
- data/lib/protostar/codec.rb +15 -0
- data/lib/protostar/compiler/ast.rb +193 -0
- data/lib/protostar/compiler/emitters/descriptor_set.rb +57 -0
- data/lib/protostar/compiler/emitters/google_ruby.rb +103 -0
- data/lib/protostar/compiler/emitters/grpc.rb +175 -0
- data/lib/protostar/compiler/emitters/protostar_rbs.rb +252 -0
- data/lib/protostar/compiler/emitters/rbs.rb +394 -0
- data/lib/protostar/compiler/emitters/ruby.rb +503 -0
- data/lib/protostar/compiler/emitters.rb +268 -0
- data/lib/protostar/compiler/include/LICENSE +32 -0
- data/lib/protostar/compiler/include/google/protobuf/any.proto +106 -0
- data/lib/protostar/compiler/include/google/protobuf/api.proto +229 -0
- data/lib/protostar/compiler/include/google/protobuf/compiler/plugin.proto +180 -0
- data/lib/protostar/compiler/include/google/protobuf/cpp_features.proto +87 -0
- data/lib/protostar/compiler/include/google/protobuf/descriptor.proto +1532 -0
- data/lib/protostar/compiler/include/google/protobuf/duration.proto +115 -0
- data/lib/protostar/compiler/include/google/protobuf/empty.proto +51 -0
- data/lib/protostar/compiler/include/google/protobuf/field_mask.proto +243 -0
- data/lib/protostar/compiler/include/google/protobuf/java_features.proto +132 -0
- data/lib/protostar/compiler/include/google/protobuf/source_context.proto +48 -0
- data/lib/protostar/compiler/include/google/protobuf/struct.proto +111 -0
- data/lib/protostar/compiler/include/google/protobuf/timestamp.proto +145 -0
- data/lib/protostar/compiler/include/google/protobuf/type.proto +217 -0
- data/lib/protostar/compiler/include/google/protobuf/wrappers.proto +157 -0
- data/lib/protostar/compiler/lexer.rb +659 -0
- data/lib/protostar/compiler/linker.rb +894 -0
- data/lib/protostar/compiler/option_interpreter.rb +363 -0
- data/lib/protostar/compiler/parser.rb +1696 -0
- data/lib/protostar/compiler/retention.rb +104 -0
- data/lib/protostar/compiler/run.rb +184 -0
- data/lib/protostar/compiler/source_info.rb +161 -0
- data/lib/protostar/compiler/symbol_table.rb +223 -0
- data/lib/protostar/compiler/text_format.rb +340 -0
- data/lib/protostar/compiler/validator.rb +944 -0
- data/lib/protostar/compiler.rb +304 -0
- data/lib/protostar/diagnostics/codes.rb +1307 -0
- data/lib/protostar/diagnostics/formats.rb +64 -0
- data/lib/protostar/diagnostics/renderer.rb +240 -0
- data/lib/protostar/diagnostics/source.rb +153 -0
- data/lib/protostar/diagnostics.rb +117 -0
- data/lib/protostar/dsl.rb +367 -0
- data/lib/protostar/enum.rb +70 -0
- data/lib/protostar/errors.rb +23 -0
- data/lib/protostar/google/protobuf/any_pb.rb +90 -0
- data/lib/protostar/google/protobuf/api_pb.rb +199 -0
- data/lib/protostar/google/protobuf/compiler/plugin_pb.rb +168 -0
- data/lib/protostar/google/protobuf/descriptor_pb.rb +1239 -0
- data/lib/protostar/google/protobuf/duration_pb.rb +99 -0
- data/lib/protostar/google/protobuf/empty_pb.rb +36 -0
- data/lib/protostar/google/protobuf/field_mask_pb.rb +228 -0
- data/lib/protostar/google/protobuf/source_context_pb.rb +33 -0
- data/lib/protostar/google/protobuf/struct_pb.rb +91 -0
- data/lib/protostar/google/protobuf/timestamp_pb.rb +129 -0
- data/lib/protostar/google/protobuf/type_pb.rb +202 -0
- data/lib/protostar/google/protobuf/wrappers_pb.rb +125 -0
- data/lib/protostar/google_protobuf_shim.rb +24 -0
- data/lib/protostar/json/encoder.rb +340 -0
- data/lib/protostar/json/errors.rb +34 -0
- data/lib/protostar/json/parser.rb +437 -0
- data/lib/protostar/json/path.rb +39 -0
- data/lib/protostar/json.rb +95 -0
- data/lib/protostar/lint/command.rb +197 -0
- data/lib/protostar/lint/config.rb +98 -0
- data/lib/protostar/lint/context.rb +126 -0
- data/lib/protostar/lint/directives.rb +56 -0
- data/lib/protostar/lint/fixer.rb +165 -0
- data/lib/protostar/lint/naming.rb +54 -0
- data/lib/protostar/lint/rule.rb +120 -0
- data/lib/protostar/lint/rules/comment_enum.rb +31 -0
- data/lib/protostar/lint/rules/comment_enum_value.rb +32 -0
- data/lib/protostar/lint/rules/comment_field.rb +33 -0
- data/lib/protostar/lint/rules/comment_message.rb +31 -0
- data/lib/protostar/lint/rules/comment_rpc.rb +31 -0
- data/lib/protostar/lint/rules/comment_service.rb +31 -0
- data/lib/protostar/lint/rules/edition_recommended.rb +31 -0
- data/lib/protostar/lint/rules/enum_first_value_zero.rb +34 -0
- data/lib/protostar/lint/rules/enum_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/enum_value_prefix.rb +38 -0
- data/lib/protostar/lint/rules/enum_value_upper_snake_case.rb +28 -0
- data/lib/protostar/lint/rules/enum_zero_value_suffix.rb +41 -0
- data/lib/protostar/lint/rules/field_lower_snake_case.rb +34 -0
- data/lib/protostar/lint/rules/field_not_required.rb +39 -0
- data/lib/protostar/lint/rules/field_number_reuse_risk.rb +45 -0
- data/lib/protostar/lint/rules/field_numbers_hot_range.rb +44 -0
- data/lib/protostar/lint/rules/file_lower_snake_case.rb +27 -0
- data/lib/protostar/lint/rules/import_no_public.rb +29 -0
- data/lib/protostar/lint/rules/import_no_weak.rb +28 -0
- data/lib/protostar/lint/rules/import_used.rb +33 -0
- data/lib/protostar/lint/rules/message_pascal_case.rb +27 -0
- data/lib/protostar/lint/rules/no_deprecated_features.rb +50 -0
- data/lib/protostar/lint/rules/no_groups.rb +34 -0
- data/lib/protostar/lint/rules/oneof_lower_snake_case.rb +27 -0
- data/lib/protostar/lint/rules/package_defined.rb +28 -0
- data/lib/protostar/lint/rules/package_directory_match.rb +33 -0
- data/lib/protostar/lint/rules/package_lower_snake_case.rb +28 -0
- data/lib/protostar/lint/rules/package_same_directory.rb +39 -0
- data/lib/protostar/lint/rules/package_version_suffix.rb +31 -0
- data/lib/protostar/lint/rules/reserved_names_with_numbers.rb +44 -0
- data/lib/protostar/lint/rules/rpc_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/rpc_request_response_unique.rb +40 -0
- data/lib/protostar/lint/rules/rpc_request_standard_name.rb +32 -0
- data/lib/protostar/lint/rules/rpc_response_standard_name.rb +31 -0
- data/lib/protostar/lint/rules/service_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/service_suffix.rb +28 -0
- data/lib/protostar/lint/rules/syntax_specified.rb +35 -0
- data/lib/protostar/lint/runner.rb +135 -0
- data/lib/protostar/lint.rb +122 -0
- data/lib/protostar/message/accessors.rb +86 -0
- data/lib/protostar/message/coercion.rb +171 -0
- data/lib/protostar/message/field_info.rb +145 -0
- data/lib/protostar/message/reflection.rb +149 -0
- data/lib/protostar/message.rb +572 -0
- data/lib/protostar/plugin.rb +94 -0
- data/lib/protostar/schema/default_value.rb +113 -0
- data/lib/protostar/schema/descriptor.rb +41 -0
- data/lib/protostar/schema/draft/copy.rb +88 -0
- data/lib/protostar/schema/draft/resolution.rb +177 -0
- data/lib/protostar/schema/draft.rb +779 -0
- data/lib/protostar/schema/enum.rb +106 -0
- data/lib/protostar/schema/extension_range.rb +37 -0
- data/lib/protostar/schema/features.rb +153 -0
- data/lib/protostar/schema/field.rb +201 -0
- data/lib/protostar/schema/file.rb +217 -0
- data/lib/protostar/schema/freezer.rb +61 -0
- data/lib/protostar/schema/message.rb +104 -0
- data/lib/protostar/schema/oneof.rb +38 -0
- data/lib/protostar/schema/options.rb +367 -0
- data/lib/protostar/schema/pool.rb +179 -0
- data/lib/protostar/schema/proto.rb +576 -0
- data/lib/protostar/schema/resolver.rb +118 -0
- data/lib/protostar/schema/service.rb +89 -0
- data/lib/protostar/schema/source_info.rb +53 -0
- data/lib/protostar/schema.rb +65 -0
- data/lib/protostar/short_names/any.rb +7 -0
- data/lib/protostar/short_names/duration.rb +7 -0
- data/lib/protostar/short_names/empty.rb +7 -0
- data/lib/protostar/short_names/field_mask.rb +7 -0
- data/lib/protostar/short_names/struct.rb +9 -0
- data/lib/protostar/short_names/timestamp.rb +7 -0
- data/lib/protostar/short_names/wrappers.rb +15 -0
- data/lib/protostar/text/extensions.rb +114 -0
- data/lib/protostar/text/parser.rb +439 -0
- data/lib/protostar/text/printer.rb +304 -0
- data/lib/protostar/text/tokenizer.rb +116 -0
- data/lib/protostar/text.rb +67 -0
- data/lib/protostar/types.rb +152 -0
- data/lib/protostar/unknown_field.rb +58 -0
- data/lib/protostar/version.rb +5 -0
- data/lib/protostar/view/generator.rb +298 -0
- data/lib/protostar/view/map.rb +194 -0
- data/lib/protostar/view/repeated.rb +143 -0
- data/lib/protostar/view/scan.rb +183 -0
- data/lib/protostar/view.rb +283 -0
- data/lib/protostar/well_known/any.rb +52 -0
- data/lib/protostar/well_known/duration.rb +53 -0
- data/lib/protostar/well_known/list_value.rb +63 -0
- data/lib/protostar/well_known/struct.rb +55 -0
- data/lib/protostar/well_known/timestamp.rb +64 -0
- data/lib/protostar/well_known/value.rb +60 -0
- data/lib/protostar/well_known.rb +38 -0
- data/lib/protostar/wire/io_source.rb +40 -0
- data/lib/protostar/wire/reader.rb +254 -0
- data/lib/protostar/wire/writer.rb +201 -0
- data/lib/protostar/wire.rb +96 -0
- data/lib/protostar.rb +95 -0
- data/shims/google-protobuf/lib/google/protobuf/any_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/api_pb.rb +22 -0
- data/shims/google-protobuf/lib/google/protobuf/compiler/plugin_pb.rb +25 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptor_pb.rb +72 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptor_pool.rb +164 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptors.rb +553 -0
- data/shims/google-protobuf/lib/google/protobuf/duration_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/empty_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/field_mask_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/convert.rb +180 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/extensions.rb +154 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/json.rb +104 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/well_known.rb +140 -0
- data/shims/google-protobuf/lib/google/protobuf/map.rb +216 -0
- data/shims/google-protobuf/lib/google/protobuf/message.rb +544 -0
- data/shims/google-protobuf/lib/google/protobuf/message_exts.rb +41 -0
- data/shims/google-protobuf/lib/google/protobuf/plugin_pb.rb +4 -0
- data/shims/google-protobuf/lib/google/protobuf/repeated_field.rb +366 -0
- data/shims/google-protobuf/lib/google/protobuf/source_context_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/struct_pb.rb +20 -0
- data/shims/google-protobuf/lib/google/protobuf/timestamp_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/type_pb.rb +27 -0
- data/shims/google-protobuf/lib/google/protobuf/well_known_types.rb +37 -0
- data/shims/google-protobuf/lib/google/protobuf/wrappers_pb.rb +25 -0
- data/shims/google-protobuf/lib/google/protobuf.rb +107 -0
- data/shims/google-protobuf/lib/google/protobuf_ffi.rb +5 -0
- data/shims/google-protobuf/lib/google/protobuf_native.rb +5 -0
- data/sig/protostar/google/protobuf/any_pb.rbs +77 -0
- data/sig/protostar/google/protobuf/api_pb.rbs +242 -0
- data/sig/protostar/google/protobuf/compiler/plugin_pb.rbs +264 -0
- data/sig/protostar/google/protobuf/descriptor_pb.rbs +2220 -0
- data/sig/protostar/google/protobuf/duration_pb.rbs +82 -0
- data/sig/protostar/google/protobuf/empty_pb.rbs +18 -0
- data/sig/protostar/google/protobuf/field_mask_pb.rbs +170 -0
- data/sig/protostar/google/protobuf/source_context_pb.rbs +24 -0
- data/sig/protostar/google/protobuf/struct_pb.rbs +135 -0
- data/sig/protostar/google/protobuf/timestamp_pb.rbs +102 -0
- data/sig/protostar/google/protobuf/type_pb.rbs +304 -0
- data/sig/protostar/google/protobuf/wrappers_pb.rbs +169 -0
- data/sig/protostar/lint.rbs +216 -0
- data/sig/protostar.rbs +326 -0
- metadata +366 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Protostar
|
|
4
|
+
module Schema
|
|
5
|
+
# An RPC service. Its methods are exposed as {#rpcs} and {#rpc} so that
|
|
6
|
+
# Object#methods and Object#method keep working on a descriptor.
|
|
7
|
+
class Service < Descriptor
|
|
8
|
+
# @return [File]
|
|
9
|
+
attr_reader :file
|
|
10
|
+
|
|
11
|
+
# @api private
|
|
12
|
+
def initialize(name:, full_name:, file:, index:)
|
|
13
|
+
@name = name
|
|
14
|
+
@full_name = full_name
|
|
15
|
+
@file = file
|
|
16
|
+
@index = index
|
|
17
|
+
@rpcs = Freezer::EMPTY_ARRAY
|
|
18
|
+
@rpcs_by_name = Freezer::EMPTY_HASH
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @api private
|
|
22
|
+
def __rpcs(rpcs)
|
|
23
|
+
@rpcs = rpcs
|
|
24
|
+
@rpcs_by_name = rpcs.to_h { |m| [m.name, m] }.freeze
|
|
25
|
+
self
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @return [Array<Method>] declaration order
|
|
29
|
+
attr_reader :rpcs
|
|
30
|
+
|
|
31
|
+
# @param name [String, Symbol]
|
|
32
|
+
# @return [Method, nil]
|
|
33
|
+
def rpc(name)
|
|
34
|
+
@rpcs_by_name[name.to_s]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @return [Protostar::Google::Protobuf::ServiceDescriptorProto]
|
|
38
|
+
def to_proto
|
|
39
|
+
Proto::Writer.service(self)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# One RPC of a {Service}
|
|
44
|
+
class Method < Descriptor
|
|
45
|
+
# @return [Service]
|
|
46
|
+
attr_reader :service
|
|
47
|
+
# @return [Message]
|
|
48
|
+
attr_reader :input_type
|
|
49
|
+
# @return [Message]
|
|
50
|
+
attr_reader :output_type
|
|
51
|
+
|
|
52
|
+
# @api private
|
|
53
|
+
attr_reader :input_type_name, :output_type_name
|
|
54
|
+
|
|
55
|
+
# @api private
|
|
56
|
+
def initialize(name:, full_name:, service:, index:, input_type_name:, output_type_name:,
|
|
57
|
+
client_streaming:, server_streaming:)
|
|
58
|
+
@name = name
|
|
59
|
+
@full_name = full_name
|
|
60
|
+
@service = service
|
|
61
|
+
@index = index
|
|
62
|
+
@input_type_name = input_type_name
|
|
63
|
+
@output_type_name = output_type_name
|
|
64
|
+
@client_streaming = client_streaming
|
|
65
|
+
@server_streaming = server_streaming
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# @return [File]
|
|
69
|
+
def file
|
|
70
|
+
@service.file
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @return [Boolean]
|
|
74
|
+
def client_streaming?
|
|
75
|
+
@client_streaming
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @return [Boolean]
|
|
79
|
+
def server_streaming?
|
|
80
|
+
@server_streaming
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @return [Protostar::Google::Protobuf::MethodDescriptorProto]
|
|
84
|
+
def to_proto
|
|
85
|
+
Proto::Writer.rpc(self)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Protostar
|
|
4
|
+
module Schema
|
|
5
|
+
# A file's `source_code_info`, kept verbatim
|
|
6
|
+
class SourceInfo
|
|
7
|
+
# One `SourceCodeInfo.Location`
|
|
8
|
+
class Location
|
|
9
|
+
# @return [Array<Integer>] the descriptor path, e.g. [4, 0, 2, 1] for message 0, field 1
|
|
10
|
+
attr_reader :path
|
|
11
|
+
# @return [Array<Integer>] [start_line, start_column, (end_line,) end_column], zero-based
|
|
12
|
+
attr_reader :span
|
|
13
|
+
# @return [String, nil]
|
|
14
|
+
attr_reader :leading_comments
|
|
15
|
+
# @return [String, nil]
|
|
16
|
+
attr_reader :trailing_comments
|
|
17
|
+
# @return [Array<String>]
|
|
18
|
+
attr_reader :leading_detached_comments
|
|
19
|
+
|
|
20
|
+
# @param path [Array<Integer>]
|
|
21
|
+
# @param span [Array<Integer>]
|
|
22
|
+
# @param leading_comments [String, nil]
|
|
23
|
+
# @param trailing_comments [String, nil]
|
|
24
|
+
# @param leading_detached_comments [Array<String>]
|
|
25
|
+
def initialize(path:, span:, leading_comments: nil, trailing_comments: nil, leading_detached_comments: [])
|
|
26
|
+
@path = Freezer.call(path)
|
|
27
|
+
@span = Freezer.call(span)
|
|
28
|
+
@leading_comments = Freezer.call(leading_comments)
|
|
29
|
+
@trailing_comments = Freezer.call(trailing_comments)
|
|
30
|
+
@leading_detached_comments = Freezer.call(leading_detached_comments)
|
|
31
|
+
freeze
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Array<Location>]
|
|
36
|
+
attr_reader :locations
|
|
37
|
+
|
|
38
|
+
# @param locations [Array<Location>] in protoc's order
|
|
39
|
+
def initialize(locations)
|
|
40
|
+
@locations = locations.dup.freeze
|
|
41
|
+
@by_path = {}
|
|
42
|
+
@locations.each { |loc| @by_path[loc.path] ||= loc }
|
|
43
|
+
@by_path.freeze
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param path [Array<Integer>]
|
|
47
|
+
# @return [Location, nil] the first location recorded for the path
|
|
48
|
+
def location(path)
|
|
49
|
+
@by_path[path]
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Protostar
|
|
4
|
+
# The descriptor model: an immutable, Ractor-shareable graph of files,
|
|
5
|
+
# messages, fields, enums and services. {File.draft} builds one;
|
|
6
|
+
# {File#to_proto} and {File.from_proto} translate to and from protoc's
|
|
7
|
+
# `FileDescriptorProto`.
|
|
8
|
+
module Schema
|
|
9
|
+
autoload :DefaultValue, ::File.expand_path("schema/default_value", __dir__)
|
|
10
|
+
autoload :Draft, ::File.expand_path("schema/draft", __dir__)
|
|
11
|
+
autoload :ExtensionRange, ::File.expand_path("schema/extension_range", __dir__)
|
|
12
|
+
autoload :Proto, ::File.expand_path("schema/proto", __dir__)
|
|
13
|
+
autoload :Resolver, ::File.expand_path("schema/resolver", __dir__)
|
|
14
|
+
autoload :SourceInfo, ::File.expand_path("schema/source_info", __dir__)
|
|
15
|
+
|
|
16
|
+
# Raised for malformed descriptors, missing dependencies and pool clashes
|
|
17
|
+
class Error < Protostar::Error; end
|
|
18
|
+
|
|
19
|
+
# The JSON name protoc derives from a field name: underscores dropped,
|
|
20
|
+
# the letter after each one upper-cased
|
|
21
|
+
# @param name [String]
|
|
22
|
+
# @return [String]
|
|
23
|
+
def self.json_name(name)
|
|
24
|
+
out = +""
|
|
25
|
+
upper = false
|
|
26
|
+
name.each_char do |c|
|
|
27
|
+
if c == "_"
|
|
28
|
+
upper = true
|
|
29
|
+
elsif upper
|
|
30
|
+
out << c.upcase(:ascii)
|
|
31
|
+
upper = false
|
|
32
|
+
else
|
|
33
|
+
out << c
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
out
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Raised when a type name, extendee or method type cannot be resolved
|
|
40
|
+
class ResolveError < Error
|
|
41
|
+
# @return [String, nil] the name as written
|
|
42
|
+
attr_reader :name
|
|
43
|
+
# @return [String, nil] the scope the lookup started from
|
|
44
|
+
attr_reader :scope
|
|
45
|
+
|
|
46
|
+
def initialize(message, name: nil, scope: nil)
|
|
47
|
+
@name = name
|
|
48
|
+
@scope = scope
|
|
49
|
+
super(message)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
require_relative "schema/freezer"
|
|
56
|
+
require_relative "schema/options"
|
|
57
|
+
require_relative "schema/features"
|
|
58
|
+
require_relative "schema/descriptor"
|
|
59
|
+
require_relative "schema/file"
|
|
60
|
+
require_relative "schema/message"
|
|
61
|
+
require_relative "schema/oneof"
|
|
62
|
+
require_relative "schema/field"
|
|
63
|
+
require_relative "schema/enum"
|
|
64
|
+
require_relative "schema/service"
|
|
65
|
+
require_relative "schema/pool"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../google/protobuf/wrappers_pb"
|
|
4
|
+
|
|
5
|
+
module Protostar
|
|
6
|
+
DoubleValue = Google::Protobuf::DoubleValue
|
|
7
|
+
FloatValue = Google::Protobuf::FloatValue
|
|
8
|
+
Int64Value = Google::Protobuf::Int64Value
|
|
9
|
+
UInt64Value = Google::Protobuf::UInt64Value
|
|
10
|
+
Int32Value = Google::Protobuf::Int32Value
|
|
11
|
+
UInt32Value = Google::Protobuf::UInt32Value
|
|
12
|
+
BoolValue = Google::Protobuf::BoolValue
|
|
13
|
+
StringValue = Google::Protobuf::StringValue
|
|
14
|
+
BytesValue = Google::Protobuf::BytesValue
|
|
15
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Protostar
|
|
4
|
+
module Text
|
|
5
|
+
# Extensions seen through the unknown fields that hold them: finding the
|
|
6
|
+
# extensions of a message, reading their values out of unknown fields
|
|
7
|
+
# and writing values back into unknown fields.
|
|
8
|
+
# @api private
|
|
9
|
+
class Extensions
|
|
10
|
+
F = Message::FieldInfo
|
|
11
|
+
|
|
12
|
+
# @param registry [Types::Registry]
|
|
13
|
+
# @param pool [Schema::Pool, nil]
|
|
14
|
+
def initialize(registry, pool)
|
|
15
|
+
@registry = registry
|
|
16
|
+
@pool = pool
|
|
17
|
+
@by_extendee = {}
|
|
18
|
+
@infos = {}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param descriptor [Schema::Message]
|
|
22
|
+
# @return [Hash{Integer => Schema::Field}] extensions of the message by number
|
|
23
|
+
def of(descriptor)
|
|
24
|
+
@by_extendee[descriptor] ||= begin
|
|
25
|
+
fields = if @pool
|
|
26
|
+
@pool.extensions_of(descriptor.full_name)
|
|
27
|
+
else
|
|
28
|
+
files(descriptor.file).flat_map(&:all_extensions).select { |e| e.extendee.equal?(descriptor) }
|
|
29
|
+
end
|
|
30
|
+
fields.to_h { |f| [f.number, f] }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param descriptor [Schema::Message]
|
|
35
|
+
# @param name [String] the extension's full name
|
|
36
|
+
# @return [Schema::Field, nil]
|
|
37
|
+
def named(descriptor, name)
|
|
38
|
+
of(descriptor).each_value.find { |f| f.full_name == name }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param field [Schema::Field] an extension
|
|
42
|
+
# @return [Message::FieldInfo, nil] nil when its message or enum type has no class
|
|
43
|
+
def info(field)
|
|
44
|
+
return @infos[field] if @infos.key?(field)
|
|
45
|
+
@infos[field] = begin
|
|
46
|
+
Message::FieldInfo.new(field, nil, method(:resolve))
|
|
47
|
+
rescue KeyError
|
|
48
|
+
nil
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# The values an extension holds in a message's unknown fields
|
|
53
|
+
# @param info [Message::FieldInfo]
|
|
54
|
+
# @param unknown [Array<UnknownField>] those with the extension's number
|
|
55
|
+
# @return [Array] values as the field's reader would give them, or nil
|
|
56
|
+
# when the bytes do not read as the extension's type
|
|
57
|
+
def read(info, unknown)
|
|
58
|
+
values = []
|
|
59
|
+
unknown.each do |u|
|
|
60
|
+
if u.wire_type == Wire::LENGTH_DELIMITED && info.packable && !info.message? && info.kind != F::STRING && info.kind != F::BYTES
|
|
61
|
+
r = Wire::Reader.new(u.value)
|
|
62
|
+
values << scalar(info, r) until r.eof?
|
|
63
|
+
elsif u.wire_type != info.wire_type
|
|
64
|
+
return nil
|
|
65
|
+
elsif info.message?
|
|
66
|
+
values << info.message_class.decode(u.value)
|
|
67
|
+
else
|
|
68
|
+
values << scalar(info, Wire::Reader.new(u.bytes))
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
values
|
|
72
|
+
rescue DecodeError
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @param info [Message::FieldInfo]
|
|
77
|
+
# @param values [Array]
|
|
78
|
+
# @return [Array<UnknownField>] the fields the binary codec would have kept
|
|
79
|
+
def write(info, values)
|
|
80
|
+
if info.packed && !values.empty?
|
|
81
|
+
w = Wire::Writer.new
|
|
82
|
+
Codec::Encoder.packed(info, values, w)
|
|
83
|
+
payload = w.string
|
|
84
|
+
return [UnknownField.new(info.number, Wire::LENGTH_DELIMITED, Wire.varint(payload.bytesize) + payload)]
|
|
85
|
+
end
|
|
86
|
+
values.map do |v|
|
|
87
|
+
w = Wire::Writer.new
|
|
88
|
+
sizes = {}.compare_by_identity
|
|
89
|
+
Codec::Sizer.value(info, v, sizes)
|
|
90
|
+
Codec::Encoder.value(info, v, w, sizes)
|
|
91
|
+
UnknownField.new(info.number, info.wire_type, w.string)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def scalar(info, r)
|
|
98
|
+
v = Codec::Decoder.scalar(r, info)
|
|
99
|
+
(info.kind == F::ENUM) ? (info.enum_names[v] || v) : v
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def resolve(descriptor)
|
|
103
|
+
Types.find(descriptor.full_name, registry: @registry || Types.registry) || raise(KeyError, descriptor.full_name)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# The file and everything it imports, transitively
|
|
107
|
+
def files(file, seen = {})
|
|
108
|
+
return [] if seen[file]
|
|
109
|
+
seen[file] = true
|
|
110
|
+
[file] + file.dependency_files.flat_map { |d| files(d, seen) }
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|