rbs_protobuf 1.1.0 → 1.2.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 +7 -0
- data/Gemfile.lock +2 -2
- data/README.md +36 -16
- data/bin/setup +0 -9
- data/exe/protoc-gen-rbs +18 -0
- data/lib/rbs_protobuf/rbs_factory.rb +1 -0
- data/lib/rbs_protobuf/translator/base.rb +71 -6
- data/lib/rbs_protobuf/translator/protobuf_gem.rb +103 -9
- data/lib/rbs_protobuf/version.rb +1 -1
- data/rbs_collection.lock.yaml +1 -1
- data/sig/rbs_protobuf/rbs_factory.rbs +1 -1
- data/sig/rbs_protobuf/translator/base.rbs +14 -2
- data/sig/rbs_protobuf/translator/protobuf_gem.rbs +2 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: bcaf6201c92331c28b9fa7d1791711def79ccb4803d81692a220b60d08e640a6
         | 
| 4 | 
            +
              data.tar.gz: 93651dffc7e86d657f5ed5298b3ab43042a7e663fd07a502b25fe968ede6cef2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: '09835d51dd74b278a376dc721bbde2527f6e501596dd5239b29a0da5aa96af69cfc08831e2dafc7b6ac67491ef3e5c35b2ec2dca536fbc66864291b3a2109e6a'
         | 
