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.
- checksums.yaml +7 -0
- data/lib/expirable.rb +60 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/expirable.rb
ADDED
@@ -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:
|