sidekiq_adhoc_scheduler 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0403c22706ae767ef5b12de8e937ee5c3e96e651f05e8bc0d294e5649b42b76f
4
+ data.tar.gz: 3f7f16ee529157c2e999d0b453f127752b52e5acb87ece3d61b8461b78b0e2f5
5
+ SHA512:
6
+ metadata.gz: 9b02cf070317386377e5b9055e045e0ca2892374984fe4ccd1c81b77d8debabc3fb89f21c5579178316cb2e6a85c6d11108f889776e1df390794f3dacb4b2cf3
7
+ data.tar.gz: 52662306703c77c953d7c46e62369deb543ce889b9c15c2b3389d3f76ef6c11d03b45f9098cd441b7c1cc67872220000aaf1a865a1b75c3023bfb0086ad8befc
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 khaile
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # Sidekiq Addhoc Scheduler
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem "sidekiq_adhoc_scheduler", :git => "git@github.com:khaile/sidekiq_adhoc_scheduler.git"
9
+ ```
10
+
11
+ And then execute:
12
+
13
+ ```bash
14
+ bundle
15
+ ```
16
+
17
+ Or install itself as:
18
+
19
+ ```bash
20
+ gem install sidekiq_adhoc_scheduler
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ To enable this extension, insert this piece of code in your app at the initialization stage:
26
+
27
+ ```ruby
28
+ require 'sidekiq_adhoc_scheduler'
29
+ ````
@@ -0,0 +1,10 @@
1
+ require 'rake'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
6
+ t.rspec_opts = '--format documentation'
7
+ end
8
+
9
+ desc 'Run tests'
10
+ task default: :spec
@@ -0,0 +1,8 @@
1
+ require 'sidekiq/web' unless defined?(Sidekiq::Web)
2
+ require 'sidekiq_adhoc_scheduler/web'
3
+
4
+ module SidekiqAdhocScheduler
5
+ Sidekiq::Web.register(SidekiqAdhocScheduler::Web)
6
+ Sidekiq::Web.tabs['adhoc_schedulers'] = 'adhoc-schedulers'
7
+ Sidekiq::Web.locales << File.expand_path('web/locales', __dir__)
8
+ end
@@ -0,0 +1,3 @@
1
+ module SidekiqAdhocScheduler
2
+ VERSION = '0.0.1'.freeze
3
+ end
@@ -0,0 +1,129 @@
1
+ module SidekiqAdhocScheduler
2
+ module Web
3
+ VIEW_PATH = File.expand_path('../../web/views', __dir__)
4
+
5
+ def self.registered(app)
6
+ app.get '/schedulers' do
7
+ @schedulers = Sidekiq.get_all_schedules
8
+ erb File.read(File.join(VIEW_PATH, 'scheduler.html.erb'))
9
+ end
10
+
11
+ app.get '/scheduler/:id' do
12
+ @scheduler = Sidekiq.get_schedule(params[:id])
13
+ erb File.read(File.join(VIEW_PATH, 'scheduler_edit.html.erb'))
14
+ end
15
+
16
+ app.put '/scheduler/:id' do
17
+ job_name = params[:id]
18
+
19
+ unless job_name.to_s.strip.empty?
20
+ @scheduler = Sidekiq.get_schedule(params[:id])
21
+ data = {
22
+ class: params[:scheduler]['class'],
23
+ queue: params[:scheduler]['queue'],
24
+ description: params[:scheduler]['description'],
25
+ args: params[:scheduler]['args']
26
+ }
27
+
28
+ unless params[:scheduler]['args'].to_s.strip.empty?
29
+ args = params[:scheduler]['args'].to_s.strip
30
+ if args.include?('[')
31
+ begin
32
+ data[:args] = JSON.parse(args)
33
+ rescue JSON::ParserError => e
34
+ redirect "#{root_path}scheduler/#{params[:id]}"
35
+ end
36
+ else
37
+ data[:args] = args
38
+ end
39
+ end
40
+
41
+ if !params[:scheduler]['cron'].to_s.strip.empty?
42
+ data[:cron] = params[:scheduler]['cron']
43
+ elsif !params[:scheduler]['every'].to_s.strip.empty?
44
+ every = params[:scheduler]['every'].to_s.strip
45
+ if every.include?('[')
46
+ begin
47
+ data[:every] = JSON.parse(every)
48
+ rescue JSON::ParserError => e
49
+ redirect "#{root_path}scheduler/#{params[:id]}"
50
+ end
51
+ else
52
+ data[:every] = every
53
+ end
54
+ end
55
+
56
+ Sidekiq.set_schedule(job_name, data)
57
+ end
58
+
59
+ redirect "#{root_path}schedulers"
60
+ end
61
+
62
+ app.get '/schedulers/new' do
63
+ erb File.read(File.join(VIEW_PATH, 'scheduler_new.html.erb'))
64
+ end
65
+
66
+ app.post '/schedulers' do
67
+ job_name = params[:scheduler]['name']
68
+
69
+ unless job_name.to_s.strip.empty?
70
+ data = {
71
+ class: params[:scheduler]['class'],
72
+ queue: params[:scheduler]['queue'],
73
+ description: params[:scheduler]['description'],
74
+ args: params[:scheduler]['args']
75
+ }
76
+
77
+ unless params[:scheduler]['args'].to_s.strip.empty?
78
+ args = params[:scheduler]['args'].to_s.strip
79
+ if args.include?('[')
80
+ begin
81
+ data[:args] = JSON.parse(args)
82
+ rescue JSON::ParserError => e
83
+ redirect "#{root_path}scheduler/new"
84
+ end
85
+ else
86
+ data[:args] = args
87
+ end
88
+ end
89
+
90
+ if !params[:scheduler]['cron'].to_s.strip.empty?
91
+ data[:cron] = params[:scheduler]['cron']
92
+ elsif !params[:scheduler]['every'].to_s.strip.empty?
93
+ every = params[:scheduler]['every'].to_s.strip
94
+ if every.include?('[')
95
+ begin
96
+ data[:every] = JSON.parse(every)
97
+ rescue JSON::ParserError => e
98
+ redirect "#{root_path}schedulers/new"
99
+ end
100
+ else
101
+ data[:every] = every
102
+ end
103
+ end
104
+
105
+ Sidekiq.set_schedule(job_name, data)
106
+ end
107
+
108
+ redirect "#{root_path}schedulers"
109
+ end
110
+
111
+ app.delete '/scheduler/:id' do
112
+ schedules = Sidekiq.get_all_schedules.reject { |k, _v| k == params[:id] }
113
+ Sidekiq.schedule = schedules
114
+ redirect "#{root_path}schedulers"
115
+ end
116
+
117
+ app.get '/scheduler/:id/reject' do
118
+ Sidekiq.remove_schedule(params[:id])
119
+ redirect "#{root_path}schedulers"
120
+ end
121
+
122
+ app.get '/scheduler/:id/enqueue' do
123
+ schedule = Sidekiq.get_schedule(params[:id])
124
+ Sidekiq::Scheduler.enqueue_job(schedule)
125
+ redirect "#{root_path}schedulers"
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,13 @@
1
+ en:
2
+ recurring_jobs: Recurring Jobs
3
+ name: Name
4
+ description: Description
5
+ interval: Interval
6
+ class: Class
7
+ queue: Queue
8
+ arguments: Arguments
9
+ enqueue_now: Enqueue now
10
+ next_time: Next Time
11
+ no_next_time: No next execution for this job
12
+ disable: Disable
13
+ enable: Enable
@@ -0,0 +1,47 @@
1
+ <h3><%= t('recurring_jobs') %></h3>
2
+
3
+ <div class="table_container">
4
+ <table class="table table-hover table-bordered table-striped table-white">
5
+ <thead>
6
+
7
+ <a class="btn btn-warn btn-xs" href="schedulers/new">
8
+ <%= t('Create') %>
9
+ </a>
10
+ <tr>
11
+ <th><%= t('name') %></th>
12
+ <th><%= t('description') %></th>
13
+ <th><%= t('interval') %></th>
14
+ <th><%= t('class') %></th>
15
+ <th><%= t('queue') %></th>
16
+ <th><%= t('arguments') %></th>
17
+ <th>Action</th>
18
+ </tr>
19
+ </thead>
20
+
21
+ <tbody>
22
+ <% if ! @schedulers.nil? %>
23
+ <% @schedulers.each do |scheduler| %>
24
+ <tr>
25
+ <td><span class="pie"><%= scheduler[0] %></span></td>
26
+ <td><%= scheduler[1]['description'] %></td>
27
+ <td><%= !scheduler[1]['cron'].nil? ? scheduler[1]['cron'] : scheduler[1]['every'] %></td>
28
+ <td><%= scheduler[1]['class'] %></td>
29
+ <td><%= scheduler[1]['queue'] %></td>
30
+ <td><%= scheduler[1]['args'] %></td>
31
+ <td>
32
+ <a class="btn btn-warn btn-xs" href="<%= root_path %>scheduler/<%= URI.escape(scheduler[0]) %>/enqueue">
33
+ <%= t('enqueue_now') %>
34
+ </a>
35
+ <a class="btn btn-warn btn-xs" href="<%= root_path %>scheduler/<%= URI.escape(scheduler[0]) %>">
36
+ <%= t('Edit') %>
37
+ </a>
38
+ <a data-confirm="Are you sure want to reject this job?" rel="nofollow" data-method="delete" class="btn btn-warn btn-xs" href="<%= root_path %>scheduler/<%= URI.escape(scheduler[0]) %>/reject">
39
+ <%= t('Reject') %>
40
+ </a>
41
+ </td>
42
+ </tr>
43
+ <% end %>
44
+ <% end %>
45
+ </tbody>
46
+ </table>
47
+ </div>
@@ -0,0 +1,66 @@
1
+ <h3><%= t('recurring_jobs') %></h3>
2
+
3
+ <form action="<%= root_path %>scheduler/<%= params[:id] %>" accept-charset="UTF-8" method="post">
4
+ <input type="hidden" name="_method" value="put">
5
+ <%= csrf_tag %>
6
+
7
+ <div class="form-group">
8
+ <label class="col-lg-3 control-label" for="name">Name</label>
9
+ <div class="col-lg-7">
10
+ <input class="form-control required" disabled="disabled" type="text" value="<%= params[:id] %>">
11
+ </div>
12
+ </div>
13
+
14
+ <div class="form-group">
15
+ <label class="col-lg-3 control-label" for="name">description</label>
16
+ <div class="col-lg-7">
17
+ <input class="form-control required" placeholder="description" name="scheduler[description]" type="text" value="<%= @scheduler['description'] %>">
18
+ </div>
19
+ </div>
20
+
21
+ <div class="form-group">
22
+ <label class="col-lg-3 control-label" for="name">Cron</label>
23
+ <div class="col-lg-7">
24
+ <input class="form-control required" placeholder="cron" name="scheduler[cron]" type="text" value="<%= @scheduler['cron'] %>">
25
+ </div>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label class="col-lg-3 control-label" for="name">every</label>
30
+ <div class="col-lg-7">
31
+ <input class="form-control required" placeholder="every" name="scheduler[every]" type="text" value='<%= @scheduler['every'].is_a?(Array) ? JSON.unparse(@scheduler['every']) : @scheduler['every'] %>'>
32
+ </div>
33
+ </div>
34
+
35
+ <div class="form-group">
36
+ <label class="col-lg-3 control-label" for="name">class</label>
37
+ <div class="col-lg-7">
38
+ <input class="form-control required" placeholder="class" name="scheduler[class]" type="text" value="<%= @scheduler['class'] %>">
39
+ </div>
40
+ </div>
41
+
42
+ <div class="form-group">
43
+ <label class="col-lg-3 control-label" for="name">args</label>
44
+ <div class="col-lg-7">
45
+ <input class="form-control required" placeholder="args" name="scheduler[args]" type="text" value="<%= @scheduler['args'] %>">
46
+ </div>
47
+ </div>
48
+
49
+ <div class="form-group">
50
+ <label class="col-lg-3 control-label" for="name">queue</label>
51
+ <div class="col-lg-7">
52
+ <input class="form-control required" placeholder="queue" name="scheduler[queue]" type="text" value="<%= @scheduler['queue'] %>">
53
+ </div>
54
+ </div>
55
+
56
+ <div class="form-group">
57
+ <div class="col-lg-12 text-center">
58
+ <a href="<%= root_path %>schedulers">Cancel</a>
59
+ <button name="button" type="submit">Submit</button>
60
+ </div>
61
+ </div>
62
+ </form>
63
+
64
+
65
+
66
+
@@ -0,0 +1,65 @@
1
+ <form action="<%= root_path %>schedulers" accept-charset="UTF-8" method="post">
2
+ <%= csrf_tag %>
3
+ <div class="form-group">
4
+ <label class="col-lg-3 control-label" for="name">name</label>
5
+ <div class="col-lg-7">
6
+ <input class="form-control required" name="scheduler[name]"
7
+ type="text" value="">
8
+ </div>
9
+ </div>
10
+
11
+ <div class="form-group">
12
+ <label class="col-lg-3 control-label" for="name">description</label>
13
+ <div class="col-lg-7">
14
+ <input class="form-control required" name="scheduler[description]"
15
+ type="text" value="">
16
+ </div>
17
+ </div>
18
+
19
+ <div class="form-group">
20
+ <label class="col-lg-3 control-label" for="name">Cron Job</label>
21
+ <div class="col-lg-7">
22
+ <input class="form-control required" name="scheduler[cron]"
23
+ type="text" value="">
24
+ </div>
25
+ </div>
26
+
27
+ <div class="form-group">
28
+ <label class="col-lg-3 control-label" for="name">Every</label>
29
+ <div class="col-lg-7">
30
+ <input class="form-control required" name="scheduler[every]"
31
+ type="text" value="">
32
+ </div>
33
+ </div>
34
+
35
+ <div class="form-group">
36
+ <label class="col-lg-3 control-label" for="name">class</label>
37
+ <div class="col-lg-7">
38
+ <input class="form-control required" name="scheduler[class]"
39
+ type="text" value="">
40
+ </div>
41
+ </div>
42
+
43
+ <div class="form-group">
44
+ <label class="col-lg-3 control-label" for="name">arguments</label>
45
+ <div class="col-lg-7">
46
+ <input class="form-control required" name="scheduler[args]"
47
+ type="text" value="">
48
+ </div>
49
+ </div>
50
+
51
+ <div class="form-group">
52
+ <label class="col-lg-3 control-label" for="name">queue</label>
53
+ <div class="col-lg-7">
54
+ <input class="form-control required" name="scheduler[queue]"
55
+ type="text" value="">
56
+ </div>
57
+ </div>
58
+
59
+ <div class="form-group">
60
+ <div class="col-lg-12 text-center">
61
+ <a href="<%= root_path %>schedulers">Cancel</a>
62
+ <button name="button" type="submit">Submit</button>
63
+ </div>
64
+ </div>
65
+ </form>
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq_adhoc_scheduler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Khai Le
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sidekiq-scheduler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mock_redis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.20.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.20.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.13.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.13.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 12.3.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 12.3.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.9.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 3.9.0
111
+ description: Trigger job schedulers adhoc from Sidekiq web admin
112
+ email:
113
+ - khaile.to@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - MIT-LICENSE
119
+ - README.md
120
+ - Rakefile
121
+ - lib/sidekiq_adhoc_scheduler.rb
122
+ - lib/sidekiq_adhoc_scheduler/version.rb
123
+ - lib/sidekiq_adhoc_scheduler/web.rb
124
+ - web/locales/en.yml
125
+ - web/views/scheduler.html.erb
126
+ - web/views/scheduler_edit.html.erb
127
+ - web/views/scheduler_new.html.erb
128
+ homepage: https://github.com/khaile/sidekiq_adhoc_scheduler
129
+ licenses:
130
+ - MIT
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options: []
134
+ require_paths:
135
+ - lib
136
+ required_ruby_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: 2.6.0
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ requirements: []
147
+ rubygems_version: 3.0.8
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: Sidekiq addhoc scheduler
151
+ test_files: []