clockwork 1.0.0 → 1.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7deeb150ded639846749af6efb04b31157dc430f
4
- data.tar.gz: d97f85b001f54997b6c5fd5f2c160da31c8d0a73
3
+ metadata.gz: 4da3864c6de51bceab841eca257ffbc2926525a3
4
+ data.tar.gz: ff3ff9e0e1bef436a100785f818e57253bcc6f1c
5
5
  SHA512:
6
- metadata.gz: b6d0b9c662b085d8243aaa23e00fc1c4549810ec3d346ce0b789eef518f7c839ea830d9c8ec7b785d33cdce81a3587e13b097673cd5ca3e133e40f8133007edb
7
- data.tar.gz: b162bd32440586badc9156aa06738bda2ad581474d23bf7daf946d8c8a6aa7e55d6e63129ebd9776dc100bc02a2bfae02b21b06f31d3510968c0410f1c724f53
6
+ metadata.gz: 0bbbb9668d0b1aa9526217188e50d6d5e44b493c25c7be369f98371038667434bbcd392a615ba73ec120001da0f0a89bb3faaf395245228484566029bdb6def5
7
+ data.tar.gz: dc8a6b4a47b174293f92e91066fb74d7c4ab1ad1310eb5c6c11d6706e381f8e435095e9b8d4f5ebbe8c9ed85bc7617f87b695c7153172a5f219c920e0997b91b
@@ -0,0 +1 @@
1
+ 2.1.0
data/README.md CHANGED
@@ -116,7 +116,7 @@ Here we're using an `ActiveRecord` model called `ClockworkDatabaseEvent` to stor
116
116
 
117
117
  ```ruby
118
118
  require 'clockwork'
119
- require 'clockwork/manager_with_database_events'
119
+ require 'clockwork/database_events'
120
120
  require_relative './config/boot'
121
121
  require_relative './config/environment'
122
122
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "clockwork"
3
- s.version = "1.0.0"
3
+ s.version = "1.0.2"
4
4
 
5
5
  s.authors = ["Adam Wiggins", "tomykaira"]
6
6
  s.license = 'MIT'
@@ -53,22 +53,3 @@ module Clockwork
53
53
 
54
54
  extend Methods
55
55
  end
56
-
57
- unless 1.respond_to?(:seconds)
58
- class Numeric
59
- def seconds; self; end
60
- alias :second :seconds
61
-
62
- def minutes; self * 60; end
63
- alias :minute :minutes
64
-
65
- def hours; self * 3600; end
66
- alias :hour :hours
67
-
68
- def days; self * 86400; end
69
- alias :day :days
70
-
71
- def weeks; self * 604800; end
72
- alias :week :weeks
73
- end
74
- end
@@ -26,7 +26,7 @@ module Clockwork
26
26
 
27
27
  private
28
28
  def name_has_changed?(model)
29
- !job.respond_to?(:name) || job.name != model.name
29
+ job.respond_to?(:name) && job.name != model.name
30
30
  end
31
31
 
32
32
  def frequency_has_changed?(model)
@@ -0,0 +1,66 @@
1
+ module ActiveRecordFake
2
+
3
+ def self.included(base)
4
+ base.instance_variable_set(:@items, [])
5
+ base.instance_variable_set(:@next_id, 1)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+
10
+ attr_accessor :id
11
+
12
+ def initialize options={}
13
+ @id = options.fetch(:id) { self.class.get_next_id }
14
+ set_attribute_values_from_options options.reject{|key, value| key == :id }
15
+ self.class.add self
16
+ end
17
+
18
+ def delete!
19
+ self.class.remove(self)
20
+ end
21
+
22
+ def update options={}
23
+ set_attribute_values_from_options options
24
+ end
25
+
26
+ module ClassMethods
27
+ def create *args
28
+ new *args
29
+ end
30
+
31
+ def delete_all
32
+ @items.clear
33
+ reset_id
34
+ true
35
+ end
36
+
37
+ def all
38
+ @items.dup
39
+ end
40
+
41
+
42
+ def add instance
43
+ @items << instance
44
+ end
45
+
46
+ def remove instance
47
+ @items.delete(instance)
48
+ end
49
+
50
+ def get_next_id
51
+ id = @next_id
52
+ @next_id += 1
53
+ id
54
+ end
55
+
56
+ def reset_id
57
+ @next_id = 1
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def set_attribute_values_from_options options
64
+ options.each{|attr, value| self.send("#{attr}=".to_sym, value) }
65
+ end
66
+ end
@@ -13,8 +13,8 @@ module DatabaseEvents
13
13
 
14
14
  setup do
15
15
  @now = Time.now
16
- DatabaseEventModelClass.delete_all
17
- DatabaseEventModelClass2.delete_all
16
+ DatabaseEventModel.delete_all
17
+ DatabaseEventModel2.delete_all
18
18
 
19
19
  Clockwork.manager = @manager = Clockwork::DatabaseEvents::Manager.new
20
20
  class << @manager
@@ -29,7 +29,7 @@ module DatabaseEvents
29
29
 
30
30
  describe "arguments" do
31
31
  def test_does_not_raise_error_with_valid_arguments
32
- @subject.setup(model: DatabaseEventModelClass, every: 1.minute) {}
32
+ @subject.setup(model: DatabaseEventModel, every: 1.minute) {}
33
33
  end
34
34
 
35
35
  def test_raises_argument_error_if_model_is_not_set
@@ -41,7 +41,7 @@ module DatabaseEvents
41
41
 
42
42
  def test_raises_argument_error_if_every_is_not_set
43
43
  error = assert_raises KeyError do
44
- @subject.setup(model: DatabaseEventModelClass) {}
44
+ @subject.setup(model: DatabaseEventModel) {}
45
45
  end
46
46
  assert_equal error.message, ":every must be set to the database sync frequency"
47
47
  end
@@ -54,35 +54,35 @@ module DatabaseEvents
54
54
  end
55
55
 
56
56
  def test_fetches_and_registers_event_from_database
57
- DatabaseEventModelClass.create(:frequency => 10)
58
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
57
+ DatabaseEventModel.create(:frequency => 10)
58
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
59
59
 
60
60
  tick_at(@now, :and_every_second_for => 1.second)
61
61
 
62
- assert_equal ["DatabaseEventModelClass:1"], @events_run
62
+ assert_equal ["DatabaseEventModel:1"], @events_run
63
63
  end
64
64
 
65
65
  def test_multiple_events_from_database_can_be_registered
66
- DatabaseEventModelClass.create(:frequency => 10)
67
- DatabaseEventModelClass.create(:frequency => 10)
68
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
66
+ DatabaseEventModel.create(:frequency => 10)
67
+ DatabaseEventModel.create(:frequency => 10)
68
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
69
69
 
70
70
  tick_at(@now, :and_every_second_for => 1.second)
71
71
 
72
- assert_equal ["DatabaseEventModelClass:1", "DatabaseEventModelClass:2"], @events_run
72
+ assert_equal ["DatabaseEventModel:1", "DatabaseEventModel:2"], @events_run
73
73
  end
74
74
 
75
75
  def test_event_from_database_does_not_run_again_before_frequency_specified_in_database
76
- model = DatabaseEventModelClass.create(:frequency => 10)
77
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
76
+ model = DatabaseEventModel.create(:frequency => 10)
77
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
78
78
 
79
79
  tick_at(@now, :and_every_second_for => model.frequency - 1.second)
80
80
  assert_equal 1, @events_run.length
81
81
  end
82
82
 
83
83
  def test_event_from_database_runs_repeatedly_with_frequency_specified_in_database
84
- model = DatabaseEventModelClass.create(:frequency => 10)
85
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
84
+ model = DatabaseEventModel.create(:frequency => 10)
85
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
86
86
 
87
87
  tick_at(@now, :and_every_second_for => (2 * model.frequency) + 1.second)
88
88
 
@@ -90,21 +90,19 @@ module DatabaseEvents
90
90
  end
91
91
 
92
92
  def test_reloaded_events_from_database_run_repeatedly
93
- model = DatabaseEventModelClass.create(:frequency => 10)
94
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
93
+ model = DatabaseEventModel.create(:frequency => 10)
94
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
95
95
 
96
96
  tick_at(@now, :and_every_second_for => @sync_frequency - 1)
97
-
98
- model.update(:name => "DatabaseEventModelClass:1:Reloaded")
99
-
97
+ model.update(:name => "DatabaseEventModel:1:Reloaded")
100
98
  tick_at(@now + @sync_frequency, :and_every_second_for => model.frequency * 2)
101
99
 
102
- assert_equal ["DatabaseEventModelClass:1:Reloaded", "DatabaseEventModelClass:1:Reloaded"], @events_run[-2..-1]
100
+ assert_equal ["DatabaseEventModel:1:Reloaded", "DatabaseEventModel:1:Reloaded"], @events_run[-2..-1]
103
101
  end
104
102
 
105
103
  def test_reloading_events_from_database_with_modified_frequency_will_run_with_new_frequency
106
- model = DatabaseEventModelClass.create(:frequency => 10)
107
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
104
+ model = DatabaseEventModel.create(:frequency => 10)
105
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
108
106
 
109
107
  tick_at(@now, :and_every_second_for => @sync_frequency - 1.second)
110
108
  model.update(:frequency => 5)
@@ -117,8 +115,8 @@ module DatabaseEvents
117
115
  end
118
116
 
119
117
  def test_stops_running_deleted_events_from_database
120
- model = DatabaseEventModelClass.create(:frequency => 10)
121
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
118
+ model = DatabaseEventModel.create(:frequency => 10)
119
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
122
120
 
123
121
  tick_at(@now, :and_every_second_for => (@sync_frequency - 1.second))
124
122
  before = @events_run.dup
@@ -130,20 +128,20 @@ module DatabaseEvents
130
128
  end
131
129
 
132
130
  def test_event_from_database_with_edited_name_switches_to_new_name
133
- model = DatabaseEventModelClass.create(:frequency => 10.seconds)
134
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
131
+ model = DatabaseEventModel.create(:frequency => 10.seconds)
132
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
135
133
 
136
134
  tick_at @now, :and_every_second_for => @sync_frequency - 1.second
137
135
  @events_run.clear
138
- model.update(:name => "DatabaseEventModelClass:1_modified")
136
+ model.update(:name => "DatabaseEventModel:1_modified")
139
137
  tick_at @now + @sync_frequency, :and_every_second_for => (model.frequency * 2)
140
138
 
141
- assert_equal ["DatabaseEventModelClass:1_modified", "DatabaseEventModelClass:1_modified"], @events_run
139
+ assert_equal ["DatabaseEventModel:1_modified", "DatabaseEventModel:1_modified"], @events_run
142
140
  end
143
141
 
144
142
  def test_event_from_database_with_edited_frequency_switches_to_new_frequency
145
- model = DatabaseEventModelClass.create(:frequency => 10)
146
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
143
+ model = DatabaseEventModel.create(:frequency => 10)
144
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
147
145
 
148
146
  tick_at @now, :and_every_second_for => @sync_frequency - 1.second
149
147
  @events_run.clear
@@ -154,8 +152,8 @@ module DatabaseEvents
154
152
  end
155
153
 
156
154
  def test_event_from_database_with_edited_at_runs_at_new_at
157
- model = DatabaseEventModelClass.create(:frequency => 1.day, :at => '10:30')
158
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
155
+ model = DatabaseEventModel.create(:frequency => 1.day, :at => '10:30')
156
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
159
157
 
160
158
  assert_will_run 'jan 1 2010 10:30:00'
161
159
  assert_wont_run 'jan 1 2010 09:30:00'
@@ -167,19 +165,35 @@ module DatabaseEvents
167
165
  assert_wont_run 'jan 1 2010 10:30:00'
168
166
  end
169
167
 
170
- def test_daily_event_from_database_with_at_should_only_run_once
171
- DatabaseEventModelClass.create(:frequency => 1.day, :at => next_minute(@now).strftime('%H:%M'))
172
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
168
+ context "when #name is defined" do
169
+ def test_daily_event_from_database_with_at_should_only_run_once
170
+ DatabaseEventModel.create(:frequency => 1.day, :at => next_minute(@now).strftime('%H:%M'))
171
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
173
172
 
174
- # tick from now, though specified :at time
175
- tick_at(@now, :and_every_second_for => (2 * @sync_frequency) + 1.second)
173
+ # tick from now, though specified :at time
174
+ tick_at(@now, :and_every_second_for => (2 * @sync_frequency) + 1.second)
175
+
176
+ assert_equal 1, @events_run.length
177
+ end
178
+ end
179
+
180
+ context "when #name is not defined" do
181
+
182
+ def test_daily_event_from_database_with_at_should_only_run_once
183
+ DatabaseEventModelWithoutName.create(:frequency => 1.day, :at => next_minute(next_minute(@now)).strftime('%H:%M'))
184
+ setup_sync(model: DatabaseEventModelWithoutName, :every => @sync_frequency, :events_run => @events_run)
185
+
186
+ # tick from now, though specified :at time
187
+ tick_at(@now, :and_every_second_for => (2 * @sync_frequency) + 1.second)
188
+
189
+ assert_equal 1, @events_run.length
190
+ end
176
191
 
177
- assert_equal 1, @events_run.length
178
192
  end
179
193
 
180
- def test_event_from_databse_with_comma_separated_at_leads_to_multiple_event_ats
181
- DatabaseEventModelClass.create(:frequency => 1.day, :at => '16:20, 18:10')
182
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
194
+ def test_event_from_database_with_comma_separated_at_leads_to_multiple_event_ats
195
+ DatabaseEventModel.create(:frequency => 1.day, :at => '16:20, 18:10')
196
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
183
197
 
184
198
  tick_at @now, :and_every_second_for => 1.second
185
199
 
@@ -193,15 +207,15 @@ module DatabaseEvents
193
207
  end
194
208
 
195
209
  def test_syncing_multiple_database_models_works
196
- DatabaseEventModelClass.create(:frequency => 10)
197
- setup_sync(model: DatabaseEventModelClass, :every => @sync_frequency, :events_run => @events_run)
210
+ DatabaseEventModel.create(:frequency => 10)
211
+ setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run)
198
212
 
199
- DatabaseEventModelClass2.create(:frequency => 10)
200
- setup_sync(model: DatabaseEventModelClass2, :every => @sync_frequency, :events_run => @events_run)
213
+ DatabaseEventModel2.create(:frequency => 10)
214
+ setup_sync(model: DatabaseEventModel2, :every => @sync_frequency, :events_run => @events_run)
201
215
 
202
216
  tick_at(@now, :and_every_second_for => 1.second)
203
217
 
204
- assert_equal ["DatabaseEventModelClass:1", "DatabaseEventModelClass2:1"], @events_run
218
+ assert_equal ["DatabaseEventModel:1", "DatabaseEventModel2:1"], @events_run
205
219
  end
206
220
  end
207
221
 
@@ -211,8 +225,8 @@ module DatabaseEvents
211
225
  end
212
226
 
213
227
  def test_the_event_only_runs_once_within_the_model_frequency_period
214
- DatabaseEventModelClass.create(:frequency => 5.minutes)
215
- setup_sync(model: DatabaseEventModelClass, :every => 1.minute, :events_run => @events_run)
228
+ DatabaseEventModel.create(:frequency => 5.minutes)
229
+ setup_sync(model: DatabaseEventModel, :every => 1.minute, :events_run => @events_run)
216
230
 
217
231
  tick_at(@now, :and_every_second_for => 5.minutes)
218
232
 
@@ -224,8 +238,8 @@ module DatabaseEvents
224
238
  setup do
225
239
  @events_run = []
226
240
 
227
- DatabaseEventModelClass.create(:frequency => 10)
228
- setup_sync(model: DatabaseEventModelClass, :every => 1.minute, :events_run => @events_run)
241
+ DatabaseEventModel.create(:frequency => 10)
242
+ setup_sync(model: DatabaseEventModel, :every => 1.minute, :events_run => @events_run)
229
243
  end
230
244
 
231
245
  def test_it_does_not_raise_an_error
@@ -250,8 +264,8 @@ module DatabaseEvents
250
264
  @events_run = []
251
265
  @utc_time_now = Time.now.utc
252
266
 
253
- DatabaseEventModelClass.create(:frequency => 1.days, :at => @utc_time_now.strftime('%H:%M'), :tz => 'America/Montreal')
254
- setup_sync(model: DatabaseEventModelClass, :every => 1.minute, :events_run => @events_run)
267
+ DatabaseEventModel.create(:frequency => 1.days, :at => @utc_time_now.strftime('%H:%M'), :tz => 'America/Montreal')
268
+ setup_sync(model: DatabaseEventModel, :every => 1.minute, :events_run => @events_run)
255
269
  end
256
270
 
257
271
  def test_it_does_not_raise_an_error
@@ -1,10 +1,13 @@
1
+ require_relative 'support/active_record_fake'
2
+
1
3
  def setup_sync(options={})
2
4
  model_class = options.fetch(:model) { raise KeyError, ":model must be set to the model class" }
3
5
  frequency = options.fetch(:every) { raise KeyError, ":every must be set to the database sync frequency" }
4
6
  events_run = options.fetch(:events_run) { raise KeyError, ":events_run must be provided"}
5
7
 
6
8
  Clockwork::DatabaseEvents::SyncPerformer.setup model: model_class, every: frequency do |model|
7
- events_run << model.name
9
+ name = model.respond_to?(:name) ? model.name : model.to_s
10
+ events_run << name
8
11
  end
9
12
  end
10
13
 
@@ -31,71 +34,25 @@ def normalize_time t
31
34
  end
32
35
 
33
36
 
34
- class ActiveRecordFake
35
- attr_accessor :id, :name, :at, :frequency, :tz
36
-
37
- class << self
38
- def create *args
39
- new *args
40
- end
41
-
42
- def add instance
43
- @events << instance
44
- end
45
-
46
- def remove instance
47
- @events.delete(instance)
48
- end
49
-
50
- def next_id
51
- id = @next_id
52
- @next_id += 1
53
- id
54
- end
55
-
56
- def reset_id
57
- @next_id = 1
58
- end
59
-
60
- def delete_all
61
- @events.clear
62
- reset_id
63
- end
64
-
65
- def all
66
- @events.dup
67
- end
68
- end
69
-
70
- def initialize options={}
71
- @id = options.fetch(:id) { self.class.next_id }
72
- @name = options.fetch(:name) { nil }
73
- @at = options.fetch(:at) { nil }
74
- @frequency = options.fetch(:frequency) { raise KeyError, ":every must be supplied" }
75
- @tz = options.fetch(:tz) { nil }
76
-
77
- self.class.add self
78
- end
37
+ class DatabaseEventModel
38
+ include ActiveRecordFake
39
+ attr_accessor :name, :frequency, :at, :tz
79
40
 
80
41
  def name
81
42
  @name || "#{self.class}:#{id}"
82
43
  end
44
+ end
83
45
 
84
- def delete!
85
- self.class.remove(self)
86
- end
46
+ class DatabaseEventModel2
47
+ include ActiveRecordFake
48
+ attr_accessor :name, :frequency, :at, :tz
87
49
 
88
- def update options={}
89
- options.each{|attr, value| self.send("#{attr}=".to_sym, value) }
50
+ def name
51
+ @name || "#{self.class}:#{id}"
90
52
  end
91
53
  end
92
54
 
93
- class DatabaseEventModelClass < ActiveRecordFake
94
- @events = []
95
- @next_id = 1
96
- end
97
-
98
- class DatabaseEventModelClass2 < ActiveRecordFake
99
- @events = []
100
- @next_id = 1
55
+ class DatabaseEventModelWithoutName
56
+ include ActiveRecordFake
57
+ attr_accessor :frequency, :at
101
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clockwork
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Wiggins
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-03 00:00:00.000000000 Z
12
+ date: 2014-11-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tzinfo
@@ -136,6 +136,7 @@ extra_rdoc_files:
136
136
  - README.md
137
137
  files:
138
138
  - ".gitignore"
139
+ - ".ruby-version"
139
140
  - ".travis.yml"
140
141
  - Gemfile
141
142
  - LICENSE
@@ -159,6 +160,7 @@ files:
159
160
  - lib/clockwork/manager.rb
160
161
  - test/at_test.rb
161
162
  - test/clockwork_test.rb
163
+ - test/database_events/support/active_record_fake.rb
162
164
  - test/database_events/sync_performer_test.rb
163
165
  - test/database_events/test_helpers.rb
164
166
  - test/event_test.rb
@@ -183,13 +185,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
185
  version: '0'
184
186
  requirements: []
185
187
  rubyforge_project:
186
- rubygems_version: 2.2.0
188
+ rubygems_version: 2.2.2
187
189
  signing_key:
188
190
  specification_version: 4
189
191
  summary: A scheduler process to replace cron.
190
192
  test_files:
191
193
  - test/at_test.rb
192
194
  - test/clockwork_test.rb
195
+ - test/database_events/support/active_record_fake.rb
193
196
  - test/database_events/sync_performer_test.rb
194
197
  - test/database_events/test_helpers.rb
195
198
  - test/event_test.rb