edtf 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,22 +2,22 @@ module EDTF
2
2
 
3
3
  class Season
4
4
  extend Forwardable
5
-
5
+
6
6
  SEASONS = Hash[21, :spring, 22, :summer, 23, :autumn, 24, :winter].freeze
7
-
7
+
8
8
  CODES = Hash.new { |h,k| h.fetch(k.to_sym, nil) }.merge(
9
9
  SEASONS.invert).merge({ :fall => 23 }).freeze
10
-
10
+
11
11
  NORTHERN = Hash[:spring, [3,4,5], :summer, [6,7,8], :autumn, [9,10,11], :winter, [12,1,2]].freeze
12
12
  SOUTHERN = Hash[:autumn, [3,4,5], :winter, [6,7,8], :spring, [9,10,11], :summer, [12,1,2]].freeze
13
-
13
+
14
14
  NORTHERN_MONTHS = Hash[*NORTHERN.map { |s,ms| ms.map { |m| [m,s] } }.flatten].freeze
15
15
  SOUTHERN_MONTHS = Hash[*SOUTHERN.map { |s,ms| ms.map { |m| [m,s] } }.flatten].freeze
16
-
17
-
16
+
17
+
18
18
  include Comparable
19
19
  include Enumerable
20
-
20
+
21
21
  class << self
22
22
  def current
23
23
  Date.today.season
@@ -25,20 +25,21 @@ module EDTF
25
25
  end
26
26
 
27
27
  attr_reader :season, :year
28
-
28
+
29
29
  attr_accessor :qualifier, :uncertain, :approximate
30
-
31
- def_delegators :to_range,
32
- *Range.instance_methods(false).reject { |m| m.to_s =~ /^(each|min|max|cover?|inspect)$|^\W/ }
33
-
30
+
31
+ def_delegators :to_range, *Range.instance_methods(false).reject { |m|
32
+ m.to_s =~ /^(each|min|max|cover\?|inspect|to_s)$|^\W/
33
+ }
34
+
34
35
  SEASONS.each_value do |s|
35
36
  define_method("#{s}?") { @season == s }
36
37
  define_method("#{s}!") { @season = s }
37
38
  end
38
-
39
+
39
40
  alias fall? autumn?
40
41
  alias fall! autumn!
41
-
42
+
42
43
  [:first, :second, :third, :fourth].zip([:spring, :summer, :autumn, :winter]).each do |quarter, season|
43
44
  alias_method("#{quarter}?", "#{season}?")
44
45
  alias_method("#{quarter}!", "#{season}!")
@@ -48,7 +49,7 @@ module EDTF
48
49
  def initialize(*arguments)
49
50
  arguments.flatten!
50
51
  raise ArgumentError, "wrong number of arguments (#{arguments.length} for 0..3)" if arguments.length > 3
51
-
52
+
52
53
  if arguments.length == 1
53
54
  case arguments[0]
54
55
  when Date
@@ -67,45 +68,45 @@ module EDTF
67
68
  end
68
69
 
69
70
 
70
- [:uncertain, :approximate].each do |m|
71
-
72
- define_method("#{m}?") { !!send(m) }
73
-
74
- define_method("#{m}!") do
75
- send("#{m}=", true)
76
- self
77
- end
78
- end
79
-
80
- def certain?; !uncertain; end
81
- def precise?; !approximate; end
82
-
83
- def certain!
84
- @uncertain = false
85
- self
86
- end
87
-
88
- def precise!
89
- @approximate = false
90
- end
91
-
92
- # Returns the next season.
93
- def succ
94
- s = dup
95
- s.season = next_season_code
96
- s.year = year + 1 if s.first?
97
- s
98
- end
99
-
100
- # def next(n = 1)
101
- # end
102
-
103
- def cover?(other)
104
- return false unless other.respond_to?(:day_precision)
105
- other = other.day_precision
106
- min.day_precision! <= other && other <= max.day_precision!
107
- end
108
-
71
+ [:uncertain, :approximate].each do |m|
72
+
73
+ define_method("#{m}?") { !!send(m) }
74
+
75
+ define_method("#{m}!") do
76
+ send("#{m}=", true)
77
+ self
78
+ end
79
+ end
80
+
81
+ def certain?; !uncertain; end
82
+ def precise?; !approximate; end
83
+
84
+ def certain!
85
+ @uncertain = false
86
+ self
87
+ end
88
+
89
+ def precise!
90
+ @approximate = false
91
+ end
92
+
93
+ # Returns the next season.
94
+ def succ
95
+ s = dup
96
+ s.season = next_season_code
97
+ s.year = year + 1 if s.first?
98
+ s
99
+ end
100
+
101
+ # def next(n = 1)
102
+ # end
103
+
104
+ def cover?(other)
105
+ return false unless other.respond_to?(:day_precision)
106
+ other = other.day_precision
107
+ min.day_precision! <= other && other <= max.day_precision!
108
+ end
109
+
109
110
  def each
110
111
  if block_given?
111
112
  to_range.each(&Proc.new)
