rbi 0.1.8 → 0.1.10
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/Gemfile +1 -1
- data/lib/rbi/index.rb +1 -1
- data/lib/rbi/model.rb +78 -0
- data/lib/rbi/rewriters/filter_versions.rb +123 -0
- data/lib/rbi/version.rb +1 -1
- data/lib/rbi.rb +1 -0
- metadata +6 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4161675b7c71e44d7f0f7ee6b2b6901509bc367ab9d34fdcdca5fb7dfb600cff
         | 
| 4 | 
            +
              data.tar.gz: b34c191ab1806649d81e5620dcaf57a86b9a5881a164724f5f900176dde2e0d1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2efc52240df29f1ddffed5daeff5d51c5b63a234d30219b70cf283e7b53086845f23f4438894991f864006198779bfaeea47857b60715086853c5eb321a6762b
         | 
| 7 | 
            +
              data.tar.gz: fa1c376c7432db658ec2d8fa356e74dc9c22f55d2035743a7f28a603c4339df9102bfc95dbe6d1d05d18f0a453496836ae568209adbc3736de4bb64ca7e6385c
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -10,7 +10,7 @@ group(:development, :test) do | |
| 10 10 | 
             
              gem("minitest")
         | 
| 11 11 | 
             
              gem("minitest-reporters")
         | 
| 12 12 | 
             
              gem("rake", "~> 13.1")
         | 
