maintenance_tasks 2.8.0 → 2.9.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/README.md +19 -2
- data/app/helpers/maintenance_tasks/tasks_helper.rb +29 -5
- data/app/models/maintenance_tasks/run.rb +13 -33
- data/lib/patches/active_record_batch_enumerator.rb +17 -16
- metadata +13 -13
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f05710c874610ef0698738773b70923d2e6a4ec4ae4b452ac768b6bf2e696d2c
         | 
| 4 | 
            +
              data.tar.gz: 2ab31dae65aa383d5edbccee747199960f5167cd33833230c044fd00f0ad6cfc
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8f0f7eee33cc6615f658f49ec9d74322f7952f2afa47b4b539dd0a49131cea10df15f072402d51d611bbfbf4d8d297ace54da1896ab457e54280bc17284641c9
         | 
| 7 | 
            +
              data.tar.gz: af3992b2c6de8c8b70d840d8c06d6a8cb2646063a9b23222a1814bfc1cc7866a9745277aafe32ef8ee48627b7916e51c672c9321be87a49a5efd443f353722fc
         | 
    
        data/README.md
    CHANGED
    
    | @@ -485,6 +485,23 @@ to run. Since arguments are specified in the user interface via text area | |
| 485 485 | 
             
            inputs, it’s important to check that they conform to the format your Task
         | 
| 486 486 | 
             
            expects, and to sanitize any inputs if necessary.
         | 
| 487 487 |  | 
| 488 | 
            +
            #### Validating Task Parameters
         | 
| 489 | 
            +
             | 
| 490 | 
            +
            Task attributes can be validated using Active Model Validations. Attributes are
         | 
| 491 | 
            +
            validated before a Task is enqueued.
         | 
| 492 | 
            +
             | 
| 493 | 
            +
            If an attribute uses an inclusion validator with a supported `in:` option, the
         | 
| 494 | 
            +
            set of values will be used to populate a dropdown in the user interface. The
         | 
| 495 | 
            +
            following types are supported:
         | 
| 496 | 
            +
             | 
| 497 | 
            +
            * Arrays
         | 
| 498 | 
            +
            * Procs and lambdas that optionally accept the Task instance, and return an Array.
         | 
| 499 | 
            +
            * Callable objects that receive one argument, the Task instance, and return an Array.
         | 
| 500 | 
            +
            * Methods that return an Array, called on the Task instance.
         | 
| 501 | 
            +
             | 
| 502 | 
            +
            For enumerables that don't match the supported types, a text field will be
         | 
| 503 | 
            +
            rendered instead.
         | 
| 504 | 
            +
             | 
| 488 505 | 
             
            ### Custom cursor columns to improve performance
         | 
| 489 506 |  | 
| 490 507 | 
             
            The [job-iteration gem][job-iteration], on which this gem depends, adds an
         | 
| @@ -541,8 +558,8 @@ your application. | |
| 541 558 |  | 
| 542 559 | 
             
            Usage example:
         | 
| 543 560 |  | 
| 544 | 
            -
             | 
| 545 | 
            -
             | 