@@ -114,33 +115,33 @@ module EDTF
114
115
  to_enum
115
116
  end
116
117
  end
117
-
118
+
118
119
  def year=(new_year)
119
120
  @year = new_year.to_i
120
121
  end
121
-
122
+
122
123
  def season=(new_season)
123
124
  @season = SEASONS[new_season] || SEASONS[CODES[new_season]] ||
124
125
  raise(ArgumentError, "unknown season/format: #{new_season.inspect})")
125
126
  end
126
127
 
127
128
  def season?; true; end
128
-
129
+
129
130
  def qualified?; !!@qualifier; end
130
-
131
+
131
132
  def edtf
132
133
  '%04d-%2d%s' % [year, CODES[season], qualified? ? "^#{qualifier}" : '']
133
134
  end
134
135
 
135
136
  alias to_s edtf
136
137
 
137
-
138
+
138
139
  def <=>(other)
139
140
  case other
140
141
  when Date
141
142
  cover?(other) ? 0 : to_date <=> other
142
- when Interval, Epoch
143
- [min, max] <=> [other.min, other.max]
143
+ when Interval, Epoch
144
+ [min, max] <=> [other.min, other.max]
144
145
  when Season
145
146
  [year, month, qualifier] <=> [other.year, other.month, other.qualifier]
146
147
  else
@@ -149,42 +150,42 @@ module EDTF
149
150
  rescue
150
151
  nil
151
152
  end
152
-
153
+
153
154
  def ===(other)
154
155
  (self <=> other) == 0
155
156
  rescue
156
157
  false
157
158
  end
158
-
159
+
159
160
  def to_date
160
161
  Date.new(year, month, 1)
161
162
  end
162
163
 
163
- alias min to_date
164
-
165
- def max
166
- to_date.months_since(2).end_of_month
167
- end
168
-
164
+ alias min to_date
165
+
166
+ def max
167
+ to_date.months_since(2).end_of_month
168
+ end
169
+
169
170
  # Returns a Range that covers the season (a three month period).
170
171
  def to_range
171
- min .. max
172
+ min .. max
172
173
  end
173
-
174
+
174
175
  protected
175
-
176
+
176
177
  def month
177
178
  NORTHERN[@season][0]
178
179
  end
179
-
180
- def season_code
181
- CODES[season]
182
- end
183
-
184
- def next_season_code(by = 1)
185
- ((season_code + by) % 4) + 20
186
- end
187
-
180
+
181
+ def season_code
182
+ CODES[season]
183
+ end
184
+
185
+ def next_season_code(by = 1)
186
+ ((season_code + by) % 4) + 20
187
+ end
188
+
188
189
  end
189
-
190
- end
190
+
191
+ end
@@ -1,79 +1,81 @@
1
1
  module EDTF
2
-
3
- class Set
4
- extend Forwardable
5
-
6
- include Enumerable
7
- include Comparable
8
-
9
- def_delegators :@dates, :size, :length, :empty?
10
- def_delegators :to_a, :include?
11
-
12
- attr_accessor :choice, :later, :earlier
13
-
14
-
15
- def initialize(*dates)
16
- @dates = ::Set.new(dates.flatten)
17
- @choice, @later, @earlier = false, false, false
18
- end
19
-
20
- def initialize_copy(other)
21
- @set = other.to_set
22
- end
23
-
24
- [:choice, :later, :earlier].each do |m|
25
- define_method("#{m}?") { send(m) }
26
- define_method("#{m}!") do
27
- send("#{m}=", true)
28
- self
29
- end
30
- end
31
-
32
- def <<(date)
33
- dates << date
34
- self
35
- end
36
-
37
- def each
38
- if block_given?
39
- to_a.each(&Proc.new)
40
- self
41
- else
42
- to_enum
43
- end
44
- end
45
-
46
- def edtf
47
- parenthesize(dates.map { |d| d.respond_to?(:edtf) ? d.edtf : d.to_s }.sort.join(', '))
48
- end
49
-
50
- def to_a
51
- dates.map { |d| Array(d) }.flatten.sort
52
- end
53
-
54
- def to_set
55
- to_a.to_set
56
- end
57
-
58
- alias to_s edtf
59
-
60
- def <=>(other)
61
- return nil unless other.respond_to?(:to_a)
62
- to_a <=> other.to_a
63
- end
64
-
65
- private
66
-
67
- attr_reader :dates
68
-
69
- def parenthesize(string)
70
- p = choice? ? %w([ ]) : %w({ })
71
- p[-1,0] = '..' if earlier?
72
- p[-1,0] = string unless string.empty?
73
- p[-1,0] = '..' if later?
74
- p.join
75
- end
76
-
77
- end
78
-
79
- end
2
+
3
+ class Set
4
+ extend Forwardable
5
+
6
+ include Enumerable
7
+ include Comparable
8
+
9
+ def_delegators :@dates, :size, :length, :empty?
10
+ def_delegators :to_a, :include?
11
+
12
+ attr_accessor :choice, :later, :earlier
13
+
14
+
15
+ def initialize(*dates)
16
+ @dates = ::Set.new(dates.flatten)
17
+ @choice, @later, @earlier = false, false, false
18
+ end
19
+
20
+ def initialize_copy(other)
21
+ @set = other.to_set
22
+ end
23
+
24
+ [:choice, :later, :earlier].each do |m|
25
+ define_method("#{m}?") { send(m) }
26
+ define_method("#{m}!") do
27
+ send("#{m}=", true)
28
+ self
29
+ end
30
+ end
31
+
32
+ def <<(date)
33
+ dates << date
34
+ self
35
+ end
36
+
37
+ def each
38
+ if block_given?
39
+ to_a.each(&Proc.new)
40
+ self
41
+ else
42
+ to_enum
43
+ end
44
+ end
45
+
46
+ def edtf
47
+ parenthesize(dates.map { |d| d.respond_to?(:edtf) ? d.edtf : d.to_s }.sort.join(', '))
48
+ end
49
+
50
+ def to_a
51
+ dates.map { |d| Array(d) }.flatten.sort
52
+ end
53
+
54
+ def to_set
55
+ to_a.to_set
56
+ end
57
+
58
+ alias to_s edtf
59
+
60
+ def <=>(other)
61
+ return nil unless other.respond_to?(:to_a)
62
+ to_a <=> other.to_a
63
+ end
64
+
65
+ protected
66
+
67
+ attr_reader :dates
68
+
69
+ private
70
+
71
+ def parenthesize(string)
72
+ p = choice? ? %w([ ]) : %w({ })
73
+ p[-1,0] = '..' if earlier?
74
+ p[-1,0] = string unless string.empty?
75
+ p[-1,0] = '..' if later?
76
+ p.join
77
+ end
78
+
79
+ end
80
+
81
+ end
@@ -1,3 +1,3 @@
1
1
  module EDTF
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.1.0'.freeze
3
3
  end
