acts_as_status_for 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/acts_as_status_for.gemspec +2 -2
- data/lib/acts_as_status_for.rb +41 -10
- data/spec/acts_as_status_for_spec.rb +17 -2
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0
|
1
|
+
2.1.0
|
data/acts_as_status_for.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{acts_as_status_for}
|
8
|
-
s.version = "2.0
|
8
|
+
s.version = "2.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Curtis Schofield"]
|
12
|
-
s.date = %q{2011-06-
|
12
|
+
s.date = %q{2011-06-29}
|
13
13
|
s.description = %q{Given a list of datetime _at attributes }
|
14
14
|
s.email = %q{github.com@robotarmyma.de}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/acts_as_status_for.rb
CHANGED
@@ -20,11 +20,42 @@ module ActsAsStatusFor
|
|
20
20
|
def log_error(state)
|
21
21
|
STDERR.puts "Arel could not find #{state}_at in the database - skipping installation of acts_as_status"
|
22
22
|
end
|
23
|
+
|
24
|
+
|
25
|
+
#
|
26
|
+
# having the state means that the
|
27
|
+
# state is not nil and the state_at is greater than all the other states not nil
|
28
|
+
#
|
29
|
+
def construct_have_state_arel_condition(state)
|
30
|
+
has_condition = self.arel_table["#{state}_at".to_sym].not_eq(nil)
|
31
|
+
(on_at_events - [state]).each do | unstate |
|
32
|
+
has_condition = has_condition.and(self.arel_table["#{state}_at".to_sym].
|
33
|
+
gt(self.arel_table["#{unstate}_at".to_sym]).
|
34
|
+
or(self.arel_table["#{unstate}_at".to_sym].eq(nil)))
|
35
|
+
end
|
36
|
+
has_condition
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# not having the state means that the
|
41
|
+
# state is nil or the state_at is less or equal to all the other non nil states
|
42
|
+
#
|
43
|
+
def construct_not_have_state_arel_condition(state)
|
44
|
+
has_not_condition = self.arel_table["#{state}_at".to_sym].eq(nil)
|
45
|
+
(on_at_events - [state]).each do | unstate |
|
46
|
+
has_not_condition = has_not_condition.or(self.arel_table["#{state}_at".to_sym].
|
47
|
+
lteq(self.arel_table["#{unstate}_at".to_sym]).
|
48
|
+
and(self.arel_table["#{unstate}_at".to_sym].not_eq(nil)))
|
49
|
+
end
|
50
|
+
has_not_condition
|
51
|
+
end
|
23
52
|
def install_scopes
|
24
|
-
on_at_events.each do |state|
|
53
|
+
on_at_events.each do | state |
|
25
54
|
if self.arel_table["#{state}_at".to_sym] then
|
26
|
-
|
27
|
-
|
55
|
+
has_condition = construct_have_state_arel_condition(state)
|
56
|
+
has_not_condition = construct_not_have_state_arel_condition(state)
|
57
|
+
scope "#{state}".to_sym, where(has_condition)
|
58
|
+
scope "not_#{state}".to_sym, where(has_not_condition)
|
28
59
|
else
|
29
60
|
log_error(state)
|
30
61
|
@all_status_marks_exist = @all_status_marks_exist && false
|
@@ -70,7 +101,7 @@ module ActsAsStatusFor
|
|
70
101
|
def current_status
|
71
102
|
status.split(' ').first or ''
|
72
103
|
end
|
73
|
-
|
104
|
+
|
74
105
|
def status=(event_string)
|
75
106
|
case event_string
|
76
107
|
when ''
|
@@ -86,13 +117,13 @@ module ActsAsStatusFor
|
|
86
117
|
end
|
87
118
|
end
|
88
119
|
alias :current_status= :status=
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
120
|
+
def status
|
121
|
+
status_time = {}
|
122
|
+
self.class.on_at_events.each do | event |
|
123
|
+
time = self.send("#{event}_at")
|
93
124
|
status_time[event] = time unless time.nil?
|
125
|
+
end
|
126
|
+
status_time.sort { |a,b| b.last <=> a.last }.collect(&:first).join(' ')
|
94
127
|
end
|
95
|
-
status_time.sort { |a,b| b.last <=> a.last }.collect(&:first).join(' ')
|
96
|
-
end
|
97
128
|
end
|
98
129
|
end
|
@@ -109,14 +109,29 @@ describe ActsAsStatusFor do
|
|
109
109
|
subject.status = ''
|
110
110
|
subject.status.should == ''
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
|
+
describe "audit trail is independent of scope" do
|
114
|
+
it "should recognize only the most recent" do
|
115
|
+
subject.featured_at = 3.days.ago
|
116
|
+
subject.on_hold_at = 1.days.ago
|
117
|
+
subject.archived_at = Time.now
|
118
|
+
subject.save
|
119
|
+
subject.class.archived.should include(subject)
|
120
|
+
subject.class.not_on_hold.should include(subject)
|
121
|
+
subject.class.on_hold.should_not include(subject)
|
122
|
+
subject.class.not_featured.should include(subject)
|
123
|
+
subject.class.featured.should_not include(subject)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
(ClassFinderMethods = {
|
113
128
|
# class finder method
|
114
129
|
# => [ list of event states that belong to finder]
|
115
130
|
#
|
116
131
|
:featured => [:featured],
|
117
132
|
:on_hold => [:on_hold],
|
118
133
|
:archived => [:archived]
|
119
|
-
}.each do |scope,states|
|
134
|
+
}).each do |scope,states|
|
120
135
|
states.each do |state|
|
121
136
|
it "can be used to set events" do
|
122
137
|
subject.status = state.to_s
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: acts_as_status_for
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 2.0
|
5
|
+
version: 2.1.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Curtis Schofield
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-29 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -116,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
116
|
requirements:
|
117
117
|
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
|
-
hash:
|
119
|
+
hash: -3085350057681311933
|
120
120
|
segments:
|
121
121
|
- 0
|
122
122
|
version: "0"
|