edtf 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7e2bbb05637b4e710097d42429a9488e512a0da
4
- data.tar.gz: 6d1035527b4f7395fe782551986a08d5ffd7b2d9
3
+ metadata.gz: 68aac723f31efd30a29639ccddba4f552d32f3e2
4
+ data.tar.gz: 0997aa8f2861ababa527f1f39b0811ef2db055c9
5
5
  SHA512:
6
- metadata.gz: 3fbc959b80bbc2b1215a8899f8713072f16700d75f210468ad30fb617f8f568ceec0d55e4dc92c21fa8d6604426b66d59af36faaed68db49d74bea134f2d5bef
7
- data.tar.gz: b05c0b3be42feb8735b81a71d3839663ca6a9028c6a72457d68c8dfa95d80c24bfd1dd1545bed4dea5fdfcfc1681a1514aaa433fc281ce3bfb6312ed31fd121e
6
+ metadata.gz: fae111479f8b85e8d308e0075e62a713be2d651ad402c7867183fadb5d929541333d78baad12712b6a244b5dc890557bd9b331188656989508d657117401e9d8
7
+ data.tar.gz: 5d3ad065005556811991a501b1ad5f1a73210b0fa5c6e5bd88e4808145d24a5135d48f8bcd7b0d8c0de97634ac61a8e578bd830ffd4e2285f2a0e8874934b2d6
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore CHANGED
@@ -1,7 +1,8 @@
1
1
  Gemfile.lock
2
- lib/edtf/parser.rb
3
2
  lib/edtf/parser.output
4
3
  *.rbc
5
4
  .rbx
6
5
  .ruby-version
7
6
  *.swp
7
+ .bundle
8
+ coverage
@@ -0,0 +1,4 @@
1
+ SimpleCov.start do
2
+ add_filter 'spec/'
3
+ add_filter 'features/'
4
+ end
@@ -1,15 +1,12 @@
1
1
  language: ruby
2
2
  bundler_args: --without debug extra
3
+ script: bundle exec rake test_with_coveralls
3
4
  rvm:
4
5
  - 2.0.0
5
- - 1.9.2
6
6
  - 1.9.3
7
- # - jruby-18mode
8
- # - jruby-19mode
9
- - rbx-18mode
10
- - rbx-19mode
11
- - 1.8.7
12
- - ree
7
+ - jruby-19mode
8
+ - rbx-2.1.1
9
+ - rbx
13
10
  notifications:
14
11
  email:
15
12
  - sk@semicolon.at
data/Gemfile CHANGED
@@ -2,15 +2,20 @@ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  group :debug do
5
- gem 'debugger', :platforms => [:mri_19, :mri_20]
6
- gem 'ruby-debug', :platforms => [:mri_18, :jruby]
5
+ gem 'ruby-debug', :require => false, :platform => :jruby
6
+ gem 'debugger', ['~>1.6', '>=1.6.5'], :require => false, :platform => :mri
7
+ gem 'rubinius-compiler', '~>2.0', :require => false, :platform => :rbx
8
+ gem 'rubinius-debugger', '~>2.0', :require => false, :platform => :rbx
7
9
  end
8
10
 
9
11
  group :development do
10
12
  gem 'rake'
11
- gem 'racc'
13
+ gem 'racc', :platform => :ruby
12
14
  gem 'cucumber'
13
15
  gem 'rspec'
16
+ gem 'simplecov', '~>0.8', :require => false
17
+ gem 'rubinius-coverage', :platform => :rbx
18
+ gem 'coveralls', :require => false
14
19
  end
15
20
 
16
21
  group :extra do
@@ -18,4 +23,9 @@ group :extra do
18
23
  end
19
24
 
20
25
  # active_support requires this
21
- gem 'i18n'
26
+ gem 'i18n'
27
+
28
+ platform :rbx do
29
+ gem 'rubysl', '~>2.0'
30
+ gem 'json'
31
+ end
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  EDTF-Ruby
2
2
  =========
