chrono_trigger 0.2.1 → 1.0.0

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