edtf 1.0.0 → 2.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.
- checksums.yaml +7 -0
- data/.gitignore +3 -1
- data/.travis.yml +18 -0
- data/Gemfile +13 -3
- data/README.md +11 -10
- data/Rakefile +34 -3
- data/cucumber.yml +1 -0
- data/edtf.gemspec +3 -9
- data/features/parser/date_times.feature +7 -1
- data/lib/edtf/compatibility.rb +0 -2
- data/lib/edtf/date.rb +51 -45
- data/lib/edtf/season.rb +1 -1
- data/lib/edtf/set.rb +2 -2
- data/lib/edtf/version.rb +2 -2
- data/spec/edtf/interval_spec.rb +76 -80
- data/spec/edtf/season_spec.rb +59 -59
- metadata +14 -72
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e7e2bbb05637b4e710097d42429a9488e512a0da
|
4
|
+
data.tar.gz: 6d1035527b4f7395fe782551986a08d5ffd7b2d9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3fbc959b80bbc2b1215a8899f8713072f16700d75f210468ad30fb617f8f568ceec0d55e4dc92c21fa8d6604426b66d59af36faaed68db49d74bea134f2d5bef
|
7
|
+
data.tar.gz: b05c0b3be42feb8735b81a71d3839663ca6a9028c6a72457d68c8dfa95d80c24bfd1dd1545bed4dea5fdfcfc1681a1514aaa433fc281ce3bfb6312ed31fd121e
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
language: ruby
|
2
|
+
bundler_args: --without debug extra
|
3
|
+
rvm:
|
4
|
+
- 2.0.0
|
5
|
+
- 1.9.2
|
6
|
+
- 1.9.3
|
7
|
+
# - jruby-18mode
|
8
|
+
# - jruby-19mode
|
9
|
+
- rbx-18mode
|
10
|
+
- rbx-19mode
|
11
|
+
- 1.8.7
|
12
|
+
- ree
|
13
|
+
notifications:
|
14
|
+
email:
|
15
|
+
- sk@semicolon.at
|
16
|
+
- namyra@gmail.com
|
17
|
+
on_success: change
|
18
|
+
on_failure: always
|
data/Gemfile
CHANGED
@@ -1,10 +1,20 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
4
|
group :debug do
|
5
|
-
gem '
|
5
|
+
gem 'debugger', :platforms => [:mri_19, :mri_20]
|
6
6
|
gem 'ruby-debug', :platforms => [:mri_18, :jruby]
|
7
|
-
|
7
|
+
end
|
8
|
+
|
9
|
+
group :development do
|
10
|
+
gem 'rake'
|
11
|
+
gem 'racc'
|
12
|
+
gem 'cucumber'
|
13
|
+
gem 'rspec'
|
14
|
+
end
|
15
|
+
|
16
|
+
group :extra do
|
17
|
+
gem 'ZenTest'
|
8
18
|
end
|
9
19
|
|
10
20
|
# active_support requires this
|
data/README.md
CHANGED
@@ -12,16 +12,17 @@ EDTF-Ruby parser implements all levels and features of the EDTF specification
|
|
12
12
|
(version September 16, 2011). With the following known caveats:
|
13
13
|
|
14
14
|
* In the latest revision of the EDTF specification alternative versions of
|
15
|
-
partial uncertain/approximate strings were introduced (with or without
|
16
|
-
parentheses); EDTF-Ruby currently uses the version that tries to
|
17
|
-
parentheses for printing as we find that one easier to read; the
|
15
|
+
partial uncertain/approximate strings were introduced (with or without
|
16
|
+
nested parentheses); EDTF-Ruby currently uses the version that tries to
|
17
|
+
reduce parentheses for printing as we find that one easier to read; the
|
18
18
|
parser accepts all valid dates using this approach, plus some dates using
|
19
19
|
nested expressions (the parser will not accept some of the more complex
|
20
20
|
examples, though).
|
21
21
|
|
22
22
|
EDTF-Ruby has been confirmed to work on the following Ruby implementations:
|
23
|
-
1.9.3, 1.9.2, 1.8.7, Rubinius, and JRuby. Active Support's date
|
24
|
-
are currently listed as a dependency, because of many functional
|
23
|
+
2.0, 1.9.3, 1.9.2, 1.8.7, Rubinius, and JRuby. Active Support's date
|
24
|
+
extensions are currently listed as a dependency, because of many functional
|
25
|
+
overlaps.
|
25
26
|
|
26
27
|
|
27
28
|
Quickstart
|
@@ -37,7 +38,7 @@ given a valid EDTF string the return value will either be an (extended) `Date`,
|
|
37
38
|
Given any of these instances, you can print the corresponding EDTF string
|
38
39
|
using the `#edtf` method.
|
39
40
|
|
40
|
-
|
41
|
+
### Dates
|
41
42
|
|
42
43
|
Most of the EDTF features deal with dates; EDTF-Ruby implements these by
|
43
44
|
extending Active Support's version of the regular Ruby Date class. The library
|
@@ -155,7 +156,7 @@ When printing date strings, EDTF-Ruby will try to avoid nested parentheses:
|
|
155
156
|
=> "1999?-(02)?~-23?"
|
156
157
|
|
157
158
|
|
158
|
-
|
159
|
+
### Intervals
|
159
160
|
|
160
161
|
If you parse an EDTF interval, the EDTF-Ruby parser will return an instance
|
161
162
|
of `EDTF::Interval`; intervals mimic regular Ruby ranges, but offer additional
|
@@ -200,7 +201,7 @@ Intervals can be open or have unknown start or end dates.
|
|
200
201
|
> Date.edtf('2004/open').cover?(Date.today)
|
201
202
|
=> true
|
202
203
|
|
203
|
-
|
204
|
+
### Sets
|
204
205
|
|
205
206
|
EDTF supports two kind of sets: choice lists (meaning one date out of a list),
|
206
207
|
or inclusive lists. In EDTF-Ruby, these are covered by the class `EDTF::Set`
|
@@ -242,7 +243,7 @@ EDTF sets also feature an `#earlier?` and `#later?` attribute:
|
|
242
243
|
=> "[..1667, 1668, 1670..1672]"
|
243
244
|
|
244
245
|
|
245
|
-
|
246
|
+
### Decades and Centuries
|
246
247
|
|
247
248
|
The EDTF specification supports so called masked precision strings to define
|
248
249
|
decades or centuries. EDTF-Ruby maps these to dedicated intervals which
|
@@ -261,7 +262,7 @@ always cover 10 or 100 years, respectively.
|
|
261
262
|
> d.map(&:year)
|
262
263
|
=> [1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969]
|
263
264
|
|
264
|
-
|
265
|
+
### Seasons
|
265
266
|
|
266
267
|
Finally, EDTF covers seasons. Again, EDTF-Ruby provides a dedicated class
|
267
268
|
for this. Note that EDTF does not make any assumption about the specifics
|
data/Rakefile
CHANGED
@@ -1,9 +1,30 @@
|
|
1
|
-
lib = File.expand_path('../lib/', __FILE__)
|
2
|
-
$:.unshift lib unless $:.include?(lib)
|
3
1
|
|
4
|
-
require '
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
|
11
|
+
$:.unshift(File.join(File.dirname(__FILE__), './lib'))
|
5
12
|
require 'edtf/version'
|
6
13
|
|
14
|
+
require 'rake/clean'
|
15
|
+
|
16
|
+
task :default => [:racc, :spec, :cucumber]
|
17
|
+
|
18
|
+
desc 'Run an IRB session with CiteProc loaded'
|
19
|
+
task :console, [:script] do |t,args|
|
20
|
+
ARGV.clear
|
21
|
+
|
22
|
+
require 'irb'
|
23
|
+
require 'edtf'
|
24
|
+
|
25
|
+
IRB.conf[:SCRIPT] = args.script
|
26
|
+
IRB.start
|
27
|
+
end
|
7
28
|
|
8
29
|
desc 'Generates the parser'
|
9
30
|
task :racc do
|
@@ -15,6 +36,15 @@ task :racc_debug do
|
|
15
36
|
system 'bundle exec racc -v -t -o lib/edtf/parser.rb lib/edtf/parser.y'
|
16
37
|
end
|
17
38
|
|
39
|
+
require 'rspec/core'
|
40
|
+
require 'rspec/core/rake_task'
|
41
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
42
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
43
|
+
end
|
44
|
+
|
45
|
+
require 'cucumber/rake/task'
|
46
|
+
Cucumber::Rake::Task.new(:cucumber)
|
47
|
+
|
18
48
|
desc 'Builds the gem file'
|
19
49
|
task :build => [:racc] do
|
20
50
|
system 'gem build edtf.gemspec'
|
@@ -22,6 +52,7 @@ end
|
|
22
52
|
|
23
53
|
task :release => [:build] do
|
24
54
|
system "git tag #{EDTF::VERSION}"
|
55
|
+
system "git push --tags"
|
25
56
|
system "gem push edtf-#{EDTF::VERSION}.gem"
|
26
57
|
end
|
27
58
|
|
data/cucumber.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
default: --format progress --require features --color
|
data/edtf.gemspec
CHANGED
@@ -15,13 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.description = 'A Ruby implementation of the Extended Date/Time Format (EDTF).'
|
16
16
|
s.license = 'FreeBSD'
|
17
17
|
|
18
|
-
s.add_runtime_dependency('activesupport', ['~>
|
19
|
-
|
20
|
-
s.add_development_dependency('rake', ['~>0.9'])
|
21
|
-
s.add_development_dependency('racc', ['~>1.4'])
|
22
|
-
s.add_development_dependency('cucumber', ['~>1.0'])
|
23
|
-
s.add_development_dependency('rspec', ['~>2.6'])
|
24
|
-
s.add_development_dependency('ZenTest', ['~>4.6'])
|
18
|
+
s.add_runtime_dependency('activesupport', ['~>4.0'])
|
25
19
|
|
26
20
|
s.files = `git ls-files`.split("\n") << 'lib/edtf/parser.rb'
|
27
21
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -30,7 +24,7 @@ Gem::Specification.new do |s|
|
|
30
24
|
|
31
25
|
s.rdoc_options = %w{--line-numbers --inline-source --title "EDTF-Ruby" --main README.md --webcvs=http://github.com/inukshuk/edtf-ruby/tree/master/}
|
32
26
|
s.extra_rdoc_files = %w{README.md LICENSE}
|
33
|
-
|
27
|
+
|
34
28
|
end
|
35
29
|
|
36
|
-
# vim: syntax=ruby
|
30
|
+
# vim: syntax=ruby
|
@@ -32,4 +32,10 @@ Feature: EDTF parses date/time strings
|
|
32
32
|
| string | year | month | day | hours | minutes | seconds |
|
33
33
|
| 2004-01-01T10:10:10Z | 2004 | 1 | 1 | 10 | 10 | 10 |
|
34
34
|
| 2004-01-01T10:10:10+05:00 | 2004 | 1 | 1 | 5 | 10 | 10 |
|
35
|
-
| 2004-01-01T02:10:10+05:00 | 2003 | 12 | 31 | 21 | 10 | 10 |
|
35
|
+
| 2004-01-01T02:10:10+05:00 | 2003 | 12 | 31 | 21 | 10 | 10 |
|
36
|
+
|
37
|
+
# Scenarios: fractions
|
38
|
+
# | string | year | month | day | hours | minutes | seconds |
|
39
|
+
# | 2004-01-01T10 | 2004 | 1 | 1 | 10 | 0 | 0 |
|
40
|
+
# | 2004-01-01T10:10:10+05:00 | 2004 | 1 | 1 | 5 | 10 | 10 |
|
41
|
+
# | 2004-01-01T02:10:10+05:00 | 2003 | 12 | 31 | 21 | 10 | 10 |
|
data/lib/edtf/compatibility.rb
CHANGED
data/lib/edtf/date.rb
CHANGED
@@ -3,18 +3,18 @@ class Date
|
|
3
3
|
PRECISION = [:year, :month, :day].freeze
|
4
4
|
PRECISIONS = Hash[*PRECISION.map { |p| [p, "#{p}s".to_sym] }.flatten].freeze
|
5
5
|
|
6
|
-
|
6
|
+
FORMATS = %w{ %04d %02d %02d }.freeze
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
SYMBOLS = {
|
9
|
+
:uncertain => '?',
|
10
|
+
:approximate => '~',
|
11
|
+
:calendar => '^',
|
12
|
+
:unspecified => 'u'
|
13
|
+
}.freeze
|
14
|
+
|
15
15
|
EXTENDED_ATTRIBUTES = %w{ calendar precision uncertain approximate
|
16
16
|
unspecified }.map(&:to_sym).freeze
|
17
|
-
|
17
|
+
|
18
18
|
extend Forwardable
|
19
19
|
|
20
20
|
class << self
|
@@ -47,8 +47,8 @@ class Date
|
|
47
47
|
|
48
48
|
|
49
49
|
def initialize_copy(other)
|
50
|
-
|
51
|
-
|
50
|
+
super
|
51
|
+
copy_extended_attributes(other)
|
52
52
|
end
|
53
53
|
|
54
54
|
|
@@ -79,7 +79,7 @@ class Date
|
|
79
79
|
@precision ||= :day
|
80
80
|
end
|
81
81
|
|
82
|
-
|
82
|
+
# Sets this Date/Time's precision to the passed-in value.
|
83
83
|
def precision=(precision)
|
84
84
|
precision = precision.to_sym
|
85
85
|
raise ArgumentError, "invalid precision #{precision.inspect}" unless PRECISION.include?(precision)
|
@@ -157,7 +157,7 @@ class Date
|
|
157
157
|
def season?; false; end
|
158
158
|
|
159
159
|
# Returns true if the Date has an EDTF calendar string attached.
|
160
|
-
|
160
|
+
def calendar?; !!@calendar; end
|
161
161
|
|
162
162
|
# Converts the Date into a season.
|
163
163
|
def season
|
@@ -166,10 +166,10 @@ class Date
|
|
166
166
|
|
167
167
|
# Returns the Date's EDTF string.
|
168
168
|
def edtf
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
169
|
+
return "y#{year}" if long_year?
|
170
|
+
|
171
|
+
s = FORMATS.take(values.length).zip(values).map { |f,v| f % v }
|
172
|
+
s = unspecified.mask(s)
|
173
173
|
|
174
174
|
unless (h = ua_hash).zero?
|
175
175
|
#
|
@@ -217,24 +217,24 @@ class Date
|
|
217
217
|
end
|
218
218
|
|
219
219
|
s = s.join('-')
|
220
|
-
|
221
|
-
|
220
|
+
s << SYMBOLS[:calendar] << calendar if calendar?
|
221
|
+
s
|
222
222
|
end
|
223
223
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
224
|
+
alias to_edtf edtf
|
225
|
+
|
226
|
+
# Returns an array of the next n days, months, or years depending on the
|
227
|
+
# current Date/Time's precision.
|
228
228
|
def next(n = 1)
|
229
|
-
|
229
|
+
1.upto(n).map { |by| advance(PRECISIONS[precision] => by) }
|
230
230
|
end
|
231
231
|
|
232
|
-
|
233
|
-
|
234
|
-
|
232
|
+
def succ
|
233
|
+
advance(PRECISIONS[precision] => 1)
|
234
|
+
end
|
235
235
|
|
236
|
-
|
237
|
-
|
236
|
+
# Returns the Date of the previous day, month, or year depending on the
|
237
|
+
# current Date/Time's precision.
|
238
238
|
def prev(n = 1)
|
239
239
|
if n > 1
|
240
240
|
1.upto(n).map { |by| advance(PRECISIONS[precision] => -by) }
|
@@ -244,36 +244,42 @@ class Date
|
|
244
244
|
end
|
245
245
|
|
246
246
|
def <=>(other)
|
247
|
-
|
248
|
-
|
247
|
+
case other
|
248
|
+
when ::Date
|
249
|
+
values <=> other.values
|
250
|
+
when EDTF::Interval, EDTF::Season, EDTF::Epoch
|
251
|
+
other.cover?(self) ? other.min <=> self : 0
|
252
|
+
else
|
253
|
+
nil
|
254
|
+
end
|
249
255
|
end
|
250
256
|
|
251
257
|
|
252
|
-
|
253
|
-
|
258
|
+
# Returns an array of the current year, month, and day values filtered by
|
259
|
+
# the Date/Time's precision.
|
254
260
|
def values
|
255
261
|
precision_filter.map { |p| send(p) }
|
256
262
|
end
|
257
263
|
|
258
264
|
# Returns the same date but with negated year.
|
259
265
|
def negate
|
260
|
-
|
266
|
+
change(:year => year * -1)
|
261
267
|
end
|
262
268
|
|
263
269
|
alias -@ negate
|
264
270
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
+
# Returns true if this Date/Time has year precision and the year exceeds four digits.
|
272
|
+
def long_year?
|
273
|
+
year_precision? && year.abs > 9999
|
274
|
+
end
|
275
|
+
|
276
|
+
|
271
277
|
private
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
278
|
+
|
279
|
+
def ua_hash
|
280
|
+
uncertain.hash + approximate.hash
|
281
|
+
end
|
282
|
+
|
277
283
|
def precision_filter
|
278
284
|
@precision_filter ||= update_precision_filter
|
279
285
|
end
|
data/lib/edtf/season.rb
CHANGED
@@ -39,7 +39,7 @@ module EDTF
|
|
39
39
|
alias fall? autumn?
|
40
40
|
alias fall! autumn!
|
41
41
|
|
42
|
-
[:first, :second, :third, :fourth].zip(
|
42
|
+
[:first, :second, :third, :fourth].zip([:spring, :summer, :autumn, :winter]).each do |quarter, season|
|
43
43
|
alias_method("#{quarter}?", "#{season}?")
|
44
44
|
alias_method("#{quarter}!", "#{season}!")
|
45
45
|
end
|
data/lib/edtf/set.rb
CHANGED
@@ -44,11 +44,11 @@ module EDTF
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def edtf
|
47
|
-
parenthesize(dates.map { |d| d.respond_to?(:edtf) ? d.edtf : d.to_s }.join(', '))
|
47
|
+
parenthesize(dates.map { |d| d.respond_to?(:edtf) ? d.edtf : d.to_s }.sort.join(', '))
|
48
48
|
end
|
49
49
|
|
50
50
|
def to_a
|
51
|
-
dates.map { |d| Array(d) }.flatten
|
51
|
+
dates.map { |d| Array(d) }.flatten.sort
|
52
52
|
end
|
53
53
|
|
54
54
|
def to_set
|
data/lib/edtf/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module EDTF
|
2
|
-
VERSION = '
|
3
|
-
end
|
2
|
+
VERSION = '2.0.0'.freeze
|
3
|
+
end
|
data/spec/edtf/interval_spec.rb
CHANGED
@@ -1,72 +1,71 @@
|
|
1
1
|
module EDTF
|
2
2
|
describe 'Interval' do
|
3
|
-
|
3
|
+
|
4
4
|
describe 'the interval 2008/2011' do
|
5
5
|
let(:interval) { Date.edtf('2008/2011') }
|
6
6
|
|
7
|
-
it { interval.should_not be_open }
|
7
|
+
it { interval.should_not be_open }
|
8
8
|
it { interval.should_not be_open_end }
|
9
9
|
it { interval.should_not be_unknown_start }
|
10
10
|
it { interval.should_not be_unknown_end }
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
11
|
+
|
12
|
+
it 'has a length of 4' do
|
13
|
+
interval.to_a.length.should == 4
|
14
|
+
end
|
15
|
+
|
16
|
+
it '#step(2) yields the years 2008 and 2010' do
|
17
|
+
interval.step(2).map(&:year).should == [2008,2010]
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'the max date is 2011-12-31' do
|
21
|
+
interval.max.to_s.should == '2011-12-31'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'the max date has year precision' do
|
25
|
+
interval.max.should be_year_precision
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'the min date is 2008-01-01' do
|
29
|
+
interval.min.to_s.should == '2008-01-01'
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'the min date has year precision' do
|
33
|
+
interval.min.should be_year_precision
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
37
|
it 'includes the years 2008, 2009, 2010 and 2011' do
|
38
38
|
interval.to_a.map(&:year).should == [2008, 2009, 2010, 2011]
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
it 'does not include christmas day 2009' do
|
42
42
|
interval.should_not be_include(Date.new(2009,12,24))
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
it 'christmas day 2009 is less than max' do
|
46
|
+
Date.new(2009,12,24).should < interval.max
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'christmas day 2009 is greater than min' do
|
50
|
+
Date.new(2009,12,24).should > interval.min
|
51
|
+
end
|
48
52
|
|
49
|
-
it 'christmas day 2009 is greater than min' do
|
50
|
-
Date.new(2009,12,24).should > interval.min
|
51
|
-
end
|
52
|
-
|
53
53
|
it 'covers christmas day 2009' do
|
54
54
|
interval.should be_cover(Date.new(2009,12,24))
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it 'covers 2011-12-31' do
|
58
58
|
interval.should be_cover(Date.new(2011,12,31))
|
59
59
|
end
|
60
|
-
|
61
60
|
end
|
62
61
|
|
63
62
|
describe 'the interval 2008-08-23/2011-07-01' do
|
64
63
|
let(:interval) { Date.edtf('2008-08-23/2011-07-01') }
|
65
|
-
|
64
|
+
|
66
65
|
it 'includes christmas day 2009' do
|
67
66
|
interval.should be_include(Date.new(2009,12,24))
|
68
67
|
end
|
69
|
-
|
68
|
+
|
70
69
|
it 'covers christmas day 2009' do
|
71
70
|
interval.should be_cover(Date.new(2009,12,24))
|
72
71
|
end
|
@@ -79,24 +78,24 @@ module EDTF
|
|
79
78
|
describe 'the interval 2008-08-23/open' do
|
80
79
|
let(:interval) { Date.edtf('2008-08-23/open') }
|
81
80
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
81
|
+
it { interval.should be_open }
|
82
|
+
it { interval.should be_open_end }
|
83
|
+
it { interval.should_not be_unknown }
|
84
|
+
it { interval.should_not be_unknown_start }
|
85
|
+
it { interval.should_not be_unknown_end }
|
86
|
+
|
87
|
+
it 'the min date is 2008-08-23' do
|
88
|
+
interval.min.should == Date.new(2008,8,23)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'the max date is nil' do
|
92
|
+
interval.max.should be nil
|
93
|
+
end
|
94
|
+
|
96
95
|
it 'includes christmas day 2009' do
|
97
96
|
interval.should be_include(Date.new(2009,12,24))
|
98
97
|
end
|
99
|
-
|
98
|
+
|
100
99
|
it 'covers christmas day 2009' do
|
101
100
|
interval.should be_cover(Date.new(2009,12,24))
|
102
101
|
end
|
@@ -104,37 +103,34 @@ module EDTF
|
|
104
103
|
it 'covers 2023-07-02' do
|
105
104
|
interval.should be_cover(Date.new(2023,07,02))
|
106
105
|
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
describe 'comparisions' do
|
111
|
-
|
112
|
-
it '2007/2009 should be greater than 2001/2002' do
|
113
|
-
Date.edtf('2007/2009').should > Date.edtf('2001/2002')
|
114
|
-
end
|
115
106
|
|
116
|
-
|
117
|
-
Date.edtf('2007/2009').should < Date.edtf('2011/2012')
|
118
|
-
end
|
107
|
+
end
|
119
108
|
|
120
|
-
|
121
|
-
|
122
|
-
|
109
|
+
describe 'comparisions' do
|
110
|
+
it '2007/2009 should be greater than 2001/2002' do
|
111
|
+
Date.edtf('2007/2009').should > Date.edtf('2001/2002')
|
112
|
+
end
|
113
|
+
|
114
|
+
it '2007/2009 should be less than 2011/2012' do
|
115
|
+
Date.edtf('2007/2009').should < Date.edtf('2011/2012')
|
116
|
+
end
|
123
117
|
|
124
|
-
|
125
|
-
|
126
|
-
|
118
|
+
it '2007/2009 should be less than 2008/2009' do
|
119
|
+
Date.edtf('2007/2009').should < Date.edtf('2008/2009')
|
120
|
+
end
|
127
121
|
|
128
|
-
|
129
|
-
|
130
|
-
|
122
|
+
it '2007/2009 should be greater than 2007/2008' do
|
123
|
+
Date.edtf('2007/2009').should > Date.edtf('2007/2008')
|
124
|
+
end
|
131
125
|
|
132
|
-
|
133
|
-
|
134
|
-
|
126
|
+
it '2007/2009 should be greater than 2006/2007' do
|
127
|
+
Date.edtf('2007/2009').should > Date.edtf('2006/2007')
|
128
|
+
end
|
135
129
|
|
130
|
+
it '2007/2009 should be equal to 2007/2009' do
|
131
|
+
Date.edtf('2007/2009').should == Date.edtf('2007/2009')
|
132
|
+
end
|
133
|
+
end
|
136
134
|
|
137
|
-
|
138
|
-
end
|
139
135
|
end
|
140
136
|
end
|
data/spec/edtf/season_spec.rb
CHANGED
@@ -1,56 +1,56 @@
|
|
1
1
|
module EDTF
|
2
2
|
describe 'Seasons' do
|
3
3
|
let(:subject) { Season.new }
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
4
|
+
let(:summer) { Season.new(:summer) }
|
5
|
+
let(:winter) { Season.new(:winter) }
|
6
|
+
|
7
|
+
|
8
|
+
describe 'uncertain/approximate' do
|
9
|
+
|
10
|
+
it 'is certain by default' do
|
11
|
+
subject.should be_certain
|
12
|
+
subject.should_not be_uncertain
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'is precise by default' do
|
16
|
+
subject.should be_precise
|
17
|
+
subject.should_not be_approximate
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#approximate!' do
|
21
|
+
it 'makes the season approximate' do
|
22
|
+
subject.approximate!.should be_approximate
|
23
|
+
subject.approximate!.should_not be_precise
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#uncertain!' do
|
28
|
+
it 'makes the season uncertain' do
|
29
|
+
subject.uncertain!.should be_uncertain
|
30
|
+
subject.uncertain!.should_not be_certain
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#succ' do
|
37
|
+
|
38
|
+
it 'returns a season' do
|
39
|
+
summer.succ.should be_instance_of(Season)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'it returns a season that is greater than the original one' do
|
43
|
+
summer.succ.should > summer
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'the successor of the winter season is spring of the following year' do
|
47
|
+
spring = winter.succ
|
48
|
+
spring.should be_spring
|
49
|
+
spring.year.should == winter.year + 1
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
54
|
describe '#season?' do
|
55
55
|
it 'returns true by default' do
|
56
56
|
subject.should be_season
|
@@ -59,12 +59,12 @@ module EDTF
|
|
59
59
|
|
60
60
|
describe '#season' do
|
61
61
|
before(:each) { subject.season = :summer }
|
62
|
-
|
62
|
+
|
63
63
|
it 'returns the season code' do
|
64
64
|
subject.season.should == :summer
|
65
65
|
end
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
describe '#season=' do
|
69
69
|
it 'sets the season code when called with a valid season code' do
|
70
70
|
lambda {
|
@@ -73,15 +73,15 @@ module EDTF
|
|
73
73
|
end
|
74
74
|
}.should_not raise_error
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it 'throws an exception if given invalid season code' do
|
78
78
|
lambda { subject.season = 13 }.should raise_error
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
-
describe '#
|
83
|
-
it 'sets the season to :
|
84
|
-
lambda { subject.
|
82
|
+
describe '#summer!' do
|
83
|
+
it 'sets the season to :summer' do
|
84
|
+
lambda { subject.summer! }.should change { subject.season }.to(:summer)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -97,14 +97,14 @@ module EDTF
|
|
97
97
|
end
|
98
98
|
|
99
99
|
describe '#include?' do
|
100
|
-
|
100
|
+
|
101
101
|
context 'for summer' do
|
102
102
|
it 'returns true for August 24' do
|
103
103
|
Season.new(1980, :summer).should include(Date.new(1980,8,24))
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
end
|
110
110
|
end
|
metadata
CHANGED
@@ -1,82 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: edtf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sylvester Keil
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-12-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
19
|
+
version: '4.0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: rake
|
27
|
-
requirement: &70108307716720 !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
|
-
requirements:
|
30
|
-
- - ~>
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '0.9'
|
33
|
-
type: :development
|
34
|
-
prerelease: false
|
35
|
-
version_requirements: *70108307716720
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: racc
|
38
|
-
requirement: &70108307715280 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
|
-
requirements:
|
41
|
-
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '1.4'
|
44
|
-
type: :development
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: *70108307715280
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: cucumber
|
49
|
-
requirement: &70108307714220 !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
23
|
requirements:
|
52
24
|
- - ~>
|
53
25
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
-
type: :development
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *70108307714220
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: rspec
|
60
|
-
requirement: &70108307713500 !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
|
-
requirements:
|
63
|
-
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: '2.6'
|
66
|
-
type: :development
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: *70108307713500
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: ZenTest
|
71
|
-
requirement: &70108307712900 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
|
-
requirements:
|
74
|
-
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '4.6'
|
77
|
-
type: :development
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: *70108307712900
|
26
|
+
version: '4.0'
|
80
27
|
description: A Ruby implementation of the Extended Date/Time Format (EDTF).
|
81
28
|
email:
|
82
29
|
- http://sylvester.keil.or.at
|
@@ -89,10 +36,12 @@ files:
|
|
89
36
|
- .autotest
|
90
37
|
- .gitignore
|
91
38
|
- .rspec
|
39
|
+
- .travis.yml
|
92
40
|
- Gemfile
|
93
41
|
- LICENSE
|
94
42
|
- README.md
|
95
43
|
- Rakefile
|
44
|
+
- cucumber.yml
|
96
45
|
- edtf.gemspec
|
97
46
|
- features/parser/date_times.feature
|
98
47
|
- features/parser/dates.feature
|
@@ -130,40 +79,33 @@ files:
|
|
130
79
|
homepage: http://github.com/inukshuk/edtf-ruby
|
131
80
|
licenses:
|
132
81
|
- FreeBSD
|
82
|
+
metadata: {}
|
133
83
|
post_install_message:
|
134
84
|
rdoc_options:
|
135
85
|
- --line-numbers
|
136
86
|
- --inline-source
|
137
87
|
- --title
|
138
|
-
-
|
88
|
+
- '"EDTF-Ruby"'
|
139
89
|
- --main
|
140
90
|
- README.md
|
141
91
|
- --webcvs=http://github.com/inukshuk/edtf-ruby/tree/master/
|
142
92
|
require_paths:
|
143
93
|
- lib
|
144
94
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
95
|
requirements:
|
147
|
-
- -
|
96
|
+
- - '>='
|
148
97
|
- !ruby/object:Gem::Version
|
149
98
|
version: '0'
|
150
|
-
segments:
|
151
|
-
- 0
|
152
|
-
hash: -2732104332429493129
|
153
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
100
|
requirements:
|
156
|
-
- -
|
101
|
+
- - '>='
|
157
102
|
- !ruby/object:Gem::Version
|
158
103
|
version: '0'
|
159
|
-
segments:
|
160
|
-
- 0
|
161
|
-
hash: -2732104332429493129
|
162
104
|
requirements: []
|
163
105
|
rubyforge_project:
|
164
|
-
rubygems_version: 1.8
|
106
|
+
rubygems_version: 2.1.8
|
165
107
|
signing_key:
|
166
|
-
specification_version:
|
108
|
+
specification_version: 4
|
167
109
|
summary: Extended Date/Time Format for Ruby.
|
168
110
|
test_files:
|
169
111
|
- features/parser/date_times.feature
|