good_job 4.4.0 → 4.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +5 -5
- data/app/charts/good_job/performance_index_chart.rb +3 -0
- data/app/frontend/good_job/modules/charts.js +12 -0
- data/app/frontend/good_job/modules/html_legend_plugin.js +56 -0
- data/app/frontend/good_job/style.css +13 -0
- data/app/models/concerns/good_job/filterable.rb +1 -1
- data/app/views/good_job/jobs/index.html.erb +1 -1
- data/app/views/good_job/performance/index.html.erb +1 -1
- data/app/views/good_job/performance/show.html.erb +1 -1
- data/app/views/good_job/shared/_chart.erb +2 -2
- data/app/views/good_job/shared/_chart_container.erb +21 -0
- data/lib/good_job/capsule_tracker.rb +1 -18
- data/lib/good_job/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7a4560e3e97c78d26ea5045bbd6de6d378191a52873be4f213d886f80bdf29c
|
4
|
+
data.tar.gz: 98cc8a6958a69898966efe296339bfc22130c75d6700ad80934e60948f864861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e1479d596427c82a6ed2b683aa0e8e171e20ab52b3591b49e757efd54b9ad5651c6a10643a42e3838c1042c2d17d96070d30888ceabff19b809185009c93e88
|
7
|
+
data.tar.gz: '0784732d866e3954803d23758a320d68adcd6ad9da30413419c514ffa5ea68a40dd3652eabd3847b24563814b2a37a48e1b55f2d8358a940daacbc6353fe8171'
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,38 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v4.4.2](https://github.com/bensheldon/good_job/tree/v4.4.2) (2024-10-18)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/bensheldon/good_job/compare/v4.4.1...v4.4.2)
|
6
|
+
|
7
|
+
**Merged pull requests:**
|
8
|
+
|
9
|
+
- Bump rails from 7.1.4 to 7.1.4.1 [\#1524](https://github.com/bensheldon/good_job/pull/1524) ([Earlopain](https://github.com/Earlopain))
|
10
|
+
- Drop compatibility code for `ForkTracker` [\#1519](https://github.com/bensheldon/good_job/pull/1519) ([Earlopain](https://github.com/Earlopain))
|
11
|
+
- Add vertical legend to performance dashboard [\#1517](https://github.com/bensheldon/good_job/pull/1517) ([Wittiest](https://github.com/Wittiest))
|
12
|
+
- Bump the bundler-dependencies group across 1 directory with 10 updates [\#1515](https://github.com/bensheldon/good_job/pull/1515) ([dependabot[bot]](https://github.com/apps/dependabot))
|
13
|
+
- Manually bump tapioca / regenerate rbi [\#1514](https://github.com/bensheldon/good_job/pull/1514) ([Earlopain](https://github.com/Earlopain))
|
14
|
+
- Remove rack from the gemfile [\#1512](https://github.com/bensheldon/good_job/pull/1512) ([Earlopain](https://github.com/Earlopain))
|
15
|
+
- Add regression test for searchable numeric arguments [\#1510](https://github.com/bensheldon/good_job/pull/1510) ([bensheldon](https://github.com/bensheldon))
|
16
|
+
- Better parallelize CI jobs [\#1507](https://github.com/bensheldon/good_job/pull/1507) ([Earlopain](https://github.com/Earlopain))
|
17
|
+
- Bump webrick from 1.8.1 to 1.8.2 [\#1503](https://github.com/bensheldon/good_job/pull/1503) ([dependabot[bot]](https://github.com/apps/dependabot))
|
18
|
+
|
19
|
+
## [v4.4.1](https://github.com/bensheldon/good_job/tree/v4.4.1) (2024-10-10)
|
20
|
+
|
21
|
+
[Full Changelog](https://github.com/bensheldon/good_job/compare/v4.4.0...v4.4.1)
|
22
|
+
|
23
|
+
**Fixed bugs:**
|
24
|
+
|
25
|
+
- Better search job arguments \(including integers\) by adding `serialized_params->>arguments` explicitly [\#1504](https://github.com/bensheldon/good_job/pull/1504) ([bensheldon](https://github.com/bensheldon))
|
26
|
+
|
27
|
+
**Closed issues:**
|
28
|
+
|
29
|
+
- Searching for an integer type argument \(on the dashboard\) does not yeild any results [\#1458](https://github.com/bensheldon/good_job/issues/1458)
|
30
|
+
|
31
|
+
**Merged pull requests:**
|
32
|
+
|
33
|
+
- Clean up appraisals, add rails 8, use postgres 17 [\#1505](https://github.com/bensheldon/good_job/pull/1505) ([Earlopain](https://github.com/Earlopain))
|
34
|
+
- Bump the bundler-lint group across 1 directory with 5 updates [\#1501](https://github.com/bensheldon/good_job/pull/1501) ([dependabot[bot]](https://github.com/apps/dependabot))
|
35
|
+
|
3
36
|
## [v4.4.0](https://github.com/bensheldon/good_job/tree/v4.4.0) (2024-10-08)
|
4
37
|
|
5
38
|
[Full Changelog](https://github.com/bensheldon/good_job/compare/v4.3.0...v4.4.0)
|
data/README.md
CHANGED
@@ -1715,14 +1715,14 @@ Environment variables that may help with debugging:
|
|
1715
1715
|
- `LOUD=1`: display all stdout/stderr output from all sources. This is helpful because GoodJob wraps some tests with `quiet { }` for cleaner test output, but it can hinder debugging.
|
1716
1716
|
- `SHOW_BROWSER=1`: Run system tests headfully with Chrome/Chromedriver. Use `binding.irb` in the system tests to pause.
|
1717
1717
|
|
1718
|
-
|
1718
|
+
The gemfiles in `gemfiles/` can be used to run tests against different rails versions:
|
1719
1719
|
|
1720
1720
|
```bash
|
1721
|
-
# Install
|
1722
|
-
|
1721
|
+
# Install dependencies
|
1722
|
+
BUNDLE_GEMFILE=gemfiles/rails_6.1.gemfile bundle install
|
1723
1723
|
|
1724
|
-
# Run tests
|
1725
|
-
|
1724
|
+
# Run the tests
|
1725
|
+
BUNDLE_GEMFILE=gemfiles/rails_6.1.gemfile bin/rspec
|
1726
1726
|
```
|
1727
1727
|
|
1728
1728
|
### Release
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import htmlLegendPlugin from "html_legend_plugin";
|
2
|
+
|
1
3
|
function renderCharts(animate) {
|
2
4
|
const charts = document.querySelectorAll('.chart');
|
3
5
|
|
@@ -5,6 +7,16 @@ function renderCharts(animate) {
|
|
5
7
|
const chartEl = charts[i];
|
6
8
|
const chartData = JSON.parse(chartEl.dataset.json);
|
7
9
|
chartData.options ||= {};
|
10
|
+
|
11
|
+
if (chartData.options.plugins?.legend?.vertical) {
|
12
|
+
chartData.plugins = [htmlLegendPlugin];
|
13
|
+
chartData.options.plugins = {
|
14
|
+
...chartData.options.plugins,
|
15
|
+
legend: {
|
16
|
+
display: false,
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
8
20
|
chartData.options.animation = animate;
|
9
21
|
chartData.options.responsive = true;
|
10
22
|
chartData.options.maintainAspectRatio = false;
|
@@ -0,0 +1,56 @@
|
|
1
|
+
const generateListItem = (item) => {
|
2
|
+
const li = document.createElement('li');
|
3
|
+
li.className = 'd-flex align-items-center text-nowrap mb-2';
|
4
|
+
|
5
|
+
const boxSpan = document.createElement('span');
|
6
|
+
boxSpan.className = 'legend-item-color-box';
|
7
|
+
boxSpan.style.background = item.fillStyle;
|
8
|
+
boxSpan.style.borderColor = item.strokeStyle;
|
9
|
+
boxSpan.style.borderWidth = item.lineWidth + 'px';
|
10
|
+
|
11
|
+
const textContainer = document.createElement('p');
|
12
|
+
textContainer.className = 'item-text m-0 small';
|
13
|
+
textContainer.style.color = item.fontColor;
|
14
|
+
textContainer.style.textDecoration = item.hidden ? 'line-through' : '';
|
15
|
+
|
16
|
+
const text = document.createTextNode(item.text);
|
17
|
+
textContainer.appendChild(text);
|
18
|
+
|
19
|
+
li.appendChild(boxSpan);
|
20
|
+
li.appendChild(textContainer);
|
21
|
+
|
22
|
+
return li;
|
23
|
+
}
|
24
|
+
|
25
|
+
const htmlLegendPlugin = {
|
26
|
+
id: 'htmlLegend',
|
27
|
+
afterUpdate(chart, _args, _options) {
|
28
|
+
const {type} = chart.config;
|
29
|
+
const ul = document.getElementById('chart-legend-ul');
|
30
|
+
|
31
|
+
// Remove old legend items
|
32
|
+
while (ul.firstChild) {
|
33
|
+
ul.firstChild.remove();
|
34
|
+
}
|
35
|
+
|
36
|
+
// Reuse the built-in legendItems generator
|
37
|
+
const items = chart.options.plugins.legend.labels.generateLabels(chart);
|
38
|
+
|
39
|
+
items.forEach(item => {
|
40
|
+
const li = generateListItem(item);
|
41
|
+
ul.appendChild(li);
|
42
|
+
|
43
|
+
li.onclick = () => {
|
44
|
+
if (type === 'pie' || type === 'doughnut') {
|
45
|
+
// Pie and doughnut charts only have a single dataset and visibility is per item
|
46
|
+
chart.toggleDataVisibility(item.index);
|
47
|
+
} else {
|
48
|
+
chart.setDatasetVisibility(item.datasetIndex, !chart.isDatasetVisible(item.datasetIndex));
|
49
|
+
}
|
50
|
+
chart.update();
|
51
|
+
};
|
52
|
+
});
|
53
|
+
}
|
54
|
+
};
|
55
|
+
|
56
|
+
export { htmlLegendPlugin as default };
|
@@ -24,6 +24,19 @@
|
|
24
24
|
height: 200px;
|
25
25
|
}
|
26
26
|
|
27
|
+
.legend-item-color-box {
|
28
|
+
display: inline-block;
|
29
|
+
flex-shrink: 0;
|
30
|
+
height: 20px;
|
31
|
+
width: 20px;
|
32
|
+
border-style: solid;
|
33
|
+
margin-right: 3px;
|
34
|
+
}
|
35
|
+
|
36
|
+
#chart-legend-container {
|
37
|
+
height: 200px;
|
38
|
+
}
|
39
|
+
|
27
40
|
/* Break out of a container */
|
28
41
|
.break-out {
|
29
42
|
width:100vw;
|
@@ -35,7 +35,7 @@ module GoodJob
|
|
35
35
|
next if query.blank?
|
36
36
|
|
37
37
|
# TODO: turn this into proper bind parameters in Arel
|
38
|
-
tsvector = "(to_tsvector('english', id::text) || to_tsvector('english', COALESCE(active_job_id::text, '')) || to_tsvector('english', serialized_params) || to_tsvector('english', COALESCE(error, '')) || to_tsvector('english', COALESCE(array_to_string(labels, ' '), '')))"
|
38
|
+
tsvector = "(to_tsvector('english', id::text) || to_tsvector('english', COALESCE(active_job_id::text, '')) || to_tsvector('english', serialized_params) || to_tsvector('english', COALESCE(serialized_params->>'arguments', '')) || to_tsvector('english', COALESCE(error, '')) || to_tsvector('english', COALESCE(array_to_string(labels, ' '), '')))"
|
39
39
|
to_tsquery_function = database_supports_websearch_to_tsquery? ? 'websearch_to_tsquery' : 'plainto_tsquery'
|
40
40
|
where("#{tsvector} @@ #{to_tsquery_function}(?)", query)
|
41
41
|
.order(sanitize_sql_for_order([Arel.sql("ts_rank(#{tsvector}, #{to_tsquery_function}(?))"), query]) => 'DESC')
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render 'good_job/shared/filter', title: t("good_job.shared.navbar.jobs"), filter: @filter %>
|
2
|
-
<%= render 'good_job/shared/
|
2
|
+
<%= render 'good_job/shared/chart_container', chart_data: GoodJob::ScheduledByQueueChart.new(@filter).data %>
|
3
3
|
|
4
4
|
<div data-live-poll-region="jobs-table">
|
5
5
|
<%= render 'good_job/jobs/table', jobs: @filter.records, filter: @filter %>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<h2 class="pt-3 pb-2"><%= t ".title" %></h2>
|
3
3
|
</div>
|
4
4
|
|
5
|
-
<%= render 'good_job/shared/
|
5
|
+
<%= render 'good_job/shared/chart_container', chart_data: GoodJob::PerformanceIndexChart.new.data %>
|
6
6
|
|
7
7
|
<div class="my-3 card">
|
8
8
|
<div class="list-group list-group-flush text-nowrap" role="table">
|
@@ -2,4 +2,4 @@
|
|
2
2
|
<h2 class="pt-3 pb-2"><%= t ".title" %> - <%= @job_class %></h2>
|
3
3
|
</div>
|
4
4
|
|
5
|
-
<%= render 'good_job/shared/
|
5
|
+
<%= render 'good_job/shared/chart_container', chart_data: GoodJob::PerformanceShowChart.new(@job_class).data %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% vertical_legend = chart_data.dig(:options, :plugins, :legend, :vertical) %>
|
2
|
+
|
3
|
+
<div class="container-fluid">
|
4
|
+
<div class="row d-flex">
|
5
|
+
<% if vertical_legend %>
|
6
|
+
<div class="row d-flex">
|
7
|
+
<div class="col-md-10">
|
8
|
+
<%= render 'good_job/shared/chart', chart_data: chart_data %>
|
9
|
+
</div>
|
10
|
+
<div class="col-md-2 d-flex flex-column">
|
11
|
+
<div id="chart-legend-container" class="flex-fill overflow-auto">
|
12
|
+
<ul id="chart-legend-ul" class="list-unstyled p-0 mx-0 py-2">
|
13
|
+
</ul>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<% else %>
|
18
|
+
<%= render 'good_job/shared/chart', chart_data: chart_data %>
|
19
|
+
<% end %>
|
20
|
+
</div>
|
21
|
+
</div>
|
@@ -32,15 +32,7 @@ module GoodJob # :nodoc:
|
|
32
32
|
@record = nil
|
33
33
|
@refresh_task = nil
|
34
34
|
|
35
|
-
|
36
|
-
# Fall back to PID checking if ForkTracker is not available
|
37
|
-
if defined?(ActiveSupport::ForkTracker)
|
38
|
-
ActiveSupport::ForkTracker.after_fork { reset }
|
39
|
-
@forktracker = true
|
40
|
-
else
|
41
|
-
@ruby_pid = ::Process.pid
|
42
|
-
@forktracker = false
|
43
|
-
end
|
35
|
+
ActiveSupport::ForkTracker.after_fork { reset }
|
44
36
|
|
45
37
|
self.class.instances << self
|
46
38
|
end
|
@@ -53,7 +45,6 @@ module GoodJob # :nodoc:
|
|
53
45
|
synchronize do
|
54
46
|
next if @locks.zero?
|
55
47
|
|
56
|
-
reset_on_fork
|
57
48
|
if @record
|
58
49
|
@record.refresh_if_stale
|
59
50
|
else
|
@@ -204,14 +195,6 @@ module GoodJob # :nodoc:
|
|
204
195
|
synchronize { ns_reset }
|
205
196
|
end
|
206
197
|
|
207
|
-
def reset_on_fork
|
208
|
-
return if Concurrent.on_jruby?
|
209
|
-
return if @forktracker || ::Process.pid == @ruby_pid
|
210
|
-
|
211
|
-
@ruby_pid = ::Process.pid
|
212
|
-
ns_reset
|
213
|
-
end
|
214
|
-
|
215
198
|
def ns_reset
|
216
199
|
@record_id = SecureRandom.uuid
|
217
200
|
@record = nil
|
data/lib/good_job/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: good_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.4.
|
4
|
+
version: 4.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Sheldon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -269,6 +269,7 @@ files:
|
|
269
269
|
- app/frontend/good_job/modules/charts.js
|
270
270
|
- app/frontend/good_job/modules/checkbox_toggle.js
|
271
271
|
- app/frontend/good_job/modules/document_ready.js
|
272
|
+
- app/frontend/good_job/modules/html_legend_plugin.js
|
272
273
|
- app/frontend/good_job/modules/live_poll.js
|
273
274
|
- app/frontend/good_job/modules/popovers.js
|
274
275
|
- app/frontend/good_job/modules/theme_controller.js
|
@@ -315,6 +316,7 @@ files:
|
|
315
316
|
- app/views/good_job/processes/index.html.erb
|
316
317
|
- app/views/good_job/shared/_alert.erb
|
317
318
|
- app/views/good_job/shared/_chart.erb
|
319
|
+
- app/views/good_job/shared/_chart_container.erb
|
318
320
|
- app/views/good_job/shared/_filter.erb
|
319
321
|
- app/views/good_job/shared/_footer.erb
|
320
322
|
- app/views/good_job/shared/_navbar.erb
|