acts_as_historical 0.0.4 → 0.1.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.
- data/VERSION +1 -1
- data/acts_as_historical.gemspec +1 -1
- data/lib/acts_as_historical.rb +44 -50
- data/test/acts_as_historical_test.rb +0 -83
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/acts_as_historical.gemspec
CHANGED
data/lib/acts_as_historical.rb
CHANGED
@@ -11,13 +11,12 @@ module ActsAsHistorical
|
|
11
11
|
#
|
12
12
|
#
|
13
13
|
# @option opts [Symbol] :date_column (:snapshot_date) the database column for the date of the record
|
14
|
-
# @option opts [Symbol] :days (:all_days) what days are records valid.
|
15
14
|
# @option opts [Symbol] :scope (nil)
|
16
15
|
#
|
17
16
|
def acts_as_historical(opts = {})
|
18
17
|
configuration = {
|
19
|
-
|
20
|
-
:
|
18
|
+
:date_column => "snapshot_date",
|
19
|
+
:
|
21
20
|
:scope => nil
|
22
21
|
}
|
23
22
|
configuration.update(opts) if opts.is_a?(Hash)
|
@@ -25,12 +24,6 @@ module ActsAsHistorical
|
|
25
24
|
send :include, InstanceMethods
|
26
25
|
send :extend, DynamicClassMethods
|
27
26
|
|
28
|
-
case configuration[:days].to_sym
|
29
|
-
when :all_days
|
30
|
-
send :extend, AllDays::ClassMethods
|
31
|
-
when :weekdays
|
32
|
-
send :extend, WeekDays::ClassMethods
|
33
|
-
end
|
34
27
|
self.cattr_accessor :historical_date_col, :historical_scope, :only_weekdays
|
35
28
|
self.historical_date_col = 'snapshot_date' #configuration[:date_column]
|
36
29
|
self.historical_scope = configuration[:scope]
|
@@ -71,35 +64,53 @@ module ActsAsHistorical
|
|
71
64
|
end
|
72
65
|
}
|
73
66
|
|
74
|
-
named_scope :
|
75
|
-
:conditions => { :snapshot_date => date },
|
67
|
+
named_scope :on_date, lambda {|date| {
|
68
|
+
:conditions => { :snapshot_date => date.to_date },
|
76
69
|
:limit => 1
|
77
70
|
}}
|
78
71
|
|
79
72
|
named_scope :between, lambda {|*args|
|
80
73
|
from, to = args
|
81
74
|
range = from.to_date..to.to_date
|
82
|
-
{
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
75
|
+
{ :conditions => {self.historical_date_col => range } }
|
76
|
+
}
|
77
|
+
|
87
78
|
# nearest(date, 1)
|
88
79
|
# nearest(date, (date_from..date_to))
|
89
80
|
#
|
90
81
|
named_scope :nearest, lambda {|*args|
|
91
|
-
date = args
|
92
|
-
range = self.tolerance_to_range(date,
|
93
|
-
|
82
|
+
date, tolerance = args
|
83
|
+
range = self.tolerance_to_range(date.to_date, tolerance)
|
94
84
|
{
|
95
85
|
:conditions => {self.historical_date_col => range},
|
96
|
-
:order => ["ABS(DATEDIFF(#{self.historical_date_col_sql}, '#{date.to_s(:db)}')) ASC"]
|
97
|
-
|
86
|
+
:order => ["ABS(DATEDIFF(#{self.historical_date_col_sql}, '#{date.to_date.to_s(:db)}')) ASC"]
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
# Does not include date
|
91
|
+
#
|
92
|
+
named_scope :upto, lambda {|date|
|
93
|
+
raise "passed parameter does not respond_to? to_date" if date.respond_to?(:to_date)
|
94
|
+
{ :conditions => ["#{self.historical_date_col_sql} < ?", date.to_date] }
|
95
|
+
}
|
96
|
+
|
97
|
+
# Includes date
|
98
|
+
#
|
99
|
+
named_scope :upto_including, lambda {|date|
|
100
|
+
raise "passed parameter does not respond_to? to_date" if date.respond_to?(:to_date)
|
101
|
+
{ :conditions => ["#{self.historical_date_col_sql} <= ?", date.to_date] }
|
102
|
+
}
|
103
|
+
|
104
|
+
named_scope :from, lambda {|date|
|
105
|
+
raise "passed parameter does not respond_to? to_date" if date.respond_to?(:to_date)
|
106
|
+
{ :conditions => ["#{self.historical_date_col_sql} > ?", date.to_date] }
|
107
|
+
}
|
108
|
+
|
109
|
+
named_scope :from_including, lambda {|date|
|
110
|
+
raise "passed parameter does not respond_to? to_date" if date.respond_to?(:to_date)
|
111
|
+
{ :conditions => ["#{self.historical_date_col_sql} >= ?", date.to_date] }
|
112
|
+
}
|
98
113
|
|
99
|
-
# TODO
|
100
|
-
named_scope :until
|
101
|
-
named_scope :from
|
102
|
-
|
103
114
|
named_scope :opt, lambda {|attributes_for_select| {:select => [:snapshot_date, attributes_for_select].flatten.uniq.join(', ') } }
|
104
115
|
|
105
116
|
# validations
|
@@ -126,16 +137,12 @@ module ActsAsHistorical
|
|
126
137
|
|
127
138
|
module InstanceMethods
|
128
139
|
def valid_date?
|
129
|
-
if
|
130
|
-
errors.add_to_base('
|
140
|
+
if self.to_date.nil?
|
141
|
+
errors.add_to_base('date missing')
|
131
142
|
return false
|
132
143
|
end
|
133
|
-
if self.
|
134
|
-
errors.add_to_base('
|
135
|
-
return false
|
136
|
-
end
|
137
|
-
if self.snapshot_date >= Date.tomorrow
|
138
|
-
errors.add_to_base('snapshot_date is in future')
|
144
|
+
if self.to_date >= Date.tomorrow
|
145
|
+
errors.add_to_base('date is in future')
|
139
146
|
return false
|
140
147
|
end
|
141
148
|
true
|
@@ -147,16 +154,16 @@ module ActsAsHistorical
|
|
147
154
|
def to_date
|
148
155
|
self.send(self.class.historical_date_col)
|
149
156
|
end
|
150
|
-
|
157
|
+
|
151
158
|
private
|
152
159
|
def find_record_at(date)
|
153
160
|
self.class.at_date(date).same_scope(self).find(:first)
|
154
|
-
end
|
155
|
-
|
161
|
+
end
|
162
|
+
|
156
163
|
def next_day; self.class.step_date(to_date, 1); end
|
157
164
|
def prev_day; self.class.step_date(to_date, -1); end
|
158
165
|
end
|
159
|
-
|
166
|
+
|
160
167
|
module AllDays
|
161
168
|
module ClassMethods
|
162
169
|
def step_date(date, step_size)
|
@@ -164,19 +171,6 @@ module ActsAsHistorical
|
|
164
171
|
end
|
165
172
|
end
|
166
173
|
end
|
167
|
-
|
168
|
-
module WeekDays
|
169
|
-
module ClassMethods
|
170
|
-
def step_date(date, step_size)
|
171
|
-
date = date + step_size
|
172
|
-
while date.cwday > 5
|
173
|
-
date = step_size < 0 ? date - 1 : date + 1
|
174
|
-
end
|
175
|
-
date
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
174
|
end
|
181
175
|
|
182
176
|
ActiveRecord::Base.send :include, ActsAsHistorical
|
@@ -7,10 +7,6 @@ class ActsAsHistoricalTest < ActiveSupport::TestCase
|
|
7
7
|
acts_as_historical
|
8
8
|
end
|
9
9
|
|
10
|
-
class RecordWeekday < ActiveRecord::Base
|
11
|
-
acts_as_historical :days => :weekdays
|
12
|
-
end
|
13
|
-
|
14
10
|
def test_schema_has_loaded_correctly
|
15
11
|
assert Record.all
|
16
12
|
end
|
@@ -71,83 +67,4 @@ class ActsAsHistoricalTest < ActiveSupport::TestCase
|
|
71
67
|
end
|
72
68
|
end
|
73
69
|
end
|
74
|
-
|
75
|
-
context ":days => :weekdays" do
|
76
|
-
context "day present" do
|
77
|
-
setup {
|
78
|
-
RecordWeekday.delete_all
|
79
|
-
@old = RecordWeekday.create! :snapshot_date => Date.new(2009,12,4)
|
80
|
-
@new = RecordWeekday.create! :snapshot_date => Date.new(2009,12,7)
|
81
|
-
}
|
82
|
-
context "#previous" do
|
83
|
-
should "return record of previous weekday" do
|
84
|
-
assert_equal @old, @new.previous
|
85
|
-
end
|
86
|
-
end
|
87
|
-
context "#next" do
|
88
|
-
should "return record of next weekday" do
|
89
|
-
assert_equal @new, @old.next
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
context "day missing" do
|
95
|
-
setup {
|
96
|
-
RecordWeekday.delete_all
|
97
|
-
@record = RecordWeekday.create! :snapshot_date => Date.new(2009,12,3)
|
98
|
-
}
|
99
|
-
context "#previous" do
|
100
|
-
should "return nil if record on previous weekday" do
|
101
|
-
assert_equal nil, @record.previous
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context "#next" do
|
106
|
-
should "return nil if record on next weekday" do
|
107
|
-
assert_equal nil, @record.next
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context ":days => :all_days" do
|
114
|
-
context "day present" do
|
115
|
-
setup {
|
116
|
-
Record.delete_all
|
117
|
-
@old = Record.create! :snapshot_date => Date.new(2009,12,3)
|
118
|
-
@new = Record.create! :snapshot_date => Date.new(2009,12,4)
|
119
|
-
}
|
120
|
-
context "#previous" do
|
121
|
-
should "return record of previous day" do
|
122
|
-
assert_equal @old, @new.previous
|
123
|
-
end
|
124
|
-
end
|
125
|
-
context "#next" do
|
126
|
-
should "return record of next day" do
|
127
|
-
assert_equal @new, @old.next
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
context "day missing" do
|
133
|
-
setup {
|
134
|
-
Record.delete_all
|
135
|
-
@record = Record.create! :snapshot_date => Date.new(2009,12,3)
|
136
|
-
}
|
137
|
-
context "#previous" do
|
138
|
-
should "return nil if record on previous day" do
|
139
|
-
assert_equal nil, @record.previous
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
context "#next" do
|
144
|
-
should "return nil if record on next day" do
|
145
|
-
assert_equal nil, @record.next
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
|
152
|
-
|
153
70
|
end
|