expirable 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/expirable.rb +60 -0
  3. metadata +87 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 916910e100aa840628c2a8290a7e2c5125355746
4
+ data.tar.gz: c6075ee52e81f11758d7a8e155dd5870b14cd90f
5
+ SHA512:
6
+ metadata.gz: 040aabdfa25d7f376d04275b3c2b72f9906957782655130639404d1c50b6d3a1a5da452481f6bac5e89177abb7a059cee7515e1e8d76a514309b402ae3a77377
7
+ data.tar.gz: bc2eac48b6fdcfba757bfa170ae8977d40245367cd28b59d42bf5c7dfbb4e26e3e0218548dc03154f8f1f09a10c78dce8530c7b8e4e3f4343972fd979c784f93
@@ -0,0 +1,60 @@
1
+ # Rails model mixin that supports deadlines in workflows.
2
+ #
3
+ # It requires clients to do the following:
4
+ # 1. Include Expirable
5
+ # 2. define a `deadline_expired` instance method that will be invoked when the
6
+ # model's deadline expires
7
+ # 3. define a class method named `newly_expired` that returns a collection of model
8
+ # instances that have expired, but haven't yet received a `deadline_expired`
9
+ # message.
10
+ #
11
+ # The mixin relies on an external service to periodically call
12
+ # `Expirable.send_expired_events`, which polls for models which have expired but
13
+ # have not yet received a `deadline_expired` message.
14
+ #
15
+ # @author Brendan MacDonell <brendan@macdonell.net>
16
+ module Expirable
17
+ extend ActiveSupport::Concern
18
+
19
+ # @klasses is a collection holding all classes that have included Expirable.
20
+ # It is traversed each time
21
+ @klasses = []
22
+
23
+ def self.register(klass)
24
+ @klasses << klass
25
+ end
26
+
27
+ included do
28
+ Expirable.register(self)
29
+ end
30
+
31
+ def self.send_expired_event(object)
32
+ Rails.logger.info "Sending deadline expired event to #{object}"
33
+ begin
34
+ object.deadline_expired
35
+ rescue Exception => e
36
+ Rails.logger.error <<-eos.strip_heredoc
37
+ Deadline expiration failed with #{e.message}
38
+ #{e.backtrace.join("\n")}
39
+ eos
40
+ end
41
+ end
42
+
43
+ # Called periodically to send `deadline_expired` messages. It doesn't actually
44
+ # send the messages sequentially, but enqueues a call to `send_expired_event` to
45
+ # execute the message send asynchronously.
46
+ #
47
+ # Note that this method has no notion of priority, and may enqueue calls on objects
48
+ # that already have method calls enqueued. It is up to the client to make sure that
49
+ # there are enough workers so that the processing rate of the queue exceeds the
50
+ # arrival rate.
51
+ def self.send_expired_events
52
+ @klasses.each do |klass|
53
+ klass.newly_expired.each do |object|
54
+ self.delay.send_expired_event(object)
55
+ end
56
+ end
57
+
58
+ nil
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: expirable
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brendan MacDonell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-22 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: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: clockwork
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: delayed_job
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ description: Easily handle deadline-based workflow transitions in Rails
56
+ email: brendan@macdonell.net
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/expirable.rb
62
+ homepage: http://rubygems.org/gems/expirable
63
+ licenses:
64
+ - MIT
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.2.2
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: Expirable
86
+ test_files: []
87
+ has_rdoc: