tasks_scheduler 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -1
  3. data/app/controllers/scheduled_tasks_controller.rb +5 -4
  4. data/app/controllers/tasks_scheduler_daemon_controller.rb +4 -3
  5. data/app/controllers/tasks_scheduler_daemon_controller/_download_log.rb +6 -0
  6. data/app/helpers/scheduled_tasks_helper.rb +2 -0
  7. data/app/models/scheduled_task.rb +12 -8
  8. data/app/models/scheduled_task/checker.rb +5 -2
  9. data/app/models/scheduled_task/log.rb +9 -6
  10. data/app/models/scheduled_task/runner.rb +9 -5
  11. data/app/models/scheduled_task/status.rb +8 -4
  12. data/config/initializers/assets.rb +3 -1
  13. data/config/routes.rb +2 -0
  14. data/db/migrate/20161122123828_create_scheduled_tasks.rb +2 -0
  15. data/db/migrate/20161123130153_add_status_attributes_to_scheduled_tasks.rb +2 -0
  16. data/db/migrate/20161124200712_add_pid_to_scheduled_tasks.rb +2 -0
  17. data/db/migrate/20161128163702_add_args_to_scheduled_tasks.rb +2 -0
  18. data/db/migrate/20180223155025_add_last_fail_status_to_scheduled_tasks.rb +2 -0
  19. data/db/migrate/20180302170138_add_enabled_to_scheduled_tasks.rb +2 -0
  20. data/exe/tasks_scheduler +3 -1
  21. data/exe/tasks_scheduler_run_task +3 -1
  22. data/lib/tasks_scheduler.rb +2 -0
  23. data/lib/tasks_scheduler/checker.rb +5 -2
  24. data/lib/tasks_scheduler/checker/log.rb +2 -0
  25. data/lib/tasks_scheduler/cron_parser_patch.rb +3 -1
  26. data/lib/tasks_scheduler/cron_scheduling_validator.rb +3 -0
  27. data/lib/tasks_scheduler/daemon.rb +4 -1
  28. data/lib/tasks_scheduler/engine.rb +2 -0
  29. data/lib/tasks_scheduler/version.rb +3 -1
  30. data/test/dummy/Rakefile +3 -1
  31. data/test/dummy/app/controllers/application_controller.rb +2 -0
  32. data/test/dummy/app/helpers/application_helper.rb +2 -0
  33. data/test/dummy/bin/bundle +3 -1
  34. data/test/dummy/bin/rails +3 -1
  35. data/test/dummy/bin/rake +2 -0
  36. data/test/dummy/bin/setup +3 -1
  37. data/test/dummy/config.ru +2 -0
  38. data/test/dummy/config/application.rb +3 -1
  39. data/test/dummy/config/boot.rb +4 -2
  40. data/test/dummy/config/environment.rb +3 -1
  41. data/test/dummy/config/environments/development.rb +2 -0
  42. data/test/dummy/config/environments/production.rb +2 -0
  43. data/test/dummy/config/environments/test.rb +2 -0
  44. data/test/dummy/config/initializers/assets.rb +2 -0
  45. data/test/dummy/config/initializers/backtrace_silencers.rb +1 -0
  46. data/test/dummy/config/initializers/cookies_serializer.rb +2 -0
  47. data/test/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  48. data/test/dummy/config/initializers/inflections.rb +1 -0
  49. data/test/dummy/config/initializers/mime_types.rb +1 -0
  50. data/test/dummy/config/initializers/session_store.rb +2 -0
  51. data/test/dummy/config/initializers/wrap_parameters.rb +2 -0
  52. data/test/dummy/config/routes.rb +2 -0
  53. data/test/models/scheduled_task_test.rb +6 -4
  54. data/test/test_helper.rb +6 -4
  55. metadata +26 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89877b670ebd68e63175333d60bce49d90de7c4e04737189f5c73a6a277f0595
