edtf 3.0.8 → 3.1.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +41 -0
- data/.simplecov +15 -0
- data/Gemfile +5 -19
- data/LICENSE +1 -1
- data/README.md +12 -7
- data/Rakefile +0 -4
- data/cucumber.yml +1 -1
- data/edtf.gemspec +1 -2
- data/features/parser/unspecified.feature +17 -6
- data/features/print/level_1_edtf.feature +47 -16
- data/features/print/level_2_edtf.feature +11 -3
- data/features/support/env.rb +1 -10
- data/lib/edtf/date.rb +2 -2
- data/lib/edtf/interval.rb +4 -4
- data/lib/edtf/parser.rb +98 -94
- data/lib/edtf/parser.y +7 -5
- data/lib/edtf/season.rb +2 -2
- data/lib/edtf/uncertainty.rb +13 -13
- data/lib/edtf/version.rb +1 -1
- data/spec/edtf/interval_spec.rb +3 -3
- data/spec/edtf/parser_spec.rb +135 -70
- data/spec/edtf/uncertainty_spec.rb +73 -79
- data/spec/spec_helper.rb +1 -10
- metadata +5 -6
- data/.coveralls.yml +0 -1
- data/.travis.yml +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 750afc3b14ecab6a3cc5501ce4b3e8f70bc330c446049967912a44b73a5295b2
|
4
|
+
data.tar.gz: a0f03a70d0a4e83e1a71fdee6d19ec85edc17c36707ba0df6f60f7006dc83914
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a25877fc5a242cfc8e936610ae0b4a1cbeb6d71bc0befd2173cafedcaa738c2aaab2f45d9e246ae999dcb73931a504260fec2c2f18a17f512c16d87bc91de81
|
7
|
+
data.tar.gz: d00ae2cc4681b6cabdaec8231347e2c3c9674eb7bfc90d3b599b7d10675ec080af3f4527124b84735490e798b824ad69640edba9122f289f8de181aa3a3b2633
|
@@ -0,0 +1,41 @@
|
|
1
|
+
name: ci
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
environment: CI
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
strategy:
|
15
|
+
matrix:
|
16
|
+
ruby-version:
|
17
|
+
- '2.7'
|
18
|
+
- '3.0'
|
19
|
+
- '3.1'
|
20
|
+
- '3.2'
|
21
|
+
- 'jruby'
|
22
|
+
|
23
|
+
steps:
|
24
|
+
- name: Git checkout
|
25
|
+
uses: actions/checkout@v2
|
26
|
+
|
27
|
+
- name: Setup Ruby
|
28
|
+
uses: ruby/setup-ruby@v1
|
29
|
+
with:
|
30
|
+
ruby-version: ${{ matrix.ruby-version }}
|
31
|
+
bundler-cache: true
|
32
|
+
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake
|
35
|
+
|
36
|
+
- name: Upload coverage results
|
37
|
+
if: matrix.ruby-version == '3.1'
|
38
|
+
continue-on-error: true
|
39
|
+
uses: coverallsapp/github-action@master
|
40
|
+
with:
|
41
|
+
github-token: ${{ github.token }}
|
data/.simplecov
CHANGED
@@ -1,4 +1,19 @@
|
|
1
|
+
require 'simplecov-lcov'
|
2
|
+
|
3
|
+
SimpleCov::Formatter::LcovFormatter.config do |c|
|
4
|
+
c.output_directory = 'coverage'
|
5
|
+
c.lcov_file_name = 'lcov.info'
|
6
|
+
c.report_with_single_file = true
|
7
|
+
end
|
8
|
+
|
9
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
10
|
+
SimpleCov::Formatter::HTMLFormatter,
|
11
|
+
SimpleCov::Formatter::LcovFormatter
|
12
|
+
])
|
13
|
+
|
1
14
|
SimpleCov.start do
|
2
15
|
add_filter 'spec/'
|
3
16
|
add_filter 'features/'
|
17
|
+
|
18
|
+
enable_coverage :branch
|
4
19
|
end
|
data/Gemfile
CHANGED
@@ -2,20 +2,16 @@ source 'https://rubygems.org'
|
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
group :debug do
|
5
|
-
gem '
|
6
|
-
gem 'byebug', :require => false, :platform => :mri
|
7
|
-
gem 'rubinius-compiler', '~>2.0', :require => false, :platform => :rbx
|
8
|
-
gem 'rubinius-debugger', '~>2.0', :require => false, :platform => :rbx
|
5
|
+
gem 'debug', platform: 'mri'
|
9
6
|
end
|
10
7
|
|
11
8
|
group :development do
|
12
9
|
gem 'rake'
|
13
|
-
gem 'racc'
|
10
|
+
gem 'racc'
|
14
11
|
gem 'cucumber'
|
15
|
-
gem 'rspec'
|
16
|
-
gem 'simplecov', :
|
17
|
-
gem '
|
18
|
-
gem 'coveralls', '~>0.8', :require => false
|
12
|
+
gem 'rspec'
|
13
|
+
gem 'simplecov', platform: 'mri'
|
14
|
+
gem 'simplecov-lcov', platform: 'mri'
|
19
15
|
end
|
20
16
|
|
21
17
|
group :extra do
|
@@ -24,13 +20,3 @@ end
|
|
24
20
|
|
25
21
|
# active_support requires this
|
26
22
|
gem 'i18n'
|
27
|
-
|
28
|
-
platform :rbx do
|
29
|
-
gem 'rubysl-singleton', '~>2.0'
|
30
|
-
gem 'rubysl-open3', '~>2.0'
|
31
|
-
gem 'rubysl-enumerator', '~>2.0'
|
32
|
-
gem 'rubysl-base64', '~>2.0'
|
33
|
-
gem 'rubysl-bigdecimal', '~>2.0'
|
34
|
-
gem 'rubysl-drb', '~>2.0'
|
35
|
-
gem 'json'
|
36
|
-
end
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
EDTF-Ruby
|
2
2
|
=========
|
3
|
-
[](https://github.com/inukshuk/edtf-ruby/actions/workflows/ci.yml)
|
4
|
+
[](https://coveralls.io/github/inukshuk/edtf-ruby?branch=main)
|
5
5
|
|
6
6
|
EDTF-Ruby comprises a parser and an API implementation of the [Extended
|
7
7
|
Date/Time Format standard](http://www.loc.gov/standards/datetime/).
|
@@ -135,9 +135,11 @@ state of dates in Ruby:
|
|
135
135
|
As you can see above, you can use the bang! methods to set individual date
|
136
136
|
parts.
|
137
137
|
|
138
|
-
In addition, EDTF supports *unspecified* date parts
|
138
|
+
In addition, EDTF supports *unspecified* date parts. EDTF-Ruby provides parsing
|
139
|
+
for both the draft and finalized EDTF specifications, with output meeting the
|
140
|
+
requirements of the final specification:
|
139
141
|
|
140
|
-
> d = Date.edtf('1999-03-
|
142
|
+
> d = Date.edtf('1999-03-XX')
|
141
143
|
> d.unspecified?
|
142
144
|
=> true
|
143
145
|
> d.unspecified? :year
|
@@ -146,7 +148,11 @@ In addition, EDTF supports *unspecified* date parts:
|
|
146
148
|
=> true
|
147
149
|
> d.unspecified! :month
|
148
150
|
> d.edtf
|
149
|
-
=> "1999-
|
151
|
+
=> "1999-XX-XX"
|
152
|
+
|
153
|
+
> draft_d = Date.edtf('1999-03-uu')
|
154
|
+
> draft_d.edtf
|
155
|
+
=> "1999-03-XX"
|
150
156
|
|
151
157
|
All three, uncertain, approximate, and unspecified attributes do not factor
|
152
158
|
into date calculations (like comparisons or successors etc.).
|
@@ -334,8 +340,7 @@ and submit a pull request.
|
|
334
340
|
|
335
341
|
Credits
|
336
342
|
-------
|
337
|
-
EDTF-Ruby was written by
|
338
|
-
[Namyra](https://github.com/namyra).
|
343
|
+
EDTF-Ruby was written by Sylvester Keil and Ilja Srna.
|
339
344
|
|
340
345
|
Published under the terms and conditions of the FreeBSD License; see LICENSE
|
341
346
|
for details.
|
data/Rakefile
CHANGED
@@ -50,10 +50,6 @@ task :build => [:check_warnings] do
|
|
50
50
|
system 'gem build edtf.gemspec'
|
51
51
|
end
|
52
52
|
|
53
|
-
require 'coveralls/rake/task'
|
54
|
-
Coveralls::RakeTask.new
|
55
|
-
task :test_with_coveralls => [:spec, :cucumber, 'coveralls:push']
|
56
|
-
|
57
53
|
task :check_warnings do
|
58
54
|
$VERBOSE = true
|
59
55
|
require 'edtf'
|
data/cucumber.yml
CHANGED
@@ -1 +1 @@
|
|
1
|
-
default: --format progress --require features --color
|
1
|
+
default: --format progress --require features --color --publish-quiet
|
data/edtf.gemspec
CHANGED
@@ -8,8 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.name = 'edtf'
|
9
9
|
s.version = EDTF::VERSION.dup
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
|
-
s.authors = ['Sylvester Keil']
|
12
|
-
s.email = ['http://sylvester.keil.or.at']
|
11
|
+
s.authors = ['Sylvester Keil', 'Ilja Srna']
|
13
12
|
s.homepage = 'http://github.com/inukshuk/edtf-ruby'
|
14
13
|
s.summary = 'Extended Date/Time Format for Ruby.'
|
15
14
|
s.description = 'A Ruby implementation of the Extended Date/Time Format (EDTF).'
|
@@ -9,15 +9,26 @@ Feature: Parse unspecified date strings
|
|
9
9
|
And the day should be "<day>"
|
10
10
|
And the unspecified string code be "<unspecified>"
|
11
11
|
|
12
|
-
@102 @level1
|
12
|
+
@102 @level1 @draft
|
13
13
|
Scenarios: examples from the specification draft
|
14
14
|
| string | year | month | day | unspecified |
|
15
|
-
| 199u | 1990 | 1 | 1 |
|
16
|
-
| 19uu | 1900 | 1 | 1 |
|
17
|
-
| 1999-uu | 1999 | 1 | 1 | ssss-
|
18
|
-
| 1999-02-uu | 1999 | 2 | 1 | ssss-ss-
|
19
|
-
| 1999-uu-uu | 1999 | 1 | 1 | ssss-
|
15
|
+
| 199u | 1990 | 1 | 1 | sssX-ss-ss |
|
16
|
+
| 19uu | 1900 | 1 | 1 | ssXX-ss-ss |
|
17
|
+
| 1999-uu | 1999 | 1 | 1 | ssss-XX-ss |
|
18
|
+
| 1999-02-uu | 1999 | 2 | 1 | ssss-ss-XX |
|
19
|
+
| 1999-uu-uu | 1999 | 1 | 1 | ssss-XX-XX |
|
20
|
+
|
21
|
+
@102 @level1 @final
|
22
|
+
Scenarios: examples from the specification draft
|
23
|
+
| string | year | month | day | unspecified |
|
24
|
+
| 199X | 1990 | 1 | 1 | sssX-ss-ss |
|
25
|
+
| 19XX | 1900 | 1 | 1 | ssXX-ss-ss |
|
26
|
+
| 1999-XX | 1999 | 1 | 1 | ssss-XX-ss |
|
27
|
+
| 1999-02-XX | 1999 | 2 | 1 | ssss-ss-XX |
|
28
|
+
| 1999-XX-XX | 1999 | 1 | 1 | ssss-XX-XX |
|
20
29
|
|
21
30
|
Scenario: Completely unknown
|
22
31
|
When I parse the string "uuuu"
|
23
32
|
Then the result should be an Unknown
|
33
|
+
When I parse the string "XXXX"
|
34
|
+
Then the result should be an Unknown
|
@@ -1,21 +1,21 @@
|
|
1
1
|
Feature: Print Date/Time objects as Level 1 EDTF strings
|
2
2
|
As a Ruby programmer
|
3
3
|
I want to convert Date/Time objects to EDTF strings
|
4
|
-
|
4
|
+
|
5
5
|
@101 @level1
|
6
6
|
Scenario: Uncertain or approximate dates
|
7
7
|
When I parse the string "2001?"
|
8
8
|
When I convert the date
|
9
9
|
Then the EDTF string should be "2001?"
|
10
|
-
|
10
|
+
|
11
11
|
When I parse the string "2004-06?"
|
12
12
|
When I convert the date
|
13
13
|
Then the EDTF string should be "2004-06?"
|
14
|
-
|
14
|
+
|
15
15
|
When I parse the string "2004-06-11?"
|
16
16
|
When I convert the date
|
17
17
|
Then the EDTF string should be "2004-06-11?"
|
18
|
-
|
18
|
+
|
19
19
|
When I parse the string "1984~"
|
20
20
|
When I convert the date
|
21
21
|
Then the EDTF string should be "1984~"
|
@@ -23,28 +23,50 @@ Feature: Print Date/Time objects as Level 1 EDTF strings
|
|
23
23
|
When I parse the string "1984?~"
|
24
24
|
When I convert the date
|
25
25
|
Then the EDTF string should be "1984?~"
|
26
|
-
|
27
|
-
@102 @level1
|
26
|
+
|
27
|
+
@102 @level1 @draft
|
28
28
|
Scenario: Unspecified dates
|
29
29
|
When I parse the string "199u"
|
30
30
|
When I convert the date
|
31
|
-
Then the EDTF string should be "
|
31
|
+
Then the EDTF string should be "199X"
|
32
32
|
|
33
33
|
When I parse the string "19uu"
|
34
34
|
When I convert the date
|
35
|
-
Then the EDTF string should be "
|
35
|
+
Then the EDTF string should be "19XX"
|
36
36
|
|
37
37
|
When I parse the string "1999-uu"
|
38
38
|
When I convert the date
|
39
|
-
Then the EDTF string should be "1999-
|
39
|
+
Then the EDTF string should be "1999-XX"
|
40
40
|
|
41
41
|
When I parse the string "1999-01-uu"
|
42
42
|
When I convert the date
|
43
|
-
Then the EDTF string should be "1999-01-
|
43
|
+
Then the EDTF string should be "1999-01-XX"
|
44
|
+
|
45
|
+
When I parse the string "1999-XX-XX"
|
46
|
+
When I convert the date
|
47
|
+
Then the EDTF string should be "1999-XX-XX"
|
48
|
+
|
49
|
+
@102 @level1 @final
|
50
|
+
Scenario: Unspecified dates
|
51
|
+
When I parse the string "199X"
|
52
|
+
When I convert the date
|
53
|
+
Then the EDTF string should be "199X"
|
54
|
+
|
55
|
+
When I parse the string "19XX"
|
56
|
+
When I convert the date
|
57
|
+
Then the EDTF string should be "19XX"
|
58
|
+
|
59
|
+
When I parse the string "1999-XX"
|
60
|
+
When I convert the date
|
61
|
+
Then the EDTF string should be "1999-XX"
|
62
|
+
|
63
|
+
When I parse the string "1999-01-XX"
|
64
|
+
When I convert the date
|
65
|
+
Then the EDTF string should be "1999-01-XX"
|
44
66
|
|
45
|
-
When I parse the string "1999-
|
67
|
+
When I parse the string "1999-XX-XX"
|
46
68
|
When I convert the date
|
47
|
-
Then the EDTF string should be "1999-
|
69
|
+
Then the EDTF string should be "1999-XX-XX"
|
48
70
|
|
49
71
|
@103 @level1 @interval
|
50
72
|
Scenario: Prints L1 Extended Intervals
|
@@ -88,19 +110,28 @@ Feature: Print Date/Time objects as Level 1 EDTF strings
|
|
88
110
|
When I convert the date
|
89
111
|
Then the EDTF string should be "1984-06-02?/unknown"
|
90
112
|
|
91
|
-
@104 @level1
|
113
|
+
@104 @level1 @draft
|
92
114
|
Scenario: Prints years with more than four digits
|
93
115
|
When I parse the string "y170000002"
|
94
116
|
When I convert the date
|
95
|
-
Then the EDTF string should be "
|
117
|
+
Then the EDTF string should be "Y170000002"
|
96
118
|
|
97
119
|
When I parse the string "y-170000002"
|
98
120
|
When I convert the date
|
99
|
-
Then the EDTF string should be "
|
121
|
+
Then the EDTF string should be "Y-170000002"
|
122
|
+
|
123
|
+
@104 @level1 @final
|
124
|
+
Scenario: Prints years with more than four digits
|
125
|
+
When I parse the string "Y170000002"
|
126
|
+
When I convert the date
|
127
|
+
Then the EDTF string should be "Y170000002"
|
128
|
+
|
129
|
+
When I parse the string "Y-170000002"
|
130
|
+
When I convert the date
|
131
|
+
Then the EDTF string should be "Y-170000002"
|
100
132
|
|
101
133
|
@105 @level1 @season
|
102
134
|
Scenario: Prints seasons
|
103
135
|
When I parse the string "2001-21"
|
104
136
|
When I convert the date
|
105
137
|
Then the EDTF string should be "2001-21"
|
106
|
-
|
@@ -1,12 +1,16 @@
|
|
1
1
|
Feature: Print Date/Time objects as Level 2 EDTF strings
|
2
2
|
As a Ruby programmer
|
3
3
|
I want to convert Date/Time objects to EDTF strings
|
4
|
-
|
4
|
+
|
5
5
|
@202 @level2
|
6
6
|
Scenario: Prints internal unspecified dates
|
7
7
|
When I parse the string "156u-12-25"
|
8
8
|
When I convert the date
|
9
|
-
Then the EDTF string should be "
|
9
|
+
Then the EDTF string should be "156X-12-25"
|
10
|
+
|
11
|
+
When I parse the string "156X-12-25"
|
12
|
+
When I convert the date
|
13
|
+
Then the EDTF string should be "156X-12-25"
|
10
14
|
|
11
15
|
@205 @level2 @interval
|
12
16
|
Scenario: Prints L2 extended intervals
|
@@ -16,7 +20,11 @@ Feature: Print Date/Time objects as Level 2 EDTF strings
|
|
16
20
|
|
17
21
|
When I parse the string "2004-06-uu/2004-07-03"
|
18
22
|
When I convert the date
|
19
|
-
Then the EDTF string should be "2004-06-
|
23
|
+
Then the EDTF string should be "2004-06-XX/2004-07-03"
|
24
|
+
|
25
|
+
When I parse the string "2004-06-XX/2004-07-03"
|
26
|
+
When I convert the date
|
27
|
+
Then the EDTF string should be "2004-06-XX/2004-07-03"
|
20
28
|
|
21
29
|
@209 @level2 @season
|
22
30
|
Scenario: Prints qualified seasons
|
data/features/support/env.rb
CHANGED
@@ -1,20 +1,11 @@
|
|
1
1
|
begin
|
2
2
|
require 'simplecov'
|
3
|
-
require 'coveralls' if ENV['CI']
|
4
3
|
rescue LoadError
|
5
4
|
# ignore
|
6
5
|
end
|
7
6
|
|
8
7
|
begin
|
9
|
-
|
10
|
-
when RUBY_PLATFORM < 'java'
|
11
|
-
require 'debug'
|
12
|
-
Debugger.start
|
13
|
-
when defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
14
|
-
require 'rubinius/debugger'
|
15
|
-
else
|
16
|
-
require 'byebug'
|
17
|
-
end
|
8
|
+
require 'debug' unless RUBY_PLATFORM == 'java'
|
18
9
|
rescue LoadError
|
19
10
|
# ignore
|
20
11
|
end
|
data/lib/edtf/date.rb
CHANGED
@@ -9,7 +9,7 @@ class Date
|
|
9
9
|
:uncertain => '?',
|
10
10
|
:approximate => '~',
|
11
11
|
:calendar => '^',
|
12
|
-
:unspecified => '
|
12
|
+
:unspecified => 'X'
|
13
13
|
}.freeze
|
14
14
|
|
15
15
|
EXTENDED_ATTRIBUTES = %w{
|
@@ -172,7 +172,7 @@ class Date
|
|
172
172
|
|
173
173
|
# Returns the Date's EDTF string.
|
174
174
|
def edtf
|
175
|
-
return "
|
175
|
+
return "Y#{year}" if long_year?
|
176
176
|
|
177
177
|
v = values
|
178
178
|
s = FORMATS.take(v.length).zip(v).map { |f,d| f % d.abs }
|
data/lib/edtf/interval.rb
CHANGED
@@ -211,9 +211,9 @@ module EDTF
|
|
211
211
|
# used to compare values (slower). Returns nil if the first date of the
|
212
212
|
# interval is larger than the last or if the interval has an unknown or
|
213
213
|
# open start.
|
214
|
-
def min
|
214
|
+
def min(&block)
|
215
215
|
if block_given?
|
216
|
-
to_a.min(&
|
216
|
+
to_a.min(&block)
|
217
217
|
else
|
218
218
|
case
|
219
219
|
when unknown_start?, !unknown_end? && !open? && to < from
|
@@ -244,9 +244,9 @@ module EDTF
|
|
244
244
|
# To calculate the dates, precision is taken into account. Thus, the max
|
245
245
|
# Date of "2007/2008" would be 2008-12-31, whilst the max Date of
|
246
246
|
# "2007-12/2008-10" would be 2009-10-31.
|
247
|
-
def max
|
247
|
+
def max(&block)
|
248
248
|
if block_given?
|
249
|
-
to_a.max(&
|
249
|
+
to_a.max(&block)
|
250
250
|
else
|
251
251
|
case
|
252
252
|
when open_end?, unknown_end?, !unknown_start? && to < from
|