date_time_precision 0.7.2 → 0.8.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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cfd81b7cf64c7f1cde510e2b5a8224758bb9bdf7
4
- data.tar.gz: bd625c14c4ba483ddf55210ebdc2785b0618c2fe
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTdkODVjOTc0YWNkOGI1ZTNiMTU5MmVlODBmNTY5MTFiMzMwZDE4ZQ==
5
+ data.tar.gz: !binary |-
6
+ YjIwYmMzODc3M2I3OGQ1NDFmYTkwZWZlYTkyN2RiZDE2MmEwYWU4ZQ==
5
7
  SHA512:
6
- metadata.gz: 0447b421ed938b6d15662d9800f8475c25e6879afd67f488ab03d7b57a2f1f7bc17be88823417c675bb026fb58923c691573bd51e034a346c2751fe0ac677b86
7
- data.tar.gz: a97c3006ba3a3f22e165025eb2cde9ed9b4358fb8cb2003003cb3d14b07197f858206f99e8b756fb0914137b9e6246379f6be32cbfc1c33db46c6ac4affb23f9
8
+ metadata.gz: !binary |-
9
+ MDE5ZTIwZTljOTQ2MTgyMGI1MDI3ZjdhN2I3ZWY4Zjc4MGQ2ZDJmZjE0YTk0
10
+ MDI4OWI3YzlkM2IxMTM2N2VhNjFlYzI0MmI0YzI4NDk5NjljMzE1OWNlZjMw
11
+ MThkZWI5YTE4OGFlODU0YWIyMWMwNTc5NjEzNjYxMmIyNDc3MGE=
12
+ data.tar.gz: !binary |-
13
+ OWQ4NmFhNjVhNWE0MGIzY2U4MWEwMjcwZDI3NDQ2Y2M2MzJiMjdkMzdlYWU4
14
+ ZTUxZDNkYWE2MTUyMjgzM2I5MmI4MTg5MDkxYjE5YTQ2MTkxMTk3YjMxNTll
15
+ MjhhZTkyYzRkOTMzZWE2ZGI0NzNlNWU2YmRkZThmODMyYWVjZjI=
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.license = 'MIT'
18
18
 
19
19
  gem.add_development_dependency 'rake'
20
- gem.add_development_dependency 'rspec'
20
+ gem.add_development_dependency 'rspec', '> 3'
21
21
  gem.add_development_dependency 'appraisal'
22
22
 
23
23
  gem.add_development_dependency 'activesupport'
@@ -9,6 +9,10 @@ Date::DATE_FORMATS[:long] = lambda do |date|
9
9
  date.strftime("%B %Y")
10
10
  when date.precision == DateTimePrecision::YEAR
11
11
  date.strftime("%Y")
12
+ when date.precision == DateTimePrecision::DECADE
13
+ "#{date.decade}s"
14
+ when date.precision == DateTimePrecision::CENTURY
15
+ "#{date.century}s"
12
16
  when date.month? && date.day?
13
17
  date.strftime("%B %e")
14
18
  when date.month?
@@ -30,6 +34,10 @@ Time::DATE_FORMATS[:long] = lambda do |time|
30
34
  time.strftime("%B %Y")
31
35
  when time.precision == DateTimePrecision::YEAR
32
36
  time.strftime("%Y")
37
+ when time.precision == DateTimePrecision::DECADE
38
+ "#{time.decade}s"
39
+ when time.precision == DateTimePrecision::CENTURY
40
+ "#{time.century}s"
33
41
  when time.month? && time.day?
34
42
  time.strftime("%B %e")
35
43
  when time.month?
@@ -2,7 +2,7 @@ require 'date'
2
2
  require 'time'
3
3
 
4
4
  if defined?(ActiveSupport)
5
- ['active_support/core_ext/date', 'active_support/core_ext/datetime', 'active_support/core_ext/time', 'active_support/time', 'active_support/time_with_zone'].each do |f|
5
+ ['active_support/core_ext/date', 'active_support/core_ext/datetime', 'active_support/core_ext/date_time', 'active_support/core_ext/time', 'active_support/time', 'active_support/time_with_zone'].each do |f|
6
6
  begin
7
7
  require f
8
8
  rescue LoadError; end
@@ -28,13 +28,15 @@ module DateTimePrecision
28
28
 
29
29
  unless constants.include? "NONE"
30
30
  USEC = FRAC = 7
