tasks_scheduler 0.4.0 → 0.5.2

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: 6573b654529a255fe7a822f33662837da3915a7b9a98cdc6e071c19d3143c955
4
- data.tar.gz: 3409022b969859d61f236ed5ddbf1678105ef35bd2cd971d5a172c56c43822b5
3
+ metadata.gz: 1990d0ec938668f01704d530a1797027f84ae24771f22ec716051176032039d9
4
+ data.tar.gz: 66bab115b2e5fa8f0aeb837ff9549b5a3779fbd9637733521f5f4800239d9fcb
5
5
  SHA512:
6
- metadata.gz: e93580d187fd4e4ff62faf5ee5b5b0b5ea70b13b11f86f38779327f2bb06f329e46089b3add379cc734a06fd666c7a9edc40156939abc8ffadeb655bd43c6f22
7
- data.tar.gz: cf55f3658eb3df0c1527a219b67a03ce401af2ce22dde55e49b90184b4c4019c21bd2ab0fc3e3a7741cf6a70e4f2ca8c8a8ec6578b3d304bf6efb62ee5c4c079
6
+ metadata.gz: bc08c8c498e0179d205f23bf6b7107e4f9db245857bcce37a0956ad73d14ef45d7ff0300a9140dc25e9976c7636c4f442a7a8af374bf84a4cb7d8c89fe988b1d
7
+ data.tar.gz: af0434d46a4ef3fecc00d177132f0cd2a7b1717853113ec0327c3d798fc1a24f1b7e55f3daa1e511aa31e1754deae4fc7af37393826d624834bf90d30eb3b242
@@ -1,115 +1,4 @@
1
1
  //= require active_scaffold
2
2
  //= require js-routes
