good_job 2.14.1 → 2.14.4

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: 06d4bc71856f5762f7adc99e3ce5227df56f17176a83be5b539df1bc0be71294
4
- data.tar.gz: 8cacdbd09e3938eb0ffdc549bf2e003fadb81d879ec1c3c552d0715d81907036
3
+ metadata.gz: 34be72b94928721447a6409e5a63aea86bc371ddcdcfa4c30316ee28dfefe59f
4
+ data.tar.gz: 4ca6c70f5456cb79440577c4493f17662930e7e2a259d8077248beb2e7742406
5
5
  SHA512:
6
- metadata.gz: b5d219e39b433103abab4b747ddc2b519cc77371ad409008c7df6954d546f6a72b6460b3a0d27a23cc14d4c09cc1ffbc9de74d26e6aad9eeeed8aee9d33aba95
7
- data.tar.gz: b20b54072e87ffc298b397a6fbe32fb0b6c02573ff1c94ac4dacca9ae4efe845aa4def15d7b9677c746d5e29d3a7bfa9280684416a2f88a12ac9f49780e685dc
6
+ metadata.gz: 2e0d5ba7b3c0f1adee5491633292424e3e99dd8a27d4f1d3d324f6e1701c68b51042bd11ace9982b3f4c084e1f1b8a84e81d9a2642e02a5a1da4f4187883e69b
7
+ data.tar.gz: b22e9d91946eba8363c6c87ceb62d2cbd4e6fd29438eefd17686c42c4ef81c46e1590631326e1e0b4b376d27464ef4bf9bf3fb2573df1fd741fa6a7a0a749810
data/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
+ ## [v2.14.4](https://github.com/bensheldon/good_job/tree/v2.14.4) (2022-05-15)
4
+
5
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v2.14.3...v2.14.4)
6
+
7
+ **Fixed bugs:**
8
+
9
+ - Fix Concurrency extension to not break `perform_now` [\#593](https://github.com/bensheldon/good_job/pull/593) ([bensheldon](https://github.com/bensheldon))
10
+
11
+ ## [v2.14.3](https://github.com/bensheldon/good_job/tree/v2.14.3) (2022-05-13)
12
+
13
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v2.14.2...v2.14.3)
14
+
15
+ **Fixed bugs:**
16
+
17
+ - Bind probe server to all interfaces [\#598](https://github.com/bensheldon/good_job/pull/598) ([Timmitry](https://github.com/Timmitry))
18
+
19
+ **Closed issues:**
20
+
21
+ - NoMethodError: undefined method `current\_tags' for nil:NilClass [\#596](https://github.com/bensheldon/good_job/issues/596)
22
+ - When running rspec, I get: current transaction is aborted, commands ignored until end of transaction block [\#595](https://github.com/bensheldon/good_job/issues/595)
23
+ - CLI healtheck only listening on localhost, not reachable for Kubernetes [\#592](https://github.com/bensheldon/good_job/issues/592)
24
+
25
+ **Merged pull requests:**
26
+
27
+ - Improve development instructions and tooling \(rename bin/rails, add bin/appraisal\) [\#590](https://github.com/bensheldon/good_job/pull/590) ([bensheldon](https://github.com/bensheldon))
28
+ - Replace test Instrumentation mocking with temporary subscriptions [\#589](https://github.com/bensheldon/good_job/pull/589) ([bensheldon](https://github.com/bensheldon))
29
+ - Update to development to Ruby 3.0.4, include `matrix` gem in development Gemfile [\#588](https://github.com/bensheldon/good_job/pull/588) ([bensheldon](https://github.com/bensheldon))
30
+
31
+ ## [v2.14.2](https://github.com/bensheldon/good_job/tree/v2.14.2) (2022-05-01)
32
+
33
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v2.14.1...v2.14.2)
34
+
35
+ **Fixed bugs:**
36
+
37
+ - Reintroduce fixed "Apply to all" mass action [\#586](https://github.com/bensheldon/good_job/pull/586) ([bensheldon](https://github.com/bensheldon))
38
+
39
+ **Closed issues:**
40
+
41
+ - how to get the number of tasks in the queue and the size of the queue? [\#564](https://github.com/bensheldon/good_job/issues/564)
42
+ - GoodJob tells me to upgrade but migrations fail [\#544](https://github.com/bensheldon/good_job/issues/544)
43
+
44
+ **Merged pull requests:**
45
+
46
+ - Update development dependencies [\#584](https://github.com/bensheldon/good_job/pull/584) ([bensheldon](https://github.com/bensheldon))
47
+ - Refactor Dashboard Live Poll javascript [\#582](https://github.com/bensheldon/good_job/pull/582) ([bensheldon](https://github.com/bensheldon))
48
+
3
49
  ## [v2.14.1](https://github.com/bensheldon/good_job/tree/v2.14.1) (2022-04-26)
4
50
 
5
51
  [Full Changelog](https://github.com/bensheldon/good_job/compare/v2.14.0...v2.14.1)
data/README.md CHANGED
@@ -60,6 +60,9 @@ For more of the story of GoodJob, read the [introductory blog post](https://isla
60
60
  - [CLI HTTP health check probes](#cli-http-health-check-probes)
61
61
  - [Contribute](#contribute)
62
62
  - [Gem development](#gem-development)
63
+ - [Development setup](#development-setup)
64
+ - [Rails development harness](#rails-development-harness)
65
+ - [Running tests](#running-tests)
63
66
  - [Release](#release)
64
67
  - [License](#license)
65
68
 
@@ -941,49 +944,82 @@ spec:
941
944
 
942
945
  ## Contribute
943
946
 
944
- Contributions are welcomed and appreciated 🙏
947
+ <!-- Please keep this section in sync with CONTRIBUTING.md -->
948
+
949
+ All contributions, from feedback to code and beyond, are welcomed and appreciated 🙏
945
950
 
946
951
  - Review the [Prioritized Project Backlog](https://github.com/bensheldon/good_job/projects/1).
947
952
  - Open a new Issue or contribute to an [existing Issue](https://github.com/bensheldon/good_job/issues). Questions or suggestions are fantastic.
948
- - Participate according to our [Code of Conduct](https://github.com/bensheldon/good_job/projects/1).
953
+ - Participate according to our [Code of Conduct](/CODE_OF_CONDUCT.md).
954
+ - Financially support the project via [Sponsorship](https://github.com/sponsors/bensheldon).
955
+
956
+ For gem development and debugging information, please review the [README's Gem Development section](/README.md#gem-development).
949
957
 
950
958
  ### Gem development
951
959
 
952
- To run tests:
960
+ #### Development setup
953
961
 
954
962
  ```bash
955
963
  # Clone the repository locally
956
- $ git clone git@github.com:bensheldon/good_job.git
964
+ git clone git@github.com:bensheldon/good_job.git
957
965
 
958
966
  # Set up the local environment
959
- $ bin/setup
960
-
961
- # Run the tests
962
- $ bin/rspec
967
+ bin/setup
963
968
  ```
964
969
 
965
- This gem uses Appraisal to run tests against multiple versions of Rails:
970
+ #### Rails development harness
971
+
972
+ A Rails application exists within `spec/test_app` that is used for development, test, and GoodJob Demo environments.
966
973
 
967
974
  ```bash
968
- # Install Appraisal(s) gemfiles
969
- $ bundle exec appraisal
975
+ # Run a local development webserver
976
+ bin/rails s
977
+
978
+ # Disable job execution and cron for cleaner console output
979
+ GOOD_JOB_ENABLE_CRON=0 GOOD_JOB_EXECUTION_MODE=external bin/rails s
970
980
 
971
- # Run tests
972
- $ bundle exec appraisal bin/rspec
981
+ # Open the Rails console
982
+ bin/rails c
973
983
  ```
974
984
 
975
985
  For developing locally within another Ruby on Rails project:
976
986
 
977
987
  ```bash
978
- # Within Ruby on Rails directory...
979
- $ bundle config local.good_job /path/to/local/git/repository
988
+ # Within Ruby on Rails project directory
989
+ # Ensure that the Gemfile is set to git with a branch e.g.
990
+ # gem "good_job", git: "https://github.com/bensheldon/good_job.git", branch: "main"
991
+ # Then, override the Bundle config to point to the local filesystem's good_job repository
992
+ bundle config local.good_job /path/to/local/good_job/repository
980
993
 
981
994
  # Confirm that the local copy is used
982
- $ bundle install
995
+ bundle install
983
996
 
984
997
  # => Using good_job 0.1.0 from https://github.com/bensheldon/good_job.git (at /Users/You/Projects/good_job@dc57fb0)
985
998
  ```
986
999
 
1000
+ #### Running tests
1001
+
1002
+ Tests can be run against the primary development environment:
1003
+
1004
+ ```bash
1005
+ bin/rspec
1006
+ ```
1007
+
1008
+ Environment variables that may help with debugging:
1009
+
1010
+ - `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.
1011
+ - `SHOW_BROWSER=1`: Run system tests headfully with Chrome/Chromedriver. Use `binding.irb` in the system tests to pause.
1012
+
1013
+ Appraisal can be used to run a test matrix of multiple versions of Rails:
1014
+
1015
+ ```bash
1016
+ # Install Appraisal matrix of gemfiles
1017
+ bin/appraisal
1018
+
1019
+ # Run tests against matrix
1020
+ bin/appraisal bin/rspec
1021
+ ```
1022
+
987
1023
  ### Release
988
1024
 
989
1025
  Package maintainers can release this gem by running:
@@ -996,7 +1032,7 @@ $ gem signin
996
1032
  # CHANGELOG_GITHUB_TOKEN= # Github Personal Access Token
997
1033
 
998
1034
  # Update version number, changelog, and create git commit:
999
- $ bundle exec rake release[minor] # major,minor,patch
1035
+ $ bundle exec rake release_good_job[minor] # major,minor,patch
1000
1036
 
1001
1037
  # ..and follow subsequent directions.
1002
1038
  ```
@@ -4,11 +4,13 @@ import renderCharts from "charts";
4
4
  import checkboxToggle from "checkbox_toggle";
5
5
  import documentReady from "document_ready";
6
6
  import showToasts from "toasts";
7
- import Poller from "poller";
7
+ import LivePoll from "live_poll";
8
8
 
9
9
  documentReady(function() {
10
10
  renderCharts();
11
11
  showToasts();
12
12
  checkboxToggle();
13
- Poller.start();
13
+
14
+ const livePoll = new LivePoll
15
+ livePoll.start();
14
16
  });
@@ -0,0 +1,81 @@
1
+ /*jshint esversion: 6, strict: false */
2
+ import renderCharts from "charts";
3
+
4
+ const MINIMUM_POLL_INTERVAL = 1;
5
+ const STORAGE_KEY = "live_poll";
6
+
7
+ function getStorage(key) {
8
+ const value = localStorage.getItem('good_job-' + key);
9
+
10
+ if (value === 'true') {
11
+ return true;
12
+ } else if (value === 'false') {
13
+ return false;
14
+ } else {
15
+ return value;
16
+ }
17
+ }
18
+
19
+ function setStorage(key, value) {
20
+ localStorage.setItem('good_job-' + key, value);
21
+ }
22
+
23
+ function removeStorage(key) {
24
+ localStorage.removeItem('good_job-' + key);
25
+ }
26
+
27
+ export default class LivePoll {
28
+ start() {
29
+ const checkbox = document.querySelector('input[name="live_poll"]');
30
+
31
+ if (!checkbox.checked && getStorage(STORAGE_KEY)) {
32
+ checkbox.checked = true;
33
+ checkbox.value = getStorage(STORAGE_KEY)
34
+ }
35
+
36
+ checkbox.addEventListener('change', () => {
37
+ this.togglePolling();
38
+ });
39
+
40
+ this.togglePolling();
41
+ }
42
+
43
+ togglePolling = () => {
44
+ const checkbox = document.querySelector('input[name="live_poll"]');
45
+ const enabled = checkbox.checked;
46
+ const pollIntervalMilliseconds = Math.max(parseInt(checkbox.value), MINIMUM_POLL_INTERVAL) * 1000;
47
+
48
+ if (this.interval) {
49
+ clearInterval(this.interval);
50
+ this.interval = null;
51
+ }
52
+
53
+ if (enabled) {
54
+ setStorage(STORAGE_KEY, checkbox.value);
55
+ this.interval = setInterval(LivePoll.refreshPage, pollIntervalMilliseconds);
56
+ } else {
57
+ removeStorage(STORAGE_KEY);
58
+ }
59
+ }
60
+
61
+ static refreshPage() {
62
+ fetch(window.location.href)
63
+ .then(resp => resp.text())
64
+ .then(LivePoll.updatePageContent);
65
+ }
66
+
67
+ static updatePageContent(newContent) {
68
+ const domParser = new DOMParser();
69
+ const newDom = domParser.parseFromString(newContent, "text/html");
70
+
71
+ const newElements = newDom.querySelectorAll('[data-live-poll-region]');
72
+ newElements.forEach((newElement) => {
73
+ const regionName = newElement.getAttribute('data-live-poll-region');
74
+ const originalElement = document.querySelector(`[data-live-poll-region="${regionName}"]`);
75
+
76
+ originalElement.replaceWith(newElement);
77
+ });
78
+
79
+ renderCharts(false);
80
+ }
81
+ }
@@ -6,12 +6,12 @@ module GoodJob
6
6
  end
7
7
 
8
8
  def show
9
- @cron_entry = CronEntry.find(params[:id])
9
+ @cron_entry = CronEntry.find(params[:cron_key])
10
10
  @jobs_filter = JobsFilter.new(params, @cron_entry.jobs)
11
11
  end
12
12
 
13
13
  def enqueue
14
- @cron_entry = CronEntry.find(params[:id])
14
+ @cron_entry = CronEntry.find(params[:cron_key])
15
15
  @cron_entry.enqueue(Time.current)
16
16
  redirect_back(fallback_location: cron_entries_path, notice: "Cron entry has been enqueued.")
17
17
  end
@@ -22,7 +22,7 @@ module GoodJob
22
22
  raise ActionController::BadRequest, "#{mass_action} is not a valid mass action" unless mass_action.in?(ACTIONS.keys)
23
23
 
24
24
  jobs = if params[:all_job_ids]
25
- ActiveJobJob.all
25
+ JobsFilter.new(params).filtered_query
26
26
  else
27
27
  job_ids = params.fetch(:job_ids, [])
28
28
  ActiveJobJob.where(active_job_id: job_ids)
@@ -49,7 +49,7 @@ module GoodJob
49
49
  "No jobs were #{ACTIONS[mass_action]}"
50
50
  end
51
51
 
52
- redirect_to jobs_path, notice: notice
52
+ redirect_back(fallback_location: jobs_path, notice: notice)
53
53
  end
54
54
 
55
55
  def show
@@ -47,6 +47,7 @@ module GoodJob
47
47
  queue_name: params[:queue_name],
48
48
  query: params[:query],
49
49
  state: params[:state],
50
+ cron_key: params[:cron_key],
50
51
  }.merge(override).delete_if { |_, v| v.blank? }
51
52
  end
52
53
 
@@ -54,8 +55,9 @@ module GoodJob
54
55
  raise NotImplementedError
55
56
  end
56
57
 
57
- # def filtered_query_count
58
- delegate :count, to: :filtered_query, prefix: true
58
+ def filtered_count
59
+ filtered_query.count
60
+ end
59
61
 
60
62
  private
61
63
 
@@ -18,6 +18,7 @@ module GoodJob
18
18
  query = query.job_class(params[:job_class]) if params[:job_class].present?
19
19
  query = query.where(queue_name: params[:queue_name]) if params[:queue_name].present?
20
20
  query = query.search_text(params[:query]) if params[:query].present?
21
+ query = query.where(cron_key: params[:cron_key]) if params[:cron_key].present?
21
22
 
22
23
  if params[:state]
23
24
  case params[:state]
@@ -39,7 +40,7 @@ module GoodJob
39
40
  query
40
41
  end
41
42
 
42
- def filtered_query_count
43
+ def filtered_count
43
44
  filtered_query.unscope(:select).count
44
45
  end
45
46
 
@@ -3,4 +3,4 @@
3
3
  <% end %>
4
4
 
5
5
  <%= render 'good_job/shared/filter', title: title, filter: @jobs_filter %>
6
- <%= render 'good_job/jobs/table', jobs: @jobs_filter.records %>
6
+ <%= render 'good_job/jobs/table', jobs: @jobs_filter.records, filter: @jobs_filter %>
@@ -1,4 +1,4 @@
1
- <div class="my-3" data-gj-poll-replace id="executions-table">
1
+ <div class="my-3" data-live-poll-region="executions-table">
2
2
  <div class="table-responsive">
3
3
  <table class="table table-hover table-sm mb-0" id="executions_index_table">
4
4
  <thead>
@@ -1,7 +1,7 @@
1
- <div class="my-3" data-gj-poll-replace id="jobs-table">
1
+ <div class="my-3">
2
2
  <div class="table-responsive">
3
- <%= form_with(url: mass_update_jobs_path, method: :put, local: true, data: { "checkbox-toggle": "job_ids" }) do |form| %>
4
- <table class="table table-hover table-sm mb-0">
3
+ <%= form_with(url: mass_update_jobs_path(filter.to_params), method: :put, local: true, data: { "checkbox-toggle": "job_ids" }) do |form| %>
4
+ <table class="table table-hover table-sm mb-0 table-jobs">
5
5
  <thead>
6
6
  <tr>
7
7
  <th><%= check_box_tag('toggle_job_ids', "1", false, data: { "checkbox-toggle-all": "job_ids" }) %></th>
@@ -35,6 +35,15 @@
35
35
  <%= render_icon "arrow_clockwise" %> All
36
36
  <% end %>
37
37
  </div>
38
+ </th>
39
+ </tr>
40
+ <tr class="d-none" data-checkbox-toggle-show="job_ids">
41
+ <td class="text-center table-warning" colspan="10">
42
+ <label>
43
+ <%= check_box_tag "all_job_ids", 1, false, disabled: true, data: { "checkbox-toggle-show": "job_ids"} %>
44
+ Apply to all <%= filter.filtered_count %> <%= "job".pluralize(filter.filtered_count) %>.
45
+ </label>
46
+ </td>
38
47
  </tr>
39
48
  </thead>
40
49
  <tbody>
@@ -1,15 +1,17 @@
1
1
  <%= render 'good_job/shared/filter', title: "Jobs", filter: @filter %>
2
2
  <%= render 'good_job/shared/chart', chart_data: GoodJob::ScheduledByQueueChart.new(@filter).data %>
3
- <%= render 'good_job/jobs/table', jobs: @filter.records, all_jobs_count: @filter.filtered_query_count %>
4
3
 
5
- <% if @filter.records.present? %>
6
- <nav aria-label="Job pagination" class="mt-3" data-gj-poll-replace id="jobs-pagination">
7
- <ul class="pagination">
8
- <li class="page-item">
9
- <%= link_to(@filter.to_params(after_scheduled_at: (@filter.last.scheduled_at || @filter.last.created_at), after_id: @filter.last.id), class: "page-link") do %>
10
- Older jobs <span aria-hidden="true">&raquo;</span>
11
- <% end %>
12
- </li>
13
- </ul>
14
- </nav>
15
- <% end %>
4
+ <div data-live-poll-region="jobs-table">
5
+ <%= render 'good_job/jobs/table', jobs: @filter.records, filter: @filter %>
6
+ <% if @filter.records.present? %>
7
+ <nav aria-label="Job pagination" class="mt-3">
8
+ <ul class="pagination">
9
+ <li class="page-item">
10
+ <%= link_to(@filter.to_params(after_scheduled_at: (@filter.last.scheduled_at || @filter.last.created_at), after_id: @filter.last.id), class: "page-link") do %>
11
+ Older jobs <span aria-hidden="true">&raquo;</span>
12
+ <% end %>
13
+ </li>
14
+ </ul>
15
+ </nav>
16
+ <% end %>
17
+ </div>
@@ -2,7 +2,7 @@
2
2
  <h2>Processes</h2>
3
3
  </div>
4
4
 
5
- <div data-gj-poll-replace id="processes">
5
+ <div data-live-poll-region="processes">
6
6
  <% if !GoodJob::Process.migrated? %>
7
7
  <div class="card my-3">
8
8
  <div class="card-body">
@@ -1,4 +1,4 @@
1
- <div class="py-4" data-gj-poll-replace id="chart">
1
+ <div class="py-4" data-live-poll-region="chart">
2
2
  <div class="chart-wrapper container-fluid">
3
3
  <canvas class="chart" data-json="<%= chart_data.to_json %>"></canvas>
4
4
  </div>
@@ -1,4 +1,4 @@
1
- <div data-gj-poll-replace id="filter">
1
+ <div data-live-poll-region id="filter">
2
2
  <div class="bg-light break-out">
3
3
  <h2 class="container-fluid pt-3 pb-2"><%= title %></h2>
4
4
 
@@ -1,4 +1,4 @@
1
- <footer class="footer mt-auto py-3 bg-light border-top text-muted small" id="footer" data-gj-poll-replace>
1
+ <footer class="footer mt-auto py-3 bg-light border-top text-muted small" id="footer" data-live-poll-region="footer">
2
2
  <div class="container-fluid">
3
3
  <div class="row">
4
4
  <div class="col-6">
@@ -14,14 +14,14 @@
14
14
  <%= link_to t(".cron_schedules"), cron_entries_path, class: ["nav-link", ("active" if controller_name == 'cron_entries')] %>
15
15
  </li>
16
16
  <li class="nav-item">
17
- <%= link_to t(".processes"), processes_path, class: ["nav-link", ("active" if controller_name == 'processes')] %>
17
+ <%= link_to t(".processes"), processes_path, class: ["nav-link", ("active" if controller_name == 'processes')] %>
18
18
  </li>
19
19
  </ul>
20
20
  <div class="nav-item pe-2">
21
- <div class="form-check">
22
- <input type="checkbox" id="toggle-poll" name="toggle-poll" <%= 'checked' if params[:poll].present? %>>
23
- <label for="toggle-poll"><%= t(".live_poll") %></label>
24
- </div>
21
+ <label>
22
+ <%= check_box_tag "live_poll", params.fetch("poll", 30), params[:poll].present? %>
23
+ <%= t(".live_poll") %>
24
+ </label>
25
25
  </div>
26
26
  <ul class="navbar-nav">
27
27
  <li class="nav-item dropdown">
@@ -17,7 +17,7 @@ GoodJob::Engine.routes.draw do
17
17
  end
18
18
  end
19
19
 
20
- resources :cron_entries, only: %i[index show] do
20
+ resources :cron_entries, only: %i[index show], param: :cron_key do
21
21
  member do
22
22
  post :enqueue
23
23
  end
@@ -61,6 +61,11 @@ module GoodJob
61
61
  key = job.good_job_concurrency_key
62
62
  next if key.blank?
63
63
 
64
+ if CurrentThread.execution.blank?
65
+ logger.debug("Ignoring concurrency limits because the job is executed with `perform_now`.")
66
+ next
67
+ end
68
+
64
69
  GoodJob::Execution.advisory_lock_key(key, function: "pg_advisory_lock") do
65
70
  allowed_active_job_ids = GoodJob::Execution.unfinished.where(concurrency_key: key).advisory_locked.order(Arel.sql("COALESCE(performed_at, scheduled_at, created_at) ASC")).limit(perform_limit).pluck(:active_job_id)
66
71
  # The current job has already been locked and will appear in the previous query
@@ -159,7 +159,7 @@ module GoodJob
159
159
  alias enable_cron? enable_cron
160
160
 
161
161
  def cron
162
- env_cron = JSON.parse(ENV['GOOD_JOB_CRON'], symbolize_names: true) if ENV['GOOD_JOB_CRON'].present?
162
+ env_cron = JSON.parse(ENV.fetch('GOOD_JOB_CRON'), symbolize_names: true) if ENV['GOOD_JOB_CRON'].present?
163
163
 
164
164
  options[:cron] ||
165
165
  rails_config[:cron] ||
@@ -17,7 +17,7 @@ module GoodJob
17
17
  def start
18
18
  @handler = Rack::Handler.get(RACK_SERVER)
19
19
  @future = Concurrent::Future.new(args: [@handler, @port, GoodJob.logger]) do |thr_handler, thr_port, thr_logger|
20
- thr_handler.run(self, Port: thr_port, Logger: thr_logger, AccessLog: [])
20
+ thr_handler.run(self, Port: thr_port, Host: '0.0.0.0', Logger: thr_logger, AccessLog: [])
21
21
  end
22
22
  @future.add_observer(self.class, :task_observer)
23
23
  @future.execute
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module GoodJob
3
3
  # GoodJob gem version.
4
- VERSION = '2.14.1'
4
+ VERSION = '2.14.4'
5
5
  end
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: 2.14.1
4
+ version: 2.14.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Sheldon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-26 00:00:00.000000000 Z
11
+ date: 2022-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -364,7 +364,7 @@ files:
364
364
  - engine/app/assets/good_job/modules/charts.js
365
365
  - engine/app/assets/good_job/modules/checkbox_toggle.js
366
366
  - engine/app/assets/good_job/modules/document_ready.js
367
- - engine/app/assets/good_job/modules/poller.js
367
+ - engine/app/assets/good_job/modules/live_poll.js
368
368
  - engine/app/assets/good_job/modules/toasts.js
369
369
  - engine/app/assets/good_job/scripts.js
370
370
  - engine/app/assets/good_job/style.css
@@ -483,7 +483,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
483
483
  - !ruby/object:Gem::Version
484
484
  version: '0'
485
485
  requirements: []
486
- rubygems_version: 3.3.7
486
+ rubygems_version: 3.2.33
487
487
  signing_key:
488
488
  specification_version: 4
489
489
  summary: A multithreaded, Postgres-based ActiveJob backend for Ruby on Rails
@@ -1,93 +0,0 @@
1
- /*jshint esversion: 6, strict: false */
2
- import renderCharts from "charts";
3
-
4
- // NOTE: this file is a bit disorganized. Please do not use it as a template for how to organize a JS module.
5
-
6
- const DEFAULT_POLL_INTERVAL_SECONDS = 30;
7
- const MINIMUM_POLL_INTERVAL = 1000;
8
-
9
- function getStorage(key) {
10
- const value = localStorage.getItem('good_job-' + key);
11
-
12
- if (value === 'true') {
13
- return true;
14
- } else if (value === 'false') {
15
- return false;
16
- } else {
17
- return value;
18
- }
19
- }
20
-
21
- function setStorage(key, value) {
22
- localStorage.setItem('good_job-' + key, value);
23
- }
24
-
25
- function updatePageContent(newContent) {
26
- const domParser = new DOMParser();
27
- const parsedDOM = domParser.parseFromString(newContent, "text/html");
28
-
29
- const newElements = parsedDOM.querySelectorAll('[data-gj-poll-replace]');
30
-
31
- for (let i = 0; i < newElements.length; i++) {
32
- const newEl = newElements[i];
33
- const oldEl = document.getElementById(newEl.id);
34
-
35
- if (oldEl) {
36
- oldEl.replaceWith(newEl);
37
- }
38
- }
39
-
40
- renderCharts(false);
41
- }
42
-
43
- function refreshPage() {
44
- fetch(window.location.href)
45
- .then(resp => resp.text())
46
- .then(updatePageContent);
47
- }
48
-
49
- const Poller = {
50
- start: () => {
51
- Poller.updateSettings();
52
- Poller.pollUpdates();
53
-
54
- const checkbox = document.querySelector('input[name="toggle-poll"]');
55
- checkbox.addEventListener('change', Poller.togglePoll)
56
- },
57
-
58
- togglePoll: (event) => {
59
- Poller.pollEnabled = event.currentTarget.checked;
60
- setStorage('pollEnabled', Poller.pollEnabled);
61
- },
62
-
63
- updateSettings: () => {
64
- const queryString = window.location.search;
65
- const urlParams = new URLSearchParams(queryString);
66
-
67
- if (urlParams.has('poll')) {
68
- const parsedInterval = (parseInt(urlParams.get('poll')) || DEFAULT_POLL_INTERVAL_SECONDS) * 1000;
69
- Poller.pollInterval = Math.max(parsedInterval, MINIMUM_POLL_INTERVAL);
70
- setStorage('pollInterval', Poller.pollInterval);
71
-
72
- Poller.pollEnabled = true;
73
- } else {
74
- Poller.pollInterval = getStorage('pollInterval') || (DEFAULT_POLL_INTERVAL_SECONDS * 1000);
75
- Poller.pollEnabled = getStorage('pollEnabled') || false;
76
- }
77
-
78
- document.getElementById('toggle-poll').checked = Poller.pollEnabled;
79
- },
80
-
81
- pollUpdates: () => {
82
- setTimeout(() => {
83
- if (Poller.pollEnabled === true) {
84
- refreshPage();
85
- Poller.pollUpdates();
86
- } else {
87
- Poller.pollUpdates();
88
- }
89
- }, Poller.pollInterval);
90
- },
91
- };
92
-
93
- export { Poller as default };