| 561 | 
            +
            ```ruby
         | 
| 562 | 
            +
            ActiveSupport::Notifications.subscribe("succeeded.maintenance_tasks") do |*, payload|
         | 
| 546 563 | 
             
              task_name = payload[:task_name]
         | 
| 547 564 | 
             
              arguments = payload[:arguments]
         | 
| 548 565 | 
             
              metadata = payload[:metadata]
         | 
| @@ -102,8 +102,13 @@ module MaintenanceTasks | |
| 102 102 | 
             
                end
         | 
| 103 103 |  | 
| 104 104 | 
             
                # Resolves values covered by the inclusion validator for a task attribute.
         | 
| 105 | 
            -
                #  | 
| 106 | 
            -
                #  | 
| 105 | 
            +
                # Supported option types:
         | 
| 106 | 
            +
                # - Arrays
         | 
| 107 | 
            +
                # - Procs and lambdas that optionally accept the Task instance, and return an Array.
         | 
| 108 | 
            +
                # - Callable objects that receive one argument, the Task instance, and return an Array.
         | 
| 109 | 
            +
                # - Methods that return an Array, called on the Task instance.
         | 
| 110 | 
            +
                #
         | 
| 111 | 
            +
                # Other types are not supported and will return nil.
         | 
| 107 112 | 
             
                #
         | 
| 108 113 | 
             
                # Returned values are used to populate a dropdown list of options.
         | 
| 109 114 | 
             
                #
         | 
| @@ -111,20 +116,39 @@ module MaintenanceTasks | |
| 111 116 | 
             
                # @param parameter_name [String] The parameter name.
         | 
| 112 117 | 
             
                #
         | 
| 113 118 | 
             
                # @return [Array] value of the resolved inclusion option.
         | 
| 114 | 
            -
                def resolve_inclusion_value( | 
| 119 | 
            +
                def resolve_inclusion_value(task, parameter_name)
         | 
| 120 | 
            +
                  task_class = task.class
         | 
| 115 121 | 
             
                  inclusion_validator = task_class.validators_on(parameter_name).find do |validator|
         | 
| 116 122 | 
             
                    validator.kind == :inclusion
         | 
| 117 123 | 
             
                  end
         | 
| 118 124 | 
             
                  return unless inclusion_validator
         | 
| 119 125 |  | 
| 120 126 | 
             
                  in_option = inclusion_validator.options[:in] || inclusion_validator.options[:within]
         | 
| 121 | 
            -
                   | 
| 127 | 
            +
                  resolved_in_option = case in_option
         | 
| 128 | 
            +
                  when Proc
         | 
| 129 | 
            +
                    if in_option.arity == 0
         | 
| 130 | 
            +
                      in_option.call
         | 
| 131 | 
            +
                    else
         | 
| 132 | 
            +
                      in_option.call(task)
         | 
| 133 | 
            +
                    end
         | 
| 134 | 
            +
                  when Symbol
         | 
| 135 | 
            +
                    method = task.method(in_option)
         | 
| 136 | 
            +
                    method.call if method.arity.zero?
         | 
| 137 | 
            +
                  else
         | 
| 138 | 
            +
                    if in_option.respond_to?(:call)
         | 
| 139 | 
            +
                      in_option.call(task)
         | 
| 140 | 
            +
                    else
         | 
| 141 | 
            +
                      in_option
         | 
| 142 | 
            +
                    end
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  resolved_in_option if resolved_in_option.is_a?(Array)
         | 
| 122 146 | 
             
                end
         | 
| 123 147 |  | 
| 124 148 | 
             
                # Return the appropriate field tag for the parameter, based on its type.
         | 
| 125 149 | 
             
                # If the parameter has a `validates_inclusion_of` validator, return a dropdown list of options instead.
         | 
| 126 150 | 
             
                def parameter_field(form_builder, parameter_name)
         | 
| 127 | 
            -
                  inclusion_values = resolve_inclusion_value(form_builder.object | 
| 151 | 
            +
                  inclusion_values = resolve_inclusion_value(form_builder.object, parameter_name)
         | 
| 128 152 | 
             
                  return form_builder.select(parameter_name, inclusion_values, prompt: "Select a value") if inclusion_values
         | 
| 129 153 |  | 
| 130 154 | 
             
                  case form_builder.object.class.attribute_types[parameter_name]
         | 
| @@ -386,40 +386,20 @@ module MaintenanceTasks | |
| 386 386 | 
             
                  nil
         | 
| 387 387 | 
             
                end
         | 
| 388 388 |  | 
| 389 | 
            -
                #  | 
| 390 | 
            -
                #  | 
| 391 | 
            -
                 | 
| 392 | 
            -
                   | 
| 393 | 
            -
                   | 
| 394 | 
            -
             | 
| 395 | 
            -
             | 
| 396 | 
            -
                     | 
| 397 | 
            -
                       | 
| 398 | 
            -
             | 
| 399 | 
            -
             | 
| 400 | 
            -
                        :arguments,
         | 
| 401 | 
            -
                        "are invalid: #{error_messages.join("; ")}",
         | 
| 402 | 
            -
                      )
         | 
| 403 | 
            -
                    end
         | 
| 404 | 
            -
                  rescue Task::NotFoundError
         | 
| 405 | 
            -
                    nil
         | 
| 406 | 
            -
                  end
         | 
| 407 | 
            -
                else
         | 
| 408 | 
            -
                  # Performs validation on the arguments to use for the Task. If the Task is
         | 
| 409 | 
            -
                  # invalid, the errors are added to the Run.
         | 
| 410 | 
            -
                  def validate_task_arguments
         | 
| 411 | 
            -
                    arguments_match_task_attributes if arguments.present?
         | 
| 412 | 
            -
                    if task.invalid?
         | 
| 413 | 
            -
                      error_messages = task.errors
         | 
| 414 | 
            -
                        .map { |error| "#{error.attribute.inspect} #{error.message}" }
         | 
| 415 | 
            -
                      errors.add(
         | 
| 416 | 
            -
                        :arguments,
         | 
| 417 | 
            -
                        "are invalid: #{error_messages.join("; ")}",
         | 
| 418 | 
            -
                      )
         | 
| 419 | 
            -
                    end
         | 
| 420 | 
            -
                  rescue Task::NotFoundError
         | 
| 421 | 
            -
                    nil
         | 
| 389 | 
            +
                # Performs validation on the arguments to use for the Task. If the Task is
         | 
| 390 | 
            +
                # invalid, the errors are added to the Run.
         | 
| 391 | 
            +
                def validate_task_arguments
         | 
| 392 | 
            +
                  arguments_match_task_attributes if arguments.present?
         | 
| 393 | 
            +
                  if task.invalid?
         | 
| 394 | 
            +
                    error_messages = task.errors
         | 
| 395 | 
            +
                      .map { |error| "#{error.attribute.inspect} #{error.message}" }
         | 
| 396 | 
            +
                    errors.add(
         | 
| 397 | 
            +
                      :arguments,
         | 
| 398 | 
            +
                      "are invalid: #{error_messages.join("; ")}",
         | 
| 399 | 
            +
                    )
         | 
| 422 400 | 
             
                  end
         | 
| 401 | 
            +
                rescue Task::NotFoundError
         | 
| 402 | 
            +
                  nil
         | 
| 423 403 | 
             
                end
         | 
| 424 404 |  | 
| 425 405 | 
             
                # Fetches the attached ActiveStorage CSV file for the run. Checks first
         | 
| @@ -1,23 +1,24 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
            #  | 
| 5 | 
            -
            module ActiveRecordBatchEnumerator
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 3 | 
            +
            if Rails.gem_version < Gem::Version.new("7.0")
         | 
| 4 | 
            +
              # Add attribute readers.
         | 
| 5 | 
            +
              module ActiveRecordBatchEnumerator
         | 
| 6 | 
            +
                # The primary key value from which the BatchEnumerator starts,
         | 
| 7 | 
            +
                #   inclusive of the value.
         | 
| 8 | 
            +
                attr_reader :start
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 10 | 
            +
                # The primary key value at which the BatchEnumerator ends,
         | 
| 11 | 
            +
                #   inclusive of the value.
         | 
| 12 | 
            +
                attr_reader :finish
         | 
| 13 13 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 14 | 
            +
                # The relation from which the BatchEnumerator yields batches.
         | 
| 15 | 
            +
                attr_reader :relation
         | 
| 16 16 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 17 | 
            +
                # The size of the batches yielded by the BatchEnumerator.
         | 
| 18 | 
            +
                def batch_size
         | 
| 19 | 
            +
                  @of
         | 
| 20 | 
            +
                end
         | 
| 20 21 | 
             
              end
         | 
| 21 | 
            -
            end
         | 
| 22 22 |  | 
| 23 | 
            -
            ActiveRecord::Batches::BatchEnumerator.include(ActiveRecordBatchEnumerator)
         | 
| 23 | 
            +
              ActiveRecord::Batches::BatchEnumerator.include(ActiveRecordBatchEnumerator)
         | 
| 24 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: maintenance_tasks
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.9.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Shopify Engineering
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024- | 
| 11 | 
            +
            date: 2024-11-15 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: actionpack
         | 
| @@ -16,42 +16,42 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: '6. | 
| 19 | 
            +
                    version: '6.1'
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - ">="
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: '6. | 
| 26 | 
            +
                    version: '6.1'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: activejob
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ">="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '6. | 
| 33 | 
            +
                    version: '6.1'
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - ">="
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: '6. | 
| 40 | 
            +
                    version: '6.1'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: activerecord
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - ">="
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: '6. | 
| 47 | 
            +
                    version: '6.1'
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - ">="
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: '6. | 
| 54 | 
            +
                    version: '6.1'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: csv
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -86,14 +86,14 @@ dependencies: | |
| 86 86 | 
             
                requirements:
         | 
| 87 87 | 
             
                - - ">="
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: '6. | 
| 89 | 
            +
                    version: '6.1'
         | 
| 90 90 | 
             
              type: :runtime
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 94 | 
             
                - - ">="
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: '6. | 
| 96 | 
            +
                    version: '6.1'
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: zeitwerk
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -185,7 +185,7 @@ homepage: https://github.com/Shopify/maintenance_tasks | |
| 185 185 | 
             
            licenses:
         | 
| 186 186 | 
             
            - MIT
         | 
| 187 187 | 
             
            metadata:
         | 
| 188 | 
            -
              source_code_uri: https://github.com/Shopify/maintenance_tasks/tree/v2. | 
| 188 | 
            +
              source_code_uri: https://github.com/Shopify/maintenance_tasks/tree/v2.9.0
         | 
| 189 189 | 
             
              allowed_push_host: https://rubygems.org
         | 
| 190 190 | 
             
            post_install_message:
         | 
| 191 191 | 
             
            rdoc_options: []
         | 
| @@ -195,14 +195,14 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 195 195 | 
             
              requirements:
         | 
| 196 196 | 
             
              - - ">="
         | 
| 197 197 | 
             
                - !ruby/object:Gem::Version
         | 
| 198 | 
            -
                  version: '3. | 
| 198 | 
            +
                  version: '3.1'
         | 
| 199 199 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 200 200 | 
             
              requirements:
         | 
| 201 201 | 
             
              - - ">="
         | 
| 202 202 | 
             
                - !ruby/object:Gem::Version
         | 
| 203 203 | 
             
                  version: '0'
         | 
| 204 204 | 
             
            requirements: []
         | 
| 205 | 
            -
            rubygems_version: 3.5. | 
| 205 | 
            +
            rubygems_version: 3.5.23
         | 
| 206 206 | 
             
            signing_key:
         | 
| 207 207 | 
             
            specification_version: 4
         | 
| 208 208 | 
             
            summary: A Rails engine for queuing and managing maintenance tasks
         |