3
-
4
- function TasksScheduler() {
5
- }
6
-
7
- TasksScheduler.Status = function () {
8
- };
9
-
10
- // Shortcut
11
- var _S = TasksScheduler.Status;
12
-
13
- _S.initialized = false;
14
-
15
- _S.init = function (url, interval_max) {
16
- if (!_S.initialized) {
17
- _S.initialized = true;
18
- _S.url = url;
19
- _S.interval_max = interval_max;
20
- _S.update();
21
- }
22
- };
23
-
24
- _S.content = function () {
25
- return $('#TaskScheduler_Status_Content');
26
- };
27
-
28
- _S.status = function () {
29
- return $('#TaskScheduler_Status_Status');
30
- };
31
-
32
- _S.update_status = function () {
33
- _S.status().html(
34
- "Updating in " + _S.interval + " seconds..."
35
- );
36
- };
37
-
38
- _S.check = function () {
39
- if (_S.interval <= 0) {
40
- _S.update();
41
- } else {
42
- _S.interval--;
43
- _S.update_status();
44
- setTimeout(_S.check, 1000);
45
- }
46
- };
47
-
48
- _S.update = function () {
49
- $.ajax({
50
- url: _S.url,
51
- success: function (result) {
52
- _S.content().html(result);
53
- },
54
- complete: function (result) {
55
- _S.interval = _S.interval_max + 1;
56
- _S.last_update = new Date();
57
- _S.check();
58
- }
59
- });
60
- };
61
-
62
- TasksScheduler.Alert = function () {
63
- };
64
-
65
- _A = TasksScheduler.Alert;
66
-
67
- _A.DEFAULT_REFRESH_INTERVAL = 5000;
68
- _A.DEFAULT_ELEMENT_SELECTOR = '#tasks_scheduler_alert';
69
- _A.CSS_CLASSES_PREFIX = 'alert_';
70
- _A.url = Routes.status_tasks_scheduler_daemon_path();
71
-
72
- _A.init = function (options) {
73
- options = typeof options !== 'undefined' ? options : {};
74
- $(document).ready(function () {
75
- _A.options = options;
76
- if (!_A.options.refresh_interval) {
77
- _A.options.refresh_interval = _A.DEFAULT_REFRESH_INTERVAL;
78
- }
79
- if (!_A.options.element_selector) {
80
- _A.options.element_selector = _A.DEFAULT_ELEMENT_SELECTOR;
81
- }
82
- _A.refresh();
83
- });
84
- };
85
-
86
- _A.setNextRefresh = function () {
87
- setTimeout(_A.refresh, _A.options.refresh_interval);
88
- };
89
-
90
- _A.refresh = function () {
91
- $.ajax({
92
- url: _A.url,
93
- success: function (result) {
94
- var alert = $(_A.options.element_selector);
95
- var pattern = new RegExp('(^|\\s)' + _A.CSS_CLASSES_PREFIX + "\\S+", 'g');
96
- alert.removeClass (function (index, className) {
97
- return (className.match (pattern) || []).join(' ');
98
- });
99
- alert.addClass(_A.resultToCssClass(result));
100
- },
101
- complete: function (result) {
102
- _A.setNextRefresh();
103
- }
104
- });
105
- };
106
-
107
- _A.resultToCssClass = function(result) {
108
- var suffix = "ok"
109
- if (!result.daemon_running) {
110
- suffix = "daemon_stopped";
111
- } else if (!result.tasks_all_ok) {
112
- suffix = "task_failed";
113
- }
114
- return _A.CSS_CLASSES_PREFIX + suffix;
115
- };
3
+ //= require tasks_scheduler/alert
4
+ //= require tasks_scheduler/status
@@ -0,0 +1,62 @@
1
+ if (typeof TasksScheduler == "undefined") {
2
+ TasksScheduler = function() {};
3
+ }
4
+
5
+ TasksScheduler.Alert = function () {
6
+ };
7
+
8
+ _A = TasksScheduler.Alert;
9
+
10
+ _A.DEFAULT_REFRESH_INTERVAL = 5000;
11
+ _A.DEFAULT_ELEMENT_SELECTOR = '#tasks_scheduler_alert';
12
+ _A.CSS_CLASSES_PREFIX = 'alert_';
13
+ _A.url = Routes.status_tasks_scheduler_daemon_path();
14
+
15
+ _A.init = function (options) {
16
+ options = typeof options !== 'undefined' ? options : {};
17
+ $(document).ready(function () {
18
+ _A.options = options;
19
+ if (!_A.options.refresh_interval) {
20
+ _A.options.refresh_interval = _A.DEFAULT_REFRESH_INTERVAL;
21
+ }
22
+ if (!_A.options.element_selector) {
23
+ _A.options.element_selector = _A.DEFAULT_ELEMENT_SELECTOR;
24
+ }
25
+ _A.refresh();
26
+ });
27
+ };
28
+
29
+ _A.setNextRefresh = function () {
30
+ setTimeout(_A.refresh, _A.options.refresh_interval);
31
+ };
32
+
33
+ _A.refresh = function () {
34
+ $.ajax(_A.refreshAjaxData());
35
+ };
36
+
37
+ _A.refreshAjaxData = function () {
38
+ return {
39
+ url: _A.url,
40
+ success: function (result) {
41
+ var alert = $(_A.options.element_selector);
42
+ var pattern = new RegExp('(^|\\s)' + _A.CSS_CLASSES_PREFIX + "\\S+", 'g');
43
+ alert.removeClass (function (index, className) {
44
+ return (className.match (pattern) || []).join(' ');
45
+ });
46
+ alert.addClass(_A.resultToCssClass(result));
47
+ },
48
+ complete: function (result) {
49
+ _A.setNextRefresh();
50
+ }
51
+ };
52
+ };
53
+
54
+ _A.resultToCssClass = function(result) {
55
+ var suffix = "ok"
56
+ if (!result.daemon_running) {
57
+ suffix = "daemon_stopped";
58
+ } else if (!result.tasks_all_ok) {
59
+ suffix = "task_failed";
60
+ }
61
+ return _A.CSS_CLASSES_PREFIX + suffix;
62
+ };
@@ -0,0 +1,62 @@
1
+ if (typeof TasksScheduler == "undefined") {
2
+ TasksScheduler = function() {};
3
+ }
4
+
5
+ TasksScheduler.Status = function () {
6
+ };
7
+
8
+ // Shortcut
9
+ var _S = TasksScheduler.Status;
10
+
11
+ _S.initialized = false;
12
+
13
+ _S.init = function (url, interval_max) {
14
+ if (!_S.initialized) {
15
+ _S.initialized = true;
16
+ _S.url = url;
17
+ _S.interval_max = interval_max;
18
+ _S.update();
19
+ }
20
+ };
21
+
22
+ _S.content = function () {
23
+ return $('#TaskScheduler_Status_Content');
24
+ };
25
+
26
+ _S.status = function () {
27
+ return $('#TaskScheduler_Status_Status');
28
+ };
29
+
30
+ _S.update_status = function () {
31
+ _S.status().html(
32
+ "Updating in " + _S.interval + " seconds..."
33
+ );
34
+ };
35
+
36
+ _S.check = function () {
37
+ if (_S.interval <= 0) {
38
+ _S.update();
39
+ } else {
40
+ _S.interval--;
41
+ _S.update_status();
42
+ setTimeout(_S.check, 1000);
43
+ }
44
+ };
45
+
46
+ _S.update = function () {
47
+ $.ajax(_S.updateAjaxData());
48
+ };
49
+
50
+ _S.updateAjaxData = function() {
51
+ return {
52
+ url: _S.url,
53
+ success: function (result) {
54
+ _S.content().html(result);
55
+ },
56
+ complete: function (result) {
57
+ _S.interval = _S.interval_max + 1;
58
+ _S.last_update = new Date();
59
+ _S.check();
60
+ }
61
+ };
62
+ };
@@ -39,6 +39,10 @@
39
39
  td.status_disabled {
40
40
  color: lightgrey;
41
41
  }
