chrono_trigger 0.2.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChronoTrigger
4
+ class Schedule
5
+ include Singleton
6
+ attr_reader :events
7
+
8
+ def initialize
9
+ @events = Concurrent::Array.new
10
+ @pool = Concurrent::Actor::Utils::Pool.spawn! "pool", 5 do |index|
11
+ Rails.logger.info "ChronoTrigger: Spawning worker schedule-#{index}"
12
+ ChronoTrigger::Worker.spawn name: "schedule-#{index}", supervise: true, args: []
13
+ end
14
+ end
15
+
16
+ def add(event)
17
+ @events << event if event&.is_a?(ChronoTrigger::Event)
18
+ self
19
+ end
20
+
21
+ def remove(uuid)
22
+ uuid_regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
23
+ @events.each { |event| event.purge! if event.id == uuid } if uuid && uuid_regex.match?(uuid.to_s.downcase)
24
+ self
25
+ end
26
+
27
+ def clear
28
+ @events.each { |event| event.purge! }
29
+ self
30
+ end
31
+
32
+ def clear_scope(value)
33
+ return self unless value
34
+ scope = value if value.is_a?(String)
35
+ scope = value.to_gid.to_s if value.is_a?(ActiveRecord::Base)
36
+ @events.each { |event| event.purge! if event.scope == scope }
37
+ self
38
+ end
39
+
40
+ def process_events
41
+ now = right_now
42
+ events.each do |event|
43
+ if event.purge || (event.before && now >= event.before) || event.repeats == 0
44
+ @events.delete(event)
45
+ next
46
+ end
47
+ next if event.after && now < event.after
48
+ if event.at.nil? || event.at == now
49
+ @pool << event
50
+ event.at = now + event.every
51
+ event.repeats -= 1 unless event.repeats == :forever
52
+ end
53
+ end
54
+ end
55
+
56
+ def refresh
57
+ now = right_now
58
+ events.each do |event|
59
+ next if event.at.nil?
60
+ event.at = nil if event.at < now
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def right_now
67
+ now = Time.zone.now
68
+ Time.zone.today + now.hour.hours + now.min.minutes + now.sec.seconds
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChronoTrigger
4
+ module Timeline
5
+ extend ::ActiveSupport::Concern
6
+
7
+ class LostInTimeError < StandardError
8
+ end
9
+
10
+ class TodayIsTomorrowsYesterday < StandardError
11
+ end
12
+
13
+ def chrono_trigger
14
+ ChronoTrigger::Schedule.instance
15
+ end
16
+
17
+ def right_now
18
+ now = Time.zone.now
19
+ Time.zone.today + now.hour.hours + now.min.minutes + now.sec.seconds
20
+ end
21
+
22
+ def moment_in_the_future(time_with_zone)
23
+ raise(LostInTimeError, "Argument must be of type ActiveSupport::TimeWithZone eg. right_now + 1.second") unless time_with_zone.is_a?(ActiveSupport::TimeWithZone)
24
+ raise(TodayIsTomorrowsYesterday, "Time must be in the future eg. 1.second.from_now") unless time_with_zone.future?
25
+ Time.zone.today + time_with_zone.hour.hours + time_with_zone.min.minutes + time_with_zone.sec.seconds
26
+ end
27
+ end
28
+ end
@@ -1,6 +1,5 @@
1
- # TODO: ideally we would call this from the gemspec file
2
- # however, this approach does not work in ruby 1.8.6 (getting gem_original_require error)
1
+ # frozen_string_literal: true
3
2
 
4
3
  module ChronoTrigger
5
- VERSION = "0.2.1"
4
+ VERSION = "1.0.0"
6
5
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ChronoTrigger
4
+ class Worker < Concurrent::Actor::RestartingContext
5
+ def on_message(event)
6
+ Rails.logger.debug "ChronoTrigger: #{event.inspect}"
7
+ event.perform(*event.args) if event.at.nil? || (event.before && event.at < event.before)
8
+ end
9
+ end
10
+ end
metadata CHANGED
@@ -1,187 +1,191 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: chrono_trigger
3
- version: !ruby/object:Gem::Version
4
- hash: 21
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 1
10
- version: 0.2.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
13
- - Jon Ciccone
6
+ authors:
7
+ - leastbad
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2013-01-10 00:00:00 -05:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: activesupport
11
+ date: 2021-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.2'
20
+ type: :runtime
23
21
  prerelease: false
24
- version_requirements: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '5.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
27
34
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 11
30
- segments:
31
- - 2
32
- - 3
33
- - 4
34
- version: 2.3.4
35
+ - !ruby/object:Gem::Version
36
+ version: 1.1.8
35
37
  type: :runtime
36
- requirement: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: shoulda
39
38
  prerelease: false
40
- version_requirements: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.1'
43
44
  - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 23
46
- segments:
47
- - 2
48
- - 10
49
- version: "2.10"
50
- type: :development
51
- requirement: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: mocha
45
+ - !ruby/object:Gem::Version
46
+ version: 1.1.8
47
+ - !ruby/object:Gem::Dependency
48
+ name: concurrent-ruby-edge
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.6'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.6.0
57
+ type: :runtime
54
58
  prerelease: false
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
- requirements:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.6'
58
64
  - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 49