3
+ [![Build Status](https://travis-ci.org/inukshuk/edtf-ruby.png?branch=master)](https://travis-ci.org/inukshuk/edtf-ruby)
4
+ [![Coverage Status](https://coveralls.io/repos/inukshuk/edtf-ruby/badge.png)](https://coveralls.io/r/inukshuk/edtf-ruby)
3
5
 
4
6
  EDTF-Ruby comprises a parser and an API implementation of the [Extended
5
7
  Date/Time Format standard](http://www.loc.gov/standards/datetime/spec.html).
@@ -7,7 +9,6 @@ Date/Time Format standard](http://www.loc.gov/standards/datetime/spec.html).
7
9
 
8
10
  Compatibility
9
11
  -------------
10
-
11
12
  EDTF-Ruby parser implements all levels and features of the EDTF specification
12
13
  (version September 16, 2011). With the following known caveats:
13
14
 
@@ -20,14 +21,14 @@ EDTF-Ruby parser implements all levels and features of the EDTF specification
20
21
  examples, though).
21
22
 
22
23
  EDTF-Ruby has been confirmed to work on the following Ruby implementations:
23
- 2.0, 1.9.3, 1.9.2, 1.8.7, Rubinius, and JRuby. Active Support's date
24
+ 2.1, 2.0, 1.9.3, Rubinius, and JRuby (1.8.7 and 1.9.2 were originally
25
+ we are not testing compatibility actively anymore). Active Support's date
24
26
  extensions are currently listed as a dependency, because of many functional
25
- overlaps.
27
+ overlaps (version 3.x and 4.x are supported).
26
28
 
27
29
 
28
30
  Quickstart
29
31
  ----------
30
-
31
32
  EDTF Ruby is implemented as an extension to the regular Ruby date/time classes.
32
33
  You can parse EDTF strings either using `Date.edtf` or `EDTF.parse`
33
34
  (both methods come with an alternative bang! version, that will raise an error
@@ -56,7 +57,7 @@ subtle difference that determines how many other methods work. For instance:
56
57
  => Fri, 11 Nov 2011
57
58
  > Date.today.month_precision!.succ
58
59
  => Sat, 10 Dec 2011
59
-
60
+
60
61
  As you can see, dates have day precision by default; after setting the date's
61
62
  precision to month, however, the natural successor is not the next day, but
62
63
  a day a month from now. Always keep precision in mind when comparing dates,
@@ -64,7 +65,7 @@ too:
64
65
 
65
66
  > Date.new(1666).year_precision! == Date.new(1966)
66
67
  => false
67
-
68
+
68
69
  The year 1666 is not equal to the January 1st, 1966. You can set a date's
69
70
  precision directly, or else use the dedicated bang! methods:
70
71
 
@@ -167,30 +168,30 @@ functionality.
167
168
  => true
168
169
  > d.include?(Date.new(1987,04,13))
169
170
  => false
170
-
171
+
171
172
  The day is not included because interval has month precision. However:
172
173
 
173
174
  > d.cover?(Date.new(1987,04,13))
174
175
  => true
175
-
176
+
176
177
  The day is still covered by the interval. In general, optimized in the
177
178
  same way that Ruby optimizes numeric ranges. Additionally, precision
178
179
  plays into the way intervals are enumerated:
179
180
 
180
181
  > d.length
181
182
  => 243
182
-
183
+
183
184
  There are 243 months between 1984-06-01 and 2004-08-31.
184
185
 
185
186
  > d.step(36).map(&:year)
186
187
  => [1984, 1987, 1990, 1993, 1996, 1999, 2002]
187
-
188
+
188
189
  Here we iterate through the interval in 36-month steps and map each date to
189
190
  the year.
190
191
 
191
192
  > Date.edtf('1582-10-01/1582-10-31').length
192
193
  => 21
193
-
194
+
194
195
  This interval has day precision, so 21 is the number of days in October 1582,
195
196
  which was cut short because of the Gregorian calendar reform.
196
197
 
@@ -200,7 +201,7 @@ Intervals can be open or have unknown start or end dates.
200
201
  => true
201
202
  > Date.edtf('2004/open').cover?(Date.today)
202
203
  => true
203
-
204
+
204
205
  ### Sets
205
206
 
206
207
  EDTF supports two kind of sets: choice lists (meaning one date out of a list),
@@ -213,7 +214,7 @@ and the `choice` attribute.
213
214
  > s.choice!
214
215
  > s.edtf
215
216
  => "[1667, 1668, 1670..1672]"
216
-
217
+
217
218
  As you can see above, EDTF-Ruby remembers which parts of the set were
218
219
  specified as a range; ranges are however enumerated for membership tests:
219
220
 
@@ -221,19 +222,19 @@ specified as a range; ranges are however enumerated for membership tests:
221
222
  => false
222
223
  > s.include?(Date.edtf('1671'))
223
224
  => true
224
-
225
+
225
226
  Even though we're still aware that the year 1671 was is not directly an
226
227
  element of the set:
227
228
 
228
229
  > s.length
229
230
  => 3
230
-
231
+
231
232
  When in doubt, you can always map the set to an array. This will also
232
233
  enumerate all ranges:
233
234
 
234
235
  > s.map(&:year)
235
236
  => [1667, 1668, 1670, 1671, 1672] # when enumerated there are 5 elements
236
-
237
+
237
238
  EDTF sets also feature an `#earlier?` and `#later?` attribute:
238
239
 
239
240
  > s.earlier?
@@ -308,17 +309,15 @@ extensive list of rspec examples.
308
309
 
309
310
  Contributing
310
311
  ------------
311
-
312
312
  The EDTF-Ruby source code is [hosted on GitHub](https://github.com/inukshuk/edtf-ruby).
313
313
  You can check out a copy of the latest code using Git:
314
314
 
315
315
  $ git clone https://github.com/inukshuk/edtf-ruby.git
316
-
316
+
317
317
  To get started, generate the parser and run all tests:
318
318
 
319
319
  $ cd edtf-ruby
320
320
  $ bundle install
321
- $ bundle exec rake racc_debug
322
321
  $ bundle exec rspec spec
323
322
  $ bundle exec cucumber
324
323
 
@@ -330,7 +329,6 @@ and submit a pull request.
330
329
 
331
330
  Credits
332
331
  -------
333
-
334
332
  EDTF-Ruby was written by [Sylvester Keil](http://sylvester.keil.or.at) and
335
333
  [Namyra](https://github.com/namyra).
336
334
 
data/Rakefile CHANGED
@@ -13,7 +13,7 @@ require 'edtf/version'
13
13
 
14
14
  require 'rake/clean'
15
15
 
16
- task :default => [:racc, :spec, :cucumber]
16
+ task :default => [:spec, :cucumber]
17
17
 
18
18
  desc 'Run an IRB session with CiteProc loaded'
19
19
  task :console, [:script] do |t,args|
@@ -21,7 +21,7 @@ task :console, [:script] do |t,args|
21
21
 
22
22
  require 'irb'
23
23
  require 'edtf'
24
-
24
+
25
25
  IRB.conf[:SCRIPT] = args.script
26
26
  IRB.start
27
27
  end
@@ -46,11 +46,21 @@ require 'cucumber/rake/task'
46
46
  Cucumber::Rake::Task.new(:cucumber)
47
47
 
48
48
  desc 'Builds the gem file'
49
- task :build => [:racc] do
49
+ task :build => [:check_warnings] do
50
50
  system 'gem build edtf.gemspec'
51
51
  end
52
52
 
53
- task :release => [:build] do
53
+ require 'coveralls/rake/task'
54
+ Coveralls::RakeTask.new
55
+ task :test_with_coveralls => [:spec, :cucumber, 'coveralls:push']
56
+
57
+ task :check_warnings do
58
+ $VERBOSE = true
59
+ require 'edtf'
60
+ puts EDTF::VERSION
61
+ end
62
+
63
+ task :release => [ :build] do
54
64
  system "git tag #{EDTF::VERSION}"
55
65
  system "git push --tags"
56
66
  system "gem push edtf-#{EDTF::VERSION}.gem"
@@ -15,7 +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', ['~>4.0'])
18
+ s.add_runtime_dependency('activesupport', '>= 3.0', '< 5.0')
19
19
 
20
20
  s.files = `git ls-files`.split("\n") << 'lib/edtf/parser.rb'
21
21
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -1 +1,22 @@
1
- require 'edtf'
1
+ begin
2
+ require 'simplecov'
3
+ require 'coveralls' if ENV['CI']
4
+ rescue LoadError
5
+ # ignore
6
+ end
7
+
8
+ begin
9
+ case
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 'debugger'
17
+ end
18
+ rescue LoadError
19
+ # ignore
20
+ end
21
+
22
+ require 'edtf'
@@ -1,8 +1,8 @@
1
1
  class Date
2
-
2
+
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
8
  SYMBOLS = {
@@ -11,47 +11,50 @@ class Date
11
11
  :calendar => '^',
12
12
  :unspecified => 'u'
13
13
  }.freeze
14
-
15
- EXTENDED_ATTRIBUTES = %w{ calendar precision uncertain approximate
16
- unspecified }.map(&:to_sym).freeze
17
-
18
- extend Forwardable
19
-
14
+
15
+ EXTENDED_ATTRIBUTES = %w{
16
+ calendar precision uncertain approximate unspecified
17
+ }.map(&:to_sym).freeze
18
+
19
+ extend Forwardable
20
+
20
21
  class << self
21
-
22
+
22
23
  def edtf(input, options = {})
23
24
  edtf!(input, options)
24
25
  rescue
25
26
  nil
26
27
  end
27
-
28
+
28
29
  def edtf!(input, options = {})
29
30
  ::EDTF::Parser.new(options).parse!(input)
30
31
  end
31
32
  end
32
-
33
+
33
34
  attr_accessor :calendar
34
-
35
+
35
36
  PRECISION.each do |p|
36
37
  define_method("#{p}_precision?") { precision == p }
37
-
38
+
38
39
  define_method("#{p}_precision!") do
39
40
  self.precision = p
40
41
  self
41
42
  end
42
-
43
+
43
44
  define_method("#{p}_precision") do
44
45
  change(:precision => p)
45
46
  end
46
47
  end
47
-
48
-
48
+
49
+
50
+ alias original_initialize_copy initialize_copy
51
+
49
52
  def initialize_copy(other)
50
- super
53
+ original_initialize_copy(other)
51
54
  copy_extended_attributes(other)
52
55
  end
53
-
54
-
56
+
57
+
55
58
  # Alias advance method from Active Support.
56
59
  alias original_advance advance
57
60
 
@@ -63,7 +66,7 @@ class Date
63
66
 
64
67
  # Alias change method from Active Support.
65
68
  alias original_change change
66
-
69
+
67
70
  # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
68
71
  def change(options)
69
72
  d = original_change(options)
@@ -72,13 +75,13 @@ class Date
72
75
  end
73
76
  d
74
77
  end
75
-
76
-
78
+
79
+
77
80
  # Returns this Date's precision.
78
81
  def precision
79
82
  @precision ||= :day
80
83
  end
81
-
84
+
82
85
  # Sets this Date/Time's precision to the passed-in value.
83
86
  def precision=(precision)
84
87
  precision = precision.to_sym
@@ -86,7 +89,7 @@ class Date
86
89
  @precision = precision
87
90
  update_precision_filter[-1]
88
91
  end
89
-
92
+
90
93
  def uncertain
91
94
  @uncertain ||= EDTF::Uncertainty.new
92
95
  end
@@ -98,14 +101,14 @@ class Date
98
101
  def unspecified
99
102
  @unspecified ||= EDTF::Unspecified.new
100
103
  end
101
-
104
+
102
105
  def_delegators :uncertain, :uncertain?, :certain?
103
106
 
104
107
  def certain!(arguments = precision_filter)
105
108
  uncertain.certain!(arguments)
106
109
  self
107
110
  end
108
-
111
+
109
112
  def uncertain!(arguments = precision_filter)
110
113
  uncertain.uncertain!(arguments)
111
114
  self
@@ -114,20 +117,20 @@ class Date
114
117
  def approximate?(arguments = precision_filter)
115
118
  approximate.uncertain?(arguments)
116
119
  end
117
-
120
+
118
121
  alias approximately? approximate?
119
-
122
+
120
123
  def approximate!(arguments = precision_filter)
121
124
  approximate.uncertain!(arguments)
122
125
  self
123
126
  end
124
-
127
+
125
128
  alias approximately! approximate!
126
-
129
+
127
130
  def precise?(arguments = precision_filter)
128
131
  !approximate?(arguments)
129
132
  end
130
-
133
+
131
134
  alias precisely? precise?
132
135
 
133
136
  def precise!(arguments = precision_filter)
@@ -136,9 +139,9 @@ class Date
136
139
  end
137
140
 
138
141
  alias precisely! precise!
139
-
142
+
140
143
  def_delegators :unspecified, :unspecified?, :specified?, :unspecific?, :specific?
141
-
144
+
142
145
  def unspecified!(arguments = precision_filter)
143
146
  unspecified.unspecified!(arguments)
144
147
  self
@@ -152,10 +155,10 @@ class Date
152
155
  end
153
156
 
154
157
  alias specific! specified!
155
-
158
+
156
159
  # Returns false for Dates.
157
160
  def season?; false; end
158
-
161
+
159
162
  # Returns true if the Date has an EDTF calendar string attached.
160
163
  def calendar?; !!@calendar; end
161
164
 
@@ -163,11 +166,11 @@ class Date
163
166
  def season
164
167
  Season.new(self)
165
168
  end
166
-
169
+
167
170
  # Returns the Date's EDTF string.
168
171
  def edtf
169
172
  return "y#{year}" if long_year?
170
-
173
+
171
174
  s = FORMATS.take(values.length).zip(values).map { |f,v| f % v }
172
175
  s = unspecified.mask(s)
173
176
 
@@ -183,11 +186,11 @@ class Date
183
186
  # not covered by precision!
184
187
  #
185
188
  y, m, d = s
186
-
189
+
187
190
  # ?/~ if true-false or true-true and other false-true
188
191
  y << SYMBOLS[:uncertain] if 3&h==1 || 27&h==19
189
192
  y << SYMBOLS[:approximate] if 24&h==8 || 27&h==26
190
-
193
+
191
194
 
192
195
  # combine if false-true-true and other m == d
193
196
  if 7&h==6 && (48&h==48 || 48&h==0) || 56&h==48 && (6&h==6 || 6&h==0)
@@ -199,21 +202,21 @@ class Date
199
202
  when 3&h==2 || 24&h==16
200
203
  m[0,0] = '('
201
204
  m << ')'
202
-
205
+
203
206
  # *-false-true
204
207
  when 6&h==4 || 48&h==32
205
208
  d[0,0] = '('
206
209
  d << ')'
207
210
  end
208
-
209
- # ?/~ if *-true-false or *-true-true and other m != d
211
+
212
+ # ?/~ if *-true-false or *-true-true and other m != d
210
213
  m << SYMBOLS[:uncertain] if h!=31 && (6&h==2 || 6&h==6 && (48&h==16 || 48&h==32))
211
214
  m << SYMBOLS[:approximate] if h!=59 && (48&h==16 || 48&h==48 && (6&h==2 || 6&h==4))
212
215
  end
213
-
216
+
214
217
  # ?/~ if *-*-true
215
218
  d << SYMBOLS[:uncertain] if 4&h==4
216
- d << SYMBOLS[:approximate] if 32&h==32
219
+ d << SYMBOLS[:approximate] if 32&h==32
217
220
  end
218
221
 
219
222
  s = s.join('-')
@@ -222,13 +225,17 @@ class Date
222
225
  end
223
226
 
224
227
  alias to_edtf edtf
225
-
228
+
229
+ remove_method :next
230
+
226
231
  # Returns an array of the next n days, months, or years depending on the
227
232
  # current Date/Time's precision.
228
233
  def next(n = 1)
229
234
  1.upto(n).map { |by| advance(PRECISIONS[precision] => by) }
230
235
  end
231
236
 
237
+ remove_method :succ
238
+
232
239
  def succ
233
240
  advance(PRECISIONS[precision] => 1)
234
241
  end
@@ -242,7 +249,7 @@ class Date
242
249
  advance(PRECISIONS[precision] => -1)
243
250
  end
244
251
  end
245
-
252
+
246
253
  def <=>(other)
247
254
  case other
248
255
  when ::Date
@@ -254,36 +261,36 @@ class Date
254
261
  end
255
262
  end
256
263
 
257
-
264
+
258
265
  # Returns an array of the current year, month, and day values filtered by
259
266
  # the Date/Time's precision.
260
267
  def values
261
268
  precision_filter.map { |p| send(p) }
262
269
  end
263
-
270
+
264
271
  # Returns the same date but with negated year.
265
272
  def negate
266
273
  change(:year => year * -1)
267
274
  end
268
-
275
+
269
276
  alias -@ negate
270
-
277
+
271
278
  # Returns true if this Date/Time has year precision and the year exceeds four digits.
272
279
  def long_year?
273
280
  year_precision? && year.abs > 9999
274
281
  end
275
-
276
-
282
+
283
+
277
284
  private
278
-
285
+
279
286
  def ua_hash
280
287
  uncertain.hash + approximate.hash
281
288
  end
282
-
289
+
283
290
  def precision_filter
284
291
  @precision_filter ||= update_precision_filter
285
292
  end
286
-
293
+
287
294
  def update_precision_filter
288
295
  @precision_filter = case precision
289
296
  when :year
@@ -294,9 +301,9 @@ class Date
294
301
  [:year,:month,:day]
295
302
  end
296
303
  end
297
-
304
+
298
305
  protected
299
-
306
+
300
307
  attr_writer :uncertain, :unspecified, :approximate
301
308
 
302
309
  def copy_extended_attributes(other)
@@ -308,6 +315,6 @@ class Date
308
315
  @precision = other.precision
309
316
 
310
317
  self
311
- end
318
+ end
312
319
 
313
320
  end