expirable 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.
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: