schedulero 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/.version +1 -0
  3. data/lib/schedulero.rb +112 -0
  4. metadata +73 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 68ae0fbd4f3eb868a50f64ca330706a1acf29a71d42aa2eb89d6232abbf36c60
4
+ data.tar.gz: 223117c9bec29af59fda35bb8d64b9286216192d153da5a598d4283b945e22a2
5
+ SHA512:
6
+ metadata.gz: 91dd146dd80f9d06f77395cb23f67925b671cec1f3df7eb1519bfaf6bcf45ac0865fb3013d289ee749b3485a5a1e724d5f693c970b6f03a62989b6e9af2d8ce6
7
+ data.tar.gz: 30762af755ba57d8d3c8b2362f743b9c283ebccba80514cfd77da1ecad69aad1511003039d61bb7c62081c4e94606e6130bceff75c556073dcd77cc461cfad62
data/.version ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
data/lib/schedulero.rb ADDED
@@ -0,0 +1,112 @@
1
+ require 'pathname'
2
+ require 'json'
3
+ require 'logger'
4
+ require 'colorize'
5
+ require 'as-duration'
6
+
7
+ class Schedulero
8
+ def initialize state_file: nil, log_file: true
9
+
10
+ # log file
11
+ log_file = case log_file
12
+ when String
13
+ log_file
14
+ when true
15
+ './log/schedulero.log'
16
+ when false
17
+ nil
18
+ end
19
+
20
+ @logger = Logger.new log_file
21
+ @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
22
+
23
+ # state file
24
+ unless state_file
25
+ state_file = 'schedulero.json'
26
+ state_file = Dir.exists?('./tmp') ? "./tmp/#{state_file}" : state_file
27
+ end
28
+
29
+ @state_file = Pathname.new state_file
30
+
31
+ if @state_file.exist?
32
+ @state = JSON.load @state_file.read
33
+ else
34
+ @state = {}
35
+ end
36
+ end
37
+
38
+ def run &block
39
+ @logger.info 'running...'
40
+
41
+ instance_exec &block
42
+
43
+ @state_file.write @state.to_json
44
+ end
45
+
46
+ def every name, seconds, &block
47
+ @state[name] ||= 0
48
+
49
+ now = Time.now.to_i
50
+ diff = (@state[name] + seconds.to_i) - now
51
+
52
+ if diff < 0
53
+ puts 'running "%s"' % name.green
54
+
55
+ @state[name] = now
56
+
57
+ begin
58
+ @logger.info 'Run: %s' % name
59
+ yield
60
+ rescue
61
+ log_errror name
62
+ end
63
+ else
64
+ puts 'skipping "%s" for %s' % [name, humanize_seconds(diff)]
65
+ end
66
+ end
67
+
68
+ def at name, hours, &block
69
+ @state[name] ||= 0
70
+
71
+ hour_now = Time.now.hour
72
+ hours = [hours] unless hours.class == Array
73
+
74
+ if hours.include?(hour_now) && (Time.now.to_i - @state[name] > 3700)
75
+ puts 'running "%s"' % name.green
76
+
77
+ @state[name] = Time.now.to_i
78
+
79
+ begin
80
+ @logger.info 'Run: %s' % name
81
+ yield
82
+ rescue
83
+ log_errror name
84
+ end
85
+ else
86
+ puts 'skipping "%s" at %d, running in %s' % [name, hour_now, hours]
87
+ end
88
+ end
89
+
90
+ def log_errror name
91
+ msg = '%s: %s (%s)' % [name, $!.message, $!.class]
92
+ puts msg.red
93
+
94
+ Dir.mkdir('./log') unless Dir.exist?('./log')
95
+
96
+ @logger.error(msg)
97
+ end
98
+
99
+ def humanize_seconds secs
100
+ return '-' unless secs
101
+
102
+ secs = secs.to_i
103
+
104
+ [[60, :sec], [60, :min], [24, :h], [356, :days], [1000, :years]].map{ |count, name|
105
+ if secs > 0
106
+ secs, n = secs.divmod(count)
107
+ "#{n.to_i} #{name}"
108
+ end
109
+ }.compact.reverse.slice(0,2).join(' ')
110
+ end
111
+ end
112
+
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schedulero
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Dino Reic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: as-duration
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Super simple scheduler that will run tasks every x seconds/minutes/hours
42
+ email: reic.dino@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - "./.version"
48
+ - "./lib/schedulero.rb"
49
+ homepage: https://github.com/dux/schedulero
50
+ licenses:
51
+ - MIT
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 2.7.5
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Simple scheduler
73
+ test_files: []