tapioca 0.11.1 → 0.11.2
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/lib/tapioca/commands/dsl.rb +19 -17
- data/lib/tapioca/dsl/compilers/action_mailer.rb +8 -1
- data/lib/tapioca/dsl/compilers/active_record_relations.rb +1 -1
- data/lib/tapioca/dsl/compilers/active_record_scope.rb +1 -1
- data/lib/tapioca/dsl/helpers/active_record_column_type_helper.rb +11 -4
- data/lib/tapioca/dsl/pipeline.rb +14 -0
- data/lib/tapioca/gem/listeners/yard_doc.rb +1 -0
- data/lib/tapioca/helpers/rbi_files_helper.rb +1 -1
- data/lib/tapioca/loaders/dsl.rb +1 -13
- data/lib/tapioca/loaders/loader.rb +5 -1
- data/lib/tapioca/version.rb +1 -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: f19238941e4e663cef8326fc3cd46a9e9fb80b19130b676509d17e9081881fea
         | 
| 4 | 
            +
              data.tar.gz: aa1db65b32badf4df8937a9d6566ac409b788cc746c714b40f5f7f0098cd062c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ba99ab5d35eb0d88cd671370bfbee1e73b72e1a6828c083915c32ed36d7142291b93b79d9258cca9a7bd7d41fcf31770f00865c12c0fe5395cba0d439b9bd850
         | 
| 7 | 
            +
              data.tar.gz: 93d5fa3abba74e8919415d494bf47416a36721f4689d5ce893831b39cf4a8f00ca1f9d9c3500fcd70fa574fe2230d9aca6f743bf4c9642817ce969bbbdb6c431
         | 
    
        data/lib/tapioca/commands/dsl.rb
    CHANGED
    
    | @@ -93,7 +93,7 @@ module Tapioca | |
| 93 93 | 
             
                  def execute
         | 
| 94 94 | 
             
                    Loaders::Dsl.load_application(
         | 
| 95 95 | 
             
                      tapioca_path: @tapioca_path,
         | 
| 96 | 
            -
                      eager_load: @requested_constants.empty?,
         | 
| 96 | 
            +
                      eager_load: @requested_constants.empty? && @requested_paths.empty?,
         | 
| 97 97 | 
             
                      app_root: @app_root,
         | 
| 98 98 | 
             
                    )
         | 
| 99 99 |  | 
| @@ -104,17 +104,10 @@ module Tapioca | |
| 104 104 | 
             
                    end
         | 
| 105 105 | 
             
                    say("")
         | 
| 106 106 |  | 
| 107 | 
            -
                     | 
| 108 | 
            -
                      constants_from_paths = Static::SymbolLoader.symbols_from_paths(@requested_paths).to_a
         | 
| 109 | 
            -
                      if constants_from_paths.empty?
         | 
| 110 | 
            -
                        say_error("\nWarning: No constants found in: #{@requested_paths.map(&:to_s).join(", ")}", :yellow)
         | 
| 111 | 
            -
                      end
         | 
| 112 | 
            -
             | 
| 113 | 
            -
                      @requested_constants += constants_from_paths
         | 
| 114 | 
            -
                    end
         | 
| 107 | 
            +
                    all_requested_constants = @requested_constants + constants_from_requested_paths
         | 
| 115 108 |  | 
| 116 109 | 
             
                    outpath = @should_verify ? Pathname.new(Dir.mktmpdir) : @outpath
         | 
