sidekiq_adhoc_job 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c08df33b8e1dd616b297a6cc7af3b8e6a5766619bef5175a5d4bbbf673d14ca1
4
- data.tar.gz: 9b8adc3d77092e4901e379b9b73c3ae65f25dac7e301b3334b55a0f109903757
3
+ metadata.gz: e0eb1cd817107c67f9c597017c3fd7e0fc8e79cd783b934d3b6ebc0fb69f5224
4
+ data.tar.gz: deaae8c8f3de455976885dddd699fd29295cdcd0ae26a013bac38190d5d5e9a1
5
5
  SHA512:
6
- metadata.gz: f74a004d5b115ed9a545aa10eba699368e23e332da01dacab2e0cc09a0c786df67f5bab224213068f417fd878597018fe309d01299d45e0ef5b6cf60f6799c38
7
- data.tar.gz: 2249e2a24c8ff5eb6e9e65fa487e2bab255a7e176723b57f822cd8ca1158be6b437ee6d57600c879243daed97bf53340758bfab3dda271983a525c8e41955f9a
6
+ metadata.gz: a5955dc23c535cfe30380fb24dabfecaa95dfb8b1bdb251d9def1ddc47bd263f0dda19cca2a2dcbaa45edcf2c974d2bebd2a2fdd371e10e19d263be757478261
7
+ data.tar.gz: fdb6a47dc6c58d2054f6d6d21b6c10e67a9d38efe5bd76de5dca355df28125f569b6db1ddd4ca5c648faa948cfba2b8293541e1baa7685be6ec68b9984383843
@@ -10,28 +10,43 @@ module SidekiqAdhocJob
10
10
  end
11
11
  @worker_klass = WorkerClassesLoader.find_worker_klass(job_name)
12
12
  @worker_klass_inspector = Utils::ClassInspector.new(worker_klass)
13
- @allowed_params = worker_klass_inspector.required_parameters(:perform) + worker_klass_inspector.optional_parameters(:perform)
14
13
 
15
14
  parse_params
16
15
  end
17
16
 
18
17
  def call
19
- SidekiqAdhocJob.config.strategy.perform_async(worker_klass, *worker_params)
18
+ SidekiqAdhocJob.config.strategy.perform_async(worker_klass, *worker_positional_params, **worker_keyword_params)
20
19
  end
21
20
 
22
21
  private
23
22
 
24
- attr_reader :request_params, :worker_klass, :worker_klass_inspector,
25
- :allowed_params, :worker_params
23
+ attr_reader :request_params, :worker_klass, :worker_klass_inspector, :worker_positional_params, :worker_keyword_params
26
24
 
27
25
  def parse_params
28
- @worker_params = allowed_params
26
+ @worker_positional_params = positional_params
29
27
  .reject { |key| request_params[key].empty? }
30
28
  .map { |key| StringUtil.parse(request_params[key], symbolize: true) }
29
+ @worker_keyword_params = keyword_params
30
+ .each_with_object({}) { |key, obj| obj[key.to_sym] = request_params[key] }
31
+ .compact
31
32
  if !!request_params[:rest_args] && !request_params[:rest_args].empty?
32
- @worker_params << StringUtil.parse_json(request_params[:rest_args].strip, symbolize: true)
33
+ @worker_positional_params << StringUtil.parse_json(request_params[:rest_args].strip, symbolize: true)
33
34
  end
34
35
  end
35
36
 
37
+ def allowed_params
38
+ worker_positional_params + worker_keyword_params
39
+ end
40
+
41
+ def positional_params
42
+ worker_klass_inspector.required_parameters(:perform) +
43
+ worker_klass_inspector.optional_parameters(:perform)
44
+ end
45
+
46
+ def keyword_params
47
+ worker_klass_inspector.required_kw_parameters(:perform) +
48
+ worker_klass_inspector.optional_kw_parameters(:perform)
49
+ end
50
+
36
51
  end
37
52
  end
@@ -11,8 +11,8 @@ module SidekiqAdhocJob
11
11
  klass_name.queue_name
12
12
  end
13
13
 
14
- def perform_async(klass, *params)
15
- klass.perform_later(*params)
14
+ def perform_async(klass, *params, **kw_params)
15
+ klass.perform_later(*params, **kw_params)
16
16
  end
17
17
  end
18
18
  end
@@ -11,8 +11,8 @@ module SidekiqAdhocJob
11
11
  klass_name.sidekiq_options['queue']
12
12
  end
13
13
 
14
- def perform_async(klass, *params)
15
- klass.perform_async(*params)
14
+ def perform_async(klass, *params, **kw_params)
15
+ klass.perform_async(*params, **kw_params)
16
16
  end
17
17
  end
18
18
  end
@@ -11,8 +11,8 @@ module SidekiqAdhocJob
11
11
  klass_name.queue_name
12
12
  end
