sidekiq-enqueue 0.0.3 → 0.0.4

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: 8593bdbca30e66b0faba29c2b89fb574b95bd65c2d512e47c44c5b8e2385c638
4
- data.tar.gz: 7bcdc4668baa2064190c2cd92f64a307f2f795aafb36b4eff1d5417c633a61f0
3
+ metadata.gz: b7e0670989272758e4def45a7bb33e090464b31078ab7d2a23f0eb6ff08b905a
4
+ data.tar.gz: 62f0740f8438f75f016fc961aaa13fba6c45b4846495465a704edc398dace8ae
5
5
  SHA512:
6
- metadata.gz: a870b1cb00ba2bbcf7cbcdd2d41511ce8af4add5342cebbac1ed641159e57eaf0b623bc4bbc31e890ec5817e9f8bff31f206fcbacc6b8c21fd210edf87282524
7
- data.tar.gz: 670a97ac89055a0fcc299f4c05e2adedb392723da62fef3dfa5baa864a7bc920ccd33654ae549f8b8c0d65f1f52799a0178a284c42b40cceeabb294b7296b6ca
6
+ metadata.gz: dd686de4c4c309c36e3c9ad2cc5f9ea9ed1f03aed57591e8c0eeb455964808508dab4e7d46a3ffa15dfe58d79fbf963b1896136a57d6cf407a403f3198744cd5
7
+ data.tar.gz: 9035c08ea3c292b8b7e13195869ae5e799e4e38f3f6a45e27f6baf4ec0b87ac4e94e7c4196c3b8df0191053943e1f1f8c3d0260bec00cd4a0d2f5ef8fbc5299a
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ require:
4
4
  AllCops:
5
5
  NewCops: enable
6
6
  SuggestExtensions: false
7
- TargetRubyVersion: 3.1.0
7
+ TargetRubyVersion: 3.4.0
8
8
 
9
9
  Gemspec/DevelopmentDependencies:
10
10
  Enabled: false
@@ -34,6 +34,9 @@ RSpec/SpecFilePathFormat:
34
34
  RSpec/SubjectStub:
35
35
  Enabled: false
36
36
 
37
+ RSpec/MultipleExpectations:
38
+ Enabled: false
39
+
37
40
  RSpec/VerifiedDoubles:
38
41
  Enabled: false
39
42
 
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 3.4.4
1
+ ruby 3.4.7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
+ ## [0.0.4]
2
+
3
+ - Bump Ruby to 3.4.7
4
+ - Update Sidekiq support to 8.x
5
+ - Added datalist options to select from when queueing a job
6
+
1
7
  ## [0.0.2]
2
8
 
3
9
  - Bumped version of `rack` to 3.1.6
4
-
5
- ## [Unreleased]
data/Gemfile.lock CHANGED
@@ -1,30 +1,30 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq-enqueue (0.0.3)
5
- sidekiq (< 8)
4
+ sidekiq-enqueue (0.0.4)
5
+ sidekiq (< 9)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.2)
11
- base64 (0.2.0)
12
- connection_pool (2.5.0)
13
- diff-lcs (1.5.1)
14
- json (2.9.1)
15
- language_server-protocol (3.17.0.3)
16
- logger (1.6.5)
17
- parallel (1.26.3)
18
- parser (3.3.7.0)
10
+ ast (2.4.3)
11
+ connection_pool (3.0.2)
12
+ diff-lcs (1.6.2)
13
+ json (2.19.2)
14
+ language_server-protocol (3.17.0.5)
15
+ logger (1.7.0)
16
+ parallel (1.27.0)
17
+ parser (3.3.10.2)
19
18
  ast (~> 2.4.1)
20
19
  racc
20
+ prism (1.9.0)
21
21
  racc (1.8.1)
22
- rack (3.2.4)
22
+ rack (3.2.5)
23
23
  rainbow (3.1.1)
24
24
  rake (13.0.6)