4
- data.tar.gz: 18d4d5224dcabd9dd2238d0cc8a5dea03689d58323de808b5bb4622664a2cc01
3
+ metadata.gz: 6573b654529a255fe7a822f33662837da3915a7b9a98cdc6e071c19d3143c955
4
+ data.tar.gz: 3409022b969859d61f236ed5ddbf1678105ef35bd2cd971d5a172c56c43822b5
5
5
  SHA512:
6
- metadata.gz: 6bb72a00e15bd394f6baa9cbae395e8737295ff72f1177315fd15937b2b60189901b7db0cfe3c2b7b9daf08599023c694558231539d1f6e2b92ea4f6fd0bd2a4
7
- data.tar.gz: 766a81812effee371317d38ee615e0e5b57400abac7d6a376a6a5971bc98fc301bdca3e03dbfa3c8f1d3f1c7903ddbdf479fc7b89451292880c386c813311b69
6
+ metadata.gz: e93580d187fd4e4ff62faf5ee5b5b0b5ea70b13b11f86f38779327f2bb06f329e46089b3add379cc734a06fd666c7a9edc40156939abc8ffadeb655bd43c6f22
7
+ data.tar.gz: cf55f3658eb3df0c1527a219b67a03ce401af2ce22dde55e49b90184b4c4019c21bd2ab0fc3e3a7741cf6a70e4f2ca8c8a8ec6578b3d304bf6efb62ee5c4c079
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
@@ -14,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
16
  rdoc.rdoc_files.include('lib/**/*.rb')
15
17
  end
16
18
 
17
- APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
19
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
18
20
  load 'rails/tasks/engine.rake'
19
21
 
20
22
  load 'rails/tasks/statistics.rake'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ScheduledTasksController < ApplicationController
2
4
  class << self
3
5
  private
@@ -8,7 +10,7 @@ class ScheduledTasksController < ApplicationController
8
10
  end
9
11
 
10
12
  active_scaffold :scheduled_task do |conf|
11
- [:create, :update, :list].each do |action|
13
+ %i[create update list].each do |action|
12
14
  conf.send(action).columns.exclude(:next_run, :last_fail_status, :last_run_start,
13
15
  :last_run_successful_start, :last_run_unsuccessful_start,
14
16
  :last_run_successful_end, :last_run_unsuccessful_end,
@@ -26,8 +28,7 @@ class ScheduledTasksController < ApplicationController
26
28
  @log_file = record.log_file(params[:identifier])
27
29
  end
28
30
 
29
- def status
30
- end
31
+ def status; end
31
32
 
32
33
  def status_content
33
34
  @scheduled_tasks = ::ScheduledTask.order(task: :asc, scheduling: :asc)
@@ -36,7 +37,7 @@ class ScheduledTasksController < ApplicationController
36
37
 
37
38
  def run_now
38
39
  process_action_link_action do |record|
39
- record.update_attributes!(next_run: Time.zone.now)
40
+ record.update!(next_run: Time.zone.now)
40
41
  record.reload
41
42
  flash[:info] = "Next run adjusted to #{record.next_run}"
42
43
  end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tasks_scheduler/checker'
2
4
 
3
5
  class TasksSchedulerDaemonController < ApplicationController
4
6
  require_relative 'tasks_scheduler_daemon_controller/_download_log'
5
7
 
6
- def index
7
- end
8
+ def index; end
8
9
 
9
10
  def execute
10
11
  @result = ::TasksScheduler::Daemon.execute(params[:tasks_scheduler_execute_action])
@@ -13,6 +14,6 @@ class TasksSchedulerDaemonController < ApplicationController
13
14
 
14
15
  def status
15
16
  render json: { daemon_running: ::TasksScheduler::Daemon.running?,
16
- tasks_all_ok: !::ScheduledTask.all.any?(&:failed?) }
17
+ tasks_all_ok: ::ScheduledTask.all.none?(&:failed?) }
17
18
  end
18
19
  end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class TasksSchedulerDaemonController < ApplicationController
2
4
  def download_log
3
5
  return unless download_log_validate_log_key
6
+
4
7
  log = ::TasksScheduler::Checker.instance.send("#{download_log_key}_log")
