date_time_precision 0.0.1

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
+ # development environment upon cd'ing into the directory
5
+
6
+ # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
7
+ # Only full ruby name is supported here, for short names use:
8
+ # echo "rvm use 1.8.7" > .rvmrc
9
+ environment_id="ruby-1.8.7-p358@date_time_precision"
10
+
11
+ # Uncomment the following lines if you want to verify rvm version per project
12
+ # rvmrc_rvm_version="1.13.5 (stable)" # 1.10.1 seams as a safe start
13
+ # eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
14
+ # echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
15
+ # return 1
16
+ # }
17
+
18
+ # First we attempt to load the desired environment directly from the environment
19
+ # file. This is very fast and efficient compared to running through the entire
20
+ # CLI and selector. If you want feedback on which environment was used then
21
+ # insert the word 'use' after --create as this triggers verbose mode.
22
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
23
+ && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
24
+ then
25
+ \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
26
+ [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
27
+ \. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
28
+ if [[ $- == *i* ]] # check for interactive shells
29
+ then echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
30
+ else echo "Using: $GEM_HOME" # don't use colors in non-interactive shells
31
+ fi
32
+ else
33
+ # If the environment file has not yet been created, use the RVM CLI to select.
34
+ rvm --create use "$environment_id" || {
35
+ echo "Failed to create RVM environment '${environment_id}'."
36
+ return 1
37
+ }
38
+ fi
39
+
40
+ # If you use bundler, this might be useful to you:
41
+ # if [[ -s Gemfile ]] && {
42
+ # ! builtin command -v bundle >/dev/null ||
43
+ # builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
44
+ # }
45
+ # then
46
+ # printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
47
+ # gem install bundler
48
+ # fi
49
+ # if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
50
+ # then
51
+ # bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
52
+ # fi
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in date_time_precision.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 David Butler
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1 @@
1
+ README.md
@@ -0,0 +1,64 @@
1
+ # DateTimePrecision
2
+
3
+ Sometimes it is desirable to manipulate dates or times for which incomplete information is known.
4
+ For example, one might only know the year, or the year and the month.
5
+ Unfortunately, Ruby's built-in Date, Time, and DateTime classes do not keep track of the precision of the data.
6
+ For example:
7
+
8
+ Date.new.to_s => "-4712-01-01"
9
+ Date.new(2000).to_s => "2000-01-01"
10
+
11
+ There is no way to tell the difference between January 1, 2000 and a Date where only the year 2000 was known.
12
+
13
+ The DateTimePrecision gem patches the Date, Time, DateTime, and NilClass classes to keep track of precision.
14
+ The behavior of these classes should remain unchanged, and the following methods are now available:
15
+
16
+ * precision
17
+ * precision=
18
+ * partial_match?
19
+ * year?
20
+ * month?
21
+ * day?
22
+ * hour?
23
+ * min?
24
+ * sec?
25
+
26
+ ## Installation
27
+
28
+ Add this line to your application's Gemfile:
29
+
30
+ gem 'date_time_precision'
31
+
32
+ And then execute:
33
+
34
+ $ bundle
35
+
36
+ Or install it yourself as:
37
+
38
+ $ gem install date_time_precision
39
+
40
+ Tested in Ruby 1.8.7, 1.9.1, and 1.9.2
41
+
42
+ ## Usage
43
+
44
+ require 'date_time_precision'
45
+
46
+ d = Date.new(2000)
47
+ d.precision # => DateTimePrecision::YEAR
48
+
49
+ t = Time::parse("2001-05")
50
+ t.precision # => DateTimePrecision::MONTH
51
+ t.precision > d.precision # => true
52
+
53
+ ## Wishlist
54
+
55
+ * Support Time::mktime, Time::utc, Time::local
56
+ * Support easy string formatting based on precision
57
+
58
+ ## Contributing
59
+
60
+ 1. Fork it
61
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
62
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
63
+ 4. Push to the branch (`git push origin my-new-feature`)
64
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ Dir['gem_tasks/**/*.rake'].each { |rake| load rake }
5
+
6
+ task :default => [:spec]
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/date_time_precision/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["David Butler"]
6
+ gem.email = ["dwbutler@ucla.edu"]
7
+ gem.description = %q{Patches Date, Time, and DateTime ruby classes to keep track of precision}
8
+ gem.summary = %q{Patches Date, Time, and DateTime ruby classes to keep track of precision}
9
+ gem.homepage = "http://github.com/Spokeo/date_time_precision"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "date_time_precision"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = DateTimePrecision::VERSION
17
+
18
+ gem.required_ruby_version = '>= 1.8.7'
19
+ gem.add_development_dependency 'rake', '>= 0.9.2'
20
+ gem.add_development_dependency 'rspec', '~> 2.10.0'
21
+ gem.add_development_dependency 'activesupport'
22
+ #gem.add_development_dependency 'ruby-debug'
23
+ #gem.add_development_dependency 'ruby-debug19'
24
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ desc "Run RSpec"
4
+ RSpec::Core::RakeTask.new do |t|
5
+ t.verbose = true
6
+ t.pattern = 'spec/**/*.{spec,rb}'
7
+ end
@@ -0,0 +1 @@
1
+ require 'date_time_precision/patch'
@@ -0,0 +1,131 @@
1
+ module DateTimePrecision
2
+ unless constants.include? "NONE"
3
+ FRAC = 7
4
+ SEC = 6
5
+ MIN = 5
6
+ HOUR = 4
7
+ DAY = 3
8
+ MONTH = 2
9
+ YEAR = 1
10
+ NONE = 0
11
+
12
+ # Default values for y,m,d,h,m,s,frac
13
+ NEW_DEFAULTS = [-4712,1,1,0,0,0,0]
14
+ end
15
+
16
+ # Returns the precision for this Date/Time object, or the
17
+ # maximum precision if none was specified
18
+ def precision
19
+ @precision = self.class::MAX_PRECISION unless @precision
20
+ return @precision
21
+ end
22
+
23
+ def precision=(prec)
24
+ @precision = [prec,self.class::MAX_PRECISION].min
25
+ end
26
+
27
+ def self.precision(val)
28
+ case val
29
+ when Date,Time,DateTime
30
+ val.precision
31
+ when Hash
32
+ case
33
+ when val[:sec_frac]
34
+ FRAC
35
+ when val[:sec]
36
+ SEC
37
+ when val[:min]
38
+ MIN
39
+ when val[:hour]
40
+ HOUR
41
+ when val[:mday]
42
+ DAY
43
+ when val[:mon]
44
+ MONTH
45
+ when val[:year]
46
+ YEAR
47
+ else
48
+ NONE
49
+ end
50
+ when Array
51
+ val.compact.length
52
+ else
53
+ NONE
54
+ end
55
+ end
56
+
57
+ def subsec?
58
+ return self.precision >= FRAC
59
+ end
60
+
61
+ def sec?
62
+ return self.precision >= SEC
63
+ end
64
+
65
+ def min?
66
+ return self.precision >= MIN
67
+ end
68
+
69
+ def hour?
70
+ return self.precision >= HOUR
71
+ end
72
+
73
+ def year?
74
+ return self.precision >= YEAR
75
+ end
76
+
77
+ def month?
78
+ return self.precision >= MONTH
79
+ end
80
+ alias_method :mon?, :month?
81
+
82
+ def day?
83
+ return self.precision >= DAY
84
+ end
85
+
86
+ def fragments
87
+ frags = []
88
+ frags << self.year if self.year?
89
+ frags << self.month if self.month?
90
+ frags << self.day if self.day?
91
+ frags << self.hour if self.hour?
92
+ frags << self.min if self.min?
93
+ frags << self.sec if self.sec?
94
+ frags
95
+ end
96
+
97
+ # Returns true if dates partially match (i.e. one is a partial date of the other)
98
+ def partial_match?(date2)
99
+ self.class::partial_match?(self, date2)
100
+ end
101
+
102
+ module ClassMethods
103
+ def partial_match?(date1, date2)
104
+ return true if date1.nil? or date2.nil?
105
+ frags1 = date1.fragments
106
+ frags2 = date2.fragments
107
+ min_precision = [frags1.length,frags2.length].min
108
+ frags1.slice(0,min_precision) == frags2.slice(0,min_precision)
109
+ end
110
+ end
111
+
112
+ def self.included(base)
113
+ # Redefine any conversion methods so precision is preserved
114
+ [:to_date, :to_time, :to_datetime].each do |m|
115
+ orig = :"orig_#{m}"
116
+ if base.method_defined?(m) && !base.method_defined?(orig)
117
+ base.class_exec {
118
+ alias_method orig, m
119
+ define_method(m) {
120
+ d = send(orig)
121
+ d.precision = [self.precision, d.class::MAX_PRECISION].min
122
+ d
123
+ }
124
+ }
125
+ end
126
+ end
127
+
128
+ # Extend with this module's class methods
129
+ base.extend(ClassMethods)
130
+ end
131
+ end
@@ -0,0 +1,5 @@
1
+ require 'date_time_precision/lib'
2
+ require 'date_time_precision/patch/date'
3
+ require 'date_time_precision/patch/time'
4
+ require 'date_time_precision/patch/date_time'
5
+ require 'date_time_precision/patch/nil'
@@ -0,0 +1,64 @@
1
+ require 'date_time_precision/lib'
2
+ require 'date'
3
+
4
+ class Date
5
+ include DateTimePrecision
6
+
7
+ MAX_PRECISION = DateTimePrecision::DAY
8
+
9
+ def self.parse(str='-4712-01-01T00:00:00+00:00', comp=false, sg=ITALY)
10
+ elem = _parse(str, comp)
11
+ precision = DateTimePrecision::precision(elem)
12
+ d = new_by_frags(elem, sg)
13
+ d.precision = precision
14
+ d
15
+ end
16
+
17
+ def self.strptime(str='-4712-01-01', fmt='%F', sg=ITALY)
18
+ elem = _strptime(str, fmt)
19
+ precision = DateTimePrecision::precision(elem)
20
+ d = new_by_frags(elem, sg)
21
+ d.precision = precision
22
+ d
23
+ end
24
+
25
+ def self.civil(y=nil, m=nil, d=nil, sg=ITALY)
26
+ vals = [y,m,d]
27
+ precision = DateTimePrecision::precision(vals)
28
+ unless vals.all?
29
+ vals = vals.compact
30
+ vals = vals.concat(NEW_DEFAULTS.slice(vals.length, NEW_DEFAULTS.length - vals.length))
31
+ end
32
+ y,m,d = vals
33
+
34
+ unless jd = (private_methods.include?(:"_valid_civil?") ? _valid_civil?(y, m, d, sg) : valid_civil?(y, m, d, sg))
35
+ raise ArgumentError, 'invalid date'
36
+ end
37
+
38
+ d = new!(jd_to_ajd(jd, 0, 0), 0, sg)
39
+ d.precision = precision
40
+ d
41
+ end
42
+
43
+ class << self; alias_method :new, :civil end
44
+
45
+ =begin
46
+ Following code is unneccessary, but keeping it as an example
47
+ # Return the date as a human-readable string.
48
+ #
49
+ # The format used is YYYY-MM-DD, YYYY-MM, or YYYY.
50
+ def to_s
51
+ case
52
+ when self.precision.nil?, self.precision >= DateTimePrecision::DAY
53
+ format('%.4d-%02d-%02d', year, mon, mday)
54
+ when self.precision == DateTimePrecision::MONTH
55
+ format('%.4d-%02d', year, mon)
56
+ when self.precision == DateTimePrecision::YEAR
57
+ format('%.4d', year)
58
+ else
59
+ '?'
60
+ end
61
+ end
62
+ =end
63
+
64
+ end
@@ -0,0 +1,47 @@
1
+ require 'date_time_precision/lib'
2
+ require 'date'
3
+
4
+ class DateTime < Date
5
+ include DateTimePrecision
6
+
7
+ MAX_PRECISION = DateTimePrecision::SEC
8
+
9
+ def self.parse(str='-4712-01-01T00:00:00+00:00', comp=false, sg=ITALY)
10
+ elem = _parse(str, comp)
11
+ precision = DateTimePrecision::precision(elem)
12
+ dt = new_by_frags(elem, sg)
13
+ dt.precision = precision
14
+ dt
15
+ end
16
+
17
+ def self.civil(y=nil, m=nil, d=nil, h=nil, min=nil, s=nil, of=0, sg=ITALY)
18
+ vals = [y,m,d,h,min,s]
19
+ precision = DateTimePrecision::precision(vals)
20
+ unless vals.all?
21
+ vals = vals.compact
22
+ vals = vals.concat(NEW_DEFAULTS.slice(vals.length, NEW_DEFAULTS.length - vals.length))
23
+ end
24
+ y,m,d,h,min,s = vals
25
+
26
+ unless (jd = (private_methods.include?(:"_valid_civil?") ? _valid_civil?(y, m, d, sg) : valid_civil?(y, m, d, sg))) &&
27
+ (fr = (private_methods.include?(:"_valid_time?") ? _valid_time?(h, min, s) : valid_time?(h, min, s)))
28
+ raise ArgumentError, 'invalid date'
29
+ end
30
+ if String === of
31
+ of = Rational(zone_to_diff(of) || 0, 86400)
32
+ end
33
+ dt = new!(jd_to_ajd(jd, fr, of), of, sg)
34
+ dt.precision = precision
35
+ dt
36
+ end
37
+
38
+ class << self; alias_method :new, :civil end
39
+
40
+ def self.strptime(str='-4712-01-01', fmt='%F', sg=ITALY)
41
+ elem = _strptime(str, fmt)
42
+ precision = DateTimePrecision::precision(elem)
43
+ d = new_by_frags(elem, sg)
44
+ d.precision = precision
45
+ d
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ require 'date_time_precision/lib'
2
+
3
+ class NilClass
4
+ def precision
5
+ DateTimePrecision::NONE
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ require 'date_time_precision/lib'
2
+ require 'time'
3
+
4
+ class Time
5
+ include DateTimePrecision
6
+
7
+ MAX_PRECISION = DateTimePrecision::SEC
8
+
9
+ def self.parse(date, now=self.now)
10
+ d = Date._parse(date, false)
11
+ year = d[:year]
12
+ year = yield(year) if year && block_given?
13
+ t = make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
14
+ t.precision = DateTimePrecision::precision(d)
15
+ t
16
+ end
17
+
18
+ #def self.strptime(str='-4712-01-01', fmt='%F', sg=Date::ITALY)
19
+ # DateTime.strptime(str, fmt, sg).to_time
20
+ #end
21
+ end
@@ -0,0 +1,3 @@
1
+ module DateTimePrecision
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'active_support'
3
+ require 'date_time_precision'
4
+
5
+ describe DateTimePrecision, 'Conversions' do
6
+ context 'when converting from Date to Time or DateTime' do
7
+ it 'should maintain precision' do
8
+ d = Date.new(2005, 1, 2)
9
+ d.precision.should == DateTimePrecision::DAY
10
+ d.to_date.precision.should == DateTimePrecision::DAY
11
+ d.to_datetime.precision.should == DateTimePrecision::DAY
12
+ end
13
+ end
14
+
15
+ it 'will lose precision when converting from DateTime or Time to Date' do
16
+ t = Time::parse('2000-1-1 00:00:00 EST') # => Fri Dec 31 21:00:00 -0800 1999
17
+ t.precision.should == DateTimePrecision::SEC
18
+ t.to_datetime.precision.should == DateTimePrecision::SEC
19
+ t.to_date.precision.should == DateTimePrecision::DAY
20
+ end
21
+ end
@@ -0,0 +1,140 @@
1
+ require 'spec_helper'
2
+ require 'date_time_precision'
3
+
4
+ describe DateTimePrecision, 'Constructors' do
5
+ it 'has no precision for unspecified date' do
6
+ d = Date.new
7
+ d.precision.should == DateTimePrecision::NONE
8
+ d.year?.should be_false
9
+
10
+ dt = DateTime.new
11
+ dt.precision.should == DateTimePrecision::NONE
12
+ dt.year?.should be_false
13
+ end
14
+
15
+ it 'has no precision for nil values' do
16
+ nil.precision.should == DateTimePrecision::NONE
17
+ end
18
+
19
+ it 'has year precision when only year is supplied' do
20
+ d = Date.new(1982)
21
+ d.precision.should == DateTimePrecision::YEAR
22
+ d.year?.should be_true
23
+ d.month?.should be_false
24
+ d.day?.should be_false
25
+ end
26
+
27
+ it 'has month precision when year and month are supplied' do
28
+ d = Date.new(1982, 11)
29
+ d.precision.should == DateTimePrecision::MONTH
30
+ d.year?.should be_true
31
+ d.month?.should be_true
32
+ d.day?.should be_false
33
+ end
34
+
35
+ it 'has day precision when year, month, and day are passed in' do
36
+ dt = DateTime.new(1987,10,19)
37
+ dt.precision.should == DateTimePrecision::DAY
38
+ dt.year?.should be_true
39
+ dt.month?.should be_true
40
+ dt.day?.should be_true
41
+ dt.hour?.should be_false
42
+ end
43
+
44
+ it 'has hour precision' do
45
+ dt = DateTime.new(1970, 1, 2, 3)
46
+ dt.precision.should == DateTimePrecision::HOUR
47
+ dt.year?.should be_true
48
+ dt.month?.should be_true
49
+ dt.day?.should be_true
50
+ dt.hour?.should be_true
51
+ dt.min?.should be_false
52
+ end
53
+
54
+ it 'should have max precision for fully specified dates/times' do
55
+ # Time.new is an alias for Time.now
56
+ [Time.new, Time.now, DateTime.now, Date.today].each do |t|
57
+ t.precision.should == t.class::MAX_PRECISION
58
+ end
59
+ end
60
+ end
61
+
62
+ describe DateTimePrecision, 'Parsing' do
63
+ it 'should have second precision when parsing a timestamp' do
64
+ t = Time::parse('2000-2-3 00:00:00 UTC')
65
+ t.precision.should == DateTimePrecision::SEC
66
+ t.year.should == 2000
67
+ t.month.should == 2
68
+ t.day.should == 3
69
+ end
70
+
71
+ it 'should have minute precision when seconds are not in the timestamp' do
72
+ dt = DateTime::parse('2000-1-1 00:00 EST') # => Sat, 01 Jan 2000 00:00:00 -0500
73
+ dt.precision.should == DateTimePrecision::MIN
74
+ dt.year.should == 2000
75
+ dt.day.should == 1
76
+ end
77
+
78
+ it 'should have day precision wehn parsing into a Date object' do
79
+ d = Date::parse('2000-1-1 00:00:00 EST') # => Sat, 01 Jan 2000
80
+ d.precision.should == DateTimePrecision::DAY
81
+ end
82
+
83
+ it 'should have month precision when day is not in the parsed string' do
84
+ t = Time::parse('January 2000 UTC').utc # => Sat Jan 01 00:00:00 -0800 2000
85
+ t.precision.should == DateTimePrecision::MONTH
86
+ t.year.should == 2000
87
+ t.month.should == 1
88
+ end
89
+ end
90
+
91
+ describe DateTimePrecision, 'strptime' do
92
+ it 'should have day precision when day is specified in date string' do
93
+ d = Date.strptime('02/09/1968', '%m/%d/%Y')
94
+ d.precision.should == DateTimePrecision::DAY
95
+ end
96
+
97
+ it 'should have minute precision when extracting down to the minute' do
98
+ dt = DateTime.strptime('2011-02-03 15:14:52','%Y-%m-%d %H:%M')
99
+ dt.precision.should == DateTimePrecision::MIN
100
+ end
101
+
102
+ it 'should have second precision when extracting down to the second' do
103
+ t = DateTime.strptime('2011-02-03 15:14:52','%Y-%m-%d %H:%M:%S')
104
+ t.precision.should == DateTimePrecision::SEC
105
+ end
106
+ end
107
+
108
+ describe DateTimePrecision, 'Addition' do
109
+ it 'will default to max precision when adding or subtracting' do
110
+ d = Date.new
111
+ d.precision.should == DateTimePrecision::NONE
112
+ d += 3
113
+ d.precision.should == Date::MAX_PRECISION
114
+ d -= 2
115
+ d.precision.should == Date::MAX_PRECISION
116
+
117
+ dt = DateTime.new
118
+ dt.precision.should == DateTimePrecision::NONE
119
+ dt += 3
120
+ dt.precision.should == DateTime::MAX_PRECISION
121
+ dt -= 2
122
+ dt.precision.should == DateTime::MAX_PRECISION
123
+
124
+ t = Time::parse('January 2000 UTC').utc
125
+ t.precision.should == DateTimePrecision::MONTH
126
+ t += 10
127
+ t.precision.should == Time::MAX_PRECISION
128
+ t -= 8
129
+ t.precision.should == Time::MAX_PRECISION
130
+ end
131
+ end
132
+
133
+ describe DateTimePrecision, 'Partial Matching' do
134
+ it 'should match when differing only in day precision' do
135
+ d1 = Date.new(2001,3,2)
136
+ d2 = Date.new(2001,3)
137
+ d1.partial_match?(d2).should be_true
138
+ d2.partial_match?(d1).should be_true
139
+ end
140
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+
5
+ Dir['./spec/support/**/*.rb'].map {|f| require f}
6
+
7
+ RSpec.configure do |c|
8
+ c.color = true
9
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: date_time_precision
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - David Butler
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-06-14 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rake
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 63
30
+ segments:
31
+ - 0
32
+ - 9
33
+ - 2
34
+ version: 0.9.2
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 39
46
+ segments:
47
+ - 2
48
+ - 10
49
+ - 0
50
+ version: 2.10.0
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: activesupport
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
67
+ description: Patches Date, Time, and DateTime ruby classes to keep track of precision
68
+ email:
69
+ - dwbutler@ucla.edu
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files: []
75
+
76
+ files:
77
+ - .gitignore
78
+ - .rvmrc
79
+ - Gemfile
80
+ - LICENSE
81
+ - README
82
+ - README.md
83
+ - Rakefile
84
+ - date_time_precision.gemspec
85
+ - gem_tasks/rspec.rake
86
+ - lib/date_time_precision.rb
87
+ - lib/date_time_precision/lib.rb
88
+ - lib/date_time_precision/patch.rb
89
+ - lib/date_time_precision/patch/date.rb
90
+ - lib/date_time_precision/patch/date_time.rb
91
+ - lib/date_time_precision/patch/nil.rb
92
+ - lib/date_time_precision/patch/time.rb
93
+ - lib/date_time_precision/version.rb
94
+ - spec/date_time_precision/active_support.rb
95
+ - spec/date_time_precision/date_time_precision_spec.rb
96
+ - spec/spec_helper.rb
97
+ has_rdoc: true
98
+ homepage: http://github.com/Spokeo/date_time_precision
99
+ licenses: []
100
+
101
+ post_install_message:
102
+ rdoc_options: []
103
+
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 57
112
+ segments:
113
+ - 1
114
+ - 8
115
+ - 7
116
+ version: 1.8.7
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
125
+ version: "0"
126
+ requirements: []
127
+
128
+ rubyforge_project:
129
+ rubygems_version: 1.3.7
130
+ signing_key:
131
+ specification_version: 3
132
+ summary: Patches Date, Time, and DateTime ruby classes to keep track of precision
133
+ test_files:
134
+ - spec/date_time_precision/active_support.rb
135
+ - spec/date_time_precision/date_time_precision_spec.rb
136
+ - spec/spec_helper.rb