25
- redis-client (0.23.2)
25
+ redis-client (0.28.0)
26
26
  connection_pool
27
- regexp_parser (2.10.0)
27
+ regexp_parser (2.11.3)
28
28
  rspec (3.12.0)
29
29
  rspec-core (~> 3.12.0)
30
30
  rspec-expectations (~> 3.12.0)
@@ -50,20 +50,21 @@ GEM
50
50
  rubocop-ast (>= 1.36.2, < 2.0)
51
51
  ruby-progressbar (~> 1.7)
52
52
  unicode-display_width (>= 2.4.0, < 4.0)
53
- rubocop-ast (1.37.0)
54
- parser (>= 3.3.1.0)
53
+ rubocop-ast (1.49.1)
54
+ parser (>= 3.3.7.2)
55
+ prism (~> 1.7)
55
56
  rubocop-rspec (3.0.5)
56
57
  rubocop (~> 1.61)
57
58
  ruby-progressbar (1.13.0)
58
- sidekiq (7.3.8)
59
- base64
60
- connection_pool (>= 2.3.0)
61
- logger
62
- rack (>= 2.2.4)
63
- redis-client (>= 0.22.2)
64
- unicode-display_width (3.1.4)
65
- unicode-emoji (~> 4.0, >= 4.0.4)
66
- unicode-emoji (4.0.4)
59
+ sidekiq (8.1.1)
60
+ connection_pool (>= 3.0.0)
61
+ json (>= 2.16.0)
62
+ logger (>= 1.7.0)
63
+ rack (>= 3.2.0)
64
+ redis-client (>= 0.26.0)
65
+ unicode-display_width (3.2.0)
66
+ unicode-emoji (~> 4.1)
67
+ unicode-emoji (4.2.0)
67
68
 
68
69
  PLATFORMS
69
70
  arm64-darwin-24
@@ -78,4 +79,4 @@ DEPENDENCIES
78
79
  sidekiq-enqueue!
79
80
 
80
81
  BUNDLED WITH
81
- 2.5.20
82
+ 2.6.9
data/README.md CHANGED
@@ -21,3 +21,14 @@ Sidekiq::Enqueue.init
21
21
  ## Web UI
22
22
 
23
23
  The web UI is accessible via `#{root_url}/#{sidekiq_web_path}/enqueue`.
24
+
25
+ ## Release
26
+
27
+ Merging to `main` does not automatically publish a new gem version. Before another app can consume a new release by updating its `Gemfile`, publish the gem to RubyGems:
28
+
29
+ 1. Update `Sidekiq::Enqueue::VERSION` in `lib/sidekiq/enqueue/version.rb`.
30
+ 2. Update `CHANGELOG.md`.
31
+ 3. Merge the release changes to `main`.
32
+ 4. Run `bundle exec rake release`.
33
+
34
+ `bundle exec rake release` will build the gem, create a git tag for the version, and push the gem to RubyGems. After that, update the gem version in the other app's `Gemfile` and run Bundler as usual.
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ module Enqueue
5
+ module Services
6
+ class AvailableJobs
7
+ def self.call
8
+ eager_load_jobs!
9
+
10
+ job_names
11
+ end
12
+
13
+ def self.job_names
14
+ @job_names ||= ObjectSpace.each_object(Class)
15
+ .filter_map { |klass| job_name_for(klass) }
16
+ .uniq
17
+ .sort
18
+ end
19
+
20
+ def self.reset_cache!
21
+ @job_names = nil
22
+ @job_files = nil
23
+ end
24
+
25
+ def self.eager_load_jobs!
26
+ return unless defined?(Rails) && Rails.respond_to?(:root) && Rails.root
27
+
28
+ job_files
29
+ end
30
+
31
+ def self.job_files
32
+ @job_files ||= Dir[Rails.root.join("app/jobs/**/*.rb")].each do |file|
33
+ if defined?(require_dependency)
34
+ require_dependency(file)
35
+ else
36
+ require(file)
37
+ end
38
+ end
39
+ end
40
+
41
+ def self.job_name_for(klass)
42
+ return unless klass.name
43
+ return unless valid_job_class?(klass)
44
+
45
+ klass.name
46
+ rescue StandardError
47
+ nil
48
+ end
49
+
50
+ def self.valid_job_class?(klass)
51
+ klass.respond_to?(:perform_async) && klass.respond_to?(:get_sidekiq_options)
52
+ end
53
+
54
+ private_class_method :eager_load_jobs!, :job_name_for, :valid_job_class?, :new
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,16 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "json"
4
+
3
5
  module Sidekiq
