sidekiq_adhoc_job 2.0.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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