Class: Month

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

Defined Under Namespace

Modules: Methods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(year, number) ⇒ Month

Returns a new instance of Month.



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/month.rb', line 5

def initialize(year, number)
  unless year.is_a?(Integer)
    raise ArgumentError, 'invalid year'
  end

  unless number.is_a?(Integer) && number.between?(1, 12)
    raise ArgumentError, 'invalid month number'
  end

  @year, @number = year, number

  freeze
end

Instance Attribute Details

#numberObject (readonly) Also known as: month

Returns the value of attribute number.



19
20
21
# File 'lib/month.rb', line 19

def number
  @number
end

#yearObject (readonly)

Returns the value of attribute year.



19
20
21
# File 'lib/month.rb', line 19

def year
  @year
end

Class Method Details

.nowObject



227
228
229
# File 'lib/month.rb', line 227

def Month.now
  Month(Time.now)
end

.parse(string) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/month.rb', line 202

def self.parse(string)
  case string
  when REGEXP1
    Month.new($1.to_i, $2.to_i)
  when REGEXP2
    Month.new($1.to_i, ABBREVIATIONS.fetch($2))
  when REGEXP3
    Month.new($2.to_i, Date::MONTHNAMES.index($1))
  else
    raise ArgumentError, 'invalid month'
  end
end

Instance Method Details

#+(number) ⇒ Object



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

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

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

#-(object) ⇒ Object



136
137
138
139
140
141
142
# File 'lib/month.rb', line 136

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

#<<(n) ⇒ Object



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

def <<(n)
  self - n
end

#<=>(month) ⇒ Object



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

def <=>(month)
  return unless month.class == self.class

  if @year == month.year
    @number <=> month.number
  else
    @year <=> month.year
  end
end

#>>(n) ⇒ Object



90
91
92
# File 'lib/month.rb', line 90

def >>(n)
  self + n
end

#april?Boolean

Returns:

  • (Boolean)


40
# File 'lib/month.rb', line 40

def april?; @number == 4; end

#august?Boolean

Returns:

  • (Boolean)


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

def august?; @number == 8; end

#datesObject Also known as: date_range



166
167
168
# File 'lib/month.rb', line 166

def dates
  start_date .. end_date
end

#december?Boolean

Returns:

  • (Boolean)


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

def december?; @number == 12; end

#deconstruct_keys(keys) ⇒ Object



58
59
60
# File 'lib/month.rb', line 58

def deconstruct_keys(keys)
  {year: @year, number: @number}
end

#downto(min, &block) ⇒ Object



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

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

#encode_with(coder) ⇒ Object



4
5
6
# File 'lib/month/yaml.rb', line 4

def encode_with(coder)
  coder.represent_scalar(nil, to_s)
end

#end_dateObject



162
163
164
# File 'lib/month.rb', line 162

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

#end_timeObject



154
155
156
# File 'lib/month.rb', line 154

def end_time
  Time.new(@year, @number, end_date.day, 23, 59, 59)
end

#eql?(object) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/month.rb', line 54

def eql?(object)
  object.class == self.class && object.year == @year && object.number == @number
end

#february?Boolean

Returns:

  • (Boolean)


38
# File 'lib/month.rb', line 38

def february?; @number == 2; end

#hashObject



50
51
52
# File 'lib/month.rb', line 50

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

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

Returns:

  • (Boolean)


144
145
146
# File 'lib/month.rb', line 144

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

#inspectObject



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

def inspect
  "<Month: #{to_s}>"
end

#january?Boolean

Returns:

  • (Boolean)


37
# File 'lib/month.rb', line 37

def january?; @number == 1; end

#july?Boolean

Returns:

  • (Boolean)


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

def july?; @number == 7; end

#june?Boolean

Returns:

  • (Boolean)


42
# File 'lib/month.rb', line 42

def june?; @number == 6; end

#lengthObject



172
173
174
# File 'lib/month.rb', line 172

def length
  end_date.mday
end

#march?Boolean

Returns:

  • (Boolean)


39
# File 'lib/month.rb', line 39

def march?; @number == 3; end

#may?Boolean

Returns:

  • (Boolean)


41
# File 'lib/month.rb', line 41

def may?; @number == 5; end

#nameObject



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

def name
  Date::MONTHNAMES[@number]
end

#nextObject Also known as: succ, next_month



74
75
76
77
78
79
80
# File 'lib/month.rb', line 74

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

#november?Boolean

Returns:

  • (Boolean)


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

def november?; @number == 11; end

#october?Boolean

Returns:

  • (Boolean)


46
# File 'lib/month.rb', line 46

def october?; @number == 10; end

#prev_monthObject



86
87
88
# File 'lib/month.rb', line 86

def prev_month
  self - 1
end

#september?Boolean

Returns:

  • (Boolean)


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

def september?; @number == 9; end

#start_dateObject



158
159
160
# File 'lib/month.rb', line 158

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

#start_timeObject



150
151
152
# File 'lib/month.rb', line 150

def start_time
  Time.new(@year, @number, 1, 0, 0, 0)
end

#step(limit, step = 1) ⇒ Object

Raises:

  • (ArgumentError)


98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/month.rb', line 98

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 Also known as: iso8601



23
24
25
# File 'lib/month.rb', line 23

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

#upto(max, &block) ⇒ Object



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

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