4
6
  module Enqueue
5
7
  module Services
6
8
  class Enqueue
7
9
  def initialize(job_name, arguments)
8
- @job_class = Module.const_get(job_name)
10
+ @job_name = job_name
9
11
  @arguments = arguments
10
12
  end
11
13
 
12
14
  def call
13
- @job_class.perform_async(*@arguments.split(",").map(&:strip))
15
+ job_class.perform_async(*@arguments.split(",").map(&:strip))
16
+ end
17
+
18
+ private
19
+
20
+ def job_class
21
+ Module.const_get(@job_name)
14
22
  end
15
23
  end
16
24
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sidekiq
4
4
  module Enqueue
5
- VERSION = "0.0.3"
5
+ VERSION = "0.0.4"
6
6
  end
7
7
  end
@@ -1,5 +1,8 @@
1
1
  en:
2
2
  sidekiq_enqueue: Enqueue Job
3
3
  sidekiq_enqueue_arguments: Arguments
4
+ sidekiq_enqueue_arguments_hint: Enter a comma-separated list of arguments to pass to the job.
4
5
  sidekiq_enqueue_job_name: Job Name
6
+ sidekiq_enqueue_jobs_load_error: Unable to load available jobs.
7
+ sidekiq_enqueue_job_name_hint: Search for or enter the worker class name to enqueue.
5
8
  sidekiq_enqueue_submit: Submit
@@ -7,9 +7,14 @@ module Sidekiq
7
7
  class Enqueue
8
8
  def self.register(app)
9
9
  app.post "/enqueue" do
10
- Sidekiq::Enqueue::Services::Enqueue.new(params[:job_name], params[:arguments]).call
10
+ raise StandardError, "Job name is required" if url_params("job_name").nil? || url_params("job_name").empty?
11
+
12
+ Sidekiq::Enqueue::Services::Enqueue.new(url_params("job_name"), url_params("arguments")).call
11
13
 
12
14
  redirect "#{root_path}enqueue"
15
+ rescue StandardError => e
16
+ @enqueue_error = e
17
+ erb File.read(File.join(VIEW_PATH, "index.html.erb"))
13
18
  end
14
19
  end
15
20
  end
@@ -8,6 +8,8 @@ module Sidekiq
8
8
  def self.register(app)
9
9
  app.get "/enqueue" do
10
10
  erb File.read(File.join(VIEW_PATH, "index.html.erb"))
11
+ rescue StandardError
12
+ erb File.read(File.join(VIEW_PATH, "index.html.erb"))
11
13
  end
12
14
  end
13
15
  end
@@ -1,25 +1,93 @@
1
- <h3><%= t('sidekiq_enqueue') %></h3>
1
+ <style nonce="<%= csp_nonce %>">
2
+ .enqueue-form-container {
3
+ max-width: 40rem;
4
+ padding: 1.5rem 0;
5
+ }
2
6
 
3
- <form action="<%= root_path %>enqueue" method="post" id="enqueue-form">
4
- <%= csrf_tag %>
7
+ .enqueue-form-title {
8
+ margin-bottom: 1.25rem;
9
+ }
5
10
 