42
+
43
+ td.status_task_not_found {
44
+ color: violet;
45
+ }
42
46
  }
43
47
 
44
48
  .last_run {
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/core_ext'
3
4
  require 'rake'
4
5
 
5
6
  class ScheduledTask < ActiveRecord::Base
@@ -29,14 +30,11 @@ class ScheduledTask < ActiveRecord::Base
29
30
  end
30
31
  end
31
32
 
32
- STATUS_RUNNING = 'running'
33
- STATUS_FAILED = 'failed'
34
- STATUS_WAITING = 'waiting'
35
- STATUS_ABORTED = 'aborted'
36
- STATUS_TIMEOUT = 'timeout'
37
- STATUS_DISABLED = 'disabled'
33
+ enable_listable
34
+ lists.add_string :status, 'aborted', 'disabled', 'failed', 'running', 'task_not_found', 'timeout',
35
+ 'waiting'
38
36
 
39
- LAST_FAIL_STATUSES = [STATUS_FAILED, STATUS_ABORTED, STATUS_TIMEOUT].freeze
37
+ LAST_FAIL_STATUSES = [STATUS_FAILED, STATUS_ABORTED, STATUS_TASK_NOT_FOUND, STATUS_TIMEOUT].freeze
40
38
 
41
39
  validates :scheduling, presence: true, 'tasks_scheduler/cron_scheduling': true
42
40
  validates :task, presence: true
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rake'
4
+ require 'eac_ruby_utils/ruby'
4
5
 
5
6
  class ScheduledTask < ActiveRecord::Base
6
7
  module Checker
@@ -44,6 +45,12 @@ class ScheduledTask < ActiveRecord::Base
44
45
  end
45
46
  end
46
47
 
48
+ def check_on_task_not_exist
49
+ message = "Task does not exist: #{task}"
50
+ check_log(message)
51
+ on_end_running(::StandardError.new(message), STATUS_TASK_NOT_FOUND)
52
+ end
53
+
47
54
  def check_log(message, method = :info)
48
55
  Rails.logger.send(method, "TASK_CHECK(#{id}): #{message}")
49
56
  end
@@ -64,7 +71,7 @@ class ScheduledTask < ActiveRecord::Base
64
71
 
65
72
  def check_task_with_next_run
66
73
  if !task_exist?
67
- check_log("Task does not exist: #{task}")
74
+ check_on_task_not_exist
68
75
  elsif next_run < Time.zone.now
69
76
  check_log('Next run reached. Running...')
70
77
  spawn_task
@@ -77,8 +84,10 @@ class ScheduledTask < ActiveRecord::Base
77
84
  params = ['bundle', 'exec', 'tasks_scheduler_run_task', id.to_s]
78
85
  check_log("Spawn command: #{params} (Task: #{task})")
79
86
  spawn_pid = nil
80
- Dir.chdir(Rails.root) do
81
- spawn_pid = Process.spawn(*params)
87
+ ::EacRubyUtils::Ruby.on_clean_environment do
88
+ Dir.chdir(Rails.root) do
89
+ spawn_pid = ::Process.spawn(*params)
90
+ end
82
91
  end
83
92
  Process.detach(spawn_pid)
84
93
  update!(pid: spawn_pid, last_fail_status: nil)
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class CreateScheduledTasks < ActiveRecord::Migration
3
+ class CreateScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  create_table :scheduled_tasks do |t|
6
8
  t.string :scheduling
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AddStatusAttributesToScheduledTasks < ActiveRecord::Migration
3
+ class AddStatusAttributesToScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  add_column :scheduled_tasks, :last_run_start, :datetime
6
8
  add_column :scheduled_tasks, :last_run_successful_start, :datetime
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AddPidToScheduledTasks < ActiveRecord::Migration
3
+ class AddPidToScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  add_column :scheduled_tasks, :pid, :integer
6
8
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AddArgsToScheduledTasks < ActiveRecord::Migration
3
+ class AddArgsToScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  add_column :scheduled_tasks, :args, :string
6
8
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AddLastFailStatusToScheduledTasks < ActiveRecord::Migration
3
+ class AddLastFailStatusToScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  add_column :scheduled_tasks, :last_fail_status, :string
6
8
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AddEnabledToScheduledTasks < ActiveRecord::Migration
3
+ class AddEnabledToScheduledTasks < (
4
+ Rails.version < '5.2' ? ActiveRecord::Migration : ActiveRecord::Migration[4.2]
5
+ )
4
6
  def change
5
7
  add_column :scheduled_tasks, :enabled, :boolean, null: false, default: true
6
8
  end
@@ -1,13 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'tasks_scheduler/engine'
4
- require 'active_scaffold'
5
- require 'js-routes'
6
- require 'parse-cron'
7
- require 'tasks_scheduler/cron_scheduling_validator'
8
- require 'tasks_scheduler/cron_parser_patch'
9
- require 'tasks_scheduler/checker'
10
- require 'tasks_scheduler/daemon'
3
+ require 'eac_ruby_utils/require_sub'
11
4
 
12
5
  module TasksScheduler
6
+ ::EacRubyUtils.require_sub __FILE__
13
7
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_gems_utils/gem'
4
+ require 'singleton'
5
+
6
+ module TasksScheduler
7
+ class AppGem < ::SimpleDelegator
8
+ include ::Singleton
9
+
10
+ def initialize
11
+ super(::EacRubyGemsUtils::Gem.new(::Rails.root))
12
+ end
13
+
14
+ def bundle(*args)
15
+ super(*args).chdir_root.envvar('RAILS_ENV', ::Rails.env)
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'parse-cron'
4
+
3
5
  module TasksScheduler
4
6
  module CronParserPatch
5
7
  class TasksSchedulerTimeSource
@@ -1,31 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'open3'
3
+ require 'tasks_scheduler/app_gem'
4
4
 
5
5
  module TasksScheduler
6
6
  class Daemon
7
7
  ACTIONS = %w[status start stop restart].freeze
8
8
 
9
9
  class << self
10
- def execute(action)
10
+ def daemon_command(action)
11
11
  raise "Action not allowed: #{action} (Allowed: #{ACTIONS})" unless ACTIONS.include?(action)
12
12
 
13
- command = ['bundle', 'exec', 'tasks_scheduler', action]
14
- Dir.chdir(Rails.root) do
15
- Open3.popen3(env_args, *command) do |_stdin, stdout, stderr, wait_thr|
16
- { action: action, env_args: env_args.map { |k, v| "#{k}=#{v}" }.join(' | '),
17
- command: command.join(' '), status: wait_thr.value.to_i, stdout: stdout.read,
18
- stderr: stderr.read }
19
- end
20
- end
13
+ ::TasksScheduler::AppGem.instance.bundle('exec', 'tasks_scheduler', action)
14
+ .envvar(::TasksScheduler::Checker::LOG_ON_FILE_ENV_KEY, '1')
15
+ end
16
+
17
+ def execute(action)
18
+ command = daemon_command(action)
19
+ result = command.execute
20
+ {
21
+ action: action, env_args: env_args_to_s(command), command: command.to_s,
22
+ status: result.fetch(:exit_code), stdout: result.fetch(:stdout),
23
+ stderr: result.fetch(:stderr)
24
+ }
21
25
  end
22
26
 
23
27
  def running?
24
28
  execute('status')[:status].zero?
25
29
  end
26
30
 
27
- def env_args
28
- { 'RAILS_ENV' => Rails.env, ::TasksScheduler::Checker::LOG_ON_FILE_ENV_KEY => '1' }
31
+ def env_args_to_s(command)
32
+ command.send(:extra_options).fetch(:envvars).map { |k, v| "#{k}=#{v}" }.join(' | ')
29
33
  end
30
34
  end
31
35
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_scaffold'
4
+ require 'js-routes'
5
+
3
6
  module TasksScheduler
4
7
  class Engine < ::Rails::Engine
5
8
  initializer :append_migrations do |app|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TasksScheduler
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.2'
5
5
  end
@@ -2,3 +2,5 @@ test_scheduling:
2
2
  scheduling: 0 0 * * *
3
3
  task: test
4
4
  next_run: 2016-11-22 09:38:28
5
+ created_at: 2016-11-20 00:00:00
6
+ updated_at: 2016-11-20 00:00:00
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tasks_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-01 00:00:00.000000000 Z
11
+ date: 2020-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_scaffold
@@ -38,6 +38,40 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: eac_ruby_gems_utils
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.4'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.4.1
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.4'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.4.1
61
+ - !ruby/object:Gem::Dependency
62
+ name: eac_ruby_utils
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.43'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.43'
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: js-routes
43
77
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +104,36 @@ dependencies:
70
104
  name: rails
71
105
  requirement: !ruby/object:Gem::Requirement
72
106
  requirements:
73
- - - "~>"
107
+ - - ">="
74
108
  - !ruby/object:Gem::Version
75
- version: 4.2.1
109
+ version: 4.2.11.3
76
110
  type: :runtime
77
111
  prerelease: false
78
112
  version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 4.2.11.3
117
+ - !ruby/object:Gem::Dependency
118
+ name: eac_ruby_gem_support
119
+ requirement: !ruby/object:Gem::Requirement
79
120
  requirements:
80
121
  - - "~>"
81
122
  - !ruby/object:Gem::Version
82
- version: 4.2.1
123
+ version: '0.1'
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: 0.1.1
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0.1'
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 0.1.1
83
137
  - !ruby/object:Gem::Dependency
84
138
  name: sqlite3
85
139
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +161,8 @@ files:
107
161
  - README.rdoc
108
162
  - Rakefile
109
163
  - app/assets/javascripts/tasks_scheduler.js
164
+ - app/assets/javascripts/tasks_scheduler/alert.js
165
+ - app/assets/javascripts/tasks_scheduler/status.js
110
166
  - app/assets/stylesheets/tasks_scheduler.scss
111
167
  - app/assets/stylesheets/tasks_scheduler/alert.scss
112
168
  - app/controllers/scheduled_tasks_controller.rb
@@ -142,6 +198,7 @@ files:
142
198
  - exe/tasks_scheduler
143
199
  - exe/tasks_scheduler_run_task
144
200
  - lib/tasks_scheduler.rb
201
+ - lib/tasks_scheduler/app_gem.rb
145
202
  - lib/tasks_scheduler/checker.rb
146
203
  - lib/tasks_scheduler/checker/log.rb
147
204
  - lib/tasks_scheduler/cron_parser_patch.rb
@@ -187,7 +244,7 @@ files:
187
244
  - test/fixtures/scheduled_tasks.yml
188
245
  - test/models/scheduled_task_test.rb
189
246
  - test/test_helper.rb
190
- homepage:
247
+ homepage: https://github.com/esquilo-azul/tasks_scheduler
191
248
  licenses:
192
249
  - MIT
193
250
  metadata: {}
@@ -206,8 +263,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
263
  - !ruby/object:Gem::Version
207
264
  version: '0'
208
265
  requirements: []
209
- rubyforge_project:
210
- rubygems_version: 2.7.7
266
+ rubygems_version: 3.0.8
211
267
  signing_key:
212
268
  specification_version: 4
213
269
  summary: Scheduler for Rake tasks.