triggerable 0.1.8 → 0.1.9
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 +4 -4
- data/README.md +12 -0
- data/lib/triggerable/rules/automation.rb +19 -6
- data/lib/triggerable/version.rb +1 -1
- data/spec/integration/automations_spec.rb +29 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cd47642923aee94d86401397eeff3693d8f2fd7
|
4
|
+
data.tar.gz: 372ca92aa502e5aea89488a98521564417443127
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40b665fd572e4e9eaa47494eec9be8dc725bca110ad32fdfc65412afe0a542342e8c12c88f441002980f3f3eb14a300db2cd9f90d95a5fc0ad6b38f1e3bc4134
|
7
|
+
data.tar.gz: 7fba9adbd6596dc8f3fdd1e600d704b078db034b76c213acc03575096262e9e62106c91e71cb5cbb2c0de29fa883d77c4ae52525eca49313b9865a9e4c2eaa84
|
data/README.md
CHANGED
@@ -58,6 +58,18 @@ trigger on: :after_create, if: { or: [{ field1: '1' }, { field2: 1 }] }, ...
|
|
58
58
|
|
59
59
|
Triggerable does not run automations by itself, you should call `Triggerable::Engine.run_automations(interval)` using any scheduling script. Interval is a time difference between calling the method (e.g. `1.hour`). *You should avoid situations when your interval is less then the time your automations need to complete!*
|
60
60
|
|
61
|
+
Automation calls action block for each found object, but it's possible to pass a relation to action block using `pass_relation` option:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
class User < ActiveRecord::Base
|
65
|
+
automation if: {
|
66
|
+
created_at: { after: 24.hours }, confirmed: false
|
67
|
+
}, pass_relation: true do
|
68
|
+
each(&:send_confirmation_email)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
```
|
72
|
+
|
61
73
|
If you have more complex condition or need to check associations (not supported in DSL now), you should use a lambda condition form:
|
62
74
|
|
63
75
|
```ruby
|
@@ -1,18 +1,23 @@
|
|
1
1
|
module Triggerable
|
2
2
|
module Rules
|
3
3
|
class Automation < Rule
|
4
|
+
attr_accessor :pass_relation
|
5
|
+
|
6
|
+
def initialize model, options, block
|
7
|
+
super(model, options, block)
|
8
|
+
@pass_relation = options[:pass_relation]
|
9
|
+
end
|
10
|
+
|
4
11
|
def execute!
|
5
12
|
ids = ActiveRecord::Base.connection.execute(build_query).map { |r| r['id'] }
|
6
13
|
models = model.where(id: ids)
|
7
14
|
|
8
15
|
Triggerable::Engine.log(:debug, "#{desc}: processing #{models.count} object(s)")
|
9
16
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
Triggerable::Engine.log(:error, "#{desc} failed with exception #{ex}")
|
15
|
-
end
|
17
|
+
if @pass_relation
|
18
|
+
execute_on!(models)
|
19
|
+
else
|
20
|
+
models.each { |object| execute_on!(object) }
|
16
21
|
end
|
17
22
|
end
|
18
23
|
|
@@ -28,6 +33,14 @@ module Triggerable
|
|
28
33
|
|
29
34
|
query
|
30
35
|
end
|
36
|
+
|
37
|
+
def execute_on!(target)
|
38
|
+
begin
|
39
|
+
actions.each {|a| a.run_for!(target, name)}
|
40
|
+
rescue Exception => ex
|
41
|
+
Triggerable::Engine.log(:error, "#{desc} failed with exception #{ex}")
|
42
|
+
end
|
43
|
+
end
|
31
44
|
end
|
32
45
|
end
|
33
46
|
end
|
data/lib/triggerable/version.rb
CHANGED
@@ -194,4 +194,33 @@ describe 'Automations' do
|
|
194
194
|
Triggerable::Engine.run_automations(15.minutes)
|
195
195
|
expect(TestTask.count).to eq(2)
|
196
196
|
end
|
197
|
+
|
198
|
+
it 'can pass relation to action block' do
|
199
|
+
constantize_time_now Time.utc 2012, 9, 1, 12, 00
|
200
|
+
|
201
|
+
TestTask.automation if: {
|
202
|
+
and: [
|
203
|
+
{ updated_at: { after: 24.hours } },
|
204
|
+
{ status: { is: :solved } },
|
205
|
+
{ kind: { is: :service } }
|
206
|
+
]
|
207
|
+
}, pass_relation: true do
|
208
|
+
raise 'error' if count < 2
|
209
|
+
update_all(kind: 'other')
|
210
|
+
end
|
211
|
+
|
212
|
+
task1 = TestTask.create
|
213
|
+
task2 = TestTask.create
|
214
|
+
task1.update_attributes status: 'solved', kind: 'service'
|
215
|
+
task2.update_attributes status: 'solved', kind: 'service'
|
216
|
+
expect(TestTask.count).to eq(2)
|
217
|
+
|
218
|
+
constantize_time_now Time.utc 2012, 9, 2, 12, 00
|
219
|
+
Triggerable::Engine.run_automations(1.hour)
|
220
|
+
|
221
|
+
task1.reload
|
222
|
+
expect(task1.kind).to eq('other')
|
223
|
+
task2.reload
|
224
|
+
expect(task2.kind).to eq('other')
|
225
|
+
end
|
197
226
|
end
|