6
- <div class="form-group row">
7
- <label class="col-sm-2 col-form-label" for="job_name"><%= t('sidekiq_enqueue_job_name') %></label>
8
- <div class="col-sm-4">
9
- <input class="form-control" type="text" name="job_name" id="job_name" />
11
+ .enqueue-form {
12
+ display: block;
13
+ width: 100%;
14
+ }
15
+
16
+ .enqueue-form-group {
17
+ display: block;
18
+ margin-bottom: 1.5rem;
19
+ width: 100%;
20
+ }
21
+
22
+ .enqueue-form-label {
23
+ display: block;
24
+ margin-bottom: 0.35rem;
25
+ }
26
+
27
+ .enqueue-form-input {
28
+ box-sizing: border-box;
29
+ display: block;
30
+ height: auto;
31
+ min-height: 2.25rem;
32
+ width: 100%;
33
+ }
34
+
35
+ .enqueue-form-hint {
36
+ display: block;
37
+ margin-top: 0.35rem;
38
+ }
39
+
40
+ .enqueue-form-actions {
41
+ margin-top: 1.5rem;
42
+ }
43
+ </style>
44
+
45
+ <script nonce="<%= csp_nonce %>">
46
+ localStorage.sidekiqLivePoll = "disabled";
47
+ </script>
48
+
49
+ <% available_jobs = [] %>
50
+ <% available_jobs_error = nil %>
51
+ <% begin %>
52
+ <% available_jobs = Sidekiq::Enqueue::Services::AvailableJobs.call %>
53
+ <% rescue StandardError %>
54
+ <% available_jobs_error = t('sidekiq_enqueue_jobs_load_error', default: 'Unable to load available jobs.') %>
55
+ <% end %>
56
+
57
+ <div class="enqueue-form-container">
58
+ <h3 class="enqueue-form-title"><%= t('sidekiq_enqueue') %></h3>
59
+
60
+ <% if defined?(@enqueue_error) && @enqueue_error %>
61
+ <div class="alert alert-danger" role="alert">
62
+ <%= @enqueue_error.message %>
63
+ </div>
64
+ <% end %>
65
+
66
+ <form action="<%= root_path %>enqueue" method="post" id="enqueue-form" class="enqueue-form">
67
+ <%= csrf_tag %>
68
+
69
+ <div class="form-group string enqueue-form-group">
70
+ <label for="job_name" class="enqueue-form-label"><%= t('sidekiq_enqueue_job_name') %></label>
71
+ <input class="form-control enqueue-form-input" type="text" name="job_name" id="job_name" list="available_jobs" autocomplete="off" />
72
+ <datalist id="available_jobs">
73
+ <% available_jobs.each do |job_name| %>
74
+ <option value="<%= job_name %>"></option>
75
+ <% end %>
76
+ </datalist>
77
+ <% if available_jobs_error %>
78
+ <small class="hint enqueue-form-hint text-danger"><%= available_jobs_error %></small>
79
+ <% end %>
80
+ <small class="hint enqueue-form-hint"><%= t('sidekiq_enqueue_job_name_hint', default: 'Search for or enter the worker class name to enqueue.') %></small>
10
81
  </div>
11
- </div>
12
82
 
13
- <div class="form-group row">
14
- <label class="col-sm-2 col-form-label" for="arguments"><%= t('sidekiq_enqueue_arguments') %></label>
15
- <div class="col-sm-4">
16
- <input class="form-control" type="text" name="arguments" id="arguments" />
83
+ <div class="form-group string enqueue-form-group">
84
+ <label for="arguments" class="enqueue-form-label"><%= t('sidekiq_enqueue_arguments') %></label>
85
+ <input class="form-control enqueue-form-input" type="text" name="arguments" id="arguments" autocomplete="off" />
86
+ <small class="hint enqueue-form-hint"><%= t('sidekiq_enqueue_arguments_hint', default: 'Enter a JSON array of arguments to pass to the job.') %></small>
17
87
  </div>
18
- </div>
19
88
 