| 7 | 
            +
              data.tar.gz: 42b4c2d53a767f7b8732f8d4ee7a74d724ba334280cf006326a1ebfcd5f1dc4031d44404d149ee63e8c66f46da5dee2f519eaa6539d7789fb8b9b5e5a9dfb863
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,12 @@ | |
| 1 1 | 
             
            # CHANGELOG
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 1.2.0 (2023-09-06)
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Add `RBS_PROTOBUF_CONCAT_LEVEL` option ([#38](https://github.com/square/rbs_protobuf/pull/38))
         | 
| 6 | 
            +
            * Generate rpc method types and interfaces ([#37](https://github.com/square/rbs_protobuf/pull/37))
         | 
| 7 | 
            +
            * Generate `record` type of each proto message ([#36](https://github.com/square/rbs_protobuf/pull/36))
         | 
| 8 | 
            +
            * Add filter ([#34](https://github.com/square/rbs_protobuf/pull/34))
         | 
| 9 | 
            +
             | 
| 3 10 | 
             
            ## 1.1.0 (2023-08-16)
         | 
| 4 11 |  | 
| 5 12 | 
             
            * Support optional fields in proto3 ([\#32](https://github.com/square/rbs_protobuf/pull/32))
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                rbs_protobuf (1. | 
| 4 | 
            +
                rbs_protobuf (1.2.0)
         | 
| 5 5 | 
             
                  activesupport (>= 4.0)
         | 
| 6 6 | 
             
                  rbs (>= 2.2.0)
         | 
| 7 7 |  | 
| 8 8 | 
             
            GEM
         | 
| 9 9 | 
             
              remote: https://rubygems.org/
         | 
| 10 10 | 
             
              specs:
         | 
| 11 | 
            -
                activesupport (7.0.7)
         | 
| 11 | 
            +
                activesupport (7.0.7.2)
         | 
| 12 12 | 
             
                  concurrent-ruby (~> 1.0, >= 1.0.2)
         | 
| 13 13 | 
             
                  i18n (>= 1.6, < 2)
         | 
| 14 14 | 
             
                  minitest (>= 5.1)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -82,21 +82,6 @@ Run `protoc` with `--rbs_out` option. | |
| 82 82 |  | 
| 83 83 | 
             
            You may need `bundle exec protoc ...` to let bundler set up PATH.
         | 
| 84 84 |  | 
| 85 | 
            -
            ## Type checking
         | 
| 86 | 
            -
             | 
| 87 | 
            -
            To type check the output, you need to configure your tools to import [gem_rbs_collection](https://github.com/ruby/gem_rbs_collection) with `rbs collection` command.
         | 
| 88 | 
            -
             | 
| 89 | 
            -
            ```yaml
         | 
| 90 | 
            -
            # Add the dependency in rbs_collection.yaml
         | 
| 91 | 
            -
            gems:
         | 
| 92 | 
            -
              - name: rbs_protobuf
         | 
| 93 | 
            -
            ```
         | 
| 94 | 
            -
             | 
| 95 | 
            -
            We assume that you don't type check the generated `.pb.rb` code.
         | 
| 96 | 
            -
            If you want to type check them, you need the definition of `Google::Protobuf`, which can be generated from [`descriptor.proto`](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto).
         | 
| 97 | 
            -
             | 
| 98 | 
            -
            Note: `rbs_protobuf` generates RBS files assuming some types added in [this PR](https://github.com/ruby/gem_rbs_collection/pull/145). Make sure you are using one of the newer versions of `rbs_gem_collection` definitions.
         | 
| 99 | 
            -
             | 
| 100 85 | 
             
            ### Options
         | 
| 101 86 |  | 
| 102 87 | 
             
            * `RBS_PROTOBUF_BACKEND` specifies the Ruby code generator gem. Supported value is `protobuf`. (We will add `google-protobuf` for `google-protobuf` gem.)
         | 
| @@ -104,6 +89,20 @@ Note: `rbs_protobuf` generates RBS files assuming some types added in [this PR]( | |
| 104 89 | 
             
            * `RBS_PROTOBUF_NO_NESTED_NAMESPACE` is to make the RBS declarations flat.
         | 
| 105 90 | 
             
            * `RBS_PROTOBUF_EXTENSION` specifies what to do for extensions.
         | 
| 106 91 | 
             
            * `RBS_PROTOBUF_ACCEPT_NIL_ATTR_WRITER` is to allow passing `nil` to required fields.
         | 
| 92 | 
            +
            * `RBS_PROTOBUF_FILTERS` contains filter Ruby script paths separated by `File::PATH_SEPARATOR`
         | 
| 93 | 
            +
            * `RBS_PROTOBUF_CONCAT_LEVEL` contains the number of dir levels that groups generated RBS files to concat
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            ## Type checking
         | 
| 96 | 
            +
             | 
| 97 | 
            +
            To type check the output, make sure your type checker configuration loads type definitions of `protobuf` gem.
         | 
| 98 | 
            +
             | 
| 99 | 
            +
            ```ruby
         | 
| 100 | 
            +
            # Declare in Gemfile and load it with rbs-collection
         | 
| 101 | 
            +
            gem 'protobuf'
         | 
| 102 | 
            +
            ```
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            We assume that you don't type check the generated `.pb.rb` code.
         | 
| 105 | 
            +
            If you want to type check them, you need the definition of `Google::Protobuf`, which can be generated from [`descriptor.proto`](https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto).
         | 
| 107 106 |  | 
| 108 107 | 
             
            ## Supported features
         | 
| 109 108 |  | 
| @@ -118,7 +117,7 @@ Note: `rbs_protobuf` generates RBS files assuming some types added in [this PR]( | |
| 118 117 | 
             
            | Services                | Only generates classes     |
         | 
| 119 118 | 
             
            | Oneof                   | No support in `protobuf` gem |
         | 
| 120 119 |  | 
| 121 | 
            -
             | 
| 120 | 
            +
            ## Extensions
         | 
| 122 121 |  | 
| 123 122 | 
             
            Adding extensions may cause problems if the name of new attribute conflicts.
         | 
| 124 123 |  | 
| @@ -144,6 +143,27 @@ You can control the behavior with `RBS_PROTOBUF_EXTENSION` environment variable. | |
| 144 143 | 
             
            * Any value else: Generates RBS for extensions.
         | 
| 145 144 | 
             
            * undefined: Ignores extensions but print messages to ask you to specify a value.
         | 
| 146 145 |  | 
| 146 | 
            +
            ## Filters
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            You can apply filters that modifies generated RBS files.
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            A filter is a proc object with type of `^(String rbs_name, String rbs_content, untyped proto_file) -> [String, String]`:
         | 
| 151 | 
            +
            It receives the file name of RBS file, the content of RBS file, the source protobuf object, and returns a pair of RBS file name and content.
         | 
| 152 | 
            +
             | 
| 153 | 
            +
            ```ruby
         | 
| 154 | 
            +
            # example_fitler.rb: It adds a warning comment at the top of the RBS content.
         | 
| 155 | 
            +
            ->(rbs_name, rbs_content, _proto_file) {
         | 
| 156 | 
            +
              [
         | 
| 157 | 
            +
                rbs_name,
         | 
| 158 | 
            +
                "# Don't modify this file. This is generated with rbs_protobuf.\n\n" + rbs_content
         | 
| 159 | 
            +
              ]
         | 
| 160 | 
            +
            }
         | 
| 161 | 
            +
            ```
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            You can apply filters by setting `RBS_PROTOBUF_FILTERS` environment variable.
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                $ RBS_PROTOBUF_BACKEND=protobuf RBS_PROTOBUF_FILTERS=example_filter.rb protoc ...
         | 
| 166 | 
            +
             | 
| 147 167 | 
             
            ## Development
         | 
| 148 168 |  | 
| 149 169 | 
             
            After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test example:typecheck` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         | 
    
        data/bin/setup
    CHANGED
    
    | @@ -9,13 +9,4 @@ echo ">>> Checking if protoc is available... 👀" | |
| 9 9 | 
             
            protoc --version
         | 
| 10 10 |  | 
| 11 11 | 
             
            echo ">>> Setting up gem_rbs_collection... 💎"
         | 
| 12 | 
            -
            REPODIR=$(cd $(dirname $0)/..; pwd)/tmp/rbs/gem_rbs_collection
         | 
| 13 | 
            -
            if [ -e $REPODIR ]; then
         | 
| 14 | 
            -
              echo "      ${REPODIR} exists"
         | 
| 15 | 
            -
            else
         | 
| 16 | 
            -
              echo "      Cloning git repo into ${REPODIR}..."
         | 
| 17 | 
            -
              mkdir -p $REPODIR/..
         | 
| 18 | 
            -
              git clone https://github.com/ruby/gem_rbs_collection.git ${REPODIR}
         | 
| 19 | 
            -
            fi
         | 
| 20 | 
            -
             | 
| 21 12 | 
             
            bundle exec rbs collection install
         | 
    
        data/exe/protoc-gen-rbs
    CHANGED
    
    | @@ -13,6 +13,20 @@ unless backend | |
| 13 13 | 
             
              exit 1
         | 
| 14 14 | 
             
            end
         | 
| 15 15 |  | 
| 16 | 
            +
            filters = []
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            if string = ENV["RBS_PROTOBUF_FILTERS"]
         | 
| 19 | 
            +
              string.split(File::PATH_SEPARATOR).each do |file|
         | 
| 20 | 
            +
                filter = Module.new.instance_eval(File.read(file), file)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                if filter.respond_to?(:call)
         | 
| 23 | 
            +
                  filters << filter
         | 
| 24 | 
            +
                else
         | 
| 25 | 
            +
                  raise "A filter `#{file}` returns `#{filter.inspect}`, but a proc object of type `^(String rbs_name, String rbs_content, untyped proto_file) -> [String, String]` is expected"
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            end
         | 
| 29 | 
            +
             | 
| 16 30 | 
             
            input = Google::Protobuf::Compiler::CodeGeneratorRequest.decode(STDIN.read)
         | 
| 17 31 |  | 
| 18 32 | 
             
            translator = case backend
         | 
| @@ -34,6 +48,7 @@ translator = case backend | |
| 34 48 |  | 
| 35 49 | 
             
                           RBSProtobuf::Translator::ProtobufGem.new(
         | 
| 36 50 | 
             
                             input,
         | 
| 51 | 
            +
                             filters,
         | 
| 37 52 | 
             
                             upcase_enum: upcase_enum,
         | 
| 38 53 | 
             
                             nested_namespace: !no_nested_namespace,
         | 
| 39 54 | 
             
                             extension: extension,
         | 
| @@ -43,6 +58,9 @@ translator = case backend | |
| 43 58 | 
             
                           raise NotImplementedError
         | 
| 44 59 | 
             
                         end
         | 
| 45 60 |  | 
| 61 | 
            +
            if level = ENV["RBS_PROTOBUF_CONCAT_LEVEL"]
         | 
| 62 | 
            +
              translator.rbs_concat_level = level.to_i
         | 
| 63 | 
            +
            end
         | 
| 46 64 | 
             
            translator.generate_rbs!
         | 
| 47 65 |  | 
| 48 66 | 
             
            response = translator.response
         | 
| @@ -3,10 +3,19 @@ module RBSProtobuf | |
| 3 3 | 
             
                class Base
         | 
| 4 4 | 
             
                  FieldDescriptorProto = Google::Protobuf::FieldDescriptorProto
         | 
| 5 5 |  | 
| 6 | 
            -
                  attr_reader :input
         | 
| 6 | 
            +
                  attr_reader :input, :filters
         | 
| 7 7 |  | 
| 8 | 
            -
                   | 
| 8 | 
            +
                  attr_accessor :rbs_concat_level
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def initialize(input, filters = [])
         | 
| 9 11 | 
             
                    @input = input
         | 
| 12 | 
            +
                    @filters = filters
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def apply_filter(rbs_name, rbs_content, proto_files)
         | 
| 16 | 
            +
                    filters.inject([rbs_name, rbs_content]) do |(rbs_name, rbs_content), filter| #$ [String, String]
         | 
| 17 | 
            +
                      filter[rbs_name, rbs_content, proto_files] or return
         | 
| 18 | 
            +
                    end
         | 
| 10 19 | 
             
                  end
         | 
| 11 20 |  | 
| 12 21 | 
             
                  def factory
         | 
| @@ -18,14 +27,61 @@ module RBSProtobuf | |
| 18 27 | 
             
                  end
         | 
| 19 28 |  | 
| 20 29 | 
             
                  def generate_rbs!
         | 
| 30 | 
            +
                    rbs_decls = {} #: Hash[Pathname, [Array[RBS::AST::Declarations::t], untyped]]
         | 
| 31 | 
            +
             | 
| 21 32 | 
             
                    input.proto_file.each do |file|
         | 
| 22 | 
            -
                       | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 33 | 
            +
                      path = Pathname(file.name).sub_ext(".rbs")
         | 
| 34 | 
            +
                      decls = rbs_content(file)
         | 
| 35 | 
            +
                      rbs_decls[path] = [decls, file]
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    rbs_contents = {} #: Hash[Pathname, [String, Array[untyped]]]
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    if (level = rbs_concat_level)&.nonzero?
         | 
| 41 | 
            +
                      groups = rbs_decls.each_key.group_by do |path|
         | 
| 42 | 
            +
                        path.sub_ext("").to_s.split(File::SEPARATOR).take(level).join(File::SEPARATOR)
         | 
| 43 | 
            +
                      end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                      groups.each do |prefix, paths|
         | 
| 46 | 
            +
                        path = Pathname(prefix).sub_ext(".rbs")
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                        decls = [] #: Array[RBS::AST::Declarations::t]
         | 
| 49 | 
            +
                        files = [] #: Array[untyped]
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                        paths.each do |path|
         | 
| 52 | 
            +
                          ds, file = rbs_decls.fetch(path)
         | 
| 53 | 
            +
                          decls.concat(ds)
         | 
| 54 | 
            +
                          files.push(file)
         | 
| 55 | 
            +
                        end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                        rbs_contents[path] = [
         | 
| 58 | 
            +
                          format_rbs(decls: decls),
         | 
| 59 | 
            +
                          files
         | 
| 60 | 
            +
                        ]
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                    else
         | 
| 63 | 
            +
                      rbs_decls.each do |path, (decls, file)|
         | 
| 64 | 
            +
                        content = format_rbs(decls: decls)
         | 
| 65 | 
            +
                        rbs_contents[path] = [content, [file]]
         | 
| 66 | 
            +
                      end
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    rbs_contents.each do |path, (content, files)|
         | 
| 70 | 
            +
                      if (name, content = apply_filter(path.to_s, content, files))
         | 
| 71 | 
            +
                        response.file << Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(
         | 
| 72 | 
            +
                          name: name,
         | 
| 73 | 
            +
                          content: content
         | 
| 74 | 
            +
                        )
         | 
| 75 | 
            +
                      end
         | 
| 26 76 | 
             
                    end
         | 
| 27 77 | 
             
                  end
         | 
| 28 78 |  | 
| 79 | 
            +
                  def format_rbs(dirs: [], decls: [])
         | 
| 80 | 
            +
                    StringIO.new.tap do |io|
         | 
| 81 | 
            +
                      RBS::Writer.new(out: io).write(dirs + decls)
         | 
| 82 | 
            +
                    end.string
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
             | 
| 29 85 | 
             
                  def rbs_name(proto_name)
         | 
| 30 86 | 
             
                    dirname = File.dirname(proto_name)
         | 
| 31 87 | 
             
                    basename = File.basename(proto_name, File.extname(proto_name))
         | 
| @@ -120,6 +176,15 @@ module RBSProtobuf | |
| 120 176 | 
             
                      )
         | 
| 121 177 | 
             
                    )
         | 
| 122 178 | 
             
                  end
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                  def optional_type(type)
         | 
| 181 | 
            +
                    case type
         | 
| 182 | 
            +
                    when RBS::Types::Optional
         | 
| 183 | 
            +
                      type
         | 
| 184 | 
            +
                    else
         | 
| 185 | 
            +
                      RBS::Types::Optional.new(type: type, location: nil)
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
                  end
         | 
| 123 188 | 
             
                end
         | 
| 124 189 | 
             
              end
         | 
| 125 190 | 
             
            end
         | 
| @@ -19,8 +19,8 @@ module RBSProtobuf | |
| 19 19 |  | 
| 20 20 | 
             
                  attr_reader :accept_nil_writer
         | 
| 21 21 |  | 
| 22 | 
            -
                  def initialize(input, upcase_enum:, nested_namespace:, extension:, accept_nil_writer:, stderr: STDERR)
         | 
| 23 | 
            -
                    super(input)
         | 
| 22 | 
            +
                  def initialize(input, filters=[], upcase_enum:, nested_namespace:, extension:, accept_nil_writer:, stderr: STDERR)
         | 
| 23 | 
            +
                    super(input, filters)
         | 
| 24 24 | 
             
                    @upcase_enum = upcase_enum
         | 
| 25 25 | 
             
                    @nested_namespace = nested_namespace
         | 
| 26 26 | 
             
                    @extension = extension
         | 
| @@ -49,7 +49,7 @@ module RBSProtobuf | |
| 49 49 | 
             
                  end
         | 
| 50 50 |  | 
| 51 51 | 
             
                  def rbs_content(file)
         | 
| 52 | 
            -
                    decls = []
         | 
| 52 | 
            +
                    decls = [] #: Array[RBS::AST::Declarations::t]
         | 
| 53 53 |  | 
| 54 54 | 
             
                    source_code_info = file.source_code_info
         | 
| 55 55 |  | 
| @@ -127,9 +127,7 @@ module RBSProtobuf | |
| 127 127 | 
             
                      end
         | 
| 128 128 | 
             
                    end
         | 
| 129 129 |  | 
| 130 | 
            -
                     | 
| 131 | 
            -
                      RBS::Writer.new(out: io).write(decls)
         | 
| 132 | 
            -
                    end.string
         | 
| 130 | 
            +
                    decls
         | 
| 133 131 | 
             
                  end
         | 
| 134 132 |  | 
| 135 133 | 
             
                  def message_to_decl(message, prefix:, message_path:, source_code_info:, path:)
         | 
| @@ -200,7 +198,17 @@ module RBSProtobuf | |
| 200 198 | 
             
                            ),
         | 
| 201 199 | 
             
                            annotations: []
         | 
| 202 200 | 
             
                          ),
         | 
| 203 | 
            -
             | 
| 201 | 
            +
                          unless field_types.empty?
         | 
| 202 | 
            +
                            RBS::AST::Members::MethodDefinition::Overload.new(
         | 
| 203 | 
            +
                              method_type: factory.method_type(
         | 
| 204 | 
            +
                                type: factory.function().update(
         | 
| 205 | 
            +
                                  required_positionals: [factory.param(factory.alias_type("record"))]
         | 
| 206 | 
            +
                                )
         | 
| 207 | 
            +
                              ),
         | 
| 208 | 
            +
                              annotations: []
         | 
| 209 | 
            +
                            )
         | 
| 210 | 
            +
                          end,
         | 
| 211 | 
            +
                        ].compact,
         | 
| 204 212 | 
             
                        annotations: [],
         | 
| 205 213 | 
             
                        comment: nil,
         | 
| 206 214 | 
             
                        location: nil,
         | 
| @@ -352,7 +360,11 @@ module RBSProtobuf | |
| 352 360 | 
             
                      class_decl.members << RBS::AST::Declarations::TypeAlias.new(
         | 
| 353 361 | 
             
                        name: TypeName("init"),
         | 
| 354 362 | 
             
                        type_params: [],
         | 
| 355 | 
            -
                        type: factory.union_type( | 
| 363 | 
            +
                        type: factory.union_type(
         | 
| 364 | 
            +
                          class_instance_type,
         | 
| 365 | 
            +
                          TO_PROTO[],
         | 
| 366 | 
            +
                          field_types.empty? ? nil : factory.alias_type("record")
         | 
| 367 | 
            +
                        ),
         | 
| 356 368 | 
             
                        annotations: [],
         | 
| 357 369 | 
             
                        comment: RBS::AST::Comment.new(string: "The type of `#initialize` parameter.", location: nil),
         | 
| 358 370 | 
             
                        location: nil
         | 
| @@ -403,6 +415,18 @@ module RBSProtobuf | |
| 403 415 | 
             
                        comment: nil,
         | 
| 404 416 | 
             
                        location: nil
         | 
| 405 417 | 
             
                      )
         | 
| 418 | 
            +
             | 
| 419 | 
            +
                      class_decl.members << RBS::AST::Declarations::TypeAlias.new(
         | 
| 420 | 
            +
                        name: TypeName("record"),
         | 
| 421 | 
            +
                        type_params: [],
         | 
| 422 | 
            +
                        type: RBS::Types::Record.new(
         | 
| 423 | 
            +
                          fields: field_types.transform_values {|_, _, type| optional_type(type) },
         | 
| 424 | 
            +
                          location: nil
         | 
| 425 | 
            +
                          ),
         | 
| 426 | 
            +
                        annotations: [],
         | 
| 427 | 
            +
                        location: nil,
         | 
| 428 | 
            +
                        comment: nil
         | 
| 429 | 
            +
                      )
         | 
| 406 430 | 
             
                    end
         | 
| 407 431 | 
             
                  end
         | 
| 408 432 |  | 
| @@ -896,11 +920,81 @@ module RBSProtobuf | |
| 896 920 | 
             
                  def service_to_decl(service, prefix:, source_code_info:, path:)
         | 
| 897 921 | 
             
                    service_name = ActiveSupport::Inflector.camelize(service.name)
         | 
| 898 922 |  | 
| 923 | 
            +
                    members = [] #: Array[RBS::AST::Declarations::Class::member]
         | 
| 924 | 
            +
             | 
| 925 | 
            +
                    service.method.each do |method|
         | 
| 926 | 
            +
                      method_name = ActiveSupport::Inflector.underscore(method.name).to_sym #: Symbol
         | 
| 927 | 
            +
             | 
| 928 | 
            +
                      interface_name = "_#{ActiveSupport::Inflector.camelize(method.name)}Method"
         | 
| 929 | 
            +
             | 
| 930 | 
            +
                      members << RBS::AST::Declarations::Interface.new(
         | 
| 931 | 
            +
                        name: factory.type_name(interface_name),
         | 
| 932 | 
            +
                        type_params: [],
         | 
| 933 | 
            +
                        members: [
         | 
| 934 | 
            +
                          RBS::AST::Members::MethodDefinition.new(
         | 
| 935 | 
            +
                            name: :request,
         | 
| 936 | 
            +
                            kind: :instance,
         | 
| 937 | 
            +
                            overloads: [
         | 
| 938 | 
            +
                              RBS::AST::Members::MethodDefinition::Overload.new(
         | 
| 939 | 
            +
                                method_type: factory.method_type(type: factory.function(message_type(method.input_type))),
         | 
| 940 | 
            +
                                annotations: []
         | 
| 941 | 
            +
                              )
         | 
| 942 | 
            +
                            ],
         | 
| 943 | 
            +
                            annotations: [],
         | 
| 944 | 
            +
                            location: nil,
         | 
| 945 | 
            +
                            comment: nil,
         | 
| 946 | 
            +
                            overloading: false,
         | 
| 947 | 
            +
                            visibility: nil
         | 
| 948 | 
            +
                          ),
         | 
| 949 | 
            +
                          RBS::AST::Members::MethodDefinition.new(
         | 
| 950 | 
            +
                            name: :respond_with,
         | 
| 951 | 
            +
                            kind: :instance,
         | 
| 952 | 
            +
                            overloads: [
         | 
| 953 | 
            +
                              RBS::AST::Members::MethodDefinition::Overload.new(
         | 
| 954 | 
            +
                                method_type: factory.method_type(
         | 
| 955 | 
            +
                                  type: factory.function().update(
         | 
| 956 | 
            +
                                    required_positionals: [
         | 
| 957 | 
            +
                                      factory.param(message_init_type(message_type(method.output_type)))
         | 
| 958 | 
            +
                                    ]
         | 
| 959 | 
            +
                                  )
         | 
| 960 | 
            +
                                ),
         | 
| 961 | 
            +
                                annotations: []
         | 
| 962 | 
            +
                              )
         | 
| 963 | 
            +
                            ],
         | 
| 964 | 
            +
                            annotations: [],
         | 
| 965 | 
            +
                            location: nil,
         | 
| 966 | 
            +
                            comment: nil,
         | 
| 967 | 
            +
                            overloading: false,
         | 
| 968 | 
            +
                            visibility: nil
         | 
| 969 | 
            +
                          )
         | 
| 970 | 
            +
                        ],
         | 
| 971 | 
            +
                        annotations: [],
         | 
| 972 | 
            +
                        location: nil,
         | 
| 973 | 
            +
                        comment: nil
         | 
| 974 | 
            +
                      )
         | 
| 975 | 
            +
             | 
| 976 | 
            +
                      members << RBS::AST::Members::MethodDefinition.new(
         | 
| 977 | 
            +
                        name: method_name,
         | 
| 978 | 
            +
                        kind: :instance,
         | 
| 979 | 
            +
                        overloads: [
         | 
| 980 | 
            +
                          RBS::AST::Members::MethodDefinition::Overload.new(
         | 
| 981 | 
            +
                            method_type: factory.method_type(type: factory.function()),
         | 
| 982 | 
            +
                            annotations: []
         | 
| 983 | 
            +
                          )
         | 
| 984 | 
            +
                        ],
         | 
| 985 | 
            +
                        annotations: [],
         | 
| 986 | 
            +
                        location: nil,
         | 
| 987 | 
            +
                        comment: nil,
         | 
| 988 | 
            +
                        overloading: false,
         | 
| 989 | 
            +
                        visibility: nil
         | 
| 990 | 
            +
                      )
         | 
| 991 | 
            +
                    end
         | 
| 992 | 
            +
             | 
| 899 993 | 
             
                    RBS::AST::Declarations::Class.new(
         | 
| 900 994 | 
             
                      name: RBS::TypeName.new(name: service_name.to_sym, namespace: prefix),
         | 
| 901 995 | 
             
                      super_class: service_base_class,
         | 
| 902 996 | 
             
                      type_params: factory.module_type_params(),
         | 
| 903 | 
            -
                      members:  | 
| 997 | 
            +
                      members: members,
         | 
| 904 998 | 
             
                      comment: comment_for_path(source_code_info, path, options: nil),
         | 
| 905 999 | 
             
                      location: nil,
         | 
| 906 1000 | 
             
                      annotations: []
         | 
    
        data/lib/rbs_protobuf/version.rb
    CHANGED
    
    
    
        data/rbs_collection.lock.yaml
    CHANGED
    
    
| @@ -10,7 +10,7 @@ module RBSProtobuf | |
| 10 10 |  | 
| 11 11 | 
             
                def singleton_type: (String | RBS::TypeName name) -> RBS::Types::ClassSingleton
         | 
| 12 12 |  | 
| 13 | 
            -
                def union_type: (RBS::Types::t `type`, *RBS::Types::t types) -> RBS::Types::t
         | 
| 13 | 
            +
                def union_type: (RBS::Types::t `type`, *RBS::Types::t? types) -> RBS::Types::t
         | 
| 14 14 |  | 
| 15 15 | 
             
                def nil_type: (?location: RBS::Location[untyped, untyped]?) -> RBS::Types::Bases::Nil
         | 
| 16 16 |  | 
| @@ -5,7 +5,15 @@ module RBSProtobuf | |
| 5 5 |  | 
| 6 6 | 
             
                  attr_reader input: untyped
         | 
| 7 7 |  | 
| 8 | 
            -
                   | 
| 8 | 
            +
                  type filter = ^(String rbs_name, String rbs_content, Array[untyped] proto_files) -> [String, String]?
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  attr_reader filters: Array[filter]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  attr_accessor rbs_concat_level: Integer?
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def initialize: (untyped input, ?Array[filter] filters) -> void
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def apply_filter: (String rbs_name, String rbs_content, Array[untyped] proto_file) -> [String, String]?
         | 
| 9 17 |  | 
| 10 18 | 
             
                  @factory: RBSFactory
         | 
| 11 19 |  | 
| @@ -21,7 +29,9 @@ module RBSProtobuf | |
| 21 29 |  | 
| 22 30 | 
             
                  def rbs_suffix: () -> ::String
         | 
| 23 31 |  | 
| 24 | 
            -
                  def  | 
| 32 | 
            +
                  def format_rbs: (?dirs: Array[RBS::AST::Directives::t], ?decls: Array[RBS::AST::Declarations::t]) -> String
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def rbs_content: (String file) -> Array[RBS::AST::Declarations::t]
         | 
| 25 35 |  | 
| 26 36 | 
             
                  def comment_for_path: (untyped source_code_info, Array[Integer] path, options: untyped) -> RBS::AST::Comment?
         | 
| 27 37 |  | 
| @@ -30,6 +40,8 @@ module RBSProtobuf | |
| 30 40 | 
             
                  def base_type: (untyped `type`) -> RBS::Types::t
         | 
| 31 41 |  | 
| 32 42 | 
             
                  def message_type: (String) -> RBS::Types::ClassInstance
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def optional_type: (RBS::Types::t) -> RBS::Types::Optional
         | 
| 33 45 | 
             
                end
         | 
| 34 46 | 
             
              end
         | 
| 35 47 | 
             
            end
         | 
| @@ -28,6 +28,7 @@ module RBSProtobuf | |
| 28 28 |  | 
| 29 29 | 
             
                  def initialize: (
         | 
| 30 30 | 
             
                    untyped input,
         | 
| 31 | 
            +
                    ?Array[Base::filter] filters,
         | 
| 31 32 | 
             
                    upcase_enum: bool,
         | 
| 32 33 | 
             
                    nested_namespace: bool,
         | 
| 33 34 | 
             
                    extension: bool | :print | nil,
         | 
| @@ -63,7 +64,7 @@ module RBSProtobuf | |
| 63 64 | 
             
                  # The entry point.
         | 
| 64 65 | 
             
                  # Generate RBS declarations from the `file` and returns the string representation of the declarations.
         | 
| 65 66 | 
             
                  #
         | 
| 66 | 
            -
                  def rbs_content: (untyped file) ->  | 
| 67 | 
            +
                  def rbs_content: (untyped file) -> Array[RBS::AST::Declarations::t]
         | 
| 67 68 |  | 
| 68 69 | 
             
                  # Returns the class declaration for given message.
         | 
| 69 70 | 
             
                  #
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rbs_protobuf
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Soutaro Matsumoto
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023- | 
| 11 | 
            +
            date: 2023-09-06 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rbs
         |