13
13
 
14
- def perform_async(klass, *params)
15
- klass.perform_later(*params)
14
+ def perform_async(klass, *params, **kw_params)
15
+ klass.perform_later(*params, **kw_params)
16
16
  end
17
17
  end
18
18
  end
@@ -35,12 +35,20 @@ module SidekiqAdhocJob
35
35
  parameters(method_name)[:opt] || []
36
36
  end
37
37
 
38
+ def required_kw_parameters(method_name)
39
+ parameters(method_name)[:keyreq] || []
40
+ end
41
+
42
+ def optional_kw_parameters(method_name)
43
+ parameters(method_name)[:key] || []
44
+ end
45
+
38
46
  def has_rest_parameter?(method_name)
39
47
  !!parameters(method_name)[:rest]
40
48
  end
41
49
 
42
50
  def klass_method(method)
43
- return method unless method.super_method
51
+ return method if method.owner == klass_name
44
52
 
45
53
  klass_method(method.super_method)
46
54
  end
@@ -1,3 +1,3 @@
1
1
  module SidekiqAdhocJob
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
@@ -4,18 +4,29 @@ module SidekiqAdhocJob
4
4
  class JobPresenter
5
5
  include Sidekiq::WebHelpers
6
6
 
7
- attr_reader :name, :path_name, :queue, :required_args, :optional_args, :has_rest_args
7
+ attr_reader :name,
8
+ :path_name,
9
+ :queue,
10
+ :required_args,
11
+ :optional_args,
12
+ :required_kw_args,
13
+ :optional_kw_args,
14
+ :has_rest_args,
15
+ :require_confirm
8
16
 
9
17
  StringUtil ||= ::SidekiqAdhocJob::Utils::String
10
18
 
11
19
  # args: { req: [], opt: [] }
12
- def initialize(name, path_name, queue, args)
20
+ def initialize(name, path_name, queue, args, require_confirm)
13
21
  @name = name
14
22
  @path_name = path_name
15
23
  @queue = queue
16
24
  @required_args = args[:req] || []
17
25
  @optional_args = args[:opt] || []
26
+ @required_kw_args = args[:keyreq] || []
27
+ @optional_kw_args = args[:key] || []
18
28
  @has_rest_args = !!args[:rest]
29
+ @require_confirm = require_confirm
19
30
  end
20
31
 
21
32
  # Builds the presenter instances for the schedule hash
@@ -40,7 +51,12 @@ module SidekiqAdhocJob
40
51
  queue = SidekiqAdhocJob.config.strategy.get_queue_name(klass_name)
41
52
  class_inspector = SidekiqAdhocJob::Utils::ClassInspector.new(klass_name)
42
53
  args = class_inspector.parameters(:perform)
43
- new(klass_name, path_name, queue, args)
54
+ require_confirm = SidekiqAdhocJob.config.require_confirmation?(klass_name.to_s)
55
+ new(klass_name, path_name, queue, args, require_confirm)
56
+ end
57
+
58
+ def no_arguments?
59
+ required_args.empty? && optional_args.empty? && required_kw_args.empty? && optional_kw_args.empty? && !has_rest_args
44
60
  end
45
61
 
46
62
  end
@@ -1,10 +1,13 @@
1
1
  en:
2
2
  adhoc_jobs: Adhoc Jobs
3
3
  adhoc_jobs_actions: Actions
4
+ adhoc_jobs_required_keyword_arguments: Required Keyword Arguments
5
+ adhoc_jobs_optional_keyword_arguments: Optional Keyword Arguments
4
6
  adhoc_jobs_required_arguments: Required Arguments
5
7
  adhoc_jobs_optional_arguments: Optional Arguments
6
8
  adhoc_jobs_go_back: Go Back
7
9
  adhoc_jobs_has_rest_arguments: Has Rest Arguments
10
+ adhoc_jobs_confirm_required: Confirm Required
8
11
  adhoc_jobs_name: Job Name
9
12
  adhoc_jobs_queue: Job Queue
10
13
  adhoc_jobs_run_job: Run Job
@@ -5,7 +5,7 @@ module SidekiqAdhocJob
5
5
 
6
6
  def self.register(app)
7
7
  app.get '/adhoc-jobs' do
8
- @presented_jobs = SidekiqAdhocJob::Web::JobPresenter.build_collection
8
+ @presented_jobs = SidekiqAdhocJob::Web::JobPresenter.build_collection.sort_by { |j| j.name.to_s }
9
9
 
10
10
  erb File.read(File.join(VIEW_PATH, 'jobs/index.html.erb'))
11
11
  end
@@ -8,7 +8,10 @@
8
8
  <th><%= t('adhoc_jobs_queue') %></th>
9
9
  <th><%= t('adhoc_jobs_required_arguments') %></th>
10
10
  <th><%= t('adhoc_jobs_optional_arguments') %></th>