20
- <div class="form-group row">
21
- <div class="col-sm-4">
89
+ <div class="form-actions enqueue-form-actions">
22
90
  <button type="submit" class="btn btn-danger"><%= t('sidekiq_enqueue_submit') %></button>
23
91
  </div>
24
- </div>
25
- </form>
92
+ </form>
93
+ </div>
@@ -5,6 +5,7 @@ require "pathname"
5
5
  ROUTE_PATH = File.expand_path("web/routes", __dir__)
6
6
 
7
7
  require_relative "services/enqueue"
8
+ require_relative "services/available_jobs"
8
9
 
9
10
  require_relative "web/routes/enqueue"
10
11
  require_relative "web/routes/index"
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/sidekiq/enqueue/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "sidekiq-enqueue"
7
+ spec.version = Sidekiq::Enqueue::VERSION
8
+ spec.authors = ["Jordan Ell"]
9
+ spec.email = ["jordan.ell@riipen.com"]
10
+
11
+ spec.summary = "Manually enqueue Sidekiq jobs from the web UI."
12
+ spec.homepage = "https://github.com/riipen/sidekiq-enqueue"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = ">= 3.4.0"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["changelog_uri"] = "https://github.com/riipen/sidekiq-enqueue/blob/master/CHANGELOG.md"
18
+
19
+ # Specify which files should be added to the gem when it is released.
20
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
+ `git ls-files -z`.split("\x0").reject do |f|
23
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
24
+ end
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "rake", "~> 13.0.6"
31
+ spec.add_development_dependency "rspec", "~> 3.12.0"
32
+ spec.add_development_dependency "rspec_junit_formatter", "~> 0.6.0"
33
+ spec.add_development_dependency "rubocop", "~> 1.69.2"
34
+ spec.add_development_dependency "rubocop-rspec", "~> 3.0.4"
35
+
36
+ spec.add_dependency "sidekiq", "< 9"
37
+
38
+ spec.metadata["rubygems_mfa_required"] = "true"
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-enqueue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordan Ell
@@ -85,14 +85,14 @@ dependencies:
85
85
  requirements:
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
- version: '8'
88
+ version: '9'
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "<"
94
94
  - !ruby/object:Gem::Version
95
- version: '8'
95
+ version: '9'
96
96
  email:
97
97
  - jordan.ell@riipen.com
98
98
  executables: []
@@ -110,6 +110,7 @@ files:
110
110
  - README.md
111
111
  - Rakefile
112
112
  - lib/sidekiq/enqueue.rb
113
+ - lib/sidekiq/enqueue/services/available_jobs.rb
113
114
  - lib/sidekiq/enqueue/services/enqueue.rb
114
115
  - lib/sidekiq/enqueue/version.rb
115
116
  - lib/sidekiq/enqueue/web.rb
@@ -117,6 +118,7 @@ files:
117
118
  - lib/sidekiq/enqueue/web/routes/enqueue.rb
118
119
  - lib/sidekiq/enqueue/web/routes/index.rb
119
120
  - lib/sidekiq/enqueue/web/templates/index.html.erb
121
+ - sidekiq-enqueue.gemspec
120
122
  homepage: https://github.com/riipen/sidekiq-enqueue
121
123
  licenses:
122
124
  - MIT
@@ -131,14 +133,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
133
  requirements:
132
134
  - - ">="
133
135
  - !ruby/object:Gem::Version
134
- version: 3.1.0
136
+ version: 3.4.0
135
137
  required_rubygems_version: !ruby/object:Gem::Requirement
136
138
  requirements:
137
139
  - - ">="
138
140
  - !ruby/object:Gem::Version
139
141
  version: '0'
140
142
  requirements: []
141
- rubygems_version: 3.6.7
143
+ rubygems_version: 3.6.9
142
144
  specification_version: 4
143
145
  summary: Manually enqueue Sidekiq jobs from the web UI.
144
146
  test_files: []