protobuf_descriptor 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.document +3 -0
  3. data/.gitignore +21 -0
  4. data/.rspec +1 -0
  5. data/.yardopts +1 -0
  6. data/ChangeLog.rdoc +4 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +57 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.rdoc +51 -0
  11. data/Rakefile +46 -0
  12. data/lib/protobuf_descriptor/enum_descriptor.rb +35 -0
  13. data/lib/protobuf_descriptor/file_descriptor.rb +130 -0
  14. data/lib/protobuf_descriptor/has_parent.rb +19 -0
  15. data/lib/protobuf_descriptor/message_descriptor.rb +167 -0
  16. data/lib/protobuf_descriptor/named_child.rb +21 -0
  17. data/lib/protobuf_descriptor/named_collection.rb +45 -0
  18. data/lib/protobuf_descriptor/service_descriptor.rb +94 -0
  19. data/lib/protobuf_descriptor/version.rb +4 -0
  20. data/lib/protobuf_descriptor.rb +95 -0
  21. data/protobuf_descriptor.gemspec +27 -0
  22. data/spec/enum_descriptor_spec.rb +45 -0
  23. data/spec/field_descriptor_spec.rb +24 -0
  24. data/spec/file_descriptor_spec.rb +52 -0
  25. data/spec/message_descriptor_spec.rb +43 -0
  26. data/spec/method_descriptor_spec.rb +17 -0
  27. data/spec/protobuf_descriptor_spec.rb +75 -0
  28. data/spec/protoc_generator_spec.rb +20 -0
  29. data/spec/protos/generator_test/aaa.proto +13 -0
  30. data/spec/protos/generator_test/foo/aab.proto +5 -0
  31. data/spec/protos/generator_test/java_package.proto +7 -0
  32. data/spec/protos/generator_test/outer_class_name.proto +7 -0
  33. data/spec/protos/service_rpc_test/wearabouts_api/multiple_files.proto +12 -0
  34. data/spec/protos/service_rpc_test/wearabouts_api/outer_class_proto.proto +12 -0
  35. data/spec/protos/service_rpc_test/wearabouts_api/user.proto +36 -0
  36. data/spec/protos/service_rpc_test/wearabouts_pb.proto +35 -0
  37. data/spec/protos/single_file_test/single_file.proto +169 -0
  38. data/spec/service_descriptor_spec.rb +13 -0
  39. data/spec/spec_helper.rb +145 -0
  40. data/spec/wire_generator_spec.rb +23 -0
  41. 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,4 @@
1
+ class ProtobufDescriptor
2
+ # protobuf_descriptor version
3
+ VERSION = "0.1.0"
4
+ 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,13 @@
1
+ package aaa;
2
+
3
+ enum Eaa {
4
+ FOO = 1;
5
+ }
6
+
7
+ message Maa {
8
+ message MaaNested {
9
+ optional int32 i = 2;
10
+ }
11
+
12
+ optional MaaNested maa_nested = 1;
13
+ }
@@ -0,0 +1,5 @@
1
+ package aa_package;
2
+
3
+ enum Eab {
4
+ FOO = 1;
5
+ }
@@ -0,0 +1,7 @@
1
+ package aaa;
2
+
3
+ option java_package = "net.porkbuns.customPackage";
4
+
5
+ enum Ead {
6
+ EAD = 2;
7
+ }
@@ -0,0 +1,7 @@
1
+ package aaa;
2
+
3
+ option java_outer_classname = "CustomOuterClassName";
4
+
5
+ enum Eac {
6
+ FOO2 = 1;
7
+ }
@@ -0,0 +1,12 @@
1
+ package WearaboutsApi.MultipleFiles;
2
+
3
+ option java_package = "us.wearabouts.chatabout.multiple";
4
+ option java_multiple_files = true;
5
+
6
+ message Icon {
7
+ required int32 id = 1;
8
+ }
9
+
10
+ enum IconEnum {
11
+ FOO = 1;
12
+ }
@@ -0,0 +1,12 @@
1
+ package WearaboutsApi.OuterClassProto;
2
+
3
+ option java_package = "us.wearabouts.chatabout.outer";
4
+ option java_outer_classname = "OuterClassName";
5
+
6
+ message Icon {
7
+ required int32 id = 1;
8
+ }
9
+
10
+ enum IconEnum {
11
+ FOO = 1;
12
+ }
@@ -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
+ }