grpc_reflection 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f937bab3c745048c769fb0d42f9904f9aca01117f516558727816543ac1fbe7
4
- data.tar.gz: e6891c576a960a263e8866ac0b32e3b3d5d9226d5828bb20647e0a757e43472d
3
+ metadata.gz: 3b17804fde58e327e1e11735e929252ea6b0d39b27f0c6422ee5641c37f251fb
4
+ data.tar.gz: 845fc82d9ed3149fb45c31ef8307a5da43240e14b7615e43d00748f5ba1ac008
5
5
  SHA512:
6
- metadata.gz: 1a4f0d7e0451241e7f9a598ca7f24cf4c48b8cd9059296ec507fbb4d48b3d15428a1855a507b9d64efe186bc7d26d2346e437e45422c76ca0dca9793490d7e86
7
- data.tar.gz: 680704101fec7d2db86034a9c275c6ecf5eb9184aeb97a40462e03aaa393d556e3724c4e31a5f983cd9ce4d6baa169c6a15517f1e5810dec4de017dcf0857f81
6
+ metadata.gz: e91d01d52dad1cfccbcdf331ea1996d90ee546e3f92ad1dd44863c89c4aca742565d6d67b5ff7a71d93d9d48cc5346cdf258c841b49e8f54feb8e13092b262bd
7
+ data.tar.gz: 96d03f3dec08b28b217111bb6f1017f7423d69eb9fc9785551ee16f953cfa8c589df797b3fbcf7f7aa276b63917c5ea5a537943b4de780d7ce6e8b0bfcd815f2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.4.0
2
+
3
+ * Support `file_containing_extension` request #14
4
+ * Support message name requests #12
5
+
1
6
  ## 0.3.0
2
7
 
3
8
  * Support `file_by_filename` #9
data/README.md CHANGED
@@ -8,7 +8,7 @@ This gem aims to provide GRPC Server Reflection Protocol for Ruby. The main purp
8
8
  **Caution**
9
9
 
10
10
  * This gem only supports files that generated by the latest `protoc`.
11
- * This gem doesn't support all GRPC Server Reflection Protocol features. Currently, only supports requests by `file_containing_symbol` and `list_services`.
11
+ * This gem doesn't support all GRPC Server Reflection Protocol features.
12
12
 
13
13
  ## Installation
14
14
 
data/Rakefile CHANGED
@@ -29,4 +29,20 @@ task :update_code_generated_by_protoc do
29
29
  File.write(service_file, File.read(service_file).gsub(/require 'reflection_pb'/, "require_relative 'reflection_pb'"))
30
30
  end
31
31
 
32
+ desc "Compile proto files for test"
33
+ task :compile_test_protos do
34
+ test_protos_dir = "test/protos"
35
+ proto_files = Dir.glob("#{test_protos_dir}/*.proto")
36
+
37
+ if proto_files.empty?
38
+ puts "No proto files found in #{test_protos_dir}"
39
+ exit 1
40
+ end
41
+
42
+ proto_files.each do |proto_file|
43
+ puts " - #{proto_file}"
44
+ system("bundle exec grpc_tools_ruby_protoc --ruby_out=. --grpc_out=. #{proto_file}", exception: true)
45
+ end
46
+ end
47
+
32
48
  task default: :test
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "json"
4
+ require "set"
4
5
  require "google/protobuf/descriptor_pb"
5
6
 
6
7
  module GrpcReflection
7
8
  class FileDescriptorDecorator
8
- attr_reader :service_and_method_names, :serialized_file, :filename, :dependency
9
+ attr_reader :dataset, :serialized_file, :filename, :dependency
9
10
 
10
11
  def initialize(file_descriptor_proto)
11
12
  @file_descriptor_proto = file_descriptor_proto
@@ -13,19 +14,27 @@ module GrpcReflection
13
14
  @filename = @file_descriptor_proto.name
14
15
 
15
16
  @dependency = @file_descriptor_proto.dependency || []
16
- @service_and_method_names = {}
17
+ @dataset = Set.new
17
18
 
18
- set_service_and_method_names
19
+ set_dataset
19
20
  end
20
21
 
21
- def set_service_and_method_names
22
+ private
23
+
24
+ def set_dataset
22
25
  @file_descriptor_proto.service.each do |s|
