jobler 0.0.8 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +34 -3
- data/Rakefile +1 -1
- data/app/assets/javascripts/jobler/application.js +0 -1
- data/app/controllers/jobler/downloads_controller.rb +5 -1
- data/app/controllers/jobler/jobs_controller.rb +11 -3
- data/app/joblers/jobler/models/destroyer_jobler.rb +65 -0
- data/app/models/jobler/job.rb +4 -6
- data/app/models/jobler/result.rb +4 -2
- data/app/views/jobler/jobs/show.html.erb +5 -1
- data/app/views/layouts/jobler/application.html.erb +6 -4
- data/db/migrate/20170130220604_create_jobs.rb +1 -1
- data/db/migrate/20170130220734_create_jobler_results.rb +1 -1
- data/db/migrate/20170203161045_add_locale_to_jobs.rb +1 -1
- data/db/migrate/20170206100737_add_error_message_and_error_backtrace_to_jobs.rb +1 -1
- data/db/migrate/20170206104246_add_slug_to_jobs.rb +1 -1
- data/db/migrate/20170217082955_add_host_protocol_and_port_to_jobler_jobs.rb +1 -1
- data/lib/jobler/base_controller.rb +1 -1
- data/lib/jobler/base_jobler.rb +74 -20
- data/lib/jobler/file_download.rb +8 -4
- data/lib/jobler/job_runner.rb +11 -5
- data/lib/jobler/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 549a9f294ff023f7c67091e91120706db134cd9639d9f8b2d60d9860c5562788
|
4
|
+
data.tar.gz: '097746283982a71eeffdd1a006e2e8a6d178c5b847e6854ddae0696075da4490'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3204ebaef1538454ea89a42066fc498d554317f14a9dd72e03356c1c1cb58ef5aac58909246c750b17c785b4610b33cef3a7b19ab93cc3877297ae0b659025e6
|
7
|
+
data.tar.gz: e7ffb22951a39418e2ffd48c7f58b69b7465dbf41419583c5b49ed8ae71fbcbd15ca5dd7f58491df70ec7769c2e1dadb2416bb7ceac974910d50ef8af7617a23
|
data/README.md
CHANGED
@@ -34,7 +34,11 @@ class ApplicationJobler < Jobler::BaseJobler
|
|
34
34
|
end
|
35
35
|
```
|
36
36
|
|
37
|
-
Jobler is going to queue its jobs through the ActiveJob queue called `:jobler`, so make sure a worker is listening to that queue.
|
37
|
+
Jobler is going to queue its jobs through the ActiveJob queue called `:jobler`, so make sure a worker is listening to that queue. This is done like this in Sidekiq:
|
38
|
+
|
39
|
+
```bash
|
40
|
+
bundle exec sidekiq --queue default --queue jobler --queue mailers
|
41
|
+
```
|
38
42
|
|
39
43
|
|
40
44
|
## Usage
|
@@ -111,7 +115,7 @@ You should then create a controller something like this:
|
|
111
115
|
```ruby
|
112
116
|
class JoblerJobsController < ApplicationController
|
113
117
|
def show
|
114
|
-
@job = Jobler::Job.find_by!(slug:
|
118
|
+
@job = Jobler::Job.find_by!(slug: params[:id])
|
115
119
|
@result = @job.results.find_by!(name: "render")
|
116
120
|
end
|
117
121
|
end
|
@@ -119,7 +123,7 @@ end
|
|
119
123
|
|
120
124
|
And a view in "app/views/jobler_jobs/show.html.erb":
|
121
125
|
```erb
|
122
|
-
<%= @result.result.force_encoding("utf-8").html_safe
|
126
|
+
<%= @result.result.force_encoding("utf-8").html_safe %>
|
123
127
|
```
|
124
128
|
|
125
129
|
You should also add a route like this:
|
@@ -129,6 +133,33 @@ Rails.application.routes.draw do
|
|
129
133
|
end
|
130
134
|
```
|
131
135
|
|
136
|
+
# Progress bar
|
137
|
+
|
138
|
+
In order to utilize the progress bar and return some feedback on the progress to the user, you can implement a couple of calls to do that:
|
139
|
+
|
140
|
+
```ruby
|
141
|
+
class MyJobler < ApplicationJobler
|
142
|
+
def execute!
|
143
|
+
progress_total collection.size
|
144
|
+
|
145
|
+
collection.find_each do |model|
|
146
|
+
increment_progress!
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
```
|
151
|
+
|
152
|
+
You can also call it from a view, if you a doing a render like this:
|
153
|
+
```erb
|
154
|
+
<% jobler.increment_progress! %>
|
155
|
+
```
|
156
|
+
|
157
|
+
You can also specify a custom value if it isn't 1:
|
158
|
+
```erb
|
159
|
+
<% jobler.increment_progress!(value: 5.0) %>
|
160
|
+
```
|
161
|
+
|
132
162
|
## License
|
133
163
|
|
134
164
|
This project rocks and uses MIT-LICENSE.
|
165
|
+
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include("lib/**/*.rb")
|
15
15
|
end
|
16
16
|
|
17
|
-
APP_RAKEFILE = File.expand_path("
|
17
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
18
18
|
load "rails/tasks/engine.rake"
|
19
19
|
|
20
20
|
load "rails/tasks/statistics.rake"
|
@@ -4,7 +4,11 @@ class Jobler::DownloadsController < Jobler::ApplicationController
|
|
4
4
|
@result = @job.jobler.result
|
5
5
|
|
6
6
|
if @result.is_a?(Jobler::FileDownload)
|
7
|
-
|
7
|
+
if @result.url.present?
|
8
|
+
redirect_to @result.url
|
9
|
+
else
|
10
|
+
send_file @result.temp_file.path, disposition: "attachment", filename: @result.file_name
|
11
|
+
end
|
8
12
|
else
|
9
13
|
flash[:error] = "The result wasn't a file download"
|
10
14
|
redirect_to :back
|
@@ -1,7 +1,6 @@
|
|
1
1
|
class Jobler::JobsController < Jobler::ApplicationController
|
2
2
|
def show
|
3
3
|
@job = Jobler::Job.find_by!(slug: params[:id])
|
4
|
-
@result = @job.jobler.result if @job.completed?
|
5
4
|
|
6
5
|
respond_to do |format|
|
7
6
|
format.json do
|
@@ -14,8 +13,17 @@ class Jobler::JobsController < Jobler::ApplicationController
|
|
14
13
|
}
|
15
14
|
end
|
16
15
|
|
17
|
-
if @
|
18
|
-
|
16
|
+
if @job.completed?
|
17
|
+
@job.jobler.controller = self
|
18
|
+
@job.jobler.format = format
|
19
|
+
|
20
|
+
@result = @job.jobler.result
|
21
|
+
|
22
|
+
if @result.is_a?(Jobler::RedirectTo)
|
23
|
+
format.html { redirect_to @result.url }
|
24
|
+
else
|
25
|
+
format.html
|
26
|
+
end
|
19
27
|
else
|
20
28
|
format.html
|
21
29
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class Jobler::Models::DestroyerJobler < Jobler::BaseJobler
|
2
|
+
def execute!
|
3
|
+
calculate_numbers
|
4
|
+
|
5
|
+
model_class.transaction do
|
6
|
+
destroy_relationships
|
7
|
+
model.destroy!
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def result
|
12
|
+
format.html { controller.redirect_to args.fetch(:redirect_to) }
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def calculate_numbers
|
18
|
+
Rails.logger.debug "Calculate numbers"
|
19
|
+
|
20
|
+
@total = 0
|
21
|
+
relationships.each do |relationship|
|
22
|
+
Rails.logger.debug "Calculate size for #{relationship}"
|
23
|
+
@total += model.__send__(relationship).size
|
24
|
+
end
|
25
|
+
|
26
|
+
progress_total @total
|
27
|
+
|
28
|
+
Rails.logger.debug "Done calculating numbers: #{@total}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def destroy_relationships
|
32
|
+
Rails.logger.debug "Destroying relationships"
|
33
|
+
relationships.each do |relationship|
|
34
|
+
Rails.logger.debug "Destroying #{relationship}"
|
35
|
+
model.__send__(relationship).find_each do |sub_model|
|
36
|
+
Rails.logger.debug "Destroying #{sub_model.id}"
|
37
|
+
sub_model.destroy!
|
38
|
+
increment_progress!
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def model_class
|
44
|
+
@model_class ||= args.fetch(:model).constantize
|
45
|
+
end
|
46
|
+
|
47
|
+
def model
|
48
|
+
@model ||= model_class.find(args.fetch(:model_id))
|
49
|
+
end
|
50
|
+
|
51
|
+
def relationships
|
52
|
+
@relationships ||= begin
|
53
|
+
result = []
|
54
|
+
|
55
|
+
model_class.reflections.each_value do |reflection|
|
56
|
+
next unless reflection.is_a?(ActiveRecord::Reflection::HasManyReflection)
|
57
|
+
next unless reflection.options[:dependent] == :destroy
|
58
|
+
|
59
|
+
result << reflection.name
|
60
|
+
end
|
61
|
+
|
62
|
+
result
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/app/models/jobler/job.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
-
class Jobler::Job < ActiveRecord::Base
|
2
|
-
has_many :results, class_name: "Jobler::Result", dependent: :destroy
|
1
|
+
class Jobler::Job < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord
|
2
|
+
has_many :results, class_name: "Jobler::Result", dependent: :destroy, inverse_of: :job
|
3
3
|
|
4
4
|
validates :jobler_type, :slug, :state, presence: true
|
5
5
|
|
6
6
|
before_validation :set_slug
|
7
7
|
|
8
8
|
def jobler
|
9
|
-
|
10
|
-
user_jobler.instance_variable_set(:@args, YAML.load(parameters)) # rubocop:disable Security/YAMLLoad
|
11
|
-
user_jobler.instance_variable_set(:@job, self)
|
12
|
-
user_jobler
|
9
|
+
@jobler ||= jobler_type.constantize.new(args: YAML.load(parameters), job: self) # rubocop:disable Security/YAMLLoad
|
13
10
|
end
|
14
11
|
|
15
12
|
def completed?
|
@@ -22,6 +19,7 @@ class Jobler::Job < ActiveRecord::Base
|
|
22
19
|
|
23
20
|
def to_param
|
24
21
|
raise "No slug" unless slug?
|
22
|
+
|
25
23
|
slug
|
26
24
|
end
|
27
25
|
|
data/app/models/jobler/result.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
class Jobler::Result < ActiveRecord::Base
|
2
|
-
belongs_to :job, class_name: "Jobler::Job"
|
1
|
+
class Jobler::Result < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord
|
2
|
+
belongs_to :job, class_name: "Jobler::Job", inverse_of: :results
|
3
|
+
|
4
|
+
has_one_attached :file
|
3
5
|
|
4
6
|
validates :job, :name, presence: true
|
5
7
|
end
|
@@ -4,7 +4,11 @@
|
|
4
4
|
|
5
5
|
<% if @job.completed? %>
|
6
6
|
<% if @result.is_a?(Jobler::FileDownload) %>
|
7
|
-
|
7
|
+
<% if @result.url.present? %>
|
8
|
+
<%= link_to "Download", @result.url %>
|
9
|
+
<% else %>
|
10
|
+
<%= link_to "Download", download_path(@job) %>
|
11
|
+
<% end %>
|
8
12
|
<% elsif @result.is_a?(Jobler::PageRender) %>
|
9
13
|
<%= @result.body.html_safe %>
|
10
14
|
<% end %>
|
@@ -3,13 +3,15 @@
|
|
3
3
|
<head>
|
4
4
|
<title>Jobler</title>
|
5
5
|
|
6
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
|
7
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
|
6
8
|
<%= stylesheet_link_tag "jobler/application", media: "all" %>
|
7
|
-
<%= stylesheet_link_tag "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css", integrity: "sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u", crossorigin: "anonymous" %>
|
8
9
|
|
10
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
|
11
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-ujs/1.2.2/rails.min.js" integrity="sha256-BbyWhCn0G+F6xbWJ2pcI5LnnpsnpSzyjJNVtl7ABp+M=" crossorigin="anonymous"></script>
|
12
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.6.0/jquery.timeago.min.js" integrity="sha256-JAdlnMiYFZRwqQqgiYwLjSkV94QtVzcbvasQMm05THk=" crossorigin="anonymous"></script>
|
13
|
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
|
9
14
|
<%= javascript_include_tag "jobler/application" %>
|
10
|
-
<%= javascript_include_tag "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js", integrity: "sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa", crossorigin: "anonymous" %>
|
11
|
-
<%= javascript_include_tag "https://use.fontawesome.com/de02b76735.js" %>
|
12
|
-
<%= javascript_include_tag "https://cdnjs.cloudflare.com/ajax/libs/jquery-timeago/1.5.4/jquery.timeago.min.js" %>
|
13
15
|
|
14
16
|
<%= csrf_meta_tags %>
|
15
17
|
</head>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
class Jobler::BaseController < ActionController::Base
|
1
|
+
class Jobler::BaseController < ActionController::Base # rubocop:disable Rails/ApplicationController
|
2
2
|
end
|
data/lib/jobler/base_jobler.rb
CHANGED
@@ -1,19 +1,53 @@
|
|
1
1
|
class Jobler::BaseJobler
|
2
|
+
attr_accessor :controller, :format
|
2
3
|
attr_reader :args, :job
|
3
4
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def self.before_jobling(&blk)
|
6
|
+
@@before_jobling ||= [] # rubocop:disable Style/ClassVars
|
7
|
+
@@before_jobling << blk
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.after_jobling(&blk)
|
11
|
+
@@after_jobling ||= [] # rubocop:disable Style/ClassVars
|
12
|
+
@@after_jobling << blk
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(args:, job:)
|
16
|
+
@args = args
|
17
|
+
@job = job
|
18
|
+
end
|
19
|
+
|
20
|
+
def call_before_callbacks
|
21
|
+
@@before_jobling&.each do |before_callback|
|
22
|
+
instance_eval(&before_callback)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def call_after_callbacks
|
27
|
+
@@after_jobling&.each do |after_callback|
|
28
|
+
instance_eval(&after_callback)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_result!(content: nil, name:, result: nil, temp_file: nil, save_in_database: false)
|
33
|
+
jobler_result = job.results.new(name: name)
|
34
|
+
|
35
|
+
if content && !temp_file
|
36
|
+
temp_file = Tempfile.new(name)
|
37
|
+
temp_file.write(content)
|
38
|
+
temp_file.close
|
39
|
+
end
|
40
|
+
|
41
|
+
if result
|
42
|
+
jobler_result.result = result
|
9
43
|
else
|
10
|
-
|
44
|
+
raise "No tempfile could be found" unless temp_file
|
45
|
+
|
46
|
+
handle_file(jobler_result: jobler_result, save_in_database: save_in_database, temp_file: temp_file)
|
11
47
|
end
|
12
48
|
|
13
|
-
|
14
|
-
|
15
|
-
result: content
|
16
|
-
)
|
49
|
+
jobler_result.save!
|
50
|
+
jobler_result
|
17
51
|
end
|
18
52
|
|
19
53
|
def execute!
|
@@ -46,7 +80,7 @@ class Jobler::BaseJobler
|
|
46
80
|
end
|
47
81
|
|
48
82
|
if update
|
49
|
-
job.
|
83
|
+
job.update!(progress: new_progress)
|
50
84
|
@_current_progress = new_progress
|
51
85
|
end
|
52
86
|
end
|
@@ -56,9 +90,7 @@ class Jobler::BaseJobler
|
|
56
90
|
end
|
57
91
|
|
58
92
|
def render(template_path, locals = {})
|
59
|
-
if template_path.is_a?(Symbol)
|
60
|
-
template_path = "joblers/#{jobler_name}/#{template_path}"
|
61
|
-
end
|
93
|
+
template_path = "joblers/#{jobler_name}/#{template_path}" if template_path.is_a?(Symbol)
|
62
94
|
|
63
95
|
request = ActionDispatch::Request.new(
|
64
96
|
"HTTP_HOST" => "#{job.host}:#{job.port}",
|
@@ -70,7 +102,7 @@ class Jobler::BaseJobler
|
|
70
102
|
controller.request = request
|
71
103
|
controller.response = ActionDispatch::Response.new
|
72
104
|
|
73
|
-
render_result = controller.render(template_path,
|
105
|
+
render_result = controller.render(template_path, layout: false, locals: {jobler: self}.merge(locals))
|
74
106
|
|
75
107
|
if render_result.is_a?(String)
|
76
108
|
# Rails 5 behaviour
|
@@ -85,15 +117,37 @@ class Jobler::BaseJobler
|
|
85
117
|
raise NoMethodError, "You should define the 'result' method on #{self.class.name}"
|
86
118
|
end
|
87
119
|
|
88
|
-
def temp_file_for_result(
|
89
|
-
job_result = job.results.where(name:
|
120
|
+
def temp_file_for_result(name:)
|
121
|
+
job_result = job.results.where(name: name).first
|
122
|
+
raise "No result by that name: #{name}" unless job_result
|
90
123
|
|
91
|
-
|
92
|
-
|
93
|
-
temp_file = Tempfile.new
|
124
|
+
temp_file = ::Tempfile.new("jobler_tempfile")
|
94
125
|
temp_file.binmode
|
95
126
|
temp_file.write(job_result.result)
|
96
127
|
temp_file.close
|
97
128
|
temp_file
|
98
129
|
end
|
130
|
+
|
131
|
+
def url_for_result(name:)
|
132
|
+
job_result = job.results.where(name: name).first
|
133
|
+
raise "No result by that name: #{name}" unless job_result
|
134
|
+
|
135
|
+
Rails.application.routes.url_helpers.rails_blob_path(job_result.file.attachment, only_path: true)
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
def handle_file(jobler_result:, save_in_database:, temp_file:)
|
141
|
+
if save_in_database
|
142
|
+
temp_file = temp_file
|
143
|
+
temp_file.close unless temp_file.closed?
|
144
|
+
content = File.read(temp_file.path)
|
145
|
+
jobler_result.result = content
|
146
|
+
else
|
147
|
+
jobler_result.file.attach(
|
148
|
+
filename: File.basename(temp_file.path),
|
149
|
+
io: File.open(temp_file.path)
|
150
|
+
)
|
151
|
+
end
|
152
|
+
end
|
99
153
|
end
|
data/lib/jobler/file_download.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
class Jobler::FileDownload
|
2
|
-
attr_reader :file_name, :temp_file
|
2
|
+
attr_reader :file_name, :temp_file, :url
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
|
6
|
-
|
4
|
+
def initialize(file_name: nil, temp_file: nil, url: nil)
|
5
|
+
raise "Temp file or URL should be given" if !temp_file && !url
|
6
|
+
raise "No filename given with temp-file" if temp_file && file_name.blank?
|
7
|
+
|
8
|
+
@file_name = file_name
|
9
|
+
@temp_file = temp_file
|
10
|
+
@url = url
|
7
11
|
end
|
8
12
|
end
|
data/lib/jobler/job_runner.rb
CHANGED
@@ -1,18 +1,24 @@
|
|
1
|
-
class Jobler::JobRunner < ActiveJob::Base
|
1
|
+
class Jobler::JobRunner < ActiveJob::Base # rubocop:disable Rails/ApplicationJob
|
2
2
|
queue_as :jobler
|
3
3
|
|
4
4
|
def perform(job_id)
|
5
5
|
@job = Jobler::Job.find(job_id)
|
6
|
-
@job.
|
6
|
+
@job.update!(started_at: Time.zone.now, state: "started")
|
7
7
|
|
8
8
|
begin
|
9
9
|
with_locale do
|
10
|
-
@job.jobler.
|
10
|
+
@job.jobler.call_before_callbacks
|
11
|
+
|
12
|
+
begin
|
13
|
+
@job.jobler.execute!
|
14
|
+
ensure
|
15
|
+
@job.jobler.call_after_callbacks
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
|
-
@job.
|
19
|
+
@job.update!(ended_at: Time.zone.now, progress: 1.0, state: "completed")
|
14
20
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
15
|
-
@job.
|
21
|
+
@job.update!(
|
16
22
|
ended_at: Time.zone.now,
|
17
23
|
error_message: e.message,
|
18
24
|
error_type: e.class.name,
|
data/lib/jobler/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jobler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaspernj
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 6.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 6.0.0
|
27
27
|
description: Generate pages or files in the background
|
28
28
|
email:
|
29
29
|
- kaspernj@gmail.com
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- app/controllers/jobler/downloads_controller.rb
|
44
44
|
- app/controllers/jobler/jobs_controller.rb
|
45
45
|
- app/helpers/jobler/application_helper.rb
|
46
|
+
- app/joblers/jobler/models/destroyer_jobler.rb
|
46
47
|
- app/models/jobler/job.rb
|
47
48
|
- app/models/jobler/result.rb
|
48
49
|
- app/views/jobler/jobs/show.html.erb
|
@@ -84,8 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
85
|
- !ruby/object:Gem::Version
|
85
86
|
version: '0'
|
86
87
|
requirements: []
|
87
|
-
|
88
|
-
rubygems_version: 2.6.8
|
88
|
+
rubygems_version: 3.0.6
|
89
89
|
signing_key:
|
90
90
|
specification_version: 4
|
91
91
|
summary: Generate pages or files in the background
|