edtf 0.0.3 → 0.0.4
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/Gemfile +3 -0
- data/edtf.gemspec +2 -0
- data/features/parser/dates.feature +1 -1
- data/features/parser/intervals.feature +9 -10
- data/features/print/level_1_edtf.feature +68 -0
- data/features/print/level_2_edtf.feature +8 -0
- data/features/step_definitions/edtf_steps.rb +38 -20
- data/lib/edtf.rb +9 -1
- data/lib/edtf/compatibility.rb +9 -10
- data/lib/edtf/date.rb +168 -121
- data/lib/edtf/date_time.rb +7 -13
- data/lib/edtf/epoch.rb +57 -0
- data/lib/edtf/extensions.rb +0 -8
- data/lib/edtf/interval.rb +21 -1
- data/lib/edtf/parser.y +59 -73
- data/lib/edtf/season.rb +133 -0
- data/lib/edtf/uncertainty.rb +1 -0
- data/lib/edtf/version.rb +1 -1
- data/spec/edtf/date_spec.rb +118 -0
- data/spec/edtf/epoch_spec.rb +0 -0
- data/spec/edtf/interval_spec.rb +12 -0
- data/spec/edtf/parser_spec.rb +8 -3
- data/spec/edtf/{seasons_spec.rb → season_spec.rb} +23 -21
- data/spec/spec_helper.rb +0 -5
- metadata +37 -15
- data/lib/edtf/seasons.rb +0 -36
data/Gemfile
CHANGED
data/edtf.gemspec
CHANGED
@@ -15,6 +15,8 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.description = 'An Extended Date/Time Format (EDTF) Parser for Ruby.'
|
16
16
|
s.license = 'FreeBSD'
|
17
17
|
|
18
|
+
s.add_runtime_dependency('activesupport', ['~>3.0'])
|
19
|
+
|
18
20
|
s.add_development_dependency('rake', ['~>0.9'])
|
19
21
|
s.add_development_dependency('racc', ['~>1.4'])
|
20
22
|
s.add_development_dependency('cucumber', ['~>1.0'])
|
@@ -3,7 +3,7 @@ Feature: EDTF parser parses date strings
|
|
3
3
|
In order to use dates in EDTF
|
4
4
|
As a user of edtf-ruby
|
5
5
|
I want to parse date strings formatted in EDTF
|
6
|
-
|
6
|
+
|
7
7
|
Scenario Outline: EDTF parses a date string
|
8
8
|
When I parse the string "<string>"
|
9
9
|
Then the year should be "<year>"
|
@@ -4,16 +4,15 @@ Feature: EDTF parses ISO 8601 interval strings
|
|
4
4
|
|
5
5
|
Scenario Outline: parse intervals
|
6
6
|
When I parse the string "<string>"
|
7
|
-
Then the interval should
|
8
|
-
And the interval should end at "<to>"
|
7
|
+
Then the interval should include the date "<date>"
|
9
8
|
|
10
9
|
@004 @level0
|
11
10
|
Scenarios: specification intervals
|
12
|
-
| string |
|
13
|
-
| 1964/2008 | 1964-01-01 |
|
14
|
-
| 2004-06/2006-08 |
|
15
|
-
| 2004-01-01/2004-01-02 | 2004-01-01 |
|
16
|
-
| 2004-02-01/2005-02-08 |
|
17
|
-
| 2004-02-01/2005-02 | 2004-
|
18
|
-
| 2004-02-01/2005 |
|
19
|
-
| 2005/2006-02 | 2005-01-01 |
|
11
|
+
| string | date |
|
12
|
+
| 1964/2008 | 1964-01-01 |
|
13
|
+
| 2004-06/2006-08 | 2006-08-31 |
|
14
|
+
| 2004-01-01/2004-01-02 | 2004-01-01 |
|
15
|
+
| 2004-02-01/2005-02-08 | 2005-02-08 |
|
16
|
+
| 2004-02-01/2005-02 | 2004-12-01 |
|
17
|
+
| 2004-02-01/2005 | 2005-12-31 |
|
18
|
+
| 2005/2006-02 | 2005-01-01 |
|
@@ -0,0 +1,68 @@
|
|
1
|
+
Feature: Print Date/Time objects as Level 1 EDTF strings
|
2
|
+
As a Ruby programmer
|
3
|
+
I want to convert Date/Time objects to EDTF strings
|
4
|
+
|
5
|
+
Scenario: Convert simple dates
|
6
|
+
Given the date "2004-08-12"
|
7
|
+
When I convert the date
|
8
|
+
Then the EDTF string should be "2004-08-12"
|
9
|
+
|
10
|
+
Scenario: Convert simple dates with precision
|
11
|
+
Given the date "1980-08-24" with precision set to "day"
|
12
|
+
When I convert the date
|
13
|
+
Then the EDTF string should be "1980-08-24"
|
14
|
+
Given the date "1980-08-24" with precision set to "month"
|
15
|
+
When I convert the date
|
16
|
+
Then the EDTF string should be "1980-08"
|
17
|
+
Given the date "1980-08-24" with precision set to "year"
|
18
|
+
When I convert the date
|
19
|
+
Then the EDTF string should be "1980"
|
20
|
+
|
21
|
+
Scenario: Date Roundtrips
|
22
|
+
When I parse the string "2001-02-03"
|
23
|
+
When I convert the date
|
24
|
+
Then the EDTF string should be "2001-02-03"
|
25
|
+
When I parse the string "2001-02"
|
26
|
+
When I convert the date
|
27
|
+
Then the EDTF string should be "2001-02"
|
28
|
+
When I parse the string "2001"
|
29
|
+
When I convert the date
|
30
|
+
Then the EDTF string should be "2001"
|
31
|
+
When I parse the string "-9909"
|
32
|
+
When I convert the date
|
33
|
+
Then the EDTF string should be "-9909"
|
34
|
+
When I parse the string "0000"
|
35
|
+
When I convert the date
|
36
|
+
Then the EDTF string should be "0000"
|
37
|
+
|
38
|
+
Scenario: DateTime Roundtrips
|
39
|
+
When I parse the string "2001-02-03T09:30:01"
|
40
|
+
When I convert the date
|
41
|
+
Then the EDTF string should be "2001-02-03T09:30:01+00:00"
|
42
|
+
When I parse the string "2004-01-01T10:10:10Z"
|
43
|
+
When I convert the date
|
44
|
+
Then the EDTF string should be "2004-01-01T10:10:10+00:00"
|
45
|
+
When I parse the string "2004-01-01T10:10:10+05:00"
|
46
|
+
When I convert the date
|
47
|
+
Then the EDTF string should be "2004-01-01T10:10:10+05:00"
|
48
|
+
|
49
|
+
Scenario: Interval Roundtrips
|
50
|
+
When I parse the string "1964/2008"
|
51
|
+
When I convert the date
|
52
|
+
Then the EDTF string should be "1964/2008"
|
53
|
+
When I parse the string "2004-06/2006-08"
|
54
|
+
When I convert the date
|
55
|
+
Then the EDTF string should be "2004-06/2006-08"
|
56
|
+
When I parse the string "2004-02-01/2005-02-08"
|
57
|
+
When I convert the date
|
58
|
+
Then the EDTF string should be "2004-02-01/2005-02-08"
|
59
|
+
When I parse the string "2004-02-01/2005-02"
|
60
|
+
When I convert the date
|
61
|
+
Then the EDTF string should be "2004-02-01/2005-02"
|
62
|
+
When I parse the string "2004-02-01/2005"
|
63
|
+
When I convert the date
|
64
|
+
Then the EDTF string should be "2004-02-01/2005"
|
65
|
+
When I parse the string "2005/2006-02"
|
66
|
+
When I convert the date
|
67
|
+
Then the EDTF string should be "2005/2006-02"
|
68
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Feature: Print Date/Time objects as Level 2 EDTF strings
|
2
|
+
As a Ruby programmer
|
3
|
+
I want to convert Date/Time objects to EDTF strings
|
4
|
+
|
5
|
+
Scenario: Uncertain or approximate dates
|
6
|
+
When I parse the string "2001?"
|
7
|
+
When I convert the date
|
8
|
+
Then the EDTF string should be "2001?"
|
@@ -1,80 +1,98 @@
|
|
1
|
+
Given /^the date "([^"]*)"(?: with precision set to "([^"]*)")?$/ do |date, precision|
|
2
|
+
@date = Date.parse(date)
|
3
|
+
@date.precision = precision unless precision.nil?
|
4
|
+
end
|
5
|
+
|
6
|
+
When /^I convert the date$/ do
|
7
|
+
@string = @date.edtf
|
8
|
+
end
|
9
|
+
|
10
|
+
Then /^the EDTF String should be "([^"]*)"$/i do |edtf|
|
11
|
+
@string.should == edtf
|
12
|
+
end
|
13
|
+
|
1
14
|
When /^I parse the string "([^"]*)"$/ do |string|
|
2
|
-
@
|
15
|
+
@date = EDTF.parse(string)
|
3
16
|
end
|
4
17
|
|
5
18
|
Then /^the year should be "([^"]*)"$/ do |year|
|
6
|
-
@
|
19
|
+
@date.year.should == year.to_i
|
7
20
|
end
|
8
21
|
|
9
22
|
Then /^the month should be "([^"]*)"$/ do |month|
|
10
|
-
@
|
23
|
+
@date.month.should == month.to_i
|
11
24
|
end
|
12
25
|
|
13
26
|
Then /^the day should be "([^"]*)"$/ do |day|
|
14
|
-
@
|
27
|
+
@date.day.should == day.to_i
|
15
28
|
end
|
16
29
|
|
17
30
|
Then /^the hours should be "([^"]*)"$/ do |hours|
|
18
|
-
@
|
31
|
+
@date.hour.should == hours.to_i
|
19
32
|
end
|
20
33
|
|
21
34
|
Then /^the year should be "([^"]*)" \(UTC\)$/ do |year|
|
22
|
-
@
|
35
|
+
@date.to_time.utc.year.should == year.to_i
|
23
36
|
end
|
24
37
|
|
25
38
|
Then /^the month should be "([^"]*)" \(UTC\)$/ do |month|
|
26
|
-
@
|
39
|
+
@date.to_time.utc.month.should == month.to_i
|
27
40
|
end
|
28
41
|
|
29
42
|
Then /^the day should be "([^"]*)" \(UTC\)$/ do |day|
|
30
|
-
@
|
43
|
+
@date.to_time.utc.day.should == day.to_i
|
31
44
|
end
|
32
45
|
|
33
46
|
Then /^the hours should be "([^"]*)" \(UTC\)$/ do |hours|
|
34
|
-
@
|
47
|
+
@date.to_time.utc.hour.should == hours.to_i
|
35
48
|
end
|
36
49
|
|
37
50
|
|
38
51
|
Then /^the minutes should be "([^"]*)"$/ do |minutes|
|
39
|
-
@
|
52
|
+
@date.min.should == minutes.to_i
|
40
53
|
end
|
41
54
|
|
42
55
|
Then /^the seconds should be "([^"]*)"$/ do |seconds|
|
43
|
-
@
|
56
|
+
@date.sec.should == seconds.to_i
|
44
57
|
end
|
45
58
|
|
46
59
|
Then /^the duration should range from "([^"]*)" to "([^"]*)"$/ do |from,to|
|
47
|
-
[@
|
60
|
+
[@date.begin.year.to_s, @date.end.year.to_s].should == [from,to]
|
48
61
|
end
|
49
62
|
|
50
63
|
Then /^the interval should start at "([^"]*)"$/ do |date|
|
51
|
-
@
|
64
|
+
@date.begin.to_s.should == date
|
52
65
|
end
|
53
66
|
|
54
67
|
Then /^the interval should end at "([^"]*)"$/ do |date|
|
55
|
-
@
|
68
|
+
@date.end.to_s.should == date
|
69
|
+
end
|
70
|
+
|
71
|
+
Then /^the interval should include the date "([^"]*)"$/ do |date|
|
72
|
+
@date.should include(Date.parse(date))
|
56
73
|
end
|
57
74
|
|
75
|
+
|
58
76
|
Then /^the date should be uncertain\? "([^"]*)"$/ do |arg1|
|
59
|
-
@
|
77
|
+
@date.uncertain?.should == !!(arg1 =~ /y(es)?/i)
|
60
78
|
end
|
61
79
|
|
62
80
|
Then /^the year should be uncertain\? "([^"]*)"$/ do |arg1|
|
63
|
-
@
|
81
|
+
@date.uncertain?(:year).should == !!(arg1 =~ /y(es)?/i)
|
64
82
|
end
|
65
83
|
|
66
84
|
Then /^the month should be uncertain\? "([^"]*)"$/ do |arg1|
|
67
|
-
@
|
85
|
+
@date.uncertain?(:month).should == !!(arg1 =~ /y(es)?/i)
|
68
86
|
end
|
69
87
|
|
70
88
|
Then /^the day should be uncertain\? "([^"]*)"$/ do |arg1|
|
71
|
-
@
|
89
|
+
@date.uncertain?(:day).should == !!(arg1 =~ /y(es)?/i)
|
72
90
|
end
|
73
91
|
|
74
92
|
Then /^the date should be approximate\? "([^"]*)"$/ do |arg1|
|
75
|
-
@
|
93
|
+
@date.approximate?.should == !!(arg1 =~ /y(es)?/i)
|
76
94
|
end
|
77
95
|
|
78
96
|
Then /^the unspecified string code be "([^"]*)"$/ do |arg1|
|
79
|
-
@
|
97
|
+
@date.unspecified.to_s.should == arg1
|
80
98
|
end
|
data/lib/edtf.rb
CHANGED
@@ -33,13 +33,21 @@ autoload :Rational, 'rational'
|
|
33
33
|
|
34
34
|
require 'forwardable'
|
35
35
|
|
36
|
+
require 'active_support/core_ext/date/calculations'
|
37
|
+
require 'active_support/core_ext/date_time/calculations'
|
38
|
+
require 'active_support/core_ext/time/calculations'
|
39
|
+
|
40
|
+
|
41
|
+
require 'active_support/core_ext/date/conversions'
|
42
|
+
|
36
43
|
require 'edtf/compatibility'
|
37
44
|
|
38
45
|
require 'edtf/version'
|
39
46
|
require 'edtf/uncertainty'
|
40
|
-
require 'edtf/seasons'
|
41
47
|
require 'edtf/date'
|
42
48
|
require 'edtf/date_time'
|
49
|
+
require 'edtf/epoch'
|
50
|
+
require 'edtf/season'
|
43
51
|
require 'edtf/interval'
|
44
52
|
require 'edtf/parser'
|
45
53
|
require 'edtf/extensions'
|
data/lib/edtf/compatibility.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
|
2
|
-
unless DateTime.respond_to?(:to_time)
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
2
|
+
# unless DateTime.respond_to?(:to_time)
|
3
|
+
# require 'time'
|
4
|
+
#
|
5
|
+
# class DateTime
|
6
|
+
# def to_time
|
7
|
+
# Time.parse(to_s)
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
# end
|
data/lib/edtf/date.rb
CHANGED
@@ -1,140 +1,187 @@
|
|
1
|
-
|
1
|
+
class Date
|
2
2
|
|
3
3
|
PRECISIONS = [:year, :month, :day].freeze
|
4
|
+
FORMATS = %w{ %04d %02d %02d }.freeze
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
attr_reader :precision
|
14
|
-
|
15
|
-
def precision=(precision)
|
16
|
-
raise ArgumentError, "invalid precision #{precision.inspect}" unless PRECISIONS.include?(precision.to_sym)
|
17
|
-
@precision = precision.to_sym
|
18
|
-
update_precision_filter[-1]
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.included(base)
|
22
|
-
base.extend(ClassMethods)
|
6
|
+
EXTENDED_ATTRIBUTES = %w{ calendar precision uncertain approximate
|
7
|
+
unspecified }.map(&:intern).freeze
|
8
|
+
|
9
|
+
extend Forwardable
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def edtf(input, options = {})
|
13
|
+
::EDTF::Parser.new(options).parse(input)
|
23
14
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :calendar
|
18
|
+
|
19
|
+
PRECISIONS.each do |p|
|
20
|
+
define_method("#{p}_precision?") { @precision == p }
|
21
|
+
define_method("#{p}_precision!") { @precision = p }
|
22
|
+
end
|
23
|
+
|
24
|
+
def dup
|
25
|
+
d = super
|
26
|
+
d.uncertain = uncertain.dup
|
27
|
+
d.approximate = approximate.dup
|
28
|
+
d.unspecified = unspecified.dup
|
29
|
+
d
|
30
|
+
end
|
31
|
+
|
32
|
+
# Alias change method from Active Support.
|
33
|
+
alias original_change change
|
34
|
+
|
35
|
+
# Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
|
36
|
+
def change(options)
|
37
|
+
d = original_change(options)
|
38
|
+
EXTENDED_ATTRIBUTES.each do |attribute|
|
39
|
+
d.send("#{attribute}=", options[attribute] || send(attribute))
|
27
40
|
end
|
41
|
+
d
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns this Date's precision.
|
45
|
+
def precision
|
46
|
+
@precision ||= :day
|
47
|
+
end
|
48
|
+
|
49
|
+
def precision=(precision)
|
50
|
+
precision = precision.intern
|
51
|
+
raise ArgumentError, "invalid precision #{precision.inspect}" unless PRECISIONS.include?(precision)
|
52
|
+
@precision = precision
|
53
|
+
update_precision_filter[-1]
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.included(base)
|
57
|
+
base.extend(ClassMethods)
|
58
|
+
end
|
59
|
+
|
60
|
+
def uncertain
|
61
|
+
@uncertain ||= EDTF::Uncertainty.new
|
62
|
+
end
|
28
63
|
|
29
|
-
|
30
|
-
|
31
|
-
|
64
|
+
def approximate
|
65
|
+
@approximate ||= EDTF::Uncertainty.new
|
66
|
+
end
|
32
67
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
68
|
+
def unspecified
|
69
|
+
@unspecified ||= EDTF::Unspecified.new
|
70
|
+
end
|
71
|
+
|
72
|
+
def_delegators :uncertain, :uncertain?, :certain?
|
38
73
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
74
|
+
def certain!(*arguments)
|
75
|
+
uncertain.certain!(*arguments)
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
def uncertain!(*arguments)
|
80
|
+
uncertain.uncertain!(*arguments)
|
81
|
+
self
|
82
|
+
end
|
48
83
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
84
|
+
def approximate?(*arguments)
|
85
|
+
approximate.uncertain?(*arguments)
|
86
|
+
end
|
87
|
+
|
88
|
+
alias approximately? approximate?
|
89
|
+
|
90
|
+
def approximate!(*arguments)
|
91
|
+
approximate.uncertain!(*arguments)
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
alias approximately! approximate!
|
96
|
+
|
97
|
+
def precise?(*arguments)
|
98
|
+
!approximate?(*arguments)
|
99
|
+
end
|
100
|
+
|
101
|
+
alias precisely? precise?
|
67
102
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
103
|
+
def precise!(*arguments)
|
104
|
+
approximate.certain!(*arguments)
|
105
|
+
self
|
106
|
+
end
|
72
107
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
108
|
+
alias precisely! precise!
|
109
|
+
|
110
|
+
def_delegators :unspecified, :unspecified?, :specified?, :unsepcific?, :specific?
|
111
|
+
|
112
|
+
def unspecified!(*arguments)
|
113
|
+
unspecified.unspecified!(*arguments)
|
114
|
+
self
|
115
|
+
end
|
81
116
|
|
82
|
-
|
117
|
+
alias unspecific! unspecified!
|
83
118
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
119
|
+
def specified!(*arguments)
|
120
|
+
unspecified.specified!(*arguments)
|
121
|
+
self
|
122
|
+
end
|
88
123
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
124
|
+
alias specific! specified!
|
125
|
+
|
126
|
+
def season?; false; end
|
127
|
+
|
128
|
+
def season
|
129
|
+
Season.new(self)
|
130
|
+
end
|
131
|
+
|
132
|
+
def edtf
|
133
|
+
FORMATS.take(values.length).join('-') % values
|
134
|
+
end
|
94
135
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
# Returns the same date with negated year
|
105
|
-
def negate
|
106
|
-
v = values
|
107
|
-
y = -1 * v.shift
|
108
|
-
self.class.new(y, *v) # TODO copy extended attributes
|
109
|
-
end
|
110
|
-
|
111
|
-
alias -@ negate
|
112
|
-
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def precision_filter
|
117
|
-
@precision_filter ||= update_precision_filter
|
118
|
-
end
|
119
|
-
|
120
|
-
def update_precision_filter
|
121
|
-
case @precision
|
122
|
-
when :year
|
123
|
-
[:year]
|
124
|
-
when :month
|
125
|
-
[:year,:month]
|
126
|
-
else
|
127
|
-
[:year,:month,:day]
|
128
|
-
end
|
129
|
-
end
|
136
|
+
alias to_edtf edtf
|
137
|
+
|
138
|
+
def next
|
139
|
+
send("next_#{precision}")
|
140
|
+
end
|
141
|
+
|
142
|
+
# def succ
|
143
|
+
# end
|
130
144
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
145
|
+
# def ==(other)
|
146
|
+
# end
|
147
|
+
|
148
|
+
# def <=>(other)
|
149
|
+
# end
|
150
|
+
|
151
|
+
# def ===(other)
|
152
|
+
# end
|
153
|
+
|
154
|
+
def values
|
155
|
+
precision_filter.map { |p| send(p) }
|
156
|
+
end
|
157
|
+
|
158
|
+
# Returns the same date with negated year
|
159
|
+
def negate
|
160
|
+
change(:year => year * -1)
|
161
|
+
end
|
162
|
+
|
163
|
+
alias -@ negate
|
164
|
+
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def precision_filter
|
169
|
+
@precision_filter ||= update_precision_filter
|
170
|
+
end
|
171
|
+
|
172
|
+
def update_precision_filter
|
173
|
+
case @precision
|
174
|
+
when :year
|
175
|
+
[:year]
|
176
|
+
when :month
|
177
|
+
[:year,:month]
|
178
|
+
else
|
179
|
+
[:year,:month,:day]
|
136
180
|
end
|
137
|
-
|
138
181
|
end
|
182
|
+
|
183
|
+
protected
|
184
|
+
|
185
|
+
attr_writer :uncertain, :unspecified, :approximate
|
139
186
|
|
140
|
-
end
|
187
|
+
end
|