schked 0.1.1 → 0.3.2

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: 3b8b3e6f7d5d7a1db0b90f3ca5ec69ff064b79ab0923aa956a6ecde419426703
4
- data.tar.gz: 26f4ec5f80c97e1311913cc381448578b735a6b44517b1c2192cf8702e89e1c9
3
+ metadata.gz: 90b8205a097b70389092670aa9611f7d20ab5084566db58383259c1bfed475ac
4
+ data.tar.gz: ced62e04d7b71e2e96a43762ab39377ada35a5d6aaeb518099d6f74a0ef6026a
5
5
  SHA512:
6
- metadata.gz: 0fa825e6c8ea53aa82e575542da294e92c8d0c19ecb1ef3e2419460ce99c6306c606ebe3518daf2a57d0478c5c122c74a37df8578ad7bd2231fdd1542b8263b2
7
- data.tar.gz: be98b368b66d02c8c3656ac26015e9f9a4ab841c7d9d37a87988860500208d1a1abcdbb46b25ed272342d017356aff5580c2efba20af318db0b374431b7612da
6
+ metadata.gz: 4e95232f135a84da9346dfae02a5d915ab52ad36ae1ec98f7b8133e72c32b3417567f1a647d1439ac42445b24f56231b84d19168b5b622f9ddf4ba20dca98831
7
+ data.tar.gz: 1b21245b148b5532c117a9d2a41d475fba6186a7c166fd13cdb8e2e30172162c7c9e1121d61d06378925b471236517cad75423fc10ab846e43867bfbd50afd39
data/Rakefile CHANGED
@@ -1,8 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
data/exe/schked CHANGED
@@ -4,4 +4,11 @@
4
4
  require "bundler/setup"
5
5
  require "schked/cli"
6
6
 
7
- Schked::CLI.start(ARGV)
7
+ begin
8
+ Schked::CLI.start(ARGV)
9
+ rescue Exception => e
10
+ $stderr.puts "Schked exited with error"
11
+ $stderr.puts(e.message) if e.respond_to?(:message)
12
+ $stderr.puts(e.backtrace.join("\n")) if e.respond_to?(:backtrace) && e.backtrace.respond_to?(:join)
13
+ exit 1
14
+ end
@@ -1,25 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rufus/scheduler"
4
-
5
3
  require "schked/version"
4
+ require "schked/config"
5
+ require "schked/worker"
6
+ require "schked/railtie" if defined?(Rails)
6
7
 
7
8
  module Schked
8
9
  module_function
9
10
 
10
- def paths
11
- @paths ||= []
12
- end
13
-
14
- def schedule
15
- paths.
16
- map { |path| File.read(path) }.
17
- join("\n")
11
+ def config
12
+ @config ||= Config.new
18
13
  end
19
14
 
20
- def start
21
- scheduler = Rufus::Scheduler.new
22
- scheduler.instance_eval(schedule)
23
- scheduler.join
15
+ def worker
16
+ @worker ||= Worker.new(config: config)
24
17
  end
25
18
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "schked"
4
3
  require "thor"
5
4
  require "shellwords"
6
5
 
@@ -8,12 +7,12 @@ module Schked
8
7
  class CLI < Thor
9
8
  def self.start(argv)
10
9
  if File.exist?(".schked")
11
- argv += File.
12
- read(".schked").
13
- split("\n").
14
- join(" ").
15
- strip.
16
- shellsplit
10
+ argv += File
11
+ .read(".schked")
12
+ .split("\n")
13
+ .join(" ")
14
+ .strip
15
+ .shellsplit
17
16
  end
18
17
 
19
18
  super(argv)
@@ -30,7 +29,7 @@ module Schked
30
29
  def start
31
30
  load_requires
32
31
 
33
- Schked.start
32
+ Schked.worker.wait
34
33
  end
35
34
 
36
35
  desc "show", "Output schedule to stdout"
@@ -39,16 +38,19 @@ module Schked
39
38
  load_requires
40
39
 
41
40
  puts "====="
42
- puts Schked.schedule
41
+ puts Schked.worker.schedule
43
42
  puts "====="
44
43
  end
45
44
 
46
45
  private
47
46
 
48
47
  def load_requires
49
- return unless options[:require]&.any?
48
+ if options[:require]&.any?
49
+ options[:require].each { |file| load(File.join(Dir.pwd, file)) }
50
+ end
50
51
 
51
- options[:require].each { |file| require(File.join(Dir.pwd, file)) }
52
+ # We have to load Schked at here, because of Rails and our railtie.
53
+ require "schked"
52
54
  end
53
55
  end