31
- SEC = 6
32
- MIN = 5
33
- HOUR = 4
34
- DAY = 3
35
- MONTH = 2
36
- YEAR = 1
37
- NONE = 0
31
+ SEC = 6
32
+ MIN = 5
33
+ HOUR = 4
34
+ DAY = 3
35
+ MONTH = 2
36
+ YEAR = 1
37
+ DECADE = 0.5
38
+ CENTURY = 0.25
39
+ NONE = 0
38
40
 
39
41
  # Default values for y,m,d,h,m,s,frac
40
42
  NEW_DEFAULTS = [-4712,1,1,0,0,0,0]
@@ -50,6 +52,8 @@ module DateTimePrecision
50
52
  ]
51
53
 
52
54
  DATE_ATTRIBUTE_PRECISIONS = {
55
+ :century => CENTURY,
56
+ :decade => DECADE,
53
57
  :year => YEAR,
54
58
  :mon => MONTH,
55
59
  :day => DAY,
@@ -91,6 +95,10 @@ module DateTimePrecision
91
95
  MONTH
92
96
  when val[:year], val[:y]
93
97
  YEAR
98
+ when val[:decade]
99
+ DECADE
100
+ when val[:century]
101
+ CENTURY
94
102
  else
95
103
  NONE
96
104
  end
@@ -121,6 +129,17 @@ module DateTimePrecision
121
129
  def normalize_new_args(args)
122
130
  self.class.normalize_new_args(args)
123
131
  end
132
+
133
+ def decade
134
+ year_with_bce_adjustment = (self.year > 0) ? self.year : self.year + 10
135
+ (year_with_bce_adjustment - year_with_bce_adjustment % 10)
136
+ end
137
+
138
+ def century
139
+ year_with_bce_adjustment = (self.year > 0) ? self.year : self.year + 100
140
+ year_with_bce_adjustment - year_with_bce_adjustment % 100
141
+ end
142
+
124
143
  protected :normalize_new_args
125
144
 
126
145
  module ClassMethods
@@ -197,7 +216,7 @@ module DateTimePrecision
197
216
  protected :#{attribute_name}_set=
198
217
  EOM
199
218
  end
200
-
219
+
201
220
  base.class_eval <<-EOM, __FILE__, __LINE__
202
221
  def attributes_set(*vals)
203
222
  #{DATE_ATTRIBUTES.map{|attribute| "@#{attribute}_set"}.join(', ')} = *(vals.flatten.map{|v| !!v})
@@ -45,8 +45,4 @@ class DateTime < Date
45
45
  Time.local(*args).to_datetime
46
46
  end
47
47
  end
48
-
49
- def utc
50
- self.to_time.utc.to_datetime
51
- end
52
48
  end
@@ -50,9 +50,5 @@ class DateTime < Date
50
50
  Time.local(*args).to_datetime
51
51
  end
52
52
  end
53
-
54
- def utc
55
- self.to_time.utc.to_datetime
56
- end
57
53
 
58
54
  end
@@ -19,4 +19,17 @@ class DateTime < Date
19
19
  (sec_fraction.to_f*1_000_000).to_i
20
20
  end
21
21
  end
22
+
23
+ if method_defined?(:utc)
24
+ alias_method :utc_orig, :utc
25
+ def utc
26
+ dt = utc_orig
27
+ dt.precision = precision
28
+ dt
29
+ end
30
+ else
31
+ def utc
32
+ self.to_time.utc.to_datetime
33
+ end
34
+ end
22
35
  end
@@ -1,3 +1,3 @@
1
1
  module DateTimePrecision
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -68,5 +68,41 @@ describe DateTimePrecision, 'Conversions' do
68
68
  expect(Time.mktime(nil, 5, 13).to_s(:long)).to eq("May 13")
69
69
  expect(Time.mktime(nil, 6).to_s(:long)).to eq("June")
70
70
  end
71
+
72
+ it 'takes precision into account for decade and century' do
73
+ decade_date = Date.new(1853)
74
+ decade_date.precision = DateTimePrecision::DECADE
75
+ expect(decade_date.to_s(:long)).to eq("1850s")
76
+
77
+ century_date = Date.new(1853)
78
+ century_date.precision = DateTimePrecision::CENTURY
79
+ expect(century_date.to_s(:long)).to eq("1800s")
80
+
81
+ decade_date_time = DateTime.new(1853)
82
+ decade_date_time.precision = DateTimePrecision::DECADE
83
+ expect(decade_date_time.to_s(:long)).to eq("1850s")
84
+
85
+ century_date_time = DateTime.new(1853)
86
+ century_date_time.precision = DateTimePrecision::CENTURY
87
+ expect(century_date_time.to_s(:long)).to eq("1800s")
88
+
89
+ decade_time = Time.mktime(1853)
90
+ decade_time.precision = DateTimePrecision::DECADE
91
+ expect(decade_time.to_s(:long)).to eq("1850s")
92
+
93
+ century_time = Time.mktime(1853)
94
+ century_time.precision = DateTimePrecision::CENTURY
95
+ expect(century_time.to_s(:long)).to eq("1800s")
96
+ end
97
+ end
98
+
99
+ context 'UTC' do
100
+ it 'does not crash and burn when calling #utc' do
101
+ expect { DateTime.now.utc }.to_not raise_error
102
+ end
103
+
104
+ it 'preserves precision when converting to UTC' do
105
+ expect(DateTime.new(2000, 5).utc.precision).to eq DateTimePrecision::MONTH
106
+ end
71
107
  end
72
108
  end
@@ -6,11 +6,11 @@ describe DateTimePrecision do
6
6
  it 'has no precision for unspecified date' do
7
7
  d = Date.new
8
8
  expect(d.precision).to eq(DateTimePrecision::NONE)
9
- expect(d.year?).to be_falsey
9
+ expect(d.year?).to be false
10
10
 
11
11
  dt = DateTime.new
12
12
  expect(dt.precision).to eq(DateTimePrecision::NONE)
13
- expect(dt.year?).to be_falsey
13
+ expect(dt.year?).to be false
14
14
  end
15
15
 
16
16
  it 'has no precision for nil values' do
@@ -20,45 +20,47 @@ describe DateTimePrecision do
20
20
  it 'has year precision when only year is supplied' do
21
21
  d = Date.new(1982)
22
22
  expect(d.precision).to eq(DateTimePrecision::YEAR)
23
- expect(d.year?).to be_truthy
24
- expect(d.month?).to be_falsey
25
- expect(d.day?).to be_falsey
23
+ expect(d.year?).to be true
24
+ expect(d.month?).to be false
25
+ expect(d.day?).to be false
26
26
  end
27
27
 
28
28
  it 'has month precision when year and month are supplied' do
29
29
  d = Date.new(1982, 11)
30
30
  expect(d.precision).to eq(DateTimePrecision::MONTH)
31
- expect(d.year?).to be_truthy
32
- expect(d.month?).to be_truthy
33
- expect(d.day?).to be_falsey
31
+ expect(d.year?).to be true
32
+ expect(d.month?).to be true
33
+ expect(d.day?).to be false
34
34
  end
35
35
 
36
36
  it 'has day precision when year, month, and day are passed in' do
37
37
  dt = DateTime.new(1987,10,19)
38
38
  expect(dt.precision).to eq(DateTimePrecision::DAY)
39
- expect(dt.year?).to be_truthy
40
- expect(dt.month?).to be_truthy
41
- expect(dt.day?).to be_truthy
42
- expect(dt.hour?).to be_falsey
39
+ expect(dt.year?).to be true
40
+ expect(dt.month?).to be true
41
+ expect(dt.day?).to be true
42
+ expect(dt.hour?).to be false
43
43
  end
44
44
 
45
45
  it 'has hour precision' do
46
46
  dt = DateTime.new(1970, 1, 2, 3)
47
47
  expect(dt.precision).to eq(DateTimePrecision::HOUR)
48
- expect(dt.year?).to be_truthy
49
- expect(dt.month?).to be_truthy
50
- expect(dt.day?).to be_truthy
51
- expect(dt.hour?).to be_truthy
52
- expect(dt.min?).to be_falsey
48
+ expect(dt.year?).to be true
49
+ expect(dt.month?).to be true
50
+ expect(dt.day?).to be true
51
+ expect(dt.hour?).to be true
52
+ expect(dt.min?).to be false
53
53
  end
54
54
 
55
55
  it 'tracks which attributes were explicitly set separately from precision' do
56
56
  [Date.new(nil, 11, 12), DateTime.new(nil, 10, 11, nil), Time.mktime(nil, 12, 13, nil, 14)].each do |d|
57
- expect(d.year?).to be_falsey
58
- expect(d.month?).to be_truthy
59
- expect(d.day?).to be_truthy
60
- expect(d.hour?).to be_falsey
61
- expect(d.min?).to be_truthy if d.is_a? Time
57
+ expect(d.decade?).to be false
58
+ expect(d.century?).to be false
59
+ expect(d.year?).to be false
60
+ expect(d.month?).to be true
61
+ expect(d.day?).to be true
62
+ expect(d.hour?).to be false
63
+ expect(d.min?).to be true if d.is_a? Time
62
64
  expect(d.precision).to eq(DateTimePrecision::NONE)
63
65
  end
64
66
  end
@@ -172,9 +174,44 @@ describe DateTimePrecision do
172
174
  it 'should match when differing only in day precision' do
173
175
  d1 = Date.new(2001,3,2)
174
176
  d2 = Date.new(2001,3)
175
- expect(d1.partial_match?(d2)).to be_truthy
176
- expect(d2.partial_match?(d1)).to be_truthy
177
+ expect(d1.partial_match?(d2)).to be true
178
+ expect(d2.partial_match?(d1)).to be true
177
179
  end
178
180
  end
179
181
 
182
+ context 'Decades and Centuries' do
183
+ it 'should have the proper precision when outputting decades or centuries' do
184
+ no_date = Date.new
185
+ full_date = Date.new(1853,10,10)
186
+ century_date_time = DateTime.new(1853)
187
+ century_date_time.precision = DateTimePrecision::CENTURY
188
+ decade_time = Time.mktime(1853)
189
+ decade_time.precision = DateTimePrecision::DECADE
190
+
191
+ expect(full_date.decade).to eq(1850)
192
+ expect(full_date.century).to eq(1800)
193
+
194
+ expect(decade_time.decade).to eq(1850)
195
+ expect(decade_time.century).to eq(1800)
196
+
197
+ expect(century_date_time.decade).to eq(1850)
198
+ expect(century_date_time.century).to eq(1800)
199
+
200
+ expect(no_date.decade?).to be false
201
+ expect(full_date.decade?).to be true
202
+ expect(decade_time.decade?).to be true
203
+ expect(century_date_time.decade?).to be false
204
+
205
+ expect(no_date.century?).to be false
206
+ expect(full_date.century?).to be true
207
+ expect(decade_time.century?).to be true
208
+ expect(century_date_time.century?).to be true
209
+ end
210
+ it 'properly handles negative years' do
211
+ date_bce = Date.new(-531, 10, 5)
212
+ expect(date_bce.decade).to eq(-530)
213
+ expect(date_bce.century).to eq(-500)
214
+ end
215
+
216
+ end
180
217
  end
@@ -220,15 +220,15 @@ describe DateTimePrecision do
220
220
  [:date, :datetime, :time].each do |klass|
221
221
  it "accepts month and day without year when converting to a #{klass}" do
222
222
  date = { :month => 5, :day => 18, :min => 48 }.send("to_#{klass}")
223
- expect(date.year?).to be_falsey
224
- expect(date.month?).to be_truthy
223
+ expect(date.year?).to be false
224
+ expect(date.month?).to be true
225
225
  expect(date.month).to eq(5)
226
- expect(date.day?).to be_truthy
226
+ expect(date.day?).to be true
227
227
  expect(date.day).to eq(18)
228
- expect(date.hour?).to be_falsey
228
+ expect(date.hour?).to be false
229
229
 
230
230
  unless klass == :date
231
- expect(date.min?).to be_truthy
231
+ expect(date.min?).to be true
232
232
  expect(date.min).to eq(48)
233
233
  end
234
234
  end
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: date_time_precision
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Butler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-01 00:00:00.000000000 Z
11
+ date: 2014-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>'
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>'
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: appraisal
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: activesupport
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
@@ -115,8 +115,8 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - ".gitignore"
119
- - ".travis.yml"
118
+ - .gitignore
119
+ - .travis.yml
120
120
  - Appraisals
121
121
  - Gemfile
122
122
  - LICENSE
@@ -167,12 +167,12 @@ require_paths:
167
167
  - lib
168
168
  required_ruby_version: !ruby/object:Gem::Requirement
169
169
  requirements:
170
- - - ">="
170
+ - - ! '>='
171
171
  - !ruby/object:Gem::Version
172
172
  version: '0'
173
173
  required_rubygems_version: !ruby/object:Gem::Requirement
174
174
  requirements:
175
- - - ">="
175
+ - - ! '>='
176
176
  - !ruby/object:Gem::Version
177
177
  version: '0'
178
178
  requirements: []