schedulero 0.1.1

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.
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: []