54
56
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+
5
+ module Schked
6
+ class Config
7
+ attr_writer :logger
8
+
9
+ def paths
10
+ @paths ||= []
11
+ end
12
+
13
+ def logger?
14
+ !!@logger
15
+ end
16
+
17
+ def logger
18
+ @logger ||= Logger.new(STDOUT).tap { |l| l.level = Logger::INFO }
19
+ end
20
+
21
+ def register_callback(name, &block)
22
+ callbacks[name] << block
23
+ end
24
+
25
+ def fire_callback(name, *args)
26
+ callbacks[name].each do |callback|
27
+ callback.call(*args)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def callbacks
34
+ @callbacks ||= Hash.new { |hsh, key| hsh[key] = [] }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/railtie"
4
+
5
+ module Schked
6
+ class Railtie < Rails::Railtie
7
+ class PathsConfig
8
+ def self.call(app)
9
+ if (root_schedule = app.root.join("config", "schedule.rb")).exist?
10
+ path = root_schedule.to_s
11
+ Schked.config.paths << path unless Schked.config.paths.include?(path)
12
+ end
13
+ end
14
+ end
15
+
16
+ initializer("schked.paths", &PathsConfig.method(:call))
17
+
18
+ config.to_prepare do
19
+ Schked.config.logger = ::Rails.logger unless Schked.config.logger?
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Schked
4
- VERSION = "0.1.1"
4
+ VERSION = "0.3.2"
5
5
  end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rufus/scheduler"
4
+
5
+ module Schked
6
+ class Worker
7
+ def initialize(config:)
8
+ @config = config
9
+
10
+ @scheduler = Rufus::Scheduler.new
11
+
12
+ define_callbacks
13
+ load_schedule
14
+ end
15
+
16
+ def job(as)
17
+ scheduler.jobs.find { |job| job.opts[:as] == as }
18
+ end
19
+
20
+ def pause
21
+ scheduler.pause
22
+ end
23
+
24
+ def wait
25
+ scheduler.join
26
+ end
27
+
28
+ def stop
29
+ scheduler.stop
30
+ end
31
+
32
+ def schedule
33
+ config
34
+ .paths
35
+ .map { |path| File.read(path) }
36
+ .join("\n")
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :config, :scheduler
42
+
43
+ def define_callbacks
44
+ cfg = config
45
+
46
+ scheduler.define_singleton_method(:on_error) do |job, error|
47
+ cfg.logger.fatal("Task #{job.opts[:as] || job.job_id} failed with error: #{error.message}")
48
+ cfg.logger.error(error.backtrace.join("\n")) if error.backtrace
49
+
50
+ cfg.fire_callback(:on_error, job, error)
51
+ end
52
+
53
+ scheduler.define_singleton_method(:on_pre_trigger) do |job, time|
54
+ cfg.logger.info("Started task: #{job.opts[:as] || job.job_id}")
55
+
56
+ cfg.fire_callback(:before_start, job, time)
57
+ end
58
+
59
+ scheduler.define_singleton_method(:on_post_trigger) do |job, time|
60
+ cfg.logger.info("Finished task: #{job.opts[:as] || job.job_id}")
61
+
62
+ cfg.fire_callback(:after_finish, job, time)
63
+ end
64
+ end
65
+
66
+ def load_schedule
67
+ scheduler.instance_eval(schedule)
68
+ end
69
+ end
70
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schked
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - bibendi@evilmartians.com
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-29 00:00:00.000000000 Z
11
+ date: 2020-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rufus-scheduler
@@ -39,103 +39,103 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: appraisal
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.16'
47
+ version: '2.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.16'
54
+ version: '2.2'
55
55
  - !ruby/object:Gem::Dependency
56
- name: pry-byebug
56
+ name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '3.4'
61
+ version: '1.16'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '3.4'
68
+ version: '1.16'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: combustion
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '10.0'
75
+ version: '1.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec
84
+ name: pry-byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.0'
89
+ version: '3.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.0'
96
+ version: '3.9'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rubocop
98
+ name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.60'
103
+ version: '13.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.60'
110
+ version: '13.0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rubocop-rspec
112
+ name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: '3.9'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: '3.9'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: standard
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: '0.4'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ">="
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: '0.4'
139
139
  description: Rufus-scheduler wrapper to run recurring jobs
140
140
  email:
141
141
  executables:
@@ -147,7 +147,10 @@ files:
147
147
  - exe/schked
148
148
  - lib/schked.rb
149
149
  - lib/schked/cli.rb
150
+ - lib/schked/config.rb
151
+ - lib/schked/railtie.rb
150
152
  - lib/schked/version.rb
153
+ - lib/schked/worker.rb
151
154
  homepage:
152
155
  licenses: []
153
156
  metadata: {}
@@ -166,8 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
169
  - !ruby/object:Gem::Version
167
170
  version: '0'
168
171
  requirements: []
169
- rubyforge_project:
170
- rubygems_version: 2.7.6
172
+ rubygems_version: 3.1.2
171
173
  signing_key:
172
174
  specification_version: 4
173
175
  summary: Ruby Scheduler