@@ -1,3 +1,24 @@
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
+
1
22
  $LOAD_PATH << File.expand_path('../../lib', __FILE__)
2
23
 
3
24
  require 'edtf'
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: edtf
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvester Keil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-22 00:00:00.000000000 Z
11
+ date: 2014-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '3.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ~>
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '4.0'
32
+ version: '5.0'
27
33
  description: A Ruby implementation of the Extended Date/Time Format (EDTF).
28
34
  email:
29
35
  - http://sylvester.keil.or.at
@@ -33,10 +39,12 @@ extra_rdoc_files:
33
39
  - README.md
34
40
  - LICENSE
35
41
  files:
36
- - .autotest
37
- - .gitignore
38
- - .rspec
39
- - .travis.yml
42
+ - ".autotest"
43
+ - ".coveralls.yml"
44
+ - ".gitignore"
45
+ - ".rspec"
46
+ - ".simplecov"
47
+ - ".travis.yml"
40
48
  - Gemfile
41
49
  - LICENSE
42
50
  - README.md
@@ -62,6 +70,7 @@ files:
62
70
  - lib/edtf/epoch.rb
63
71
  - lib/edtf/extensions.rb
64
72
  - lib/edtf/interval.rb
73
+ - lib/edtf/parser.rb
65
74
  - lib/edtf/parser.y
66
75
  - lib/edtf/season.rb
67
76
  - lib/edtf/set.rb
@@ -75,35 +84,34 @@ files:
75
84
  - spec/edtf/set_spec.rb
76
85
  - spec/edtf/uncertainty_spec.rb
77
86
  - spec/spec_helper.rb
78
- - lib/edtf/parser.rb
79
87
  homepage: http://github.com/inukshuk/edtf-ruby
80
88
  licenses:
81
89
  - FreeBSD
82
90
  metadata: {}
83
91
  post_install_message:
84
92
  rdoc_options:
85
- - --line-numbers
86
- - --inline-source
87
- - --title
88
- - '"EDTF-Ruby"'
89
- - --main
93
+ - "--line-numbers"
94
+ - "--inline-source"
95
+ - "--title"
96
+ - "\"EDTF-Ruby\""
97
+ - "--main"
90
98
  - README.md
91
- - --webcvs=http://github.com/inukshuk/edtf-ruby/tree/master/
99
+ - "--webcvs=http://github.com/inukshuk/edtf-ruby/tree/master/"
92
100
  require_paths:
93
101
  - lib
94
102
  required_ruby_version: !ruby/object:Gem::Requirement
95
103
  requirements:
96
- - - '>='
104
+ - - ">="
97
105
  - !ruby/object:Gem::Version
98
106
  version: '0'
99
107
  required_rubygems_version: !ruby/object:Gem::Requirement
100
108
  requirements:
101
- - - '>='
109
+ - - ">="
102
110
  - !ruby/object:Gem::Version
103
111
  version: '0'
104
112
  requirements: []
105
113
  rubyforge_project:
106
- rubygems_version: 2.1.8
114
+ rubygems_version: 2.2.1
107
115
  signing_key:
108
116
  specification_version: 4
109
117
  summary: Extended Date/Time Format for Ruby.