sidekiq_admin_enquerer 0.0.0 → 0.1.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 +5 -1
- data/Gemfile.lock +1 -1
- data/README.md +18 -0
- data/lib/sidekiq_admin_enquerer/pages/job.erb +34 -0
- data/lib/sidekiq_admin_enquerer/pages/jobs.erb +27 -0
- data/lib/sidekiq_admin_enquerer/version.rb +1 -1
- data/lib/sidekiq_admin_enquerer/web_app/app_control.rb +37 -0
- data/lib/sidekiq_admin_enquerer/web_app/job_method_wrapper.rb +65 -0
- data/lib/sidekiq_admin_enquerer/web_app/job_param_wrapper.rb +69 -0
- data/lib/sidekiq_admin_enquerer/web_app/job_wrapper.rb +37 -0
- data/lib/sidekiq_admin_enquerer/web_app/web_helpers.rb +40 -0
- data/lib/sidekiq_admin_enquerer/web_app.rb +46 -0
- data/lib/sidekiq_admin_enquerer.rb +84 -0
- metadata +10 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 90f5930895e062f99665e5740778c3e658a2b5f15f9c1831715383b8471ae098
         | 
| 4 | 
            +
              data.tar.gz: d405c2ee9b8f34e89a2f059f32765dbe7592cd8bd7db75916b04cf915c47c0c2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9c0d22153004c8e1133bd48e21f857d7fe085dbaad06557efea53acafed02caab4ae0066b6394f6b1c4dd2cdf2bbe8ff2dd400cdab9df1b1523853dd3d78b9bc
         | 
