protoc-gen-twirp_ruby 1.0.0 → 1.1.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/CHANGELOG.md +11 -0
- data/README.md +45 -10
- data/exe/protoc-gen-twirp_ruby +15 -2
- data/lib/google/protobuf/compiler/plugin_pb.rb +1 -23
- data/lib/google/protobuf/descriptor_pb.rb +2 -23
- data/lib/twirp/protoc_plugin/code_generator.rb +74 -127
- data/lib/twirp/protoc_plugin/compiler_plugin_ext/code_generator_request_ext.rb +55 -0
- data/lib/twirp/protoc_plugin/core_ext/file/delete_extension.rb +11 -0
- data/lib/twirp/protoc_plugin/core_ext/string/camel_case.rb +24 -0
- data/lib/twirp/protoc_plugin/core_ext/string/capitalize_first.rb +14 -0
- data/lib/twirp/protoc_plugin/core_ext/string/snake_case.rb +14 -0
- data/lib/twirp/protoc_plugin/descriptor_ext/file_descriptor_proto_ext.rb +204 -0
- data/lib/twirp/protoc_plugin/descriptor_ext/service_descriptor_proto_ext.rb +23 -0
- data/lib/twirp/protoc_plugin/process.rb +53 -27
- data/lib/twirp/protoc_plugin/version.rb +1 -1
- metadata +12 -13
- data/.rspec +0 -3
- data/.standard.yml +0 -6
- data/Rakefile +0 -10
- data/example/hello_world.proto +0 -14
- data/example/hello_world_pb.rb +0 -39
- data/example/hello_world_twirp.rb +0 -21
- data/proto/google/protobuf/compiler/plugin.proto +0 -180
- data/proto/google/protobuf/descriptor.proto +0 -1280
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "twirp/protoc_plugin/core_ext/string/capitalize_first"
|
4
|
+
|
5
|
+
class String
|
6
|
+
# Returns the string converted to either lowerCamelCase or UpperCamelCase.
|
7
|
+
#
|
8
|
+
# Inspired by https://github.com/rails/rails/blob/6f0d1ad14b92b9f5906e44740fce8b4f1c7075dc/activesupport/lib/active_support/inflector/methods.rb#L70
|
9
|
+
#
|
10
|
+
# @param uppercase_first_letter [Boolean] true for UpperCamelCase,
|
11
|
+
# false for lowerCamelCase. Defaults to true.
|
12
|
+
# @return [String] a copy of the chars of <code>self</code>
|
13
|
+
def camel_case(uppercase_first_letter = true)
|
14
|
+
s = if uppercase_first_letter
|
15
|
+
capitalize_first
|
16
|
+
else
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
s.gsub(/_([a-z\d]*)/i) do
|
21
|
+
$1.capitalize
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class String
|
4
|
+
# Capitalizes the first letter of the string.
|
5
|
+
#
|
6
|
+
# Inspired by https://github.com/rails/rails/blob/6f0d1ad14b92b9f5906e44740fce8b4f1c7075dc/activesupport/lib/active_support/inflector/methods.rb#L166
|
7
|
+
#
|
8
|
+
# @return [String] a string with the first letter capitalized
|
9
|
+
def capitalize_first
|
10
|
+
return "" if empty?
|
11
|
+
|
12
|
+
self[0].upcase + self[1..]
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class String
|
4
|
+
# Converts the string to lower_snake_case.
|
5
|
+
#
|
6
|
+
# Inspired by https://github.com/rails/rails/blob/6f0d1ad14b92b9f5906e44740fce8b4f1c7075dc/activesupport/lib/active_support/inflector/methods.rb#L99
|
7
|
+
#
|
8
|
+
# @return [String] the converted input
|
9
|
+
def snake_case
|
10
|
+
gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
|
11
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
12
|
+
.downcase
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "google/protobuf/descriptor_pb"
|
4
|
+
require "twirp/protoc_plugin/core_ext/string/camel_case"
|
5
|
+
|
6
|
+
class Google::Protobuf::FileDescriptorProto
|
7
|
+
# The `FileDescriptorProto` contains a `dependency` array of all of the imported file
|
8
|
+
# name strings, in the order in which they appear in the source file.
|
9
|
+
#
|
10
|
+
# We want to create a parallel array, but instead of just the file names, we want
|
11
|
+
# the _references_ to those proto file descriptors. So, we declare the attribute
|
12
|
+
# here. NOTE: We also override `CodeGeneratorRequest` `decode` such that it automatically
|
13
|
+
# populates this array when the request is decoded.
|
14
|
+
#
|
15
|
+
# @return [Array<Google::Protobuf::FileDescriptorProto>]
|
16
|
+
attr_accessor :dependency_proto_files
|
17
|
+
|
18
|
+
# @return [String] the output filename for the proto file's generated twirp code.
|
19
|
+
# For example, given a `name` of e.g. "some/example/hello.proto", the twirp output
|
20
|
+
# filename is "some/example/hello_twirp.rb"
|
21
|
+
def twirp_output_filename
|
22
|
+
File.delete_extension(name) + "_twirp.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String] the file name of the generated ruby protobuf code from protoc,
|
26
|
+
# without any path information and missing the ".rb" file extension.
|
27
|
+
#
|
28
|
+
# For example, given a `name` of e.g. "some/example/hello.proto", this helper
|
29
|
+
# returns "hello_rb". The ruby output is expected to be located in the same
|
30
|
+
# directory as the generated twirp output file.
|
31
|
+
def relative_ruby_protobuf_name
|
32
|
+
File.basename(name, File.extname(name)) + "_pb"
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Boolean] true if the proto file has at least one `service` definition,
|
36
|
+
# false otherwise.
|
37
|
+
def has_service?
|
38
|
+
!service.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
# @return [String] the ruby module for this proto file. Gives precedence to
|
42
|
+
# the `ruby_package` option if specified, then the `package` of the file
|
43
|
+
# (converted to UpperCamelCase). Includes a leading top-level namespace
|
44
|
+
# qualifier "::", e.g.: "::MyCompany::Example::Api". Returns `""` when neither
|
45
|
+
# ruby_package nor package is specified.
|
46
|
+
def ruby_module
|
47
|
+
@ruby_module ||= begin
|
48
|
+
pkg = options.ruby_package unless options&.ruby_package.to_s.empty?
|
49
|
+
pkg ||= split_to_constants(package).join("::").to_s unless package.to_s.empty?
|
50
|
+
|
51
|
+
if pkg.nil?
|
52
|
+
"" # Set to "" instead of nil to properly memoize and avoid re-calculating
|
53
|
+
else
|
54
|
+
"::" + pkg
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Converts a protobuf message type to a string containing the equivalent Ruby constant,
|
60
|
+
# relative to the current proto file's Ruby module.
|
61
|
+
#
|
62
|
+
# Respects the `ruby_package` option, both for the current proto file and for all
|
63
|
+
# message types that are imported if the imported file also specifies a `ruby_package`.
|
64
|
+
#
|
65
|
+
# For example, given ...
|
66
|
+
#
|
67
|
+
# 1) the current file has `package "foo.bar";` and `option ruby_package = "Foo::Bar";`
|
68
|
+
# 2) an imported file has `package "other.file.baz";` and `option ruby_package = "Baz";`
|
69
|
+
# 3) a third imported file has `package "third.file";` without a `ruby_package` option.
|
70
|
+
#
|
71
|
+
# ... then:
|
72
|
+
#
|
73
|
+
# ruby_type_for(".foo.bar.example_message") => "ExampleMessage"
|
74
|
+
# ruby_type_for(".foo.bar.ExampleMessage.NestedMessage") => "ExampleMessage::NestedMessage"
|
75
|
+
# ruby_type_for(".google.protobuf.Empty") => "::Google::Protobuf::Empty"
|
76
|
+
# ruby_type_for(".other.file.baz.example_message") => "::Baz::ExampleMessage"
|
77
|
+
# ruby_type_for(".third.file.example_message") => "::Third::File::ExampleMessage"
|
78
|
+
#
|
79
|
+
# @param message_type [String]
|
80
|
+
# @return [String]
|
81
|
+
def ruby_type_for(message_type)
|
82
|
+
ruby_type = ruby_type_map[message_type]
|
83
|
+
|
84
|
+
# For types in the same module, remove module and trailing "::"
|
85
|
+
ruby_type = ruby_type.delete_prefix(ruby_module + "::") unless ruby_module.empty?
|
86
|
+
|
87
|
+
ruby_type
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
# Converts either a package string like ".some.example.api" or a namespaced
|
93
|
+
# message like ".google.protobuf.Empty" to an Array of Strings that can be
|
94
|
+
# used as Ruby constants (when joined with "::").
|
95
|
+
#
|
96
|
+
# ".some.example.api" becomes ["", Some", "Example", "Api"]
|
97
|
+
# ".google.protobuf.Empty" becomes ["", Google", "Protobuf", "Empty"]
|
98
|
+
#
|
99
|
+
# @param package_or_message [String]
|
100
|
+
# @return [Array<String>]
|
101
|
+
def split_to_constants(package_or_message)
|
102
|
+
package_or_message
|
103
|
+
.split(".")
|
104
|
+
.map { |s| s.camel_case }
|
105
|
+
end
|
106
|
+
|
107
|
+
# @return [Hash<String, String>] the type mappings for the proto file (and all
|
108
|
+
# imported proto files), keyed by the the protobuf name (starting with `.` when
|
109
|
+
# package is specified). Values correspond to the fully qualified Ruby
|
110
|
+
# type, respecting the `ruby_package` option of the file if present.
|
111
|
+
#
|
112
|
+
# For example:
|
113
|
+
# ".example_message" => "ExampleMessage"
|
114
|
+
# ".foo.bar.ExampleMessage => "::Foo::Bar::ExampleMessage"
|
115
|
+
# ".foo.bar.ExampleMessage.NestedMessage" => "::Foo::Bar::ExampleMessage::NestedMessage"
|
116
|
+
# ".google.protobuf.Empty" => "Google::Protobuf::Empty"
|
117
|
+
# ".common.bar.baz.other_type" => "::Common::Baz::OtherType"
|
118
|
+
# (when type is imported from a proto file with package = "common.bar.baz"
|
119
|
+
# and `option ruby_package = "Common::Baz";` specified)
|
120
|
+
def ruby_type_map
|
121
|
+
if @ruby_type_map.nil?
|
122
|
+
@ruby_type_map = build_ruby_type_map(self)
|
123
|
+
end
|
124
|
+
|
125
|
+
@ruby_type_map
|
126
|
+
end
|
127
|
+
|
128
|
+
# Loops through the messages in the proto file, and recurses through the messages in
|
129
|
+
# dependent proto files, to construct the ruby type map for all types within the file.
|
130
|
+
#
|
131
|
+
# @see [#ruby_type_map]
|
132
|
+
# @param proto_file [Google::Protobuf::FileDescriptorProto]
|
133
|
+
# @return [Hash<String, String>]
|
134
|
+
def build_ruby_type_map(proto_file)
|
135
|
+
type_map = {}
|
136
|
+
|
137
|
+
proto_file.message_type.each do |message_type|
|
138
|
+
add_message_type(type_map, proto_file, message_type)
|
139
|
+
end
|
140
|
+
|
141
|
+
proto_file.dependency_proto_files.each do |dependency_proto_file|
|
142
|
+
type_map.merge! build_ruby_type_map(dependency_proto_file)
|
143
|
+
end
|
144
|
+
|
145
|
+
type_map
|
146
|
+
end
|
147
|
+
|
148
|
+
# Adds the message type's key and value to the type map, recursively handling nested message
|
149
|
+
# types along the way.
|
150
|
+
#
|
151
|
+
# @param type_map [Hash<String, String>]
|
152
|
+
# @param proto_file [Google::Protobuf::FileDescriptorProto] The proto file containing the message type
|
153
|
+
# @param message_type [Google::Protobuf::DescriptorProto]
|
154
|
+
# @param parent_key [String, nil] In the recursive case, this is the parent message type key so
|
155
|
+
# that the nested child type can be properly namespaced.
|
156
|
+
# @param parent_value [String, nil] In the recursive case, this is the parent message type value
|
157
|
+
# so that the nested type can be properly namespaced.
|
158
|
+
# @return [void]
|
159
|
+
def add_message_type(type_map, proto_file, message_type, parent_key = nil, parent_value = nil)
|
160
|
+
key = type_map_key(proto_file, message_type, parent_key)
|
161
|
+
value = type_map_value(proto_file, message_type, parent_value)
|
162
|
+
|
163
|
+
type_map[key] = value
|
164
|
+
|
165
|
+
# Recurse over nested types, using the current message_type's key and value as the parent values
|
166
|
+
message_type.nested_type.each do |nested_type|
|
167
|
+
add_message_type(type_map, proto_file, nested_type, key, value)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# @param proto_file [Google::Protobuf::FileDescriptorProto] The proto file containing the message type
|
172
|
+
# @param message_type [Google::Protobuf::DescriptorProto]
|
173
|
+
# @param parent_key [String, nil] In the recursive case, this is the parent message type key so
|
174
|
+
# that the nested child type can be properly namespaced.
|
175
|
+
# @return [String]
|
176
|
+
def type_map_key(proto_file, message_type, parent_key)
|
177
|
+
key_prefix = if !parent_key.nil?
|
178
|
+
"#{parent_key}."
|
179
|
+
elsif proto_file.package.to_s.empty?
|
180
|
+
"."
|
181
|
+
else
|
182
|
+
".#{proto_file.package}."
|
183
|
+
end
|
184
|
+
|
185
|
+
"#{key_prefix}#{message_type.name}"
|
186
|
+
end
|
187
|
+
|
188
|
+
# @param proto_file [Google::Protobuf::FileDescriptorProto] The proto file containing the message type
|
189
|
+
# @param message_type [Google::Protobuf::DescriptorProto]
|
190
|
+
# @param parent_value [String, nil] In the recursive case, this is the parent message type value
|
191
|
+
# so that the nested type can be properly namespaced.
|
192
|
+
# @return [String]
|
193
|
+
def type_map_value(proto_file, message_type, parent_value)
|
194
|
+
value_prefix = if !parent_value.nil?
|
195
|
+
"#{parent_value}::"
|
196
|
+
elsif proto_file.ruby_module.empty?
|
197
|
+
""
|
198
|
+
else
|
199
|
+
"#{proto_file.ruby_module}::"
|
200
|
+
end
|
201
|
+
|
202
|
+
"#{value_prefix}#{message_type.name.camel_case}"
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "google/protobuf/descriptor_pb"
|
4
|
+
require "twirp/protoc_plugin/core_ext/string/camel_case"
|
5
|
+
|
6
|
+
class Google::Protobuf::ServiceDescriptorProto
|
7
|
+
def service_class_name
|
8
|
+
# The generated service class name should end in "Service"; A well-named
|
9
|
+
# service may already end with "Service" but we can't guarantee it. Use
|
10
|
+
# class_name_without_service_suffix to #avoid "ServiceService"
|
11
|
+
class_name_without_service_suffix + "Service"
|
12
|
+
end
|
13
|
+
|
14
|
+
def client_class_name
|
15
|
+
class_name_without_service_suffix + "Client"
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def class_name_without_service_suffix
|
21
|
+
name.delete_suffix("Service").camel_case
|
22
|
+
end
|
23
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require "twirp/protoc_plugin/core_ext/file/delete_extension"
|
4
|
+
require "google/protobuf/compiler/plugin_pb"
|
5
|
+
require "twirp/protoc_plugin/compiler_plugin_ext/code_generator_request_ext"
|
6
|
+
require "twirp/protoc_plugin/descriptor_ext/file_descriptor_proto_ext"
|
4
7
|
require_relative "code_generator"
|
5
8
|
|
6
9
|
module Twirp
|
@@ -10,19 +13,23 @@ module Twirp
|
|
10
13
|
class << self
|
11
14
|
# @param input [String] an encoded [Google::Protobuf::Compiler::CodeGeneratorRequest] message
|
12
15
|
# @return [String] an encoded [Google::Protobuf::Compiler::CodeGeneratorResponse] message
|
13
|
-
# @raise [
|
16
|
+
# @raise [ArgumentError] when a required parameter is missing, a parameter value is invalid, or
|
17
|
+
# an unrecognized parameter is present on the command line
|
14
18
|
def process(input)
|
15
19
|
request = Google::Protobuf::Compiler::CodeGeneratorRequest.decode(input)
|
16
20
|
|
21
|
+
options = extract_options(request.parameter)
|
22
|
+
|
17
23
|
response = Google::Protobuf::Compiler::CodeGeneratorResponse.new
|
18
24
|
response.supported_features = Google::Protobuf::Compiler::CodeGeneratorResponse::Feature::FEATURE_PROTO3_OPTIONAL
|
19
25
|
|
20
|
-
request.proto_file.each do |proto_file|
|
26
|
+
request.proto_file.each do |proto_file| # proto_file: <Google::Protobuf::FileDescriptorProto>
|
21
27
|
next unless request.file_to_generate.include?(proto_file.name)
|
28
|
+
next if options[:skip_empty] && !proto_file.has_service?
|
22
29
|
|
23
30
|
file = Google::Protobuf::Compiler::CodeGeneratorResponse::File.new
|
24
|
-
file.name =
|
25
|
-
file.content = CodeGenerator.new(proto_file,
|
31
|
+
file.name = proto_file.twirp_output_filename
|
32
|
+
file.content = CodeGenerator.new(proto_file, proto_file.relative_ruby_protobuf_name, options).generate
|
26
33
|
|
27
34
|
response.file << file
|
28
35
|
end
|
@@ -32,30 +39,49 @@ module Twirp
|
|
32
39
|
|
33
40
|
private
|
34
41
|
|
35
|
-
# @param
|
36
|
-
# e.g. "some
|
37
|
-
#
|
38
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
# @param params [String] the parameters from protoc command line in comma-separated stringified
|
43
|
+
# array format, e.g. "some-flag,key1=value1".
|
44
|
+
#
|
45
|
+
# The only valid parameter is currently the optional "skip-empty" flag.
|
46
|
+
# @return [Hash{Symbol => Boolean, Symbol}]
|
47
|
+
# * :skip_empty [Boolean] indicating whether generation should skip creating a twirp file
|
48
|
+
# for proto files that contain no services. Default false.
|
49
|
+
# * :generate [Symbol] one of: :service, :client, or :both. Default :both.
|
50
|
+
# @raise [ArgumentError] when a required parameter is missing, a parameter value is invalid, or
|
51
|
+
# an unrecognized parameter is present on the command line
|
52
|
+
def extract_options(params)
|
53
|
+
opts = {
|
54
|
+
skip_empty: false,
|
55
|
+
generate: :both
|
56
|
+
}
|
42
57
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
58
|
+
# Process the options passed to the plugin from `protoc`.
|
59
|
+
params.split(",").each do |param|
|
60
|
+
# In the event value contains an =, we want to leave that intact.
|
61
|
+
# Limit the split to just separate the key out.
|
62
|
+
key, value = param.split("=", 2)
|
63
|
+
if key == "skip-empty"
|
64
|
+
unless value.nil? || value.empty?
|
65
|
+
raise ArgumentError, "Unexpected value passed to skip-empty flag: #{value}"
|
66
|
+
end
|
67
|
+
opts[:skip_empty] = true
|
68
|
+
elsif key == "generate"
|
69
|
+
if value.nil? || value.empty?
|
70
|
+
raise ArgumentError, "Unexpected missing value for generate option. Please supply one of: service, client, both."
|
71
|
+
end
|
72
|
+
|
73
|
+
value_as_symbol = value&.to_sym
|
74
|
+
unless %i[service client both].include?(value_as_symbol)
|
75
|
+
raise ArgumentError, "The generate value must be one of: service, client, both. Unexpectedly received: #{value}"
|
76
|
+
end
|
77
|
+
|
78
|
+
opts[:generate] = value_as_symbol
|
79
|
+
else
|
80
|
+
raise ArgumentError, "Invalid option: #{key}"
|
81
|
+
end
|
82
|
+
end
|
50
83
|
|
51
|
-
|
52
|
-
# e.g. "some/example/hello.proto"
|
53
|
-
# @return [String] the file name of the generated ruby protobuf code from protoc,
|
54
|
-
# without any path information, minus the ".rb" extension, e.g. "hello_pb". We
|
55
|
-
# expect the generated twirp file to be in the same directory as the generated
|
56
|
-
# ruby output.
|
57
|
-
def relative_ruby_protobuf(filename)
|
58
|
-
File.basename(filename, File.extname(filename)) + "_pb" # no ".rb" extension
|
84
|
+
opts
|
59
85
|
end
|
60
86
|
end
|
61
87
|
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protoc-gen-twirp_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darron Schall
|
8
8
|
- Daniel Morrison
|
9
9
|
- Chris Gaffney
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-05-
|
13
|
+
date: 2024-05-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: google-protobuf
|
@@ -103,24 +103,23 @@ executables:
|
|
103
103
|
extensions: []
|
104
104
|
extra_rdoc_files: []
|
105
105
|
files:
|
106
|
-
- ".rspec"
|
107
|
-
- ".standard.yml"
|
108
106
|
- CHANGELOG.md
|
109
107
|
- LICENSE
|
110
108
|
- README.md
|
111
|
-
- Rakefile
|
112
|
-
- example/hello_world.proto
|
113
|
-
- example/hello_world_pb.rb
|
114
|
-
- example/hello_world_twirp.rb
|
115
109
|
- exe/protoc-gen-twirp_ruby
|
116
110
|
- lib/google/protobuf/compiler/plugin_pb.rb
|
117
111
|
- lib/google/protobuf/descriptor_pb.rb
|
118
112
|
- lib/twirp/protoc_plugin.rb
|
119
113
|
- lib/twirp/protoc_plugin/code_generator.rb
|
114
|
+
- lib/twirp/protoc_plugin/compiler_plugin_ext/code_generator_request_ext.rb
|
115
|
+
- lib/twirp/protoc_plugin/core_ext/file/delete_extension.rb
|
116
|
+
- lib/twirp/protoc_plugin/core_ext/string/camel_case.rb
|
117
|
+
- lib/twirp/protoc_plugin/core_ext/string/capitalize_first.rb
|
118
|
+
- lib/twirp/protoc_plugin/core_ext/string/snake_case.rb
|
119
|
+
- lib/twirp/protoc_plugin/descriptor_ext/file_descriptor_proto_ext.rb
|
120
|
+
- lib/twirp/protoc_plugin/descriptor_ext/service_descriptor_proto_ext.rb
|
120
121
|
- lib/twirp/protoc_plugin/process.rb
|
121
122
|
- lib/twirp/protoc_plugin/version.rb
|
122
|
-
- proto/google/protobuf/compiler/plugin.proto
|
123
|
-
- proto/google/protobuf/descriptor.proto
|
124
123
|
- sig/twirp/protoc_plugin.rbs
|
125
124
|
homepage: https://github.com/collectiveidea/protoc-gen-twirp_ruby
|
126
125
|
licenses:
|
@@ -130,7 +129,7 @@ metadata:
|
|
130
129
|
source_code_uri: https://github.com/collectiveidea/protoc-gen-twirp_ruby
|
131
130
|
changelog_uri: https://github.com/collectiveidea/protoc-gen-twirp_ruby/blob/main/CHANGELOG.md
|
132
131
|
bug_tracker_uri: https://github.com/collectiveidea/protoc-gen-twirp_ruby/issues
|
133
|
-
post_install_message:
|
132
|
+
post_install_message:
|
134
133
|
rdoc_options: []
|
135
134
|
require_paths:
|
136
135
|
- lib
|
@@ -146,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
145
|
version: '0'
|
147
146
|
requirements: []
|
148
147
|
rubygems_version: 3.5.9
|
149
|
-
signing_key:
|
148
|
+
signing_key:
|
150
149
|
specification_version: 4
|
151
150
|
summary: A Ruby protoc plugin generator for Twirp-Ruby.
|
152
151
|
test_files: []
|
data/.rspec
DELETED
data/.standard.yml
DELETED
data/Rakefile
DELETED
data/example/hello_world.proto
DELETED
data/example/hello_world_pb.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
-
# source: example/hello_world.proto
|
4
|
-
|
5
|
-
require 'google/protobuf'
|
6
|
-
|
7
|
-
|
8
|
-
descriptor_data = "\n\x19\x65xample/hello_world.proto\x12\x13\x65xample.hello_world\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\" \n\rHelloResponse\x12\x0f\n\x07message\x18\x01 \x01(\t2c\n\x11HelloWorldService\x12N\n\x05Hello\x12!.example.hello_world.HelloRequest\x1a\".example.hello_world.HelloResponseb\x06proto3"
|
9
|
-
|
10
|
-
pool = Google::Protobuf::DescriptorPool.generated_pool
|
11
|
-
|
12
|
-
begin
|
13
|
-
pool.add_serialized_file(descriptor_data)
|
14
|
-
rescue TypeError
|
15
|
-
# Compatibility code: will be removed in the next major version.
|
16
|
-
require 'google/protobuf/descriptor_pb'
|
17
|
-
parsed = Google::Protobuf::FileDescriptorProto.decode(descriptor_data)
|
18
|
-
parsed.clear_dependency
|
19
|
-
serialized = parsed.class.encode(parsed)
|
20
|
-
file = pool.add_serialized_file(serialized)
|
21
|
-
warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
|
22
|
-
imports = [
|
23
|
-
]
|
24
|
-
imports.each do |type_name, expected_filename|
|
25
|
-
import_file = pool.lookup(type_name).file_descriptor
|
26
|
-
if import_file.name != expected_filename
|
27
|
-
warn "- #{file.name} imports #{expected_filename}, but that import was loaded as #{import_file.name}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
warn "Each proto file must use a consistent fully-qualified name."
|
31
|
-
warn "This will become an error in the next major version."
|
32
|
-
end
|
33
|
-
|
34
|
-
module Example
|
35
|
-
module HelloWorld
|
36
|
-
HelloRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("example.hello_world.HelloRequest").msgclass
|
37
|
-
HelloResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("example.hello_world.HelloResponse").msgclass
|
38
|
-
end
|
39
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Generated by the protoc-gen-twirp_ruby gem v1.0.0. DO NOT EDIT!
|
4
|
-
# source: example/hello_world.proto
|
5
|
-
|
6
|
-
require "twirp"
|
7
|
-
require_relative "hello_world_pb"
|
8
|
-
|
9
|
-
module Example
|
10
|
-
module HelloWorld
|
11
|
-
class HelloWorldService < ::Twirp::Service
|
12
|
-
package "example.hello_world"
|
13
|
-
service "HelloWorldService"
|
14
|
-
rpc :Hello, HelloRequest, HelloResponse, ruby_method: :hello
|
15
|
-
end
|
16
|
-
|
17
|
-
class HelloWorldClient < ::Twirp::Client
|
18
|
-
client_for HelloWorldService
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|