lib/edtf/season.rb in edtf-2.0.0 vs lib/edtf/season.rb in edtf-2.1.0
- old
+ new
@@ -1,56 +1,57 @@
module EDTF
class Season
extend Forwardable
-
+
SEASONS = Hash[21, :spring, 22, :summer, 23, :autumn, 24, :winter].freeze
-
+
CODES = Hash.new { |h,k| h.fetch(k.to_sym, nil) }.merge(
SEASONS.invert).merge({ :fall => 23 }).freeze
-
+
NORTHERN = Hash[:spring, [3,4,5], :summer, [6,7,8], :autumn, [9,10,11], :winter, [12,1,2]].freeze
SOUTHERN = Hash[:autumn, [3,4,5], :winter, [6,7,8], :spring, [9,10,11], :summer, [12,1,2]].freeze
-
+
NORTHERN_MONTHS = Hash[*NORTHERN.map { |s,ms| ms.map { |m| [m,s] } }.flatten].freeze
SOUTHERN_MONTHS = Hash[*SOUTHERN.map { |s,ms| ms.map { |m| [m,s] } }.flatten].freeze
-
-
+
+
include Comparable
include Enumerable
-
+
class << self
def current
Date.today.season
end
end
attr_reader :season, :year
-
+
attr_accessor :qualifier, :uncertain, :approximate
-
- def_delegators :to_range,
- *Range.instance_methods(false).reject { |m| m.to_s =~ /^(each|min|max|cover?|inspect)$|^\W/ }
-
+
+ def_delegators :to_range, *Range.instance_methods(false).reject { |m|
+ m.to_s =~ /^(each|min|max|cover\?|inspect|to_s)$|^\W/
+ }
+
SEASONS.each_value do |s|
define_method("#{s}?") { @season == s }
define_method("#{s}!") { @season = s }
end
-
+
alias fall? autumn?
alias fall! autumn!
-
+
[:first, :second, :third, :fourth].zip([:spring, :summer, :autumn, :winter]).each do |quarter, season|
alias_method("#{quarter}?", "#{season}?")
alias_method("#{quarter}!", "#{season}!")
end
def initialize(*arguments)
arguments.flatten!
raise ArgumentError, "wrong number of arguments (#{arguments.length} for 0..3)" if arguments.length > 3
-
+
if arguments.length == 1
case arguments[0]
when Date
@year, @season = arguments[0].year, NORTHERN_MONTHS[arguments[0]]
when Symbol, String
@@ -65,126 +66,126 @@
self.qualifier = qualifier
end
end
- [:uncertain, :approximate].each do |m|
-
- define_method("#{m}?") { !!send(m) }
-
- define_method("#{m}!") do
- send("#{m}=", true)
- self
- end
- end
+ [:uncertain, :approximate].each do |m|
- def certain?; !uncertain; end
- def precise?; !approximate; end
-
- def certain!
- @uncertain = false
- self
- end
-
- def precise!
- @approximate = false
- end
-
- # Returns the next season.
- def succ
- s = dup
- s.season = next_season_code
- s.year = year + 1 if s.first?
- s
- end
-
- # def next(n = 1)
- # end
+ define_method("#{m}?") { !!send(m) }
- def cover?(other)
- return false unless other.respond_to?(:day_precision)
- other = other.day_precision
- min.day_precision! <= other && other <= max.day_precision!
- end
-
+ define_method("#{m}!") do
+ send("#{m}=", true)
+ self
+ end
+ end
+
+ def certain?; !uncertain; end
+ def precise?; !approximate; end
+
+ def certain!
+ @uncertain = false
+ self
+ end
+
+ def precise!
+ @approximate = false
+ end
+
+ # Returns the next season.
+ def succ
+ s = dup
+ s.season = next_season_code
+ s.year = year + 1 if s.first?
+ s
+ end
+
+ # def next(n = 1)
+ # end
+
+ def cover?(other)
+ return false unless other.respond_to?(:day_precision)
+ other = other.day_precision
+ min.day_precision! <= other && other <= max.day_precision!
+ end
+
def each
if block_given?
to_range.each(&Proc.new)
self
else
to_enum
end
end
-
+
def year=(new_year)
@year = new_year.to_i
end
-
+
def season=(new_season)
@season = SEASONS[new_season] || SEASONS[CODES[new_season]] ||
raise(ArgumentError, "unknown season/format: #{new_season.inspect})")
end
def season?; true; end
-
+
def qualified?; !!@qualifier; end
-
+
def edtf
'%04d-%2d%s' % [year, CODES[season], qualified? ? "^#{qualifier}" : '']
end
alias to_s edtf
-
+
def <=>(other)
case other
when Date
cover?(other) ? 0 : to_date <=> other
- when Interval, Epoch
- [min, max] <=> [other.min, other.max]
+ when Interval, Epoch
+ [min, max] <=> [other.min, other.max]
when Season
[year, month, qualifier] <=> [other.year, other.month, other.qualifier]
else
nil
end
rescue
nil
end
-
+
def ===(other)
(self <=> other) == 0
rescue
false
end
-
+
def to_date
Date.new(year, month, 1)
end
- alias min to_date
-
- def max
- to_date.months_since(2).end_of_month
- end
-
+ alias min to_date
+
+ def max
+ to_date.months_since(2).end_of_month
+ end
+
# Returns a Range that covers the season (a three month period).
def to_range
- min .. max
+ min .. max
end
-
+
protected
-
+
def month
NORTHERN[@season][0]
end
-
- def season_code
- CODES[season]
- end
-
- def next_season_code(by = 1)
- ((season_code + by) % 4) + 20
- end
-
+
+ def season_code
+ CODES[season]
+ end
+
+ def next_season_code(by = 1)
+ ((season_code + by) % 4) + 20
+ end
+
end
-
-end
\ No newline at end of file
+
+end