| 7 | 
            +
              data.tar.gz: 63449fc65d48d4d5e83d9bbd82e87b5da352c920d592f3e3ef8ebbc1a37c9af0d4fa495e62a32449632452593b101f67283616df6ee9b580549f6482c7c942c6
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -8,6 +8,12 @@ | |
| 8 8 | 
             
            - [License](#license)
         | 
| 9 9 | 
             
            - [Authors](#authors)
         | 
| 10 10 |  | 
| 11 | 
            +
            # TODO:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            - interactive UI tabs for each performing method (sidekiq's UI has no jquery and bootstrap-js integrations);
         | 
| 14 | 
            +
            - job invocation rework (support for kwarg invocation and analysis of passed attributes);
         | 
| 15 | 
            +
            - specs;
         | 
| 16 | 
            +
             | 
| 11 17 | 
             
            ## Installation
         | 
| 12 18 |  | 
| 13 19 | 
             
            ```ruby
         | 
| @@ -26,6 +32,18 @@ require 'sidekiq_admin_enquerer' | |
| 26 32 |  | 
| 27 33 | 
             
            ## Usage
         | 
| 28 34 |  | 
| 35 | 
            +
            - it is assumed that you are using `Rails`;
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            ```ruby
         | 
| 38 | 
            +
            # config/initializers/sidekiq.rb
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            # ...your sidekiq configs...
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            SidekiqAdminEnqueuer.load
         | 
| 43 | 
            +
            ```
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            - navigate to `/your-sidekiq-path/enqueuer`
         | 
| 46 | 
            +
             | 
| 29 47 | 
             
            ---
         | 
| 30 48 |  | 
| 31 49 | 
             
            ## Development
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            <h3>Enqueue Job</h3>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            <!-- TODO: add interactive tabs (for each performing method) -->
         | 
| 4 | 
            +
            <!-- NOTE: sidekiq's UI has no jquery and bootstrap-js integrations -->
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            <% @job.methods.each do |job_method| %>
         | 
| 7 | 
            +
              <div class="form-group"><%= job_method.name %></div>
         | 
| 8 | 
            +
              <form method="post" action="<%= side_enq__enqueue_job_path %>">
         | 
| 9 | 
            +
                <%= csrf_tag if respond_to?(:csrf_tag) %>
         | 
| 10 | 
            +
                <input class="form-control" name="perform_method" value="<%= job_method.name %>" readonly />
         | 
| 11 | 
            +
                <input class="form-control" name="job_name" value="<%= @job.name %>" readonly />
         | 
| 12 | 
            +
                <% job_method.params.each do |job_param| %>
         | 
| 13 | 
            +
                  <div class="form-group">
         | 
| 14 | 
            +
                    <label for="<%= job_method.name %>[<%= job_param.name %>]">
         | 
| 15 | 
            +
                      <b><%= side_enq__param_requirement(job_param) %></b>: <%= job_param.name %>
         | 
| 16 | 
            +
                    </label>
         | 
| 17 | 
            +
                    <input class="form-control" name="<%= job_method.name %>[<%= job_param.name %>]" />
         | 
| 18 | 
            +
                  </div>
         | 
| 19 | 
            +
                <% end %>
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                <div class="form-group">
         | 
| 22 | 
            +
                  <input type="submit" class="btn btn-danger" name="submit" value="enqueue" />
         | 
| 23 | 
            +
                </div>
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                <div class="form-group">
         | 
| 26 | 
            +
                  <label for="enqueue_in">Schedule</label>
         | 
| 27 | 
            +
                  <input class="form-control" name="enqueue_in" placeholder="in seconds" />
         | 
| 28 | 
            +
                </div>
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                <input type="submit" class="btn btn-danger" name="submit" value="schedule" />
         | 
| 31 | 
            +
              </form>
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              <hr />
         | 
| 34 | 
            +
            <% end %>
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            <h3>Jobs</h3>
         | 
| 2 | 
            +
            <table class="table table-hover table-bordered table-striped">
         | 
| 3 | 
            +
              <thead>
         | 
| 4 | 
            +
                <tr>
         | 
| 5 | 
            +
                  <th>Name</th>
         | 
| 6 | 
            +
                  <th>Method Parameters</th>
         | 
| 7 | 
            +
                  <th>Actions</th>
         | 
| 8 | 
            +
                </tr>
         | 
| 9 | 
            +
              </thead>
         | 
| 10 | 
            +
              <tbody>
         | 
| 11 | 
            +
                <% @jobs.each do |job| %>
         | 
| 12 | 
            +
                  <tr>
         | 
| 13 | 
            +
                    <td><%= job.name %></td>
         | 
| 14 | 
            +
                    <td>
         | 
| 15 | 
            +
                      <% job.methods.each do |job_method| %>
         | 
| 16 | 
            +
                        <div><b><%= job_method.name %></b>: <%= side_enq__method_params(job_method) %></div>
         | 
| 17 | 
            +
                      <% end %>
         | 
| 18 | 
            +
                    </td>
         | 
| 19 | 
            +
                    <td>
         | 
| 20 | 
            +
                      <a class="btn btn-danger btn-xs" href="<%= side_enq__enqueue_path(job) %>">
         | 
| 21 | 
            +
                        Enqueue
         | 
| 22 | 
            +
                      </a>
         | 
| 23 | 
            +
                    </td>
         | 
| 24 | 
            +
                  </tr>
         | 
| 25 | 
            +
                <% end %>
         | 
| 26 | 
            +
              </tbody>
         | 
| 27 | 
            +
            </table>
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module SidekiqAdminEnquerer::WebApp
         | 
| 4 | 
            +
              # @api private
         | 
| 5 | 
            +
              # @since 0.1.0
         | 
| 6 | 
            +
              module AppControl
         | 
| 7 | 
            +
                class << self
         | 
| 8 | 
            +
                  # @return [Array<SidekiqAdminEnquerer::WebApp::JobWrapper>]
         | 
| 9 | 
            +
                  #
         | 
| 10 | 
            +
                  # @api private
         | 
| 11 | 
            +
                  # @since 0.1.0
         | 
| 12 | 
            +
                  def jobs
         | 
| 13 | 
            +
                    SidekiqAdminEnquerer.jobs.map { JobWrapper.new(_1) }
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  # @param job_name [String]
         | 
| 17 | 
            +
                  # @return [SidekiqAdminEnquerer::WebApp::JobWrapper]
         | 
| 18 | 
            +
                  #
         | 
| 19 | 
            +
                  # @api private
         | 
| 20 | 
            +
                  # @since 0.1.0
         | 
| 21 | 
            +
                  def find_job(job_name)
         | 
| 22 | 
            +
                    SidekiqAdminEnquerer.find_job(job_name).yield_self { JobWrapper.new(_1) }
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  # @param job_run_params [Hash<Symbol,Any>]
         | 
| 26 | 
            +
                  # @return [void]
         | 
| 27 | 
            +
                  #
         | 
| 28 | 
            +
                  # @api private
         | 
| 29 | 
            +
                  # @since 0.1.0
         | 
| 30 | 
            +
                  def run_job(job_run_params)
         | 
| 31 | 
            +
                    job_name = job_run_params[:job_name]
         | 
| 32 | 
            +
                    job_klass = SidekiqAdminEnquerer.find_job(job_name)
         | 
| 33 | 
            +
                    SidekiqAdminEnquerer.run_job(job_klass, job_run_params)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api private
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            class SidekiqAdminEnquerer::WebApp::JobMethodWrapper
         | 
| 6 | 
            +
              # @return [Array<Symbol>]
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @api private
         | 
| 9 | 
            +
              # @since 0.1.0
         | 
| 10 | 
            +
              JOB_INVOCATION_METHODS = %i[
         | 
| 11 | 
            +
                perform
         | 
| 12 | 
            +
                perform_in
         | 
| 13 | 
            +
                perform_async
         | 
| 14 | 
            +
                perform_at
         | 
| 15 | 
            +
              ].freeze
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              class << self
         | 
| 18 | 
            +
                # @param job [Class<ActiveJob::Base>, Class<Sidekiq::Worker]
         | 
| 19 | 
            +
                # @return [Array<SidekiqAdminEnquerer::WebApp::JobMethodWrapper>]
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                # @api private
         | 
| 22 | 
            +
                # @since 0.1.0
         | 
| 23 | 
            +
                def extract_methods_from(job)
         | 
| 24 | 
            +
                  job.instance_methods.select do |method|
         | 
| 25 | 
            +
                    JOB_INVOCATION_METHODS.include?(method)
         | 
| 26 | 
            +
                  end.each_with_object([]) do |method, aggregate|
         | 
| 27 | 
            +
                    parameters = job.instance_method(method).parameters.map do |(req, name)|
         | 
| 28 | 
            +
                      SidekiqAdminEnquerer::WebApp::JobParamWrapper.new(job, method, name, req)
         | 
| 29 | 
            +
                    end # => Array<JobParamWrapper>
         | 
| 30 | 
            +
                    aggregate << new(job, method, parameters) # => JobMethodWrapper
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              # @return [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 36 | 
            +
              #
         | 
| 37 | 
            +
              # @api private
         | 
| 38 | 
            +
              # @since 0.1.0
         | 
| 39 | 
            +
              attr_reader :job
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              # @return [Symbol]
         | 
| 42 | 
            +
              #
         | 
| 43 | 
            +
              # @api private
         | 
| 44 | 
            +
              # @since 0.1.0
         | 
| 45 | 
            +
              attr_reader :name
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              # @return [Array<SidekiqAdminEnquerer::WebApp::JobParamWrapper>]
         | 
| 48 | 
            +
              #
         | 
| 49 | 
            +
              # @api private
         | 
| 50 | 
            +
              # @since 0.1.0
         | 
| 51 | 
            +
              attr_reader :params
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              # @param job [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 54 | 
            +
              # @param name [Symbol]
         | 
| 55 | 
            +
              # @param params [Array<SidekiqAdminEnquerer::WebApp::JobParamWrapper>]
         | 
| 56 | 
            +
              # @return [void]
         | 
| 57 | 
            +
              #
         | 
| 58 | 
            +
              # @api private
         | 
| 59 | 
            +
              # @since 0.1.0
         | 
| 60 | 
            +
              def initialize(job, name, params)
         | 
| 61 | 
            +
                @job = job
         | 
| 62 | 
            +
                @name = name
         | 
| 63 | 
            +
                @params = params
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api private
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            class SidekiqAdminEnquerer::WebApp::JobParamWrapper
         | 
| 6 | 
            +
              # @return [Symbol]
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @api private
         | 
| 9 | 
            +
              # @since 0.1.0
         | 
| 10 | 
            +
              attr_reader :name
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              # @return [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # @api private
         | 
| 15 | 
            +
              # @since 0.1.0
         | 
| 16 | 
            +
              attr_reader :job
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              # @return [Symbol]
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              # @api private
         | 
| 21 | 
            +
              # @since 0.1.0
         | 
| 22 | 
            +
              attr_reader :req
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              # @param job [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 25 | 
            +
              # @param method [Symbol]
         | 
| 26 | 
            +
              # @param name [Symbol]
         | 
| 27 | 
            +
              # @param req [Symbol]
         | 
| 28 | 
            +
              # @return [void]
         | 
| 29 | 
            +
              #
         | 
| 30 | 
            +
              # @api private
         | 
| 31 | 
            +
              # @since 0.1.0
         | 
| 32 | 
            +
              def initialize(job, method, name, req)
         | 
| 33 | 
            +
                @job = job
         | 
| 34 | 
            +
                @name = name
         | 
| 35 | 
            +
                @req = req
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              # @return [Boolean]
         | 
| 39 | 
            +
              #
         | 
| 40 | 
            +
              # @api private
         | 
| 41 | 
            +
              # @since 0.1.0
         | 
| 42 | 
            +
              def optional?
         | 
| 43 | 
            +
                req == :key || req == :opt
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              # @return [Boolean]
         | 
| 47 | 
            +
              #
         | 
| 48 | 
            +
              # @api private
         | 
| 49 | 
            +
              # @since 0.1.0
         | 
| 50 | 
            +
              def required?
         | 
| 51 | 
            +
                req == :keyreq || req == :req
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              # @return [Boolean]
         | 
| 55 | 
            +
              #
         | 
| 56 | 
            +
              # @api private
         | 
| 57 | 
            +
              # @since 0.1.0
         | 
| 58 | 
            +
              def kwarg_attr?
         | 
| 59 | 
            +
                req == :key || req == :keyreq
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              # @return [Boolean]
         | 
| 63 | 
            +
              #
         | 
| 64 | 
            +
              # @api private
         | 
| 65 | 
            +
              # @since 0.1.0
         | 
| 66 | 
            +
              def named_attr?
         | 
| 67 | 
            +
                req == :opt || req == :req
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api private
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            class SidekiqAdminEnquerer::WebApp::JobWrapper
         | 
| 6 | 
            +
              # @return [Array<SidekiqAdminEnquerer::WebApp::JobMethodWrapper>]
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @api private
         | 
| 9 | 
            +
              # @since 0.1.0
         | 
| 10 | 
            +
              attr_reader :methods
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              # @param job [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 13 | 
            +
              # @return [void]
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # @api private
         | 
| 16 | 
            +
              # @since 0.1.0
         | 
| 17 | 
            +
              def initialize(job)
         | 
| 18 | 
            +
                @job = job
         | 
| 19 | 
            +
                @methods = SidekiqAdminEnquerer::WebApp::JobMethodWrapper.extract_methods_from(job)
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              # @return [String]
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              # @api private
         | 
| 25 | 
            +
              # @since 0.1.0
         | 
| 26 | 
            +
              def name
         | 
| 27 | 
            +
                job.name
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              # @return [Class<ActiveJob::Base>, Class<Sidekiq::Worker>]
         | 
| 33 | 
            +
              #
         | 
| 34 | 
            +
              # @api private
         | 
| 35 | 
            +
              # @since 0.1.0
         | 
| 36 | 
            +
              attr_reader :job
         | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,40 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api private
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            module SidekiqAdminEnquerer::WebApp::WebHelpers
         | 
| 6 | 
            +
              # @param job [SidekiqAdminEnquerer::WebApp::JobWrapper]
         | 
| 7 | 
            +
              # @return [String]
         | 
| 8 | 
            +
              #
         | 
| 9 | 
            +
              # @api private
         | 
| 10 | 
            +
              # @since 0.1.0
         | 
| 11 | 
            +
              def side_enq__enqueue_path(job)
         | 
| 12 | 
            +
                "#{root_path}enqueuer/#{job.name}"
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              # @return [String]
         | 
| 16 | 
            +
              #
         | 
| 17 | 
            +
              # @api private
         | 
| 18 | 
            +
              # @since 0.1.0
         | 
| 19 | 
            +
              def side_enq__enqueue_job_path
         | 
| 20 | 
            +
                "#{root_path}enqueuer"
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              # @param job_method [SidekiqAdminEnquerer::WebApp::JobMethodWrapper]
         | 
| 24 | 
            +
              # @return [String]
         | 
| 25 | 
            +
              #
         | 
| 26 | 
            +
              # @api private
         | 
| 27 | 
            +
              # @since 0.1.0
         | 
| 28 | 
            +
              def side_enq__method_params(job_method)
         | 
| 29 | 
            +
                job_method.params.map(&:name).join(', ')
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              # @param job_param [SidekiqAdminEnquerer::WebApp::JobParamWrapper]
         | 
| 33 | 
            +
              # @return [String]
         | 
| 34 | 
            +
              #
         | 
| 35 | 
            +
              # @api private
         | 
| 36 | 
            +
              # @since 0.1.0
         | 
| 37 | 
            +
              def side_enq__param_requirement(job_param)
         | 
| 38 | 
            +
                job_param.required? ? 'required' : 'optional'
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # @api private
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 5 | 
            +
            module SidekiqAdminEnquerer::WebApp
         | 
| 6 | 
            +
              require_relative 'web_app/web_helpers'
         | 
| 7 | 
            +
              require_relative 'web_app/job_param_wrapper'
         | 
| 8 | 
            +
              require_relative 'web_app/job_method_wrapper'
         | 
| 9 | 
            +
              require_relative 'web_app/job_wrapper'
         | 
| 10 | 
            +
              require_relative 'web_app/app_control'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              # @return [Hash<Symbol,String>]
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # @api private
         | 
| 15 | 
            +
              # @since 0.1.0
         | 
| 16 | 
            +
              TEMPLATES = {
         | 
| 17 | 
            +
                jobs: File.read(File.join(File.expand_path(__dir__), 'pages', 'jobs.erb')),
         | 
| 18 | 
            +
                job: File.read(File.join(File.expand_path(__dir__), 'pages', 'job.erb'))
         | 
| 19 | 
            +
              }.freeze
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              class << self
         | 
| 22 | 
            +
                # @param app [?]
         | 
| 23 | 
            +
                # @return [void]
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # @api private
         | 
| 26 | 
            +
                # @since 0.1.0
         | 
| 27 | 
            +
                def registered(app)
         | 
| 28 | 
            +
                  app.helpers(WebHelpers)
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  app.get('/enqueuer') do
         | 
| 31 | 
            +
                    @jobs = AppControl.jobs
         | 
| 32 | 
            +
                    render(:erb, TEMPLATES[:jobs])
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  app.get('/enqueuer/:job_name') do
         | 
| 36 | 
            +
                    @job = AppControl.find_job(params[:job_name])
         | 
| 37 | 
            +
                    render(:erb, TEMPLATES[:job])
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  app.post('/enqueuer') do
         | 
| 41 | 
            +
                    AppControl.run_job(params)
         | 
| 42 | 
            +
                    redirect File.join(root_path, 'enqueuer')
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| @@ -1,5 +1,89 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            # @api public
         | 
| 4 | 
            +
            # @since 0.1.0
         | 
| 3 5 | 
             
            module SidekiqAdminEnquerer
         | 
| 4 6 | 
             
              require_relative 'sidekiq_admin_enquerer/version'
         | 
| 7 | 
            +
              require_relative 'sidekiq_admin_enquerer/web_app'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              # @return [Array<String>]
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # @api private
         | 
| 12 | 
            +
              # @since 0.1.0
         | 
| 13 | 
            +
              JOB_SKIP_LIST = %w[
         | 
| 14 | 
            +
                Sidekiq::Extensions::DelayedModel
         | 
| 15 | 
            +
                Sidekiq::Extensions::DelayedMailer
         | 
| 16 | 
            +
                Sidekiq::Extensions::DelayedClass
         | 
| 17 | 
            +
                ApplicationJob
         | 
| 18 | 
            +
                ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper
         | 
| 19 | 
            +
              ].freeze
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              class << self
         | 
| 22 | 
            +
                # @return [Array<Class<ActiveJob::Base>,Class<Sidekiq::Worker>>]
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                # @api private
         | 
| 25 | 
            +
                # @since 0.1.0
         | 
| 26 | 
            +
                def jobs
         | 
| 27 | 
            +
                  Rails.application.eager_load!
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  ObjectSpace.each_object(Class).select do |job_klass|
         | 
| 30 | 
            +
                    next if job_klass.singleton_class?
         | 
| 31 | 
            +
                    next if JOB_SKIP_LIST.any? { job_klass.to_s.include?(_1) }
         | 
| 32 | 
            +
                    job_klass < ActiveJob::Base || job_klass.included_modules.include?(Sidekiq::Worker)
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # @param job_name [String]
         | 
| 37 | 
            +
                # @return [Class<ActiveJob::Base>,Class<Sidekiq::Worker>]
         | 
| 38 | 
            +
                #
         | 
| 39 | 
            +
                # @api private
         | 
| 40 | 
            +
                # @since 0.1.0
         | 
| 41 | 
            +
                def find_job(job_name)
         | 
| 42 | 
            +
                  jobs.find { _1.name == job_name || _1.to_s == job_name }
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # @param job [?]
         | 
| 46 | 
            +
                # @param params [?]
         | 
| 47 | 
            +
                # @return [void]
         | 
| 48 | 
            +
                #
         | 
| 49 | 
            +
                # @api private
         | 
| 50 | 
            +
                # @since 0.1.0
         | 
| 51 | 
            +
                # rubocop:disable Metrics/AbcSize
         | 
| 52 | 
            +
                def run_job(job, params)
         | 
| 53 | 
            +
                  # TODO: rework with attribute analysis
         | 
| 54 | 
            +
                  job_perform_method = params['perform_method']
         | 
| 55 | 
            +
                  job_params = params[job_perform_method]
         | 
| 56 | 
            +
                  job.respond_to?(:sidekiq_options) ? job.sidekiq_options['queue'].to_s : 'default'
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  if params['submit'] == 'enqueue'
         | 
| 59 | 
            +
                    case
         | 
| 60 | 
            +
                    when job < ActiveJob::Base
         | 
| 61 | 
            +
                      job.perform_later(*job_params.values)
         | 
| 62 | 
            +
                    when job_klass.included_modules.include?(Sidekiq::Worker)
         | 
| 63 | 
            +
                      Sidekiq::Client.enqueue_to(queue, job, *job_params.values)
         | 
| 64 | 
            +
                    end
         | 
| 65 | 
            +
                  elsif params['submit'] == 'schedule'
         | 
| 66 | 
            +
                    case
         | 
| 67 | 
            +
                    when job < ActiveJob::Base
         | 
| 68 | 
            +
                      job.set(wait: params['enqueue_in'].to_i.seconds).perform_later(*job_params.values)
         | 
| 69 | 
            +
                    when job_klass.included_modules.include?(Sidekiq::Worker)
         | 
| 70 | 
            +
                      Sidekiq::Client.enqueue_to_in(
         | 
| 71 | 
            +
                        queue, params['enqueue_in'].to_i.seconds, job, *job_params.values
         | 
| 72 | 
            +
                      )
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
                # rubocop:enable Metrics/AbcSize
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                # @return [void]
         | 
| 79 | 
            +
                #
         | 
| 80 | 
            +
                # @api public
         | 
| 81 | 
            +
                # @since 0.1.0
         | 
| 82 | 
            +
                def load
         | 
| 83 | 
            +
                  if defined?(Sidekiq::Web)
         | 
| 84 | 
            +
                    Sidekiq::Web.register(SidekiqAdminEnquerer::WebApp)
         | 
| 85 | 
            +
                    Sidekiq::Web.tabs['Enqueuer'] = 'enqueuer'
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
              end
         | 
| 5 89 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sidekiq_admin_enquerer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Rustam Ibragimov
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023-07- | 
| 11 | 
            +
            date: 2023-07-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -114,7 +114,15 @@ files: | |
| 114 114 | 
             
            - bin/console
         | 
| 115 115 | 
             
            - bin/setup
         | 
| 116 116 | 
             
            - lib/sidekiq_admin_enquerer.rb
         | 
| 117 | 
            +
            - lib/sidekiq_admin_enquerer/pages/job.erb
         | 
| 118 | 
            +
            - lib/sidekiq_admin_enquerer/pages/jobs.erb
         | 
| 117 119 | 
             
            - lib/sidekiq_admin_enquerer/version.rb
         | 
| 120 | 
            +
            - lib/sidekiq_admin_enquerer/web_app.rb
         | 
| 121 | 
            +
            - lib/sidekiq_admin_enquerer/web_app/app_control.rb
         | 
| 122 | 
            +
            - lib/sidekiq_admin_enquerer/web_app/job_method_wrapper.rb
         | 
| 123 | 
            +
            - lib/sidekiq_admin_enquerer/web_app/job_param_wrapper.rb
         | 
| 124 | 
            +
            - lib/sidekiq_admin_enquerer/web_app/job_wrapper.rb
         | 
| 125 | 
            +
            - lib/sidekiq_admin_enquerer/web_app/web_helpers.rb
         | 
| 118 126 | 
             
            - sidekiq_admin_enquerer.gemspec
         | 
| 119 127 | 
             
            homepage: https://github.com/0exp/sidekiq_admin_enquerer
         | 
| 120 128 | 
             
            licenses:
         |