5
8
  return unless download_log_validate_log_exist(log)
9
+
6
10
  send_log_file(log)
7
11
  end
8
12
 
@@ -14,6 +18,7 @@ class TasksSchedulerDaemonController < ApplicationController
14
18
 
15
19
  def download_log_validate_log_key
16
20
  return true if ::TasksScheduler::Checker::LOGS_KEYS.include?(download_log_key)
21
+
17
22
  redirect_to(tasks_scheduler_daemon_path,
18
23
  notice: "Invalid log key: \"#{download_log_key}\"")
19
24
  false
@@ -21,6 +26,7 @@ class TasksSchedulerDaemonController < ApplicationController
21
26
 
22
27
  def download_log_validate_log_exist(log)
23
28
  return true if log.exist?
29
+
24
30
  redirect_to(tasks_scheduler_daemon_path, notice: "Log \"#{log.key}\" does not exist.")
25
31
  false
26
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ScheduledTasksHelper
2
4
  def scheduled_tasks_status_time(time)
3
5
  if time.present?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rake'
2
4
 
3
5
  class ScheduledTask < ActiveRecord::Base
@@ -6,7 +8,7 @@ class ScheduledTask < ActiveRecord::Base
6
8
  include ::ScheduledTask::Runner
7
9
  include ::ScheduledTask::Status
8
10
 
9
- DEFAULT_TIMEOUT_ENVVAR_NAME = 'TASKS_SCHEDULER_TIMEOUT'.freeze
11
+ DEFAULT_TIMEOUT_ENVVAR_NAME = 'TASKS_SCHEDULER_TIMEOUT'
10
12
  DEFAULT_TIMEOUT = 12.hours
11
13
 
12
14
  class << self
@@ -20,9 +22,9 @@ class ScheduledTask < ActiveRecord::Base
20
22
  def timeout
21
23
  @timeout ||= begin
22
24
  r = Integer(ENV[DEFAULT_TIMEOUT_ENVVAR_NAME])
23
- r > 0 ? r.seconds : DEFAULT_TIMEOUT
24
- rescue ArgumentError, TypeError
25
- DEFAULT_TIMEOUT
25
+ r.positive? ? r.seconds : DEFAULT_TIMEOUT
26
+ rescue ArgumentError, TypeError
27
+ DEFAULT_TIMEOUT
26
28
  end
27
29
  end
28
30
  end
@@ -34,7 +36,7 @@ class ScheduledTask < ActiveRecord::Base
34
36
  STATUS_TIMEOUT = 'timeout'
35
37
  STATUS_DISABLED = 'disabled'
36
38
 
37
- LAST_FAIL_STATUSES = [STATUS_FAILED, STATUS_ABORTED, STATUS_TIMEOUT]
39
+ LAST_FAIL_STATUSES = [STATUS_FAILED, STATUS_ABORTED, STATUS_TIMEOUT].freeze
38
40
 
39
41
  validates :scheduling, presence: true, 'tasks_scheduler/cron_scheduling': true
40
42
  validates :task, presence: true
@@ -69,13 +71,14 @@ class ScheduledTask < ActiveRecord::Base
69
71
 
70
72
  def process_running?
71
73
  return false if pid.nil?
74
+
72
75
  Process.kill(0, pid)
73
- return true
76
+ true
74
77
  rescue Errno::EPERM
75
78
  raise "No permission to query #{pid}!"
76
79
  rescue Errno::ESRCH
77
- return false
78
- rescue
80
+ false
81
+ rescue StandardError
79
82
  raise "Unable to determine status for #{pid}"
80
83
  end
81
84
 
@@ -87,6 +90,7 @@ class ScheduledTask < ActiveRecord::Base
87
90
  return if task.blank?
88
91
  return unless task_changed?
89
92
  return if self.class.rake_tasks.include?(task)
93
+
90
94
  errors.add(:task, "Task \"#{task}\" not found")
91
95
  end
92
96
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rake'
2
4
 
3
5
  class ScheduledTask < ActiveRecord::Base
@@ -34,6 +36,7 @@ class ScheduledTask < ActiveRecord::Base
34
36
 
35
37
  def check_on_pid_not_present
36
38
  return unless enabled?
39
+
37
40
  if next_run.present?
38
41
  check_task_with_next_run
39
42
  else
@@ -55,7 +58,7 @@ class ScheduledTask < ActiveRecord::Base
55
58
 
56
59
  def check_task_without_next_run
57
60
  check_log('Next run blank')
58
- update_attributes!(next_run: calculate_next_run)
61
+ update!(next_run: calculate_next_run)
59
62
  check_log("Next run scheduled: #{next_run.in_time_zone}")
60
63
  end
61
64
 
@@ -78,7 +81,7 @@ class ScheduledTask < ActiveRecord::Base
78
81
  spawn_pid = Process.spawn(*params)
79
82
  end
80
83
  Process.detach(spawn_pid)
81
- update_attributes!(pid: spawn_pid, last_fail_status: nil)
84
+ update!(pid: spawn_pid, last_fail_status: nil)
82
85
  end
83
86
 
84
87
  def timeout?
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ScheduledTask < ActiveRecord::Base
2
4
  module Log
3
5
  def log_file(identifier)
4
6
  unless log_identifiers.include?(identifier)
5
- fail "Log identifier unknown: \"#{identifier}\" (Valid: #{log_identifiers})"
7
+ raise "Log identifier unknown: \"#{identifier}\" (Valid: #{log_identifiers})"
6
8
  end
9
+
7
10
  Rails.root.join('log', 'tasks_scheduler', "#{id}_#{identifier}.log")
8
11
  end
9
12
 
@@ -24,11 +27,11 @@ class ScheduledTask < ActiveRecord::Base
24
27
 
25
28
  def log_on_end(exception)
26
29
  running_log = log_file(LOG_RUNNING)
27
- if ::File.exist?(running_log)
28
- target_log = exception ? log_file(LOG_UNSUCCESSFUL) : log_file(LOG_SUCCESSFUL)
29
- File.unlink(target_log) if File.exist?(target_log)
30
- File.rename(running_log, target_log)
31
- end
30
+ return unless ::File.exist?(running_log)
31
+
32
+ target_log = exception ? log_file(LOG_UNSUCCESSFUL) : log_file(LOG_SUCCESSFUL)
33
+ File.unlink(target_log) if File.exist?(target_log)
34
+ File.rename(running_log, target_log)
32
35
  end
33
36
  end
34
37
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ScheduledTask < ActiveRecord::Base
2
4
  module Runner
3
5
  def run
4
6
  log_on_start
5
7
  run_banner
6
8
  return if process_running? && pid != Process.pid
9
+
7
10
  status_on_start
8
11
  exception = invoke_task
9
12
  on_end_running(exception, STATUS_FAILED)
@@ -33,7 +36,7 @@ class ScheduledTask < ActiveRecord::Base
33
36
 
34
37
  def run_banner
35
38
  run_log("Task: #{self}")
36
- run_log("PID: #{pid ? pid : '-'} (Current: #{Process.pid})")
39
+ run_log("PID: #{pid || '-'} (Current: #{Process.pid})")
37
40
  run_log("Process running? #{process_running? ? 'Yes' : 'No'}")
38
41
  run_log("Rails.env: #{Rails.env}")
39
42
  end
@@ -44,15 +47,16 @@ class ScheduledTask < ActiveRecord::Base
44
47
  Rake::Task.clear
45
48
  Rails.application.load_tasks
46
49
  Rake::Task[task].invoke(*invoke_args)
47
- rescue StandardError => ex
48
- run_log(ex, :fatal)
49
- exception = ex
50
+ rescue StandardError => e
51
+ run_log(e, :fatal)
52
+ exception = e
50
53
  end
51
54
  exception
52
55
  end
53
56
 
54
57
  def invoke_args
55
- return [] unless args.present?
58
+ return [] if args.blank?
59
+
56
60
  args.split('|')
57
61
  end
58
62
  end