| 117 | 
            -
                    rbi_files_to_purge = existing_rbi_filenames( | 
| 110 | 
            +
                    rbi_files_to_purge = existing_rbi_filenames(all_requested_constants)
         | 
| 118 111 |  | 
| 119 112 | 
             
                    pipeline = create_pipeline
         | 
| 120 113 |  | 
| @@ -146,7 +139,7 @@ module Tapioca | |
| 146 139 | 
             
                      if @auto_strictness
         | 
| 147 140 | 
             
                        say("")
         | 
| 148 141 | 
             
                        validate_rbi_files(
         | 
| 149 | 
            -
                          command: default_command(:dsl,  | 
| 142 | 
            +
                          command: default_command(:dsl, all_requested_constants.join(" ")),
         | 
| 150 143 | 
             
                          gem_dir: @gem_dir,
         | 
| 151 144 | 
             
                          dsl_dir: @outpath.to_s,
         | 
| 152 145 | 
             
                          auto_strictness: @auto_strictness,
         | 
| @@ -164,7 +157,8 @@ module Tapioca | |
| 164 157 | 
             
                  sig { returns(Tapioca::Dsl::Pipeline) }
         | 
| 165 158 | 
             
                  def create_pipeline
         | 
| 166 159 | 
             
                    Tapioca::Dsl::Pipeline.new(
         | 
| 167 | 
            -
                      requested_constants: | 
| 160 | 
            +
                      requested_constants:
         | 
| 161 | 
            +
                        constantize(@requested_constants) + constantize(constants_from_requested_paths, ignore_missing: true),
         | 
| 168 162 | 
             
                      requested_paths: @requested_paths,
         | 
| 169 163 | 
             
                      requested_compilers: constantize_compilers(@only),
         | 
| 170 164 | 
             
                      excluded_compilers: constantize_compilers(@exclude),
         | 
| @@ -189,17 +183,17 @@ module Tapioca | |
| 189 183 | 
             
                    filenames.to_set
         | 
| 190 184 | 
             
                  end
         | 
| 191 185 |  | 
| 192 | 
            -
                  sig { params(constant_names: T::Array[String]).returns(T::Array[Module]) }
         | 
| 193 | 
            -
                  def constantize(constant_names)
         | 
| 186 | 
            +
                  sig { params(constant_names: T::Array[String], ignore_missing: T::Boolean).returns(T::Array[Module]) }
         | 
| 187 | 
            +
                  def constantize(constant_names, ignore_missing: false)
         | 
| 194 188 | 
             
                    constant_map = constant_names.to_h do |name|
         | 
| 195 189 | 
             
                      [name, Object.const_get(name)]
         | 
| 196 190 | 
             
                    rescue NameError
         | 
| 197 191 | 
             
                      [name, nil]
         | 
| 198 192 | 
             
                    end
         | 
| 199 193 |  | 
| 200 | 
            -
                    unprocessable_constants = constant_map. | 
| 194 | 
            +
                    processable_constants, unprocessable_constants = constant_map.partition { |_, v| !v.nil? }
         | 
| 201 195 |  | 
| 202 | 
            -
                    unless unprocessable_constants.empty?
         | 
| 196 | 
            +
                    unless unprocessable_constants.empty? || ignore_missing
         | 
| 203 197 | 
             
                      unprocessable_constants.each do |name, _|
         | 
| 204 198 | 
             
                        say("Error: Cannot find constant '#{name}'", :red)
         | 
| 205 199 | 
             
                        filename = dsl_rbi_filename(name)
         | 
| @@ -209,7 +203,7 @@ module Tapioca | |
| 209 203 | 
             
                      raise Thor::Error, ""
         | 
| 210 204 | 
             
                    end
         | 
| 211 205 |  | 
| 212 | 
            -
                     | 
| 206 | 
            +
                    processable_constants.map { |_, constant| constant }
         | 
| 213 207 | 
             
                  end
         | 
| 214 208 |  | 
| 215 209 | 
             
                  sig { params(compiler_names: T::Array[String]).returns(T::Array[T.class_of(Tapioca::Dsl::Compiler)]) }
         | 
| @@ -384,6 +378,14 @@ module Tapioca | |
| 384 378 | 
             
                  def generate_command_for(constant)
         | 
| 385 379 | 
             
                    default_command(:dsl, constant)
         | 
| 386 380 | 
             
                  end
         | 
| 381 | 
            +
             | 
| 382 | 
            +
                  sig { returns(T::Array[String]) }
         | 
| 383 | 
            +
                  def constants_from_requested_paths
         | 
| 384 | 
            +
                    @constants_from_requested_paths ||= T.let(
         | 
| 385 | 
            +
                      Static::SymbolLoader.symbols_from_paths(@requested_paths).to_a,
         | 
| 386 | 
            +
                      T.nilable(T::Array[String]),
         | 
| 387 | 
            +
                    )
         | 
| 388 | 
            +
                  end
         | 
| 387 389 | 
             
                end
         | 
| 388 390 | 
             
              end
         | 
| 389 391 | 
             
            end
         | 
| @@ -41,7 +41,7 @@ module Tapioca | |
| 41 41 | 
             
                    sig { override.void }
         | 
| 42 42 | 
             
                    def decorate
         | 
| 43 43 | 
             
                      root.create_path(constant) do |mailer|
         | 
| 44 | 
            -
                         | 
| 44 | 
            +
                        action_methods_for_constant.each do |mailer_method|
         | 
| 45 45 | 
             
                          method_def = constant.instance_method(mailer_method)
         | 
| 46 46 | 
             
                          parameters = compile_method_parameters_to_rbi(method_def)
         | 
| 47 47 | 
             
                          mailer.create_method(
         | 
| @@ -62,6 +62,13 @@ module Tapioca | |
| 62 62 | 
             
                        descendants_of(::ActionMailer::Base).reject(&:abstract?)
         | 
| 63 63 | 
             
                      end
         | 
| 64 64 | 
             
                    end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    private
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    sig { returns(T::Array[String]) }
         | 
| 69 | 
            +
                    def action_methods_for_constant
         | 
| 70 | 
            +
                      constant.action_methods.to_a
         | 
| 71 | 
            +
                    end
         | 
| 65 72 | 
             
                  end
         | 
| 66 73 | 
             
                end
         | 
| 67 74 | 
             
              end
         | 
| @@ -17,11 +17,9 @@ module Tapioca | |
| 17 17 | 
             
                    def type_for(column_name)
         | 
| 18 18 | 
             
                      return ["T.untyped", "T.untyped"] if do_not_generate_strong_types?(@constant)
         | 
| 19 19 |  | 
| 20 | 
            +
                      column = @constant.columns_hash[column_name]
         | 
| 20 21 | 
             
                      column_type = @constant.attribute_types[column_name]
         | 
| 21 | 
            -
             | 
| 22 22 | 
             
                      getter_type = type_for_activerecord_value(column_type)
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                      column = @constant.columns_hash[column_name]
         | 
| 25 23 | 
             
                      setter_type =
         | 
| 26 24 | 
             
                        case column_type
         | 
| 27 25 | 
             
                        when ActiveRecord::Enum::EnumType
         | 
| @@ -31,7 +29,8 @@ module Tapioca | |
| 31 29 | 
             
                        end
         | 
| 32 30 |  | 
| 33 31 | 
             
                      if column&.null
         | 
| 34 | 
            -
                         | 
| 32 | 
            +
                        getter_type = as_nilable_type(getter_type) unless not_nilable_serialized_column?(column_type)
         | 
| 33 | 
            +
                        return [getter_type, as_nilable_type(setter_type)]
         | 
| 35 34 | 
             
                      end
         | 
| 36 35 |  | 
| 37 36 | 
             
                      if column_name == @constant.primary_key ||
         | 
| @@ -148,6 +147,14 @@ module Tapioca | |
| 148 147 | 
             
                        "T.untyped"
         | 
| 149 148 | 
             
                      end
         | 
| 150 149 | 
             
                    end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                    sig { params(column_type: T.untyped).returns(T::Boolean) }
         | 
| 152 | 
            +
                    def not_nilable_serialized_column?(column_type)
         | 
| 153 | 
            +
                      return false unless column_type.is_a?(ActiveRecord::Type::Serialized)
         | 
| 154 | 
            +
                      return false unless column_type.coder.is_a?(ActiveRecord::Coders::YAMLColumn)
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                      [Array.singleton_class, Hash.singleton_class].include?(column_type.coder.object_class.singleton_class)
         | 
| 157 | 
            +
                    end
         | 
| 151 158 | 
             
                  end
         | 
| 152 159 | 
             
                end
         | 
| 153 160 | 
             
              end
         | 
    
        data/lib/tapioca/dsl/pipeline.rb
    CHANGED
    
    | @@ -68,6 +68,10 @@ module Tapioca | |
| 68 68 | 
             
                      ERROR
         | 
| 69 69 | 
             
                    end
         | 
| 70 70 |  | 
| 71 | 
            +
                    if defined?(::ActiveRecord::Base) && constants_to_process.any? { |c| ::ActiveRecord::Base > c }
         | 
| 72 | 
            +
                      abort_if_pending_migrations!
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
             | 
| 71 75 | 
             
                    result = Executor.new(
         | 
| 72 76 | 
             
                      constants_to_process,
         | 
| 73 77 | 
             
                      number_of_workers: @number_of_workers,
         | 
| @@ -184,6 +188,16 @@ module Tapioca | |
| 184 188 | 
             
                    handler.call(error)
         | 
| 185 189 | 
             
                    exit(1)
         | 
| 186 190 | 
             
                  end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                  sig { void }
         | 
| 193 | 
            +
                  def abort_if_pending_migrations!
         | 
| 194 | 
            +
                    return unless defined?(::Rake)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                    Rails.application.load_tasks
         | 
| 197 | 
            +
                    if Rake::Task.task_defined?("db:abort_if_pending_migrations")
         | 
| 198 | 
            +
                      Rake::Task["db:abort_if_pending_migrations"].invoke
         | 
| 199 | 
            +
                    end
         | 
| 200 | 
            +
                  end
         | 
| 187 201 | 
             
                end
         | 
| 188 202 | 
             
              end
         | 
| 189 203 | 
             
            end
         | 
    
        data/lib/tapioca/loaders/dsl.rb
    CHANGED
    
    | @@ -11,7 +11,7 @@ module Tapioca | |
| 11 11 |  | 
| 12 12 | 
             
                    sig { params(tapioca_path: String, eager_load: T::Boolean, app_root: String).void }
         | 
| 13 13 | 
             
                    def load_application(tapioca_path:, eager_load: true, app_root: ".")
         | 
| 14 | 
            -
                      loader = new(tapioca_path: tapioca_path, app_root: app_root)
         | 
| 14 | 
            +
                      loader = new(tapioca_path: tapioca_path, eager_load: eager_load, app_root: app_root)
         | 
| 15 15 | 
             
                      loader.load
         | 
| 16 16 | 
             
                    end
         | 
| 17 17 | 
             
                  end
         | 
| @@ -20,7 +20,6 @@ module Tapioca | |
| 20 20 | 
             
                  def load
         | 
| 21 21 | 
             
                    load_dsl_extensions
         | 
| 22 22 | 
             
                    load_application
         | 
| 23 | 
            -
                    abort_if_pending_migrations!
         | 
| 24 23 | 
             
                    load_dsl_compilers
         | 
| 25 24 | 
             
                  end
         | 
| 26 25 |  | 
| @@ -70,17 +69,6 @@ module Tapioca | |
| 70 69 |  | 
| 71 70 | 
             
                    say("Done", :green)
         | 
| 72 71 | 
             
                  end
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                  sig { void }
         | 
| 75 | 
            -
                  def abort_if_pending_migrations!
         | 
| 76 | 
            -
                    return unless File.exist?("#{@app_root}/config/application.rb")
         | 
| 77 | 
            -
                    return unless defined?(::Rake)
         | 
| 78 | 
            -
             | 
| 79 | 
            -
                    Rails.application.load_tasks
         | 
| 80 | 
            -
                    if Rake::Task.task_defined?("db:abort_if_pending_migrations")
         | 
| 81 | 
            -
                      Rake::Task["db:abort_if_pending_migrations"].invoke
         | 
| 82 | 
            -
                    end
         | 
| 83 | 
            -
                  end
         | 
| 84 72 | 
             
                end
         | 
| 85 73 | 
             
              end
         | 
| 86 74 | 
             
            end
         | 
| @@ -48,11 +48,15 @@ module Tapioca | |
| 48 48 | 
             
                    eager_load_rails_app if eager_load
         | 
| 49 49 | 
             
                  rescue LoadError, StandardError => e
         | 
| 50 50 | 
             
                    say(
         | 
| 51 | 
            -
                      " | 
| 51 | 
            +
                      "\nTapioca attempted to load the Rails application after encountering a `config/application.rb` file, " \
         | 
| 52 52 | 
             
                        "but it failed. If your application uses Rails please ensure it can be loaded correctly before " \
         | 
| 53 53 | 
             
                        "generating RBIs.\n#{e}",
         | 
| 54 54 | 
             
                      :yellow,
         | 
| 55 55 | 
             
                    )
         | 
| 56 | 
            +
                    if e.backtrace
         | 
| 57 | 
            +
                      backtrace = T.must(e.backtrace).join("\n")
         | 
| 58 | 
            +
                      say(backtrace, :cyan) # TODO: Check verbose flag to print backtrace.
         | 
| 59 | 
            +
                    end
         | 
| 56 60 | 
             
                    say("Continuing RBI generation without loading the Rails application.")
         | 
| 57 61 | 
             
                  end
         | 
| 58 62 |  | 
    
        data/lib/tapioca/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: tapioca
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.11. | 
| 4 | 
            +
              version: 0.11.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ufuk Kayserilioglu
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: exe
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2023- | 
| 14 | 
            +
            date: 2023-03-10 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: bundler
         |