61
- segments:
62
- - 0
63
- - 9
64
- - 5
65
- version: 0.9.5
65
+ - !ruby/object:Gem::Version
66
+ version: 0.6.0
67
+ - !ruby/object:Gem::Dependency
68
+ name: magic_frozen_string_literal
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 1.2.0
66
74
  type: :development
67
- requirement: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: rubyforge
70
75
  prerelease: false
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 3
77
- segments:
78
- - 0
79
- version: "0"
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 1.2.0
81
+ - !ruby/object:Gem::Dependency
82
+ name: pry
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.12'
80
88
  type: :development
81
- requirement: *id004
82
- - !ruby/object:Gem::Dependency
83
- name: git
84
89
  prerelease: false
85
- version_requirements: &id005 !ruby/object:Gem::Requirement
86
- none: false
87
- requirements:
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.12'
95
+ - !ruby/object:Gem::Dependency
96
+ name: pry-nav
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '0.3'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '0.3'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rake
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '13.0'
88
116
  - - ">="
89
- - !ruby/object:Gem::Version
90
- hash: 3
91
- segments:
92
- - 0
93
- version: "0"
117
+ - !ruby/object:Gem::Version
118
+ version: 13.0.3
94
119
  type: :development
95
- requirement: *id005
96
- - !ruby/object:Gem::Dependency
97
- name: technicalpickles-jeweler
98
120
  prerelease: false
99
- version_requirements: &id006 !ruby/object:Gem::Requirement
100
- none: false
101
- requirements:
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '13.0'
102
126
  - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
127
+ - !ruby/object:Gem::Version
128
+ version: 13.0.3
129
+ - !ruby/object:Gem::Dependency
130
+ name: standardrb
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '1.0'
108
136
  type: :development
109
- requirement: *id006
110
- description: This gem allows you to write, deploy, and maintain cron jobs withing the rails framework.
111
- email: darful@gmail.com
112
- executables:
113
- - chrono_trigger
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '1.0'
143
+ description:
144
+ email:
145
+ - hello@leastbad.com
146
+ executables: []
114
147
  extensions: []
115
-
116
- extra_rdoc_files:
117
- - README.rdoc
118
- files:
119
- - .project
120
- - History.txt
121
- - Manifest.txt
122
- - PostInstall.txt
123
- - README.rdoc
148
+ extra_rdoc_files: []
149
+ files:
150
+ - Gemfile
151
+ - Gemfile.lock
152
+ - LICENSE.txt
153
+ - README.md
124
154
  - Rakefile
125
- - VERSION.yml
126
- - bin/chrono_trigger
127
- - chrono_trigger.gemspec
155
+ - SUMMARY.md
156
+ - bin/console
157
+ - bin/loc
158
+ - bin/setup
159
+ - bin/standardize
128
160
  - lib/chrono_trigger.rb
129
- - lib/chrono_trigger/cron_entry.rb
130
- - lib/chrono_trigger/process.rb
131
- - lib/chrono_trigger/runner.rb
132
- - lib/chrono_trigger/shell.rb
133
- - lib/chrono_trigger/tasks.rb
134
- - lib/chrono_trigger/trigger.rb
161
+ - lib/chrono_trigger/clock.rb
162
+ - lib/chrono_trigger/config.rb
163
+ - lib/chrono_trigger/event.rb
164
+ - lib/chrono_trigger/schedule.rb
165
+ - lib/chrono_trigger/timeline.rb
135
166
  - lib/chrono_trigger/version.rb
136
- - lib/tasks/chrono_trigger.rake
137
- - lib/triggers/test_triggers.rb
138
- - script/console
139
- - script/destroy
140
- - script/generate
141
- - test/test_chrono_trigger.rb
142
- - test/test_cron_entry.rb
143
- - test/test_helper.rb
144
- - test/test_shell.rb
145
- - test/test_trigger.rb
146
- - test/triggers.rb
147
- has_rdoc: true
148
- homepage: https://github.com/darful/chrono_trigger
149
- licenses: []
150
-
167
+ - lib/chrono_trigger/worker.rb
168
+ homepage: https://github.com/leastbad/chrono_trigger
169
+ licenses:
170
+ - MIT
171
+ metadata: {}
151
172
  post_install_message:
152
173
  rdoc_options: []
153
-
154
- require_paths:
174
+ require_paths:
155
175
  - lib
156
- required_ruby_version: !ruby/object:Gem::Requirement
157
- none: false
158
- requirements:
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
159
178
  - - ">="
160
- - !ruby/object:Gem::Version
161
- hash: 3
162
- segments:
163
- - 0
164
- version: "0"
165
- required_rubygems_version: !ruby/object:Gem::Requirement
166
- none: false
167
- requirements:
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
168
183
  - - ">="
169
- - !ruby/object:Gem::Version
170
- hash: 3
171
- segments:
172
- - 0
173
- version: "0"
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
174
186
  requirements: []
175
-
176
- rubyforge_project:
177
- rubygems_version: 1.4.2
187
+ rubygems_version: 3.1.4
178
188
  signing_key:
179
- specification_version: 3
180
- summary: Rails cron jobs.
181
- test_files:
182
- - test/test_chrono_trigger.rb
183
- - test/test_cron_entry.rb
184
- - test/test_helper.rb
185
- - test/test_shell.rb
186
- - test/test_trigger.rb
187
- - test/triggers.rb
189
+ specification_version: 4
190
+ summary: A clock-based scheduler that runs inside your Rails app.
191
+ test_files: []