23
26
  converted_service = JSON.parse(s.to_json)
24
- @service_and_method_names[@file_descriptor_proto.package + "." + converted_service["name"]] = true
27
+ @dataset.add(@file_descriptor_proto.package + "." + converted_service["name"])
25
28
  converted_service["method"].each do |m|
26
- @service_and_method_names[@file_descriptor_proto.package + "." + converted_service["name"] + "." + m["name"]] = true
29
+ @dataset.add(@file_descriptor_proto.package + "." + converted_service["name"] + "." + m["name"])
30
+ @dataset.add(m["inputType"][1..])
31
+ @dataset.add(m["outputType"][1..])
27
32
  end
28
33
  end
34
+
35
+ @file_descriptor_proto.extension.each do |s|
36
+ @dataset.add(@file_descriptor_proto.package + "." + s.name)
37
+ end
29
38
  end
30
39
  end
31
40
  end
@@ -37,21 +37,23 @@ module GrpcReflection
37
37
  private
38
38
 
39
39
  def find_file_descriptor(name)
40
- file_descriptor = @@file_descriptor_decorators.detect { |f| f.service_and_method_names[name] }
40
+ file_descriptor = @@file_descriptor_decorators.detect { |f| f.dataset.include?(name) }
41
41
  return file_descriptor if file_descriptor
42
42
 
43
43
  search_name = name
44
44
  file_descriptor_proto = nil
45
45
  while pos = search_name.rindex(".")
46
- file_descriptor_proto = Google::Protobuf::DescriptorPool.generated_pool.lookup(search_name)&.file_descriptor&.to_proto
47
- break unless file_descriptor_proto.nil?
46
+ descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(search_name)
48
47
  search_name = search_name.slice(0..(pos - 1))
48
+ next if descriptor.nil? || !descriptor.respond_to?(:file_descriptor)
49
+ file_descriptor_proto = descriptor.file_descriptor&.to_proto
50
+ break unless file_descriptor_proto.nil?
49
51
  end
50
52
 
51
53
  return nil if file_descriptor_proto.nil?
52
54
 
53
55
  add(file_descriptor_proto)
54
- @@file_descriptor_decorators.detect { |f| f.service_and_method_names[name] }
56
+ @@file_descriptor_decorators.detect { |f| f.dataset.include?(name) }
55
57
  end
56
58
  end
57
59
  end
@@ -5,7 +5,6 @@ module GrpcReflection
5
5
  request = req.first
6
6
 
7
7
  res = proto_module::ServerReflectionResponse.new
8
- # TODO: implement another responses
9
8
  if request.list_services.size != 0
10
9
  res.list_services_response = proto_module::ListServiceResponse.new(service: list_services_response(proto_module))
11
10
  elsif !request.file_containing_symbol.empty?
@@ -14,6 +13,19 @@ module GrpcReflection
14
13
  elsif !request.file_by_filename.empty?
15
14
  proto = Google::Protobuf::DescriptorPool.generated_pool.lookup(request.file_by_filename)&.to_proto
16
15
  res.file_descriptor_response = proto_module::FileDescriptorResponse.new(file_descriptor_proto: [Google::Protobuf::FileDescriptorProto.encode(proto)])
16
+ elsif !request.file_containing_extension.nil? && !request.file_containing_extension.containing_type.empty?
17
+ descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(request.file_containing_extension.containing_type)
18
+ if descriptor.is_a?(Google::Protobuf::FieldDescriptor) && descriptor.number == request.file_containing_extension.extension_number
19
+ result = GrpcReflection::FileDescriptorManager.find(request.file_containing_extension.containing_type)
20
+ res.file_descriptor_response = proto_module::FileDescriptorResponse.new(file_descriptor_proto: result)
21
+ else
22
+ res.file_descriptor_response = proto_module::FileDescriptorResponse.new(file_descriptor_proto: [])
23
+ end
24
+ elsif !request.all_extension_numbers_of_type.empty?
25
+ res.error_response = proto_module::ErrorResponse.new(
26
+ error_code: GRPC::Core::StatusCodes::UNIMPLEMENTED,
27
+ error_message: "all_extension_numbers_of_type is not implemented"
28
+ )
17
29
  end
18
30
  [res].enum_for(:each)
19
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcReflection
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc_reflection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuji Yaginuma