protobuf_descriptor 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +3 -0
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.yardopts +1 -0
- data/ChangeLog.rdoc +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +57 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +51 -0
- data/Rakefile +46 -0
- data/lib/protobuf_descriptor/enum_descriptor.rb +35 -0
- data/lib/protobuf_descriptor/file_descriptor.rb +130 -0
- data/lib/protobuf_descriptor/has_parent.rb +19 -0
- data/lib/protobuf_descriptor/message_descriptor.rb +167 -0
- data/lib/protobuf_descriptor/named_child.rb +21 -0
- data/lib/protobuf_descriptor/named_collection.rb +45 -0
- data/lib/protobuf_descriptor/service_descriptor.rb +94 -0
- data/lib/protobuf_descriptor/version.rb +4 -0
- data/lib/protobuf_descriptor.rb +95 -0
- data/protobuf_descriptor.gemspec +27 -0
- data/spec/enum_descriptor_spec.rb +45 -0
- data/spec/field_descriptor_spec.rb +24 -0
- data/spec/file_descriptor_spec.rb +52 -0
- data/spec/message_descriptor_spec.rb +43 -0
- data/spec/method_descriptor_spec.rb +17 -0
- data/spec/protobuf_descriptor_spec.rb +75 -0
- data/spec/protoc_generator_spec.rb +20 -0
- data/spec/protos/generator_test/aaa.proto +13 -0
- data/spec/protos/generator_test/foo/aab.proto +5 -0
- data/spec/protos/generator_test/java_package.proto +7 -0
- data/spec/protos/generator_test/outer_class_name.proto +7 -0
- data/spec/protos/service_rpc_test/wearabouts_api/multiple_files.proto +12 -0
- data/spec/protos/service_rpc_test/wearabouts_api/outer_class_proto.proto +12 -0
- data/spec/protos/service_rpc_test/wearabouts_api/user.proto +36 -0
- data/spec/protos/service_rpc_test/wearabouts_pb.proto +35 -0
- data/spec/protos/single_file_test/single_file.proto +169 -0
- data/spec/service_descriptor_spec.rb +13 -0
- data/spec/spec_helper.rb +145 -0
- data/spec/wire_generator_spec.rb +23 -0
- metadata +186 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
require "protobuf_descriptor/named_collection"
|
2
|
+
require "protobuf_descriptor/has_parent"
|
3
|
+
|
4
|
+
require "active_support"
|
5
|
+
require "active_support/core_ext/module/delegation"
|
6
|
+
|
7
|
+
class ProtobufDescriptor
|
8
|
+
# Describes a service.
|
9
|
+
#
|
10
|
+
# See ServiceDescriptorProto[https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.proto#188]
|
11
|
+
class ServiceDescriptor
|
12
|
+
# Describes a method of a service.
|
13
|
+
#
|
14
|
+
# See MethodDescriptorProto[https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.proto#196]
|
15
|
+
class MethodDescriptor
|
16
|
+
# The parent ServiceDescriptor[../ServiceDescriptor.html]
|
17
|
+
attr_reader :parent
|
18
|
+
|
19
|
+
# The +MethodDescriptorProto+ this +MethodDescriptor+ is wrapping
|
20
|
+
attr_reader :method_descriptor_proto
|
21
|
+
|
22
|
+
def initialize(parent, method_descriptor_proto)
|
23
|
+
@parent = parent
|
24
|
+
@method_descriptor_proto = method_descriptor_proto
|
25
|
+
end
|
26
|
+
|
27
|
+
include ProtobufDescriptor::HasParent
|
28
|
+
|
29
|
+
# The name of the service method
|
30
|
+
def name
|
31
|
+
method_descriptor_proto.name
|
32
|
+
end
|
33
|
+
|
34
|
+
# The +MethodOptions+ for the service method
|
35
|
+
def options
|
36
|
+
method_descriptor_proto.options
|
37
|
+
end
|
38
|
+
|
39
|
+
# Input type name for the service method. This is resolved in the same way
|
40
|
+
# as FieldDescriptorProto.type_name, but must refer to a message type.
|
41
|
+
def input_type_name
|
42
|
+
method_descriptor_proto.input_type
|
43
|
+
end
|
44
|
+
|
45
|
+
# Output type name for the service method. This is resolved in the same way
|
46
|
+
# as FieldDescriptorProto.type_name, but must refer to a message type.
|
47
|
+
def output_type_name
|
48
|
+
method_descriptor_proto.output_type
|
49
|
+
end
|
50
|
+
|
51
|
+
# Resolves the method's +input_type_name+, returning the
|
52
|
+
# MessageDescriptor[link:MessageDescriptor.html] that this method
|
53
|
+
# receives.
|
54
|
+
def resolve_input_type
|
55
|
+
protobuf_descriptor.resolve_type_name(input_type_name, file_descriptor)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Resolves the method's +output_type_name+, returning the
|
59
|
+
# MessageDescriptor[link:MessageDescriptor.html] that this method
|
60
|
+
# returns.
|
61
|
+
def resolve_output_type
|
62
|
+
protobuf_descriptor.resolve_type_name(output_type_name, file_descriptor)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# The parent FileDescriptor[FileDescriptor.html]
|
67
|
+
attr_reader :parent
|
68
|
+
|
69
|
+
# The +ServiceDescriptorProto+ this +ServiceDescriptor+ is wrapping
|
70
|
+
attr_reader :service_descriptor_proto
|
71
|
+
|
72
|
+
# Set of methods contained within this service, as a NamedCollection of
|
73
|
+
# MethodDescriptor[link:ServiceDescriptor/MethodDescriptor.html]
|
74
|
+
attr_reader :method
|
75
|
+
|
76
|
+
def initialize(parent, service_descriptor_proto)
|
77
|
+
@parent = parent
|
78
|
+
@service_descriptor_proto = service_descriptor_proto
|
79
|
+
@method = ProtobufDescriptor::NamedCollection.new(
|
80
|
+
service_descriptor_proto.method.map { |m|
|
81
|
+
ProtobufDescriptor::ServiceDescriptor::MethodDescriptor.new(self, m)
|
82
|
+
})
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
# The name of the service
|
87
|
+
def name; service_descriptor_proto.name; end
|
88
|
+
|
89
|
+
# The +ServiceOptions+ for this service.
|
90
|
+
def options; service_descriptor_proto.options; end
|
91
|
+
|
92
|
+
alias_method :methods, :method
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "protobuf_descriptor/version"
|
2
|
+
require "protobuf_descriptor/file_descriptor"
|
3
|
+
require "protobuf_descriptor/message_descriptor"
|
4
|
+
require "protobuf_descriptor/named_collection"
|
5
|
+
|
6
|
+
require "stringio"
|
7
|
+
require "protobuf"
|
8
|
+
require "protobuf/descriptors/google/protobuf/descriptor.pb.rb"
|
9
|
+
|
10
|
+
# A wrapper for the
|
11
|
+
# {+FileDescriptorSet+}[https://code.google.com/p/protobuf/source/browse/trunk/src/google/protobuf/descriptor.proto#49]
|
12
|
+
# proto. This acts as the root from which name resolution occurs.
|
13
|
+
class ProtobufDescriptor
|
14
|
+
# Decode a ProtobufDescriptor from bytes
|
15
|
+
#
|
16
|
+
# ProtobufDescriptor.decode(File.read("descriptor.desc"))
|
17
|
+
def self.decode(bytes)
|
18
|
+
return self.decode_from(::StringIO.new(bytes))
|
19
|
+
end
|
20
|
+
|
21
|
+
# Decode a ProtobufDescriptor from a readable stream
|
22
|
+
#
|
23
|
+
# ProtobufDescriptor.decode_from(File.open("descriptor.desc"))
|
24
|
+
def self.decode_from(stream)
|
25
|
+
return self.new(stream)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Loads a ProtobufDescriptor from a file
|
29
|
+
#
|
30
|
+
# ProtobufDescriptor.load("descriptor.desc")
|
31
|
+
def self.load(path)
|
32
|
+
return self.decode_from(File.open(path))
|
33
|
+
end
|
34
|
+
|
35
|
+
# Raw FileDescriptorSet protocol buffer
|
36
|
+
attr_reader :descriptor_set
|
37
|
+
# Set of .proto files that are contained within the descriptor set, as a NamedCollection of FileDescriptors[link:ProtobufDescriptor/FileDescriptor.html]
|
38
|
+
attr_reader :file
|
39
|
+
|
40
|
+
def initialize(stream)
|
41
|
+
@descriptor_set = Google::Protobuf::FileDescriptorSet.new.decode_from(stream)
|
42
|
+
@file = ProtobufDescriptor::NamedCollection.new(@descriptor_set.file.map { |f| ProtobufDescriptor::FileDescriptor.new(self, f) }) do |name, member|
|
43
|
+
member.name == name || member.name == "#{name}.proto"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
alias_method :files, :file
|
48
|
+
|
49
|
+
# Returns all the named descendants of this descriptor set, basically every
|
50
|
+
# defined MessageDescriptor[link:ProtobufDescriptor/MessageDescriptor.html],
|
51
|
+
# EnumDescriptor[link:ProtobufDescriptor/EnumDescriptor.html], and
|
52
|
+
# ServiceDescriptor[link:ProtobufDescriptor/ServiceDescriptor] referenced
|
53
|
+
# in this set of proto files.
|
54
|
+
def all_descendants
|
55
|
+
seeds = files.to_a.dup
|
56
|
+
children = Set.new
|
57
|
+
while !seeds.empty?
|
58
|
+
seeds.pop.children.each do |child|
|
59
|
+
children << child
|
60
|
+
|
61
|
+
seeds << child if child.respond_to?(:children)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
children
|
65
|
+
end
|
66
|
+
|
67
|
+
# Finds the descriptor corresponding to a given type name. +type_name+ can
|
68
|
+
# either be a fully qualified name (with a leading "."), or a relative name,
|
69
|
+
# in which case +relative_to+ must either be a descriptor or a fully qualified
|
70
|
+
# name that the relative name is resolved relative to.
|
71
|
+
def resolve_type_name(type_name, relative_to=nil)
|
72
|
+
if type_name.start_with?('.')
|
73
|
+
all_descendants.find { |descendant|
|
74
|
+
descendant.fully_qualified_name == type_name
|
75
|
+
}
|
76
|
+
else
|
77
|
+
raise "Must provide a relative path!" unless relative_to
|
78
|
+
|
79
|
+
relative_to = relative_to.fully_qualified_name if relative_to.respond_to? :fully_qualified_name
|
80
|
+
parents = relative_to.split('.')
|
81
|
+
|
82
|
+
# The first element is the empty string, which is the root.
|
83
|
+
while parents.size > 1
|
84
|
+
type = resolve_type_name("#{parents.join('.')}.#{type_name}")
|
85
|
+
return type if type
|
86
|
+
parents.pop
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Shorthand for accessing files
|
92
|
+
def [](index)
|
93
|
+
return files[index]
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../lib/protobuf_descriptor/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "protobuf_descriptor"
|
7
|
+
gem.version = ProtobufDescriptor::VERSION
|
8
|
+
gem.summary = %q{Protocol Buffer file descriptor parser}
|
9
|
+
gem.description = %q{Wraps the protobuf FileDescriptorSet messages with happy features like type name resolution and the like.}
|
10
|
+
gem.license = "MIT"
|
11
|
+
gem.authors = ["Hsiu-Fan Wang"]
|
12
|
+
gem.email = "hfwang@porkbuns.net"
|
13
|
+
gem.homepage = "https://github.com/hfwang/protobuf_descriptor"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ['lib']
|
19
|
+
|
20
|
+
gem.add_dependency 'protobuf', '~> 3.0.0'
|
21
|
+
gem.add_dependency 'active_support', '>= 3.0'
|
22
|
+
|
23
|
+
gem.add_development_dependency 'pry', '~> 0.9.12.6'
|
24
|
+
gem.add_development_dependency 'rspec', '~> 2.4'
|
25
|
+
gem.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
26
|
+
gem.add_development_dependency 'yard', '~> 0.8'
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor::EnumDescriptor do
|
4
|
+
describe "#fully_qualified_name" do
|
5
|
+
it "handles top-level enums" do
|
6
|
+
with_descriptor("single_file_test") do |descriptor|
|
7
|
+
expect(descriptor[:single_file].enum_types[:UnnestedEnum].fully_qualified_name).to eq(".porkbuns.UnnestedEnum")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "handles nested enums" do
|
12
|
+
with_descriptor("single_file_test") do |descriptor|
|
13
|
+
expect(descriptor[:single_file].message_types[:FieldOptions].enum_types[:CType].fully_qualified_name).to eq(".porkbuns.FieldOptions.CType")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#fully_qualified_java_name" do
|
19
|
+
it "handles top-level enums" do
|
20
|
+
with_descriptor("single_file_test") do |descriptor|
|
21
|
+
expect(descriptor[:single_file].enum_types[:UnnestedEnum].fully_qualified_java_name).to eq("porkbuns.SingleFile.UnnestedEnum")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "handles nested enums" do
|
26
|
+
with_descriptor("single_file_test") do |descriptor|
|
27
|
+
expect(descriptor[:single_file].message_types[:FieldOptions].enum_types[:CType].fully_qualified_java_name).to eq("porkbuns.SingleFile.FieldOptions.CType")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "handles java_outer_classname option" do
|
32
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
33
|
+
name = descriptor["wearabouts_api/outer_class_proto"].enum_types[:IconEnum].fully_qualified_java_name
|
34
|
+
expect(name).to eq("us.wearabouts.chatabout.outer.OuterClassName.IconEnum")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "handles java_multiple_files option" do
|
39
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
40
|
+
name = descriptor["wearabouts_api/multiple_files"].enum_types[:IconEnum].fully_qualified_java_name
|
41
|
+
expect(name).to eq("us.wearabouts.chatabout.multiple.IconEnum")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor::MessageDescriptor::FieldDescriptor do
|
4
|
+
describe "#type_name" do
|
5
|
+
it "is sane" do
|
6
|
+
with_descriptor("single_file_test") do |descriptor|
|
7
|
+
message_descriptor = descriptor[:single_file].messages[:FieldOptions]
|
8
|
+
field_descriptor = message_descriptor.fields[:ctype]
|
9
|
+
|
10
|
+
expect(field_descriptor.field_type).to eq(Google::Protobuf::FieldDescriptorProto::Type::TYPE_ENUM)
|
11
|
+
expect(field_descriptor.type_name).to eq(".porkbuns.FieldOptions.CType")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "#resolve_type resolves a field's type name" do
|
17
|
+
with_descriptor("single_file_test") do |descriptor|
|
18
|
+
message_descriptor = descriptor[:single_file].messages[:FieldOptions]
|
19
|
+
field_descriptor = message_descriptor.fields[:ctype]
|
20
|
+
|
21
|
+
expect(field_descriptor.resolve_type).to eq(message_descriptor.enums[:CType])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor::FileDescriptor do
|
4
|
+
describe "#files" do
|
5
|
+
it "has the right size" do
|
6
|
+
with_descriptor("single_file_test") do |descriptor|
|
7
|
+
expect(descriptor.files).to have(1).items
|
8
|
+
expect(descriptor.files.size).to eq(1)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#[]" do
|
13
|
+
it "handles numeric index" do
|
14
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
15
|
+
expect(descriptor.files[0]).to eq(descriptor.files.first)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "handles lookup by basename" do
|
20
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
21
|
+
expect(descriptor.files["wearabouts_api/user"].name).to eq("wearabouts_api/user.proto")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "handles lookup by filename" do
|
26
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
27
|
+
expect(descriptor.files["wearabouts_api/user.proto"].name).to eq("wearabouts_api/user.proto")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns nil if not found" do
|
32
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
33
|
+
expect(descriptor.files["wearabouts_api/userblah"]).to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#java_package" do
|
40
|
+
it "handles java_package option" do
|
41
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
42
|
+
expect(descriptor.files[:wearabouts_pb].java_package).to eq("us.wearabouts.chatabout.proto")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it "defaults to package if no java_package specified" do
|
47
|
+
with_descriptor("single_file_test") do |descriptor|
|
48
|
+
expect(descriptor.files[:single_file].java_package).to eq("porkbuns")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor::MessageDescriptor do
|
4
|
+
describe "#fully_qualified_name" do
|
5
|
+
it "handles top-level messages" do
|
6
|
+
with_descriptor("single_file_test") do |descriptor|
|
7
|
+
expect(descriptor[:single_file].message_types[:FieldOptions].fully_qualified_name).to eq(".porkbuns.FieldOptions")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "handles nested messages" do
|
12
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
13
|
+
expect(descriptor[:wearabouts_pb].message_types[:UserProto].nested_type[:UserDetails].fully_qualified_name).to eq(".WearaboutsPb.UserProto.UserDetails")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#fully_qualified_java_name" do
|
19
|
+
it "handles top-level messages" do
|
20
|
+
with_descriptor("single_file_test") do |descriptor|
|
21
|
+
expect(descriptor[:single_file].message_types[:FieldOptions].fully_qualified_java_name).to eq("porkbuns.SingleFile.FieldOptions")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "handles nested messages" do
|
26
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
27
|
+
expect(descriptor[:wearabouts_pb].message_types[:UserProto].nested_type[:UserDetails].fully_qualified_java_name).to eq("us.wearabouts.chatabout.proto.WearaboutsPb.UserProto.UserDetails")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "handles java_outer_classname option" do
|
32
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
33
|
+
expect(descriptor["wearabouts_api/outer_class_proto"].message_types[:Icon].fully_qualified_java_name).to eq("us.wearabouts.chatabout.outer.OuterClassName.Icon")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "handles java_multiple_files option" do
|
38
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
39
|
+
expect(descriptor["wearabouts_api/multiple_files"].message_types[:Icon].fully_qualified_java_name).to eq("us.wearabouts.chatabout.multiple.Icon")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor::ServiceDescriptor::MethodDescriptor do
|
4
|
+
it "is sane" do
|
5
|
+
with_descriptor("service_rpc_test") do |descriptor|
|
6
|
+
file_descriptor = descriptor["wearabouts_api/user"]
|
7
|
+
service_descriptor = file_descriptor.services[:UserService]
|
8
|
+
method_descriptor = service_descriptor.methods[:Authenticate]
|
9
|
+
|
10
|
+
expect(method_descriptor.input_type_name).to eq(".WearaboutsApi.User.AuthenticateRequest")
|
11
|
+
expect(method_descriptor.output_type_name).to eq(".WearaboutsApi.User.AuthenticateResponse")
|
12
|
+
|
13
|
+
expect(method_descriptor.resolve_input_type).to eq(file_descriptor.messages[:AuthenticateRequest])
|
14
|
+
expect(method_descriptor.resolve_output_type).to eq(file_descriptor.messages[:AuthenticateResponse])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ProtobufDescriptor do
|
4
|
+
it "should have a VERSION constant" do
|
5
|
+
expect(ProtobufDescriptor::VERSION).not_to be_empty
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#resolve_type_name" do
|
9
|
+
it "should handle fully qualified names" do
|
10
|
+
with_descriptor("single_file_test") do |descriptor|
|
11
|
+
expect(descriptor.resolve_type_name(".porkbuns.UnnestedEnum")).to eq(descriptor[:single_file].enums[:UnnestedEnum])
|
12
|
+
expect(descriptor.resolve_type_name(".porkbuns.FieldOptions")).to eq(descriptor[:single_file].messages[:FieldOptions])
|
13
|
+
expect(descriptor.resolve_type_name(".porkbuns.FieldOptions.CType")).to eq(descriptor[:single_file].messages[:FieldOptions].enums[:CType])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should handle relative names" do
|
18
|
+
with_descriptor("single_file_test") do |descriptor|
|
19
|
+
expect(descriptor.resolve_type_name("UnnestedEnum", ".porkbuns")).to eq(descriptor[:single_file].enums[:UnnestedEnum])
|
20
|
+
expect(descriptor.resolve_type_name("FieldOptions", ".porkbuns")).to eq(descriptor[:single_file].messages[:FieldOptions])
|
21
|
+
expect(descriptor.resolve_type_name("CType", ".porkbuns.FieldOptions")).to eq(descriptor[:single_file].messages[:FieldOptions].enums[:CType])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should allow the relative_to argument to be a descriptor object" do
|
26
|
+
with_descriptor("single_file_test") do |descriptor|
|
27
|
+
file_descriptor = descriptor[:single_file]
|
28
|
+
expect(descriptor.resolve_type_name("UnnestedEnum", file_descriptor)).to eq(file_descriptor.enums[:UnnestedEnum])
|
29
|
+
expect(descriptor.resolve_type_name("FieldOptions", file_descriptor)).to eq(file_descriptor.messages[:FieldOptions])
|
30
|
+
expect(descriptor.resolve_type_name("CType", file_descriptor.messages[:FieldOptions])).to eq(file_descriptor.messages[:FieldOptions].enums[:CType])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should backtrack when using relative names" do
|
35
|
+
with_descriptor("single_file_test") do |descriptor|
|
36
|
+
expect(descriptor.resolve_type_name("UnnestedEnum", ".porkbuns.FieldOptions.CType")).to eq(descriptor[:single_file].enums[:UnnestedEnum])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "Deserialization" do
|
42
|
+
describe "#load" do
|
43
|
+
it "should load the file" do
|
44
|
+
with_descriptor_file("single_file_test") do |f|
|
45
|
+
|
46
|
+
descriptor = ProtobufDescriptor.load(f.path)
|
47
|
+
|
48
|
+
expect(descriptor.files).to have(1).item
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#decode_from" do
|
54
|
+
it "should load the file" do
|
55
|
+
with_descriptor_file("single_file_test") do |f|
|
56
|
+
|
57
|
+
descriptor = ProtobufDescriptor.decode_from(f)
|
58
|
+
|
59
|
+
expect(descriptor.files).to have(1).item
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#decode" do
|
65
|
+
it "should load the file" do
|
66
|
+
with_descriptor_file("single_file_test") do |f|
|
67
|
+
|
68
|
+
descriptor = ProtobufDescriptor.decode(f.read)
|
69
|
+
|
70
|
+
expect(descriptor.files).to have(1).item
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "tmpdir"
|
3
|
+
|
4
|
+
describe "ProtocJavaCompiler" do
|
5
|
+
# Compile the contents of the generator_tests proto dir, and then assert
|
6
|
+
# everything is where it should be.
|
7
|
+
it "computes fully-qualified class names correctly" do
|
8
|
+
Dir.mktmpdir do |dir|
|
9
|
+
with_descriptor("generator_test", plugin: "java", plugin_out: dir) do |descriptor|
|
10
|
+
generated_classes = ghetto_parse_java_package(dir)
|
11
|
+
|
12
|
+
children = descriptor.all_descendants
|
13
|
+
|
14
|
+
children.each do |child|
|
15
|
+
expect(child.fully_qualified_java_name).to eq(generated_classes[child.name])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
package WearaboutsApi.User;
|
2
|
+
|
3
|
+
option java_package = "us.wearabouts.chatabout.proto.user";
|
4
|
+
|
5
|
+
import "wearabouts_pb.proto";
|
6
|
+
|
7
|
+
message AuthenticateRequest {
|
8
|
+
optional string email = 1;
|
9
|
+
optional string phone = 2;
|
10
|
+
required string device_id = 3;
|
11
|
+
optional string name = 4;
|
12
|
+
}
|
13
|
+
message AuthenticateResponse {
|
14
|
+
optional WearaboutsPb.UserProto user = 1;
|
15
|
+
optional WearaboutsPb.DeviceLinkProto device_link = 2;
|
16
|
+
optional string auth_token = 3;
|
17
|
+
}
|
18
|
+
|
19
|
+
message MeRequest {}
|
20
|
+
message MeResponse {
|
21
|
+
optional WearaboutsPb.UserProto user = 1;
|
22
|
+
optional WearaboutsPb.DeviceLinkProto device_link = 2;
|
23
|
+
}
|
24
|
+
|
25
|
+
message UpdateNameRequest {
|
26
|
+
required string name = 1;
|
27
|
+
}
|
28
|
+
message UpdateNameResponse {
|
29
|
+
optional WearaboutsPb.UserProto user = 1;
|
30
|
+
}
|
31
|
+
|
32
|
+
service UserService {
|
33
|
+
rpc Authenticate (AuthenticateRequest) returns (AuthenticateResponse);
|
34
|
+
rpc Me (MeRequest) returns (MeResponse);
|
35
|
+
rpc UpdateName (UpdateNameRequest) returns (UpdateNameResponse);
|
36
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
package WearaboutsPb;
|
2
|
+
|
3
|
+
option java_package = "us.wearabouts.chatabout.proto";
|
4
|
+
|
5
|
+
message UserProto {
|
6
|
+
message UserDetails {
|
7
|
+
optional string email = 2;
|
8
|
+
optional string phone = 3;
|
9
|
+
optional string name = 4;
|
10
|
+
}
|
11
|
+
required string id = 1;
|
12
|
+
optional UserDetails user_details = 2;
|
13
|
+
}
|
14
|
+
|
15
|
+
message ConversationProto {
|
16
|
+
required string id = 1;
|
17
|
+
repeated UserProto participants = 2;
|
18
|
+
}
|
19
|
+
|
20
|
+
message PostProto {
|
21
|
+
enum Kind {
|
22
|
+
TEXT = 1;
|
23
|
+
AUDIO = 2;
|
24
|
+
}
|
25
|
+
required string id = 1;
|
26
|
+
|
27
|
+
required Kind kind = 2;
|
28
|
+
optional string text = 100;
|
29
|
+
optional string audio_url = 200;
|
30
|
+
}
|
31
|
+
|
32
|
+
message DeviceLinkProto {
|
33
|
+
required string device_id = 1;
|
34
|
+
optional bool verified = 2;
|
35
|
+
}
|