@@ -1,10 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ScheduledTask < ActiveRecord::Base
2
4
  module Status
3
5
  def status
4
6
  return STATUS_DISABLED unless enabled?
5
7
  return STATUS_RUNNING if running?
6
8
  return STATUS_WAITING if waiting?
7
- last_fail_status.present? ? last_fail_status : STATUS_FAILED
9
+
10
+ last_fail_status.presence || STATUS_FAILED
8
11
  end
9
12
 
10
13
  def failed?
@@ -17,6 +20,7 @@ class ScheduledTask < ActiveRecord::Base
17
20
 
18
21
  def waiting?
19
22
  return true if ended?(last_run_successful_end, last_run_unsuccessful_end)
23
+
20
24
  status_attributes.all? { |a| send(a).blank? }
21
25
  end
22
26
 
@@ -27,11 +31,11 @@ class ScheduledTask < ActiveRecord::Base
27
31
  end
28
32
 
29
33
  def status_on_start
30
- update_attributes!(last_run_start: Time.zone.now)
34
+ update!(last_run_start: Time.zone.now)
31
35
  end
32
36
 
33
37
  def status_on_end(exception, last_fail_status)
34
- update_attributes!(
38
+ update!(
35
39
  next_run: calculate_next_run,
36
40
  (exception ? :last_run_unsuccessful_start : :last_run_successful_start) => last_run_start,
37
41
  (exception ? :last_run_unsuccessful_end : :last_run_successful_end) => Time.zone.now,
@@ -42,7 +46,7 @@ class ScheduledTask < ActiveRecord::Base
42
46
  end
43
47
 
44
48
  def status_attributes
45
- %w(start successful_start successful_end unsuccessful_start unsuccessful_end).map do |a|
49
+ %w[start successful_start successful_end unsuccessful_start unsuccessful_end].map do |a|
46
50
  "last_run_#{a}"
47
51
  end
48
52
  end
@@ -1 +1,3 @@
1
- Rails.application.config.assets.precompile += %w( active_scaffold/indicator.gif )
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.config.assets.precompile += %w[active_scaffold/indicator.gif]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.routes.draw do
2
4
  resources(:scheduled_tasks) do
3
5
  as_routes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  create_table :scheduled_tasks do |t|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddStatusAttributesToScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  add_column :scheduled_tasks, :last_run_start, :datetime
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddPidToScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  add_column :scheduled_tasks, :pid, :integer
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddArgsToScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  add_column :scheduled_tasks, :args, :string
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddLastFailStatusToScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  add_column :scheduled_tasks, :last_fail_status, :string
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class AddEnabledToScheduledTasks < ActiveRecord::Migration
2
4
  def change
3
5
  add_column :scheduled_tasks, :enabled, :boolean, null: false, default: true
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rubygems'
4
5
  require 'daemons'
5
6
  require 'fileutils'
6
7
 
7
8
  def find_rails_root(dir = Dir.pwd)
8
- fail 'Rails root not found' if dir == '' || dir == '/' || dir == '.'
9
+ raise 'Rails root not found' if ['', '/', '.'].include?(dir)
9
10
  return dir if File.exist?(File.expand_path('config/environment.rb', dir))
11
+
10
12
  rails_root(File.dirname(dir))
11
13
  end
12
14
 
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rubygems'
4
5
  require 'daemons'
5
6
 
6
7
  def find_rails_root(dir = Dir.pwd)
7
- fail 'Rails root not found' if dir == '' || dir == '/' || dir == '.'
8
+ raise 'Rails root not found' if ['', '/', '.'].include?(dir)
8
9
  return dir if File.exist?(File.expand_path('config/environment.rb', dir))
10
+
9
11
  rails_root(File.dirname(dir))
10
12
  end
11
13
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tasks_scheduler/engine'
2
4
  require 'active_scaffold'
3
5
  require 'js-routes'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tasks_scheduler/checker/log'
2
4
 
3
5
  module TasksScheduler
@@ -5,8 +7,8 @@ module TasksScheduler
5
7
  include Singleton
6
8
 
7
9
  CHECK_INTERVAL = 15
8
- LOG_ON_FILE_ENV_KEY = 'TASKS_SCHEDULER_LOG_ON_FILE'.freeze
9
- LOGS_KEYS = %w(rails stdout stderr).freeze
10
+ LOG_ON_FILE_ENV_KEY = 'TASKS_SCHEDULER_LOG_ON_FILE'
11
+ LOGS_KEYS = %w[rails stdout stderr].freeze
10
12
 
11
13
  def run
12
14
  check_log
@@ -40,6 +42,7 @@ CODE
40
42
 
41
43
  def check_log
42
44
  return unless log_on_file?
45
+
43
46
  ::Rails.logger = ::Logger.new(rails_log.path)
44
47
  $stdout.reopen(stdout_log.path, 'w')
45
48
  $stderr.reopen(stderr_log.path, 'w')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
 
3
5
  module TasksScheduler
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TasksScheduler
2
4
  module CronParserPatch
3
5
  class TasksSchedulerTimeSource
4
6
  class << self
5
- def local(year, month, day, hour, min, second)
7
+ def local(year, month, day, hour, min, second) # rubocop:disable Metrics/ParameterLists
6
8
  Time.utc(year, month, day, hour, min, second)
7
9
  end
8
10
 
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TasksScheduler
2
4
  class CronSchedulingValidator < ActiveModel::EachValidator
3
5
  def validate_each(record, attribute, value)
4
6
  return if value_valid?(value)
7
+
5
8
  record.errors[attribute] << (options[:message] ||
6
9
  I18n.translate(:cron_scheduling_validator_error_message))
7
10
  end
@@ -1,12 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open3'
2
4
 
3
5
  module TasksScheduler
4
6
  class Daemon
5
- ACTIONS = %w(status start stop restart).freeze
7
+ ACTIONS = %w[status start stop restart].freeze
6
8
 
7
9
  class << self
8
10
  def execute(action)
9
11
  raise "Action not allowed: #{action} (Allowed: #{ACTIONS})" unless ACTIONS.include?(action)
12
+
10
13
  command = ['bundle', 'exec', 'tasks_scheduler', action]
11
14
  Dir.chdir(Rails.root) do
12
15
  Open3.popen3(env_args, *command) do |_stdin, stdout, stderr, wait_thr|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TasksScheduler
2
4
  class Engine < ::Rails::Engine
3
5
  initializer :append_migrations do |app|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TasksScheduler
2
- VERSION = '0.3.0'.freeze
4
+ VERSION = '0.4.0'
3
5
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Add your own tasks in files placed in lib/tasks ending in .rake,
2
4
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
5
 
4
- require File.expand_path('../config/application', __FILE__)
6
+ require File.expand_path('config/application', __dir__)
5
7
 
6
8
  Rails.application.load_tasks
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationController < ActionController::Base
2
4
  # Prevent CSRF attacks by raising an exception.
3
5
  # For APIs, you may want to use :null_session instead.
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ApplicationHelper
2
4
  end
@@ -1,3 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
2
+ # frozen_string_literal: true
3
+
4
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
3
5
  load Gem.bin_path('bundler', 'bundle')
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
2
+ # frozen_string_literal: true
3
+
4
+ APP_PATH = File.expand_path('../config/application', __dir__)
3
5
  require_relative '../config/boot'
4
6
  require 'rails/commands'
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require_relative '../config/boot'
3
5
  require 'rake'
4
6
  Rake.application.run
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require 'pathname'
3
5
 
4
6
  # path to your application root.
5
- APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
7
+ APP_ROOT = Pathname.new File.expand_path('..', __dir__)
6
8
 
7
9
  Dir.chdir APP_ROOT do
8
10
  # This script is a starting point to setup your application.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is used by Rack-based servers to start the application.
2
4
 
3
5
  require ::File.expand_path('../config/environment', __FILE__)
@@ -1,4 +1,6 @@
1
- require File.expand_path('../boot', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('boot', __dir__)
2
4
 
3
5
  require 'rails/all'
4
6
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Set up gems listed in the Gemfile.
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
4
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
3
5
 
4
6
  require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
- $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
7
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Load the Rails application.
2
- require File.expand_path('../application', __FILE__)
4
+ require File.expand_path('application', __dir__)
3
5
 
4
6
  # Initialize the Rails application.
5
7
  Rails.application.initialize!
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.configure do
2
4
  # Settings specified here will take precedence over those in config/application.rb.
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.configure do
2
4
  # Settings specified here will take precedence over those in config/application.rb.
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.configure do
2
4
  # Settings specified here will take precedence over those in config/application.rb.
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  # Version of your assets, change this if you want to expire all your assets.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # You can add backtrace silencers for libraries that you're using but don't wish to see in your
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  # Configure sensitive parameters which will be filtered from the log file.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Add new inflection rules using the following format. Inflections
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Be sure to restart your server when you modify this file.
2
3
 
3
4
  # Add new mime types for use in respond_to blocks:
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  Rails.application.config.session_store :cookie_store, key: '_dummy_session'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  # This file contains settings for ActionController::ParamsWrapper which
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Rails.application.routes.draw do
2
4
  # The priority is based upon order of creation: first created -> highest priority.
3
5
  # See how all your routes lay out with "rake routes".
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class ScheduledTaskTest < ActiveSupport::TestCase
@@ -6,9 +8,9 @@ class ScheduledTaskTest < ActiveSupport::TestCase
6
8
  '*/5 * * * *' => Time.utc(2016, 12, 22, 12, 5, 0, 0),
7
9
  '* * 1 * *' => Time.utc(2017, 1, 1, 0, 0, 0, 0),
8
10
  '* * * * *' => Time.utc(2016, 12, 22, 12, 1, 0, 0)
9
- }
11
+ }.freeze
10
12
 
11
- SCHEDULING_INVALID_VALUES = [' ', nil, '1', 'abc123', 456]
13
+ SCHEDULING_INVALID_VALUES = [' ', nil, '1', 'abc123', 456].freeze
12
14
 
13
15
  setup do
14
16
  @scheduled_task = scheduled_tasks(:test_scheduling)
@@ -57,7 +59,7 @@ class ScheduledTaskTest < ActiveSupport::TestCase
57
59
  end
58
60
 
59
61
  test 'status 1' do
60
- @scheduled_task.update_attributes!(
62
+ @scheduled_task.update!(
61
63
  scheduling: '*/5 * * * *',
62
64
  next_run: 'Wed, 28 Feb 2018 15:35:00 UTC +00:00',
63
65
  created_at: 'Tue, 06 Dec 2016 20:30:01 UTC +00:00',
@@ -88,7 +90,7 @@ class ScheduledTaskTest < ActiveSupport::TestCase
88
90
  assert_equal ['abc'], @scheduled_task.send('invoke_args')
89
91
 
90
92
  @scheduled_task.args = 'abc|def|ghi'
91
- assert_equal %w(abc def ghi), @scheduled_task.send('invoke_args')
93
+ assert_equal %w[abc def ghi], @scheduled_task.send('invoke_args')
92
94
 
93
95
  @scheduled_task.args = 'abc||ghi'
94
96
  assert_equal ['abc', '', 'ghi'], @scheduled_task.send('invoke_args')
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Configure Rails Environment
2
4
  ENV['RAILS_ENV'] = 'test'
3
5
 
4
- require File.expand_path('../../test/dummy/config/environment.rb', __FILE__)
6
+ require File.expand_path('../test/dummy/config/environment.rb', __dir__)
5
7
  ActiveRecord::Migrator.migrations_paths = [
6
- File.expand_path('../../test/dummy/db/migrate', __FILE__)
8
+ File.expand_path('../test/dummy/db/migrate', __dir__)
7
9
  ]
8
10
  require 'rails/test_help'
9
11
 
@@ -12,11 +14,11 @@ require 'rails/test_help'
12
14
  Minitest.backtrace_filter = Minitest::BacktraceFilter.new
13
15
 
14
16
  # Load support files
15
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
16
18
 
17
19
  # Load fixtures from the engine
18
20
  if ActiveSupport::TestCase.respond_to?(:fixture_path=)
19
- ActiveSupport::TestCase.fixture_path = File.expand_path('../fixtures', __FILE__)
21
+ ActiveSupport::TestCase.fixture_path = File.expand_path('fixtures', __dir__)
20
22
  ActiveSupport::TestCase.fixtures :all
21
23
  end
22
24
 
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.3.0
4
+ version: 0.4.0
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: 2019-08-19 00:00:00.000000000 Z
11
+ date: 2020-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_scaffold
@@ -212,41 +212,41 @@ signing_key:
212
212
  specification_version: 4
213
213
  summary: Scheduler for Rake tasks.
214
214
  test_files:
215
- - test/models/scheduled_task_test.rb
215
+ - test/dummy/Rakefile
216
+ - test/dummy/README.rdoc
217
+ - test/dummy/config.ru
218
+ - test/dummy/config/boot.rb
219
+ - test/dummy/config/database.yml
220
+ - test/dummy/config/secrets.yml
221
+ - test/dummy/config/locales/en.yml
222
+ - test/dummy/config/application.rb
223
+ - test/dummy/config/environments/development.rb
224
+ - test/dummy/config/environments/test.rb
225
+ - test/dummy/config/environments/production.rb
226
+ - test/dummy/config/environment.rb
216
227
  - test/dummy/config/routes.rb
217
228
  - test/dummy/config/initializers/assets.rb
218
229
  - test/dummy/config/initializers/cookies_serializer.rb
230
+ - test/dummy/config/initializers/inflections.rb
219
231
  - test/dummy/config/initializers/session_store.rb
220
- - test/dummy/config/initializers/backtrace_silencers.rb
221
232
  - test/dummy/config/initializers/wrap_parameters.rb
222
233
  - test/dummy/config/initializers/filter_parameter_logging.rb
223
- - test/dummy/config/initializers/inflections.rb
234
+ - test/dummy/config/initializers/backtrace_silencers.rb
224
235
  - test/dummy/config/initializers/mime_types.rb
225
- - test/dummy/config/database.yml
226
- - test/dummy/config/secrets.yml
227
- - test/dummy/config/locales/en.yml
228
- - test/dummy/config/environment.rb
229
- - test/dummy/config/boot.rb
230
- - test/dummy/config/application.rb
231
- - test/dummy/config/environments/production.rb
232
- - test/dummy/config/environments/test.rb
233
- - test/dummy/config/environments/development.rb
234
- - test/dummy/Rakefile
235
- - test/dummy/public/favicon.ico
236
- - test/dummy/public/404.html
237
- - test/dummy/public/500.html
238
- - test/dummy/public/422.html
239
- - test/dummy/config.ru
240
- - test/dummy/app/assets/stylesheets/application.css
241
- - test/dummy/app/assets/javascripts/application.js
242
- - test/dummy/app/helpers/application_helper.rb
236
+ - test/dummy/db/schema.rb
243
237
  - test/dummy/app/views/layouts/application.html.erb
244
238
  - test/dummy/app/controllers/application_controller.rb
245
- - test/dummy/bin/setup
239
+ - test/dummy/app/helpers/application_helper.rb
240
+ - test/dummy/app/assets/stylesheets/application.css
241
+ - test/dummy/app/assets/javascripts/application.js
242
+ - test/dummy/public/422.html
243
+ - test/dummy/public/404.html
244
+ - test/dummy/public/favicon.ico
245
+ - test/dummy/public/500.html
246
246
  - test/dummy/bin/bundle
247
+ - test/dummy/bin/setup
247
248
  - test/dummy/bin/rails
248
249
  - test/dummy/bin/rake
249
- - test/dummy/db/schema.rb
250
- - test/dummy/README.rdoc
251
250
  - test/test_helper.rb
252
251
  - test/fixtures/scheduled_tasks.yml
252
+ - test/models/scheduled_task_test.rb