| 13 | 
            -
              gem("rubocop", "~> 1. | 
| 13 | 
            +
              gem("rubocop", "~> 1.62", require: false)
         | 
| 14 14 | 
             
              gem("rubocop-shopify", require: false)
         | 
| 15 15 | 
             
              gem("rubocop-sorbet", require: false)
         | 
| 16 16 | 
             
              gem("sorbet", ">= 0.5.9204", require: false)
         | 
    
        data/lib/rbi/index.rb
    CHANGED
    
    
    
        data/lib/rbi/model.rb
    CHANGED
    
    | @@ -534,6 +534,79 @@ module RBI | |
| 534 534 | 
             
                  @params << param
         | 
| 535 535 | 
             
                end
         | 
| 536 536 |  | 
| 537 | 
            +
                sig { params(name: String).void }
         | 
| 538 | 
            +
                def add_param(name)
         | 
| 539 | 
            +
                  @params << ReqParam.new(name)
         | 
| 540 | 
            +
                end
         | 
| 541 | 
            +
             | 
| 542 | 
            +
                sig { params(name: String, default_value: String).void }
         | 
| 543 | 
            +
                def add_opt_param(name, default_value)
         | 
| 544 | 
            +
                  @params << OptParam.new(name, default_value)
         | 
| 545 | 
            +
                end
         | 
| 546 | 
            +
             | 
| 547 | 
            +
                sig { params(name: String).void }
         | 
| 548 | 
            +
                def add_rest_param(name)
         | 
| 549 | 
            +
                  @params << RestParam.new(name)
         | 
| 550 | 
            +
                end
         | 
| 551 | 
            +
             | 
| 552 | 
            +
                sig { params(name: String).void }
         | 
| 553 | 
            +
                def add_kw_param(name)
         | 
| 554 | 
            +
                  @params << KwParam.new(name)
         | 
| 555 | 
            +
                end
         | 
| 556 | 
            +
             | 
| 557 | 
            +
                sig { params(name: String, default_value: String).void }
         | 
| 558 | 
            +
                def add_kw_opt_param(name, default_value)
         | 
| 559 | 
            +
                  @params << KwOptParam.new(name, default_value)
         | 
| 560 | 
            +
                end
         | 
| 561 | 
            +
             | 
| 562 | 
            +
                sig { params(name: String).void }
         | 
| 563 | 
            +
                def add_kw_rest_param(name)
         | 
| 564 | 
            +
                  @params << KwRestParam.new(name)
         | 
| 565 | 
            +
                end
         | 
| 566 | 
            +
             | 
| 567 | 
            +
                sig { params(name: String).void }
         | 
| 568 | 
            +
                def add_block_param(name)
         | 
| 569 | 
            +
                  @params << BlockParam.new(name)
         | 
| 570 | 
            +
                end
         | 
| 571 | 
            +
             | 
| 572 | 
            +
                sig do
         | 
| 573 | 
            +
                  params(
         | 
| 574 | 
            +
                    params: T::Array[SigParam],
         | 
| 575 | 
            +
                    return_type: T.nilable(String),
         | 
| 576 | 
            +
                    is_abstract: T::Boolean,
         | 
| 577 | 
            +
                    is_override: T::Boolean,
         | 
| 578 | 
            +
                    is_overridable: T::Boolean,
         | 
| 579 | 
            +
                    is_final: T::Boolean,
         | 
| 580 | 
            +
                    type_params: T::Array[String],
         | 
| 581 | 
            +
                    checked: T.nilable(Symbol),
         | 
| 582 | 
            +
                    block: T.proc.params(node: Sig).void,
         | 
| 583 | 
            +
                  ).void
         | 
| 584 | 
            +
                end
         | 
| 585 | 
            +
                def add_sig(
         | 
| 586 | 
            +
                  params: [],
         | 
| 587 | 
            +
                  return_type: nil,
         | 
| 588 | 
            +
                  is_abstract: false,
         | 
| 589 | 
            +
                  is_override: false,
         | 
| 590 | 
            +
                  is_overridable: false,
         | 
| 591 | 
            +
                  is_final: false,
         | 
| 592 | 
            +
                  type_params: [],
         | 
| 593 | 
            +
                  checked: nil,
         | 
| 594 | 
            +
                  &block
         | 
| 595 | 
            +
                )
         | 
| 596 | 
            +
                  sig = Sig.new(
         | 
| 597 | 
            +
                    params: params,
         | 
| 598 | 
            +
                    return_type: return_type,
         | 
| 599 | 
            +
                    is_abstract: is_abstract,
         | 
| 600 | 
            +
                    is_override: is_override,
         | 
| 601 | 
            +
                    is_overridable: is_overridable,
         | 
| 602 | 
            +
                    is_final: is_final,
         | 
| 603 | 
            +
                    type_params: type_params,
         | 
| 604 | 
            +
                    checked: checked,
         | 
| 605 | 
            +
                    &block
         | 
| 606 | 
            +
                  )
         | 
| 607 | 
            +
                  @sigs << sig
         | 
| 608 | 
            +
                end
         | 
| 609 | 
            +
             | 
| 537 610 | 
             
                sig { returns(String) }
         | 
| 538 611 | 
             
                def fully_qualified_name
         | 
| 539 612 | 
             
                  if is_singleton
         | 
| @@ -1085,6 +1158,11 @@ module RBI | |
| 1085 1158 | 
             
                  @params << param
         | 
| 1086 1159 | 
             
                end
         | 
| 1087 1160 |  | 
| 1161 | 
            +
                sig { params(name: String, type: String).void }
         | 
| 1162 | 
            +
                def add_param(name, type)
         | 
| 1163 | 
            +
                  @params << SigParam.new(name, type)
         | 
| 1164 | 
            +
                end
         | 
| 1165 | 
            +
             | 
| 1088 1166 | 
             
                sig { params(other: Object).returns(T::Boolean) }
         | 
| 1089 1167 | 
             
                def ==(other)
         | 
| 1090 1168 | 
             
                  return false unless other.is_a?(Sig)
         | 
| @@ -0,0 +1,123 @@ | |
| 1 | 
            +
            # typed: strict
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module RBI
         | 
| 5 | 
            +
              module Rewriters
         | 
| 6 | 
            +
                # Take a gem version and filter out all RBI that is not relevant to that version based on @version annotations
         | 
| 7 | 
            +
                # in comments. As an example:
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # ~~~rb
         | 
| 10 | 
            +
                # tree = Parser.parse_string(<<~RBI)
         | 
| 11 | 
            +
                #   class Foo
         | 
| 12 | 
            +
                #     # @version > 0.3.0
         | 
| 13 | 
            +
                #     def bar
         | 
| 14 | 
            +
                #     end
         | 
| 15 | 
            +
                #
         | 
| 16 | 
            +
                #     # @version <= 0.3.0
         | 
| 17 | 
            +
                #     def bar(arg1)
         | 
| 18 | 
            +
                #     end
         | 
| 19 | 
            +
                #   end
         | 
| 20 | 
            +
                # RBI
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # Rewriters::FilterVersions.filter(tree, Gem::Version.new("0.3.1"))
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                # assert_equal(<<~RBI, tree.string)
         | 
| 25 | 
            +
                #   class Foo
         | 
| 26 | 
            +
                #     # @version > 0.3.0
         | 
| 27 | 
            +
                #     def bar
         | 
| 28 | 
            +
                #     end
         | 
| 29 | 
            +
                #   end
         | 
| 30 | 
            +
                # RBI
         | 
| 31 | 
            +
                # ~~~
         | 
| 32 | 
            +
                #
         | 
| 33 | 
            +
                # Supported operators:
         | 
| 34 | 
            +
                # - equals `=`
         | 
| 35 | 
            +
                # - not equals `!=`
         | 
| 36 | 
            +
                # - greater than `>`
         | 
| 37 | 
            +
                # - greater than or equal to `>=`
         | 
| 38 | 
            +
                # - less than `<`
         | 
| 39 | 
            +
                # - less than or equal to `<=`
         | 
| 40 | 
            +
                # - pessimistic or twiddle-wakka`~>`
         | 
| 41 | 
            +
                #
         | 
| 42 | 
            +
                # And/or logic:
         | 
| 43 | 
            +
                # - "And" logic: put multiple versions on the same line
         | 
| 44 | 
            +
                #   - e.g. `@version > 0.3.0, <1.0.0` means version must be greater than 0.3.0 AND less than 1.0.0
         | 
| 45 | 
            +
                # - "Or" logic: put multiple versions on subsequent lines
         | 
| 46 | 
            +
                #   - e.g. the following means version must be less than 0.3.0 OR greater than 1.0.0
         | 
| 47 | 
            +
                #       ```
         | 
| 48 | 
            +
                #       # @version < 0.3.0
         | 
| 49 | 
            +
                #       # @version > 1.0.0
         | 
| 50 | 
            +
                #       ```
         | 
| 51 | 
            +
                # Prerelease versions:
         | 
| 52 | 
            +
                # - Prerelease versions are considered less than their non-prerelease counterparts
         | 
| 53 | 
            +
                #   - e.g. `0.4.0-prerelease` is less than `0.4.0`
         | 
| 54 | 
            +
                #
         | 
| 55 | 
            +
                # RBI with no versions:
         | 
| 56 | 
            +
                # - RBI with no version annotations are automatically counted towards ALL versions
         | 
| 57 | 
            +
                class FilterVersions < Visitor
         | 
| 58 | 
            +
                  extend T::Sig
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  VERSION_PREFIX = "version "
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  class << self
         | 
| 63 | 
            +
                    extend T::Sig
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    sig { params(tree: Tree, version: Gem::Version).void }
         | 
| 66 | 
            +
                    def filter(tree, version)
         | 
| 67 | 
            +
                      v = new(version)
         | 
| 68 | 
            +
                      v.visit(tree)
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  sig { params(version: Gem::Version).void }
         | 
| 73 | 
            +
                  def initialize(version)
         | 
| 74 | 
            +
                    super()
         | 
| 75 | 
            +
                    @version = version
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  sig { override.params(node: T.nilable(Node)).void }
         | 
| 79 | 
            +
                  def visit(node)
         | 
| 80 | 
            +
                    return unless node
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    unless node.satisfies_version?(@version)
         | 
| 83 | 
            +
                      node.detach
         | 
| 84 | 
            +
                      return
         | 
| 85 | 
            +
                    end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    visit_all(node.nodes.dup) if node.is_a?(Tree)
         | 
| 88 | 
            +
                  end
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
              end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              class Node
         | 
| 93 | 
            +
                sig { params(version: Gem::Version).returns(T::Boolean) }
         | 
| 94 | 
            +
                def satisfies_version?(version)
         | 
| 95 | 
            +
                  return true unless is_a?(NodeWithComments)
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  requirements = version_requirements
         | 
| 98 | 
            +
                  requirements.empty? || requirements.any? { |req| req.satisfied_by?(version) }
         | 
| 99 | 
            +
                end
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              class NodeWithComments
         | 
| 103 | 
            +
                sig { returns(T::Array[Gem::Requirement]) }
         | 
| 104 | 
            +
                def version_requirements
         | 
| 105 | 
            +
                  annotations.select do |annotation|
         | 
| 106 | 
            +
                    annotation.start_with?(Rewriters::FilterVersions::VERSION_PREFIX)
         | 
| 107 | 
            +
                  end.map do |annotation|
         | 
| 108 | 
            +
                    versions = annotation.delete_prefix(Rewriters::FilterVersions::VERSION_PREFIX).split(/, */)
         | 
| 109 | 
            +
                    Gem::Requirement.new(versions)
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
              class Tree
         | 
| 115 | 
            +
                extend T::Sig
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                sig { params(version: Gem::Version).void }
         | 
| 118 | 
            +
                def filter_versions!(version)
         | 
| 119 | 
            +
                  visitor = Rewriters::FilterVersions.new(version)
         | 
| 120 | 
            +
                  visitor.visit(self)
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
    
        data/lib/rbi/version.rb
    CHANGED
    
    
    
        data/lib/rbi.rb
    CHANGED
    
    | @@ -10,6 +10,7 @@ require "rbi/index" | |
| 10 10 | 
             
            require "rbi/rewriters/add_sig_templates"
         | 
| 11 11 | 
             
            require "rbi/rewriters/annotate"
         | 
| 12 12 | 
             
            require "rbi/rewriters/deannotate"
         | 
| 13 | 
            +
            require "rbi/rewriters/filter_versions"
         | 
| 13 14 | 
             
            require "rbi/rewriters/merge_trees"
         | 
| 14 15 | 
             
            require "rbi/rewriters/nest_singleton_methods"
         | 
| 15 16 | 
             
            require "rbi/rewriters/nest_non_public_methods"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rbi
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.10
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Alexandre Terrasa
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-04-04 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: prism
         | 
| @@ -19,7 +19,7 @@ dependencies: | |
| 19 19 | 
             
                    version: 0.18.0
         | 
| 20 20 | 
             
                - - "<"
         | 
| 21 21 | 
             
                  - !ruby/object:Gem::Version
         | 
| 22 | 
            -
                    version: '0. | 
| 22 | 
            +
                    version: '0.25'
         | 
| 23 23 | 
             
              type: :runtime
         | 
| 24 24 | 
             
              prerelease: false
         | 
| 25 25 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| @@ -29,7 +29,7 @@ dependencies: | |
| 29 29 | 
             
                    version: 0.18.0
         | 
| 30 30 | 
             
                - - "<"
         | 
| 31 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            -
                    version: '0. | 
| 32 | 
            +
                    version: '0.25'
         | 
| 33 33 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 34 34 | 
             
              name: sorbet-runtime
         | 
| 35 35 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -64,6 +64,7 @@ files: | |
| 64 64 | 
             
            - lib/rbi/rewriters/add_sig_templates.rb
         | 
| 65 65 | 
             
            - lib/rbi/rewriters/annotate.rb
         | 
| 66 66 | 
             
            - lib/rbi/rewriters/deannotate.rb
         | 
| 67 | 
            +
            - lib/rbi/rewriters/filter_versions.rb
         | 
| 67 68 | 
             
            - lib/rbi/rewriters/group_nodes.rb
         | 
| 68 69 | 
             
            - lib/rbi/rewriters/merge_trees.rb
         | 
| 69 70 | 
             
            - lib/rbi/rewriters/nest_non_public_methods.rb
         | 
| @@ -92,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 92 93 | 
             
                - !ruby/object:Gem::Version
         | 
| 93 94 | 
             
                  version: '0'
         | 
| 94 95 | 
             
            requirements: []
         | 
| 95 | 
            -
            rubygems_version: 3.5. | 
| 96 | 
            +
            rubygems_version: 3.5.7
         | 
| 96 97 | 
             
            signing_key: 
         | 
| 97 98 | 
             
            specification_version: 4
         | 
| 98 99 | 
             
            summary: RBI generation framework
         |