Class: Month

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/month.rb,
lib/month.rb

Defined Under Namespace

Modules: Methods

Constant Summary collapse

NAMES =
{
  1 => :January,
  2 => :February,
  3 => :March,
  4 => :April,
  5 => :May,
  6 => :June,
  7 => :July,
  8 => :August,
  9 => :September,
  10 => :October,
  11 => :November,
  12 => :December
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(year, number) ⇒ Month

Returns a new instance of Month.



19
20
21
22
23
24
25
# File 'lib/month.rb', line 19

def initialize(year, number)
  unless NAMES.has_key?(number)
    raise ArgumentError, 'invalid month number'
  end

  @year, @number = year, number
end

Instance Attribute Details

#numberObject (readonly)

Returns the value of attribute number.



27
28
29
# File 'lib/month.rb', line 27

def number
  @number
end

#yearObject (readonly)

Returns the value of attribute year.



27
28
29
# File 'lib/month.rb', line 27

def year
  @year
end

Class Method Details

.parse(string) ⇒ Object



140
141
142
143
144
145
146
# File 'lib/month.rb', line 140

def Month.parse(string)
  if string =~ /\A(\d{4})-(\d{2})\z/
    Month.new($1.to_i, $2.to_i)
  else
    raise ArgumentError, 'invalid month'
  end
end

Instance Method Details

#+(number) ⇒ Object



103
104
105
106
107
# File 'lib/month.rb', line 103

def +(number)
  a, b = (@number - 1 + number).divmod(12)

  self.class.new(@year + a, b + 1)
end

#-(object) ⇒ Object



109
110
111
112
113
114
115
# File 'lib/month.rb', line 109

def -(object)
  if object.is_a?(Integer)
    self + (-object)
  else
    (year * 12 + @number) - (object.year * 12 + object.number)
  end
end

#<=>(month) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/month.rb', line 51

def <=>(month)
  if @year == month.year
    @number <=> month.number
  else
    @year <=> month.year
  end
end

#datesObject



131
132
133
# File 'lib/month.rb', line 131

def dates
  start_date .. end_date
end

#downto(min, &block) ⇒ Object



99
100
101
# File 'lib/month.rb', line 99

def downto(min, &block)
  step(min, -1, &block)
end

#end_dateObject



127
128
129
# File 'lib/month.rb', line 127

def end_date
  Date.new(@year, @number, -1)
end

#eql?(object) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/month.rb', line 47

def eql?(object)
  object.class == self.class && object.hash == self.hash
end

#hashObject



43
44
45
# File 'lib/month.rb', line 43

def hash
  [@year, @number].hash
end

#include?(date) ⇒ Boolean Also known as: ===

Returns:

  • (Boolean)


117
118
119
# File 'lib/month.rb', line 117

def include?(date)
  @year == date.year && @number == date.month
end

#lengthObject



135
136
137
# File 'lib/month.rb', line 135

def length
  end_date.mday
end

#nameObject



33
34
35
# File 'lib/month.rb', line 33

def name
  NAMES.fetch(@number)
end

#nextObject Also known as: succ



61
62
63
64
65
66
67
# File 'lib/month.rb', line 61

def next
  if @number == 12
    self.class.new(@year + 1, 1)
  else
    self.class.new(@year, @number + 1)
  end
end

#start_dateObject



123
124
125
# File 'lib/month.rb', line 123

def start_date
  Date.new(@year, @number, 1)
end

#step(limit, step = 1) ⇒ Object

Raises:

  • (ArgumentError)


71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/month.rb', line 71

def step(limit, step = 1)
  raise ArgumentError if step.zero?

  unless block_given?
    return enum_for(:step, limit, step)
  end

  month = self

  if step > 0
    until month > limit
      yield month

      month += step
    end
  else
    until month < limit
      yield month

      month += step
    end
  end
end

#to_sObject



29
30
31
# File 'lib/month.rb', line 29

def to_s
  "#@year-#{@number.to_s.rjust(2, '0')}"
end

#upto(max, &block) ⇒ Object



95
96
97
# File 'lib/month.rb', line 95

def upto(max, &block)
  step(max, 1, &block)
end