partial-date 0.1.0 → 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.
- data/ChangeLog.textile +6 -0
- data/README.textile +4 -2
- data/lib/partial-date/date.rb +55 -10
- data/lib/partial-date/version.rb +1 -1
- data/spec/{partial-date_spec.rb → date_spec.rb} +24 -3
- metadata +4 -4
data/ChangeLog.textile
CHANGED
data/README.textile
CHANGED
@@ -16,7 +16,7 @@ h2. Examples
|
|
16
16
|
|
17
17
|
bc.. require 'partial-date'
|
18
18
|
|
19
|
-
#Default initializer
|
19
|
+
# Default initializer
|
20
20
|
date = PartialDate::Date.new
|
21
21
|
# =>
|
22
22
|
date.value
|
@@ -50,7 +50,9 @@ h2. Install
|
|
50
50
|
|
51
51
|
h2. TODO
|
52
52
|
|
53
|
-
|
53
|
+
# @PartialDate::Date.parse@ method for construction from strings.
|
54
|
+
# A Hash or Array backing store for date components for better performance.
|
55
|
+
# Include Comparable
|
54
56
|
|
55
57
|
h2. Copyright
|
56
58
|
|
data/lib/partial-date/date.rb
CHANGED
@@ -17,6 +17,7 @@ module PartialDate
|
|
17
17
|
# date = PartialDate::Date.new {|d| d.year = 2012 }
|
18
18
|
#
|
19
19
|
class Date
|
20
|
+
include Comparable
|
20
21
|
|
21
22
|
# Public: Create a new partial date class from a block of integers
|
22
23
|
# or strings.
|
@@ -35,10 +36,10 @@ module PartialDate
|
|
35
36
|
#
|
36
37
|
# Returns a date object.
|
37
38
|
def initialize
|
39
|
+
@data = [0,0,0,0]
|
38
40
|
yield self if block_given?
|
39
41
|
end
|
40
42
|
|
41
|
-
|
42
43
|
# Public: Get the integer date value in partial date format.
|
43
44
|
#
|
44
45
|
# Examples
|
@@ -49,7 +50,7 @@ module PartialDate
|
|
49
50
|
#
|
50
51
|
# Returns an integer representation of a partial date.
|
51
52
|
def value
|
52
|
-
|
53
|
+
get_value(0)
|
53
54
|
end
|
54
55
|
|
55
56
|
# Public: Set a date value using an interger in partial date format.
|
@@ -61,13 +62,14 @@ module PartialDate
|
|
61
62
|
# Returns nothing
|
62
63
|
def value=(value)
|
63
64
|
if value.is_a?(Integer) && (value >= 10000 && value <= 99991231)
|
64
|
-
|
65
|
+
set_value(0, value)
|
65
66
|
else
|
66
67
|
raise PartialDateError, "Date value must be an integer betwen 10000 and 99991231"
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
70
|
-
# Public: Loads an 8 digit date value into a date object.
|
71
|
+
# Public: Loads an 8 digit date value into a date object. Can be used
|
72
|
+
# when rehydrating a date object from a persisted partial date value.
|
71
73
|
#
|
72
74
|
# value - an 8 digit value in partial date format.
|
73
75
|
#
|
@@ -114,7 +116,7 @@ module PartialDate
|
|
114
116
|
end
|
115
117
|
|
116
118
|
if value.is_a?(Integer) && (value <= 9999 && value > 0)
|
117
|
-
|
119
|
+
set_value(1, value)
|
118
120
|
else
|
119
121
|
raise PartialDateError, "Year must be an integer between 1 and 9999"
|
120
122
|
end
|
@@ -122,7 +124,7 @@ module PartialDate
|
|
122
124
|
|
123
125
|
# Public: Get the year from a partial date.
|
124
126
|
def year
|
125
|
-
|
127
|
+
get_value(1)
|
126
128
|
end
|
127
129
|
|
128
130
|
# Public: Set the month of a partial date.
|
@@ -141,7 +143,7 @@ module PartialDate
|
|
141
143
|
end
|
142
144
|
|
143
145
|
if value.is_a?(Integer) && (value <= 12 && value >= 0)
|
144
|
-
|
146
|
+
set_value(2, value)
|
145
147
|
else
|
146
148
|
raise PartialDateError, "Month must an be integer between 1 and 12"
|
147
149
|
end
|
@@ -149,7 +151,7 @@ module PartialDate
|
|
149
151
|
|
150
152
|
# Public: Get the month from a partial date.
|
151
153
|
def month
|
152
|
-
|
154
|
+
get_value(2)
|
153
155
|
end
|
154
156
|
|
155
157
|
|
@@ -172,7 +174,8 @@ module PartialDate
|
|
172
174
|
if value.is_a?(Integer) && (value >= 0 && value <= 31)
|
173
175
|
begin
|
174
176
|
date = ::Date.civil(self.year, self.month, value) if value > 0
|
175
|
-
|
177
|
+
#@value = (self.value - self.day + value)
|
178
|
+
set_value(3, value)
|
176
179
|
rescue
|
177
180
|
raise PartialDateError, "Day must be a valid day for the given month"
|
178
181
|
end
|
@@ -183,7 +186,8 @@ module PartialDate
|
|
183
186
|
|
184
187
|
# Public: Get the day from a partial date.
|
185
188
|
def day
|
186
|
-
self.value > 0 ? self.value - (self.value / 100).abs * 100 : 0
|
189
|
+
#self.value > 0 ? self.value - (self.value / 100).abs * 100 : 0
|
190
|
+
get_value(3)
|
187
191
|
end
|
188
192
|
|
189
193
|
# Public: Returns a formatted string representation of the partial date.
|
@@ -205,5 +209,46 @@ module PartialDate
|
|
205
209
|
return ""
|
206
210
|
end
|
207
211
|
end
|
212
|
+
|
213
|
+
# Public: Spaceship operator for date comparisons.
|
214
|
+
#
|
215
|
+
# Returns -1, 1, or 0
|
216
|
+
def <=>(other_date)
|
217
|
+
self.value <=> other_date.value
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
private
|
222
|
+
|
223
|
+
# Internal: Retreive a value from the array backing store.
|
224
|
+
#
|
225
|
+
# Returns an integer value for partial date, year, month or day.
|
226
|
+
def get_value(element)
|
227
|
+
@data[element]
|
228
|
+
end
|
229
|
+
|
230
|
+
# Internal: Set a value in the array backing store - either the
|
231
|
+
# complete date value (from load or value accessors), or a year,
|
232
|
+
# month, or day value after which the partial date will be recomputed.
|
233
|
+
#
|
234
|
+
# Returns nothing
|
235
|
+
def set_value(element, value)
|
236
|
+
case element
|
237
|
+
when 0
|
238
|
+
@data[1] = (value / 10000).abs
|
239
|
+
@data[2] = ((value - (value / 10000).abs * 10000) / 100).abs
|
240
|
+
@data[3] = value - (value / 100).abs * 100
|
241
|
+
when 1
|
242
|
+
@data[0] = @data[0] - (self.year * 10000) + (value * 10000)
|
243
|
+
when 2
|
244
|
+
@data[0] = @data[0] - (self.month * 100) + (value * 100)
|
245
|
+
when 3
|
246
|
+
@data[0] = @data[0] - self.day + value
|
247
|
+
end
|
248
|
+
|
249
|
+
# Important - update the old element value _after_ @data[0]
|
250
|
+
# has been recalculated above.
|
251
|
+
@data[element] = value
|
252
|
+
end
|
208
253
|
end
|
209
254
|
end
|
data/lib/partial-date/version.rb
CHANGED
@@ -43,17 +43,17 @@ describe PartialDate::Date do
|
|
43
43
|
expect {new_date = PartialDate::Date.new {|d| d.value = 100000000}}.to raise_error(PartialDate::PartialDateError, "Date value must be an integer betwen 10000 and 99991231")
|
44
44
|
end
|
45
45
|
|
46
|
-
it "should return a string
|
46
|
+
it "should return a string representation of date in the correct format" do
|
47
47
|
new_date = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 31}
|
48
48
|
new_date.to_s.should match(/\A\d{4}-\d{2}-\d{2}\z/)
|
49
49
|
end
|
50
50
|
|
51
|
-
it "should return a string
|
51
|
+
it "should return a string representation of a partial date in the correct format" do
|
52
52
|
new_date = PartialDate::Date.new {|d| d.year = 2012; d.month = 12}
|
53
53
|
new_date.to_s.should match(/\A\d{4}-\d{2}\z/)
|
54
54
|
end
|
55
55
|
|
56
|
-
it "should return a string
|
56
|
+
it "should return a string representation of a partial date in the correct format" do
|
57
57
|
new_date = PartialDate::Date.new {|d| d.year = 2012}
|
58
58
|
new_date.to_s.should match(/\A\d{4}\z/)
|
59
59
|
end
|
@@ -164,4 +164,25 @@ describe PartialDate::Date do
|
|
164
164
|
date.day.should == 10
|
165
165
|
end
|
166
166
|
end
|
167
|
+
|
168
|
+
describe "Comparisons" do
|
169
|
+
it "should determine if one date is greater than another" do
|
170
|
+
a = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 31}
|
171
|
+
b = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 30}
|
172
|
+
a.should be > b
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should determine if one date is less than another" do
|
176
|
+
a = PartialDate::Date.new {|d| d.year = 2012; d.month = 0; d.day = 0}
|
177
|
+
b = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 30}
|
178
|
+
a.should be < b
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should determine if one date is equal to another" do
|
182
|
+
a = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 30}
|
183
|
+
b = PartialDate::Date.new {|d| d.year = 2012; d.month = 12; d.day = 30}
|
184
|
+
a.should be == b
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
167
188
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: partial-date
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubygems-tasks
|
@@ -82,7 +82,7 @@ files:
|
|
82
82
|
- lib/partial-date/error.rb
|
83
83
|
- lib/partial-date/version.rb
|
84
84
|
- partial-date.gemspec
|
85
|
-
- spec/
|
85
|
+
- spec/date_spec.rb
|
86
86
|
- spec/spec_helper.rb
|
87
87
|
homepage: https://github.com/58bits/partial-date#readme
|
88
88
|
licenses:
|
@@ -111,5 +111,5 @@ specification_version: 3
|
|
111
111
|
summary: A simple date class that can be used to store partial date values in a single
|
112
112
|
column/attribute.
|
113
113
|
test_files:
|
114
|
-
- spec/
|
114
|
+
- spec/date_spec.rb
|
115
115
|
- spec/spec_helper.rb
|