11
+ <th><%= t('adhoc_jobs_required_keyword_arguments') %></th>
12
+ <th><%= t('adhoc_jobs_optional_keyword_arguments') %></th>
11
13
  <th><%= t('adhoc_jobs_has_rest_arguments') %></th>
14
+ <th><%= t('adhoc_jobs_confirm_required') %></th>
12
15
  <th><%= t('adhoc_jobs_actions') %></th>
13
16
  </tr>
14
17
  </thead>
@@ -20,7 +23,10 @@
20
23
  <td><%= job.queue %></td>
21
24
  <td><%= job.required_args.join(', ') %></td>
22
25
  <td><%= job.optional_args.join(', ') %></td>
26
+ <td><%= job.required_kw_args.join(', ') %></td>
27
+ <td><%= job.optional_kw_args.join(', ') %></td>
23
28
  <td><%= job.has_rest_args %></td>
29
+ <td><%= job.require_confirm %></td>
24
30
  <td class="text-center">
25
31
  <a class="btn btn-warn btn-xs" href="<%= root_path %>adhoc-jobs/<%= CGI.escape(job.path_name) %>">
26
32
  <%= t('adhoc_jobs_view_job') %>
@@ -2,9 +2,9 @@
2
2
 
3
3
  <h4><%= SidekiqAdhocJob::Utils::String.classify(@presented_job.path_name) %></h4>
4
4
 
5
- <form method="POST" action="<%= root_path %>adhoc-jobs/<%= CGI.escape(@presented_job.path_name) %>/schedule">
5
+ <form method="POST" action="<%= root_path %>adhoc-jobs/<%= CGI.escape(@presented_job.path_name) %>/schedule" id="adhoc-jobs-submit-form">
6
6
  <input type="hidden" name="authenticity_token" value="<%= @csrf_token %>" />
7
- <% if @presented_job.required_args.empty? && @presented_job.optional_args.empty? && !@presented_job.has_rest_args %>
7
+ <% if @presented_job.no_arguments? %>
8
8
  <p>No job arguments</p>
9
9
  <% else %>
10
10
  <% @presented_job.required_args.each do |arg| %>
@@ -23,6 +23,22 @@
23
23
  </div>
24
24
  </div>
25
25
  <% end %>
26
+ <% @presented_job.required_kw_args.each do |arg| %>
27
+ <div class="form-group row">
28
+ <label class="col-sm-2 col-form-label" for="<%= arg %>"><%= arg %>:</label>
29
+ <div class="col-sm-4">
30
+ <input class="form-control" type="text" name="<%= arg %>" id="<%= arg %>" required/>
31
+ </div>
32
+ </div>
33
+ <% end %>
34
+ <% @presented_job.optional_kw_args.each do |arg| %>
35
+ <div class="form-group row">
36
+ <label class="col-sm-2 col-form-label" for="<%= arg %>"><%= arg %>:</label>
37
+ <div class="col-sm-4">
38
+ <input class="form-control" type="text" name="<%= arg %>" id="<%= arg %>"/>
39
+ </div>
40
+ </div>
41
+ <% end %>
26
42
  <% if @presented_job.has_rest_args %>
27
43
  <div class="form-group row">
28
44
  <label class="col-sm-2 col-form-label" for="rest_args">Rest arguments (please provide a json string representing the arguments):</label>
@@ -39,3 +55,12 @@
39
55
  </div>
40
56
  </div>
41
57
  </form>
58
+
59
+ <% if @presented_job.require_confirm %>
60
+ <script>
61
+ document.getElementById('adhoc-jobs-submit-form').addEventListener('submit', (event) => {
62
+ if (!confirm('Are you sure?'))
63
+ event.preventDefault();
64
+ })
65
+ </script>
66
+ <% end %>
@@ -41,7 +41,10 @@ module SidekiqAdhocJob
41
41
  end
42
42
 
43
43
  class Configuration
44
- attr_accessor :load_paths, :module_names, :strategy_name
44
+ attr_accessor :load_paths,
45
+ :module_names,
46
+ :strategy_name,
47
+ :require_confirm_worker_names
45
48
 
46
49
  def initialize
47
50
  @load_paths = []
@@ -53,6 +56,14 @@ module SidekiqAdhocJob
53
56
  Array(@module_names).map(&:to_s)
54
57
  end
55
58
 
59
+ def require_confirm
60
+ @require_confirm ||= Array(@require_confirm_worker_names).map(&:to_s)
61
+ end
62
+
63
+ def require_confirmation?(worker_name)
64
+ require_confirm.include?(worker_name)
65
+ end
66
+
56
67
  def strategy
57
68
  @strategy ||= case strategy_name
58
69
  when :default
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_adhoc_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Goh Khoon Hiang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-16 00:00:00.000000000 Z
11
+ date: 2022-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry