koyomi 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/lib/koyomi.rb +13 -7
- data/lib/koyomi/calendar.rb +21 -20
- data/lib/koyomi/error.rb +5 -0
- data/lib/koyomi/error/wrong_range_error.rb +2 -0
- data/lib/koyomi/init.rb +4 -0
- data/lib/koyomi/month.rb +96 -45
- data/lib/koyomi/month_cycle.rb +35 -0
- data/lib/koyomi/version.rb +1 -1
- data/lib/koyomi/week.rb +22 -24
- data/lib/koyomi/year.rb +54 -0
- data/spec/feature/koyomi_sequence_spec.rb +8 -0
- data/spec/lib/koyomi/calendar_spec.rb +8 -10
- data/spec/lib/koyomi/month_cycle_spec.rb +116 -0
- data/spec/lib/koyomi/month_spec.rb +154 -19
- data/spec/lib/koyomi/year_spec.rb +102 -0
- data/spec/lib/koyomi_spec.rb +19 -0
- metadata +14 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 2424c6cda5e48fb64ecee69b6fb8b292b0a13e3a
         | 
| 4 | 
            +
              data.tar.gz: b21e94aff1c9fe720a79ce9bd7bd076d679749d3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: da9ef2356634f30e02edd0794a6e12d0a3ca0c762611a2a4aae879755f85849a57141c3e53def14b6293289cd6ddc112b3bad36aa68e5f4c8a81860f9c14f389
         | 
| 7 | 
            +
              data.tar.gz: a90d16687d127b8182c082859e8ad78e30c5c97227a80de6d03bf7ca93ba69e15b886c4ceae56b3682129db01a9f6b168230e1e2955085289a85c942c88e6526
         | 
    
        data/.rspec
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,14 @@ | |
| 1 1 | 
             
            # Change Log
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 0.2.0 (2015-11-26)
         | 
| 4 | 
            +
              * lib/koyomi/year.rb: Add Koyomi::Year class to treat years.
         | 
| 5 | 
            +
              * lib/koyomi/month_cycle.rb: Add Koyomi::MonthCycle class to treat
         | 
| 6 | 
            +
                cycles in month.
         | 
| 7 | 
            +
              * lib/koyomi/wrong_range_error.rb: Added to raise error
         | 
| 8 | 
            +
                outside of the month.
         | 
| 9 | 
            +
              * lib/koyomi/month.rb: Changed to raise Koyomi::WrongRangeError
         | 
| 10 | 
            +
                when specified date not within the month.
         | 
| 11 | 
            +
             | 
| 3 12 | 
             
            ## 0.1.0 (2015-11-15)
         | 
| 4 13 |  | 
| 5 14 | 
             
              * use rspec
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/lib/koyomi.rb
    CHANGED
    
    | @@ -1,13 +1,19 @@ | |
| 1 1 | 
             
            # encoding: utf-8
         | 
| 2 2 |  | 
| 3 3 | 
             
            require "koyomi/init"
         | 
| 4 | 
            -
            require "koyomi/version"
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            require "koyomi/period"
         | 
| 7 | 
            -
            require "koyomi/month"
         | 
| 8 | 
            -
            require "koyomi/week"
         | 
| 9 | 
            -
            require "koyomi/calendar"
         | 
| 10 | 
            -
            require "koyomi/helper"
         | 
| 11 4 |  | 
| 12 5 | 
             
            module Koyomi
         | 
| 6 | 
            +
              def self.year(year)
         | 
| 7 | 
            +
                Koyomi::Year.new(year)
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              private
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def self.method_missing(name, *args, &block)
         | 
| 13 | 
            +
                if "#{name}".match(/^_[0-9]+$/)
         | 
| 14 | 
            +
                    self.year("#{name}".sub(/_/, "").to_i)
         | 
| 15 | 
            +
                else
         | 
| 16 | 
            +
                  super
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 13 19 | 
             
            end
         | 
    
        data/lib/koyomi/calendar.rb
    CHANGED
    
    | @@ -6,7 +6,7 @@ require "koyomi/helper/week" | |
| 6 6 |  | 
| 7 7 | 
             
            class Koyomi::Calendar < Koyomi::Period
         | 
| 8 8 | 
             
              include Koyomi::Helper::Week
         | 
| 9 | 
            -
             | 
| 9 | 
            +
             | 
| 10 10 | 
             
              # create Koyomi::Calendar instance from date.
         | 
| 11 11 | 
             
              #
         | 
| 12 12 | 
             
              # @param  [Date]  date
         | 
| @@ -15,26 +15,26 @@ class Koyomi::Calendar < Koyomi::Period | |
| 15 15 | 
             
              def self.of(date, week_start = nil)
         | 
| 16 16 | 
             
                self.new(date.year, date.month, week_start)
         | 
| 17 17 | 
             
              end
         | 
| 18 | 
            -
             | 
| 18 | 
            +
             | 
| 19 19 | 
             
              #--------------------#
         | 
| 20 20 | 
             
              # instance methods
         | 
| 21 21 | 
             
              attr_accessor :week_start
         | 
| 22 22 | 
             
              attr_reader :year, :month, :koyomi_month
         | 
| 23 23 | 
             
              attr_reader :weeks
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 | 
             
              # initialize instance
         | 
| 26 26 | 
             
              #
         | 
| 27 27 | 
             
              # @param  [Integer] year optional, use instance create date.
         | 
| 28 28 | 
             
              # @param  [Integer] month optional, use instance create date.
         | 
| 29 29 | 
             
              # @param  [Object] week_start weekday which week starts with. optional, use DEFAULT_WEEK_START.
         | 
| 30 | 
            -
              def initialize(year = nil, month = nil, week_start =  | 
| 30 | 
            +
              def initialize(year = nil, month = nil, week_start = Koyomi::Week::DEFAULT_START)
         | 
| 31 31 | 
             
                super()
         | 
| 32 32 | 
             
                self.year = year||self.created_at.year
         | 
| 33 33 | 
             
                self.month = month||self.created_at.month
         | 
| 34 34 | 
             
                self.koyomi_month = Koyomi::Month.new(self.month, self.year)
         | 
| 35 | 
            -
                self.week_start = week_start | 
| 35 | 
            +
                self.week_start = week_start
         | 
| 36 36 | 
             
              end
         | 
| 37 | 
            -
             | 
| 37 | 
            +
             | 
| 38 38 | 
             
              # set week_start
         | 
| 39 39 | 
             
              #
         | 
| 40 40 | 
             
              # @param  [Object]  value
         | 
| @@ -42,44 +42,45 @@ class Koyomi::Calendar < Koyomi::Period | |
| 42 42 | 
             
                self.setup_week_start(value)
         | 
| 43 43 | 
             
                @week_start
         | 
| 44 44 | 
             
              end
         | 
| 45 | 
            -
             | 
| 45 | 
            +
             | 
| 46 46 | 
             
              # first date of the calendar (NOT first date of the MONTH)
         | 
| 47 47 | 
             
              #
         | 
| 48 48 | 
             
              # @return [Date]
         | 
| 49 49 | 
             
              def first
         | 
| 50 50 | 
             
                Koyomi::Week.new(self.koyomi_month.first, self.week_start).first
         | 
| 51 51 | 
             
              end
         | 
| 52 | 
            -
             | 
| 52 | 
            +
             | 
| 53 53 | 
             
              # last date of the calendar (NOT last date of the MONTH)
         | 
| 54 54 | 
             
              #
         | 
| 55 55 | 
             
              # @return [Date]
         | 
| 56 56 | 
             
              def last
         | 
| 57 57 | 
             
                Koyomi::Week.new(self.koyomi_month.last, self.week_start).last
         | 
| 58 58 | 
             
              end
         | 
| 59 | 
            -
             | 
| 59 | 
            +
             | 
| 60 60 | 
             
              # range of the calendar.
         | 
| 61 61 | 
             
              #
         | 
| 62 62 | 
             
              # @return [Range]
         | 
| 63 63 | 
             
              def range
         | 
| 64 64 | 
             
                Range.new(self.first, self.last)
         | 
| 65 65 | 
             
              end
         | 
| 66 | 
            -
             | 
| 66 | 
            +
             | 
| 67 67 | 
             
              # Koyomi::Month of the calendar's month.
         | 
| 68 68 | 
             
              #
         | 
| 69 69 | 
             
              # @return [Koyomi::Month]
         | 
| 70 70 | 
             
              def the_month
         | 
| 71 71 | 
             
                self.koyomi_month
         | 
| 72 72 | 
             
              end
         | 
| 73 | 
            -
             | 
| 73 | 
            +
             | 
| 74 74 | 
             
              # week day of nth week.
         | 
| 75 75 | 
             
              #
         | 
| 76 76 | 
             
              # @param  [Integer] nth
         | 
| 77 77 | 
             
              # @param  [Object]  wday_name
         | 
| 78 78 | 
             
              # @return [Date]
         | 
| 79 79 | 
             
              def nth_wday(nth, wday_name)
         | 
| 80 | 
            +
                raise Koyomi::WrongRangeError if nth > weeks.size
         | 
| 80 81 | 
             
                self.weeks[nth - 1].wday(wday_name)
         | 
| 81 82 | 
             
              end
         | 
| 82 | 
            -
             | 
| 83 | 
            +
             | 
| 83 84 | 
             
              # week days
         | 
| 84 85 | 
             
              #
         | 
| 85 86 | 
             
              # @param  [Object]  wday_name
         | 
| @@ -87,7 +88,7 @@ class Koyomi::Calendar < Koyomi::Period | |
| 87 88 | 
             
              def wdays(wday_name)
         | 
| 88 89 | 
             
                self.weeks.collect { |w| w.wday(wday_name) }
         | 
| 89 90 | 
             
              end
         | 
| 90 | 
            -
             | 
| 91 | 
            +
             | 
| 91 92 | 
             
              # cycle dates
         | 
| 92 93 | 
             
              #
         | 
| 93 94 | 
             
              # @param  [Array<Integer>|Integer]  weeks
         | 
| @@ -102,12 +103,12 @@ class Koyomi::Calendar < Koyomi::Period | |
| 102 103 | 
             
                end
         | 
| 103 104 | 
             
                _dates.sort
         | 
| 104 105 | 
             
              end
         | 
| 105 | 
            -
             | 
| 106 | 
            +
             | 
| 106 107 | 
             
              #--------------------#
         | 
| 107 108 | 
             
              protected
         | 
| 108 | 
            -
             | 
| 109 | 
            +
             | 
| 109 110 | 
             
              attr_writer :year, :month, :koyomi_month
         | 
| 110 | 
            -
             | 
| 111 | 
            +
             | 
| 111 112 | 
             
              # setup week start
         | 
| 112 113 | 
             
              #
         | 
| 113 114 | 
             
              # @param  [Object]  value
         | 
| @@ -115,7 +116,7 @@ class Koyomi::Calendar < Koyomi::Period | |
| 115 116 | 
             
                @week_start = self.class.windex(value)
         | 
| 116 117 | 
             
                self.setup_weeks(@week_start)
         | 
| 117 118 | 
             
              end
         | 
| 118 | 
            -
             | 
| 119 | 
            +
             | 
| 119 120 | 
             
              # setup weeks of the calendar.
         | 
| 120 121 | 
             
              #
         | 
| 121 122 | 
             
              # @return [Array<Week>]
         | 
| @@ -123,17 +124,17 @@ class Koyomi::Calendar < Koyomi::Period | |
| 123 124 | 
             
                a_date = self.first
         | 
| 124 125 | 
             
                the_last = self.last
         | 
| 125 126 | 
             
                @weeks = []
         | 
| 126 | 
            -
             | 
| 127 | 
            +
             | 
| 127 128 | 
             
                while (a_date < the_last)
         | 
| 128 129 | 
             
                  @weeks << Koyomi::Week.new(a_date, week_start)
         | 
| 129 130 | 
             
                  a_date += WEEK_DAYS
         | 
| 130 131 | 
             
                end
         | 
| 131 132 | 
             
                @weeks
         | 
| 132 133 | 
             
              end
         | 
| 133 | 
            -
             | 
| 134 | 
            +
             | 
| 134 135 | 
             
              #--------------------#
         | 
| 135 136 | 
             
              private
         | 
| 136 | 
            -
             | 
| 137 | 
            +
             | 
| 137 138 | 
             
              # cycle weeks filter
         | 
| 138 139 | 
             
              #
         | 
| 139 140 | 
             
              # @param  [Object]  weeks
         | 
    
        data/lib/koyomi/error.rb
    ADDED
    
    
    
        data/lib/koyomi/init.rb
    CHANGED
    
    
    
        data/lib/koyomi/month.rb
    CHANGED
    
    | @@ -3,10 +3,10 @@ | |
| 3 3 | 
             
            require "koyomi/period"
         | 
| 4 4 |  | 
| 5 5 | 
             
            class Koyomi::Month < Koyomi::Period
         | 
| 6 | 
            -
             | 
| 6 | 
            +
             | 
| 7 7 | 
             
              #--------------------#
         | 
| 8 8 | 
             
              # class methods
         | 
| 9 | 
            -
             | 
| 9 | 
            +
             | 
| 10 10 | 
             
              # create instance from date
         | 
| 11 11 | 
             
              #
         | 
| 12 12 | 
             
              # @param  [Date]  date
         | 
| @@ -14,36 +14,55 @@ class Koyomi::Month < Koyomi::Period | |
| 14 14 | 
             
              def self.of(date)
         | 
| 15 15 | 
             
                self.new(date.month, date.year)
         | 
| 16 16 | 
             
              end
         | 
| 17 | 
            -
             | 
| 17 | 
            +
             | 
| 18 18 | 
             
              #--------------------#
         | 
| 19 19 | 
             
              # instance methods
         | 
| 20 | 
            -
             | 
| 20 | 
            +
             | 
| 21 21 | 
             
              attr_reader :year, :month
         | 
| 22 22 | 
             
              attr_reader :first, :last
         | 
| 23 | 
            -
             | 
| 23 | 
            +
             | 
| 24 24 | 
             
              # initialize instance.
         | 
| 25 25 | 
             
              #
         | 
| 26 26 | 
             
              # @param  [Integer] month optional, default use the month of instance created.
         | 
| 27 27 | 
             
              # @param  [Integer] year  optional, default use the year of instance created.
         | 
| 28 28 | 
             
              def initialize(month = nil, year = nil)
         | 
| 29 29 | 
             
                super()
         | 
| 30 | 
            -
                 | 
| 30 | 
            +
                @year   = year||self.created_at.year
         | 
| 31 | 
            +
                @month  = month||self.created_at.month
         | 
| 32 | 
            +
                @first  = Date.new(self.year, self.month, 1)
         | 
| 33 | 
            +
                @last   = (first_date_of_next_month - 1)
         | 
| 34 | 
            +
                @range  = Range.new(self.first, self.last)
         | 
| 31 35 | 
             
              end
         | 
| 32 | 
            -
             | 
| 36 | 
            +
             | 
| 33 37 | 
             
              # next month
         | 
| 34 38 | 
             
              #
         | 
| 35 39 | 
             
              # @return [Koyomi::Month]
         | 
| 36 40 | 
             
              def next
         | 
| 37 41 | 
             
                self.class.of(self.last + 1)
         | 
| 38 42 | 
             
              end
         | 
| 39 | 
            -
             | 
| 43 | 
            +
             | 
| 40 44 | 
             
              # previous month
         | 
| 41 45 | 
             
              #
         | 
| 42 46 | 
             
              # @return [Koyomi::Month]
         | 
| 43 47 | 
             
              def prev
         | 
| 44 48 | 
             
                self.class.of(self.first - 1)
         | 
| 45 49 | 
             
              end
         | 
| 46 | 
            -
             | 
| 50 | 
            +
             | 
| 51 | 
            +
              # Create Koyomi::Calendar
         | 
| 52 | 
            +
              #
         | 
| 53 | 
            +
              # @param  [Object]  week_start
         | 
| 54 | 
            +
              # @return [Koyomi::Calendar]
         | 
| 55 | 
            +
              def calendar(week_start = Koyomi::Week::DEFAULT_START)
         | 
| 56 | 
            +
                Koyomi::Calendar.new(year, month, week_start)
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              # Create Koyomi::MonthCycle
         | 
| 60 | 
            +
              #
         | 
| 61 | 
            +
              # @return [Koyomi::Cycle]
         | 
| 62 | 
            +
              def cycle
         | 
| 63 | 
            +
                Koyomi::MonthCycle.new(self)
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 47 66 | 
             
              # week days of nth weeks.
         | 
| 48 67 | 
             
              #
         | 
| 49 68 | 
             
              # @param  [Integer|Array<Integer>] nth
         | 
| @@ -53,24 +72,45 @@ class Koyomi::Month < Koyomi::Period | |
| 53 72 | 
             
                _dates = []
         | 
| 54 73 | 
             
                cycle_weeks_filter(weeks).each do |n|
         | 
| 55 74 | 
             
                  [wdays].flatten.each do |w|
         | 
| 56 | 
            -
                     | 
| 57 | 
            -
             | 
| 75 | 
            +
                    begin
         | 
| 76 | 
            +
                      a_date = self.nth_wday!(n, w)
         | 
| 77 | 
            +
                    rescue Koyomi::WrongRangeError => e
         | 
| 78 | 
            +
                      next
         | 
| 79 | 
            +
                    else
         | 
| 80 | 
            +
                      _dates << a_date
         | 
| 81 | 
            +
                    end
         | 
| 58 82 | 
             
                  end
         | 
| 59 83 | 
             
                end
         | 
| 60 84 | 
             
                _dates.sort
         | 
| 61 85 | 
             
              end
         | 
| 62 | 
            -
             | 
| 86 | 
            +
             | 
| 63 87 | 
             
              # week day of nth week.
         | 
| 64 88 | 
             
              #
         | 
| 65 89 | 
             
              # @param  [Integer] nth
         | 
| 66 90 | 
             
              # @param  [Object]  wday_name
         | 
| 67 91 | 
             
              # @return [Date]
         | 
| 68 92 | 
             
              def nth_wday(nth, wday_name)
         | 
| 69 | 
            -
                 | 
| 70 | 
            -
                 | 
| 93 | 
            +
                case "#{nth}"
         | 
| 94 | 
            +
                when /first/
         | 
| 95 | 
            +
                  calc_nth_wday(1, wday_name)
         | 
| 96 | 
            +
                when /last/
         | 
| 97 | 
            +
                  self.next.nth_wday(1, wday_name) - Koyomi::Week::DAYS
         | 
| 98 | 
            +
                else
         | 
| 99 | 
            +
                  calc_nth_wday(nth, wday_name)
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              # week day of nth week.
         | 
| 104 | 
            +
              #
         | 
| 105 | 
            +
              # @param  [Integer] nth
         | 
| 106 | 
            +
              # @param  [Object]  wday_name
         | 
| 107 | 
            +
              # @return [Date]
         | 
| 108 | 
            +
              def nth_wday!(nth, wday_name)
         | 
| 109 | 
            +
                date = nth_wday(nth, wday_name)
         | 
| 110 | 
            +
                raise Koyomi::WrongRangeError if date.month != self.month
         | 
| 111 | 
            +
                date
         | 
| 71 112 | 
             
              end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
              
         | 
| 113 | 
            +
             | 
| 74 114 | 
             
              # week days
         | 
| 75 115 | 
             
              #
         | 
| 76 116 | 
             
              # @param  [Object]  wday_name
         | 
| @@ -78,36 +118,38 @@ class Koyomi::Month < Koyomi::Period | |
| 78 118 | 
             
              def wdays(wday_name)
         | 
| 79 119 | 
             
                _dates = []
         | 
| 80 120 | 
             
                a_date = self.nth_wday(1, wday_name)
         | 
| 81 | 
            -
             | 
| 121 | 
            +
             | 
| 82 122 | 
             
                while (a_date.month == self.month)
         | 
| 83 123 | 
             
                  _dates << a_date
         | 
| 84 124 | 
             
                  a_date += Koyomi::Week::DAYS
         | 
| 85 125 | 
             
                end
         | 
| 86 126 | 
             
                _dates.sort
         | 
| 87 127 | 
             
              end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
               | 
| 90 | 
            -
              protected
         | 
| 91 | 
            -
              
         | 
| 92 | 
            -
              attr_writer :year, :month
         | 
| 93 | 
            -
              attr_writer :first, :last
         | 
| 94 | 
            -
              
         | 
| 95 | 
            -
              # initialize range
         | 
| 128 | 
            +
             | 
| 129 | 
            +
              # date
         | 
| 96 130 | 
             
              #
         | 
| 97 | 
            -
              # @param | 
| 98 | 
            -
              # @ | 
| 99 | 
            -
               | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
                 | 
| 103 | 
            -
             | 
| 104 | 
            -
                 | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
              
         | 
| 131 | 
            +
              # @param [Integer] days
         | 
| 132 | 
            +
              # @return [Date]
         | 
| 133 | 
            +
              def date(day)
         | 
| 134 | 
            +
                begin
         | 
| 135 | 
            +
                  date!(day)
         | 
| 136 | 
            +
                rescue ArgumentError => e
         | 
| 137 | 
            +
                  raise Koyomi::WrongRangeError
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              # date
         | 
| 142 | 
            +
              #   don't catch exceptions
         | 
| 143 | 
            +
              #
         | 
| 144 | 
            +
              # @param [Integer] days
         | 
| 145 | 
            +
              # @return [Date]
         | 
| 146 | 
            +
              def date!(day)
         | 
| 147 | 
            +
                Date.new(self.year, self.month, "#{day}".to_i)
         | 
| 148 | 
            +
              end
         | 
| 149 | 
            +
             | 
| 108 150 | 
             
              #--------------------#
         | 
| 109 151 | 
             
              private
         | 
| 110 | 
            -
             | 
| 152 | 
            +
             | 
| 111 153 | 
             
              # filter cycle weeks
         | 
| 112 154 | 
             
              #
         | 
| 113 155 | 
             
              # @param  [Object]  weeks
         | 
| @@ -121,24 +163,24 @@ class Koyomi::Month < Koyomi::Period | |
| 121 163 | 
             
                end
         | 
| 122 164 | 
             
                _weeks
         | 
| 123 165 | 
             
              end
         | 
| 124 | 
            -
             | 
| 166 | 
            +
             | 
| 125 167 | 
             
              # a date next month of the date
         | 
| 126 168 | 
             
              #
         | 
| 127 169 | 
             
              # @param  [Date]  date
         | 
| 128 170 | 
             
              # @return [Date]
         | 
| 129 | 
            -
              def  | 
| 130 | 
            -
                 | 
| 171 | 
            +
              def a_date_of_next_month
         | 
| 172 | 
            +
                self.first + 32
         | 
| 131 173 | 
             
              end
         | 
| 132 | 
            -
             | 
| 174 | 
            +
             | 
| 133 175 | 
             
              # first date of next month
         | 
| 134 176 | 
             
              #
         | 
| 135 177 | 
             
              # @param  [Date]  date
         | 
| 136 178 | 
             
              # @return [Date]
         | 
| 137 | 
            -
              def  | 
| 138 | 
            -
                a_date =  | 
| 179 | 
            +
              def first_date_of_next_month
         | 
| 180 | 
            +
                a_date = a_date_of_next_month
         | 
| 139 181 | 
             
                Date.new(a_date.year, a_date.month, 1)
         | 
| 140 182 | 
             
              end
         | 
| 141 | 
            -
             | 
| 183 | 
            +
             | 
| 142 184 | 
             
              # maximumn of weeks
         | 
| 143 185 | 
             
              #
         | 
| 144 186 | 
             
              # @return [Integer]
         | 
| @@ -147,4 +189,13 @@ class Koyomi::Month < Koyomi::Period | |
| 147 189 | 
             
                _fraction = (self.last.day % Koyomi::Week::DAYS)
         | 
| 148 190 | 
             
                (_weeks + (_fraction == 0 ? 0 : 1))
         | 
| 149 191 | 
             
              end
         | 
| 150 | 
            -
             | 
| 192 | 
            +
             | 
| 193 | 
            +
              def calc_nth_wday(nth, wday_name)
         | 
| 194 | 
            +
                a_date = self.first + ((nth - 1) * Koyomi::Week::DAYS)
         | 
| 195 | 
            +
                Koyomi::Week.new(a_date, a_date.wday).wday(wday_name)
         | 
| 196 | 
            +
              end
         | 
| 197 | 
            +
             | 
| 198 | 
            +
              def method_missing(name, *args, &block)
         | 
| 199 | 
            +
                date("#{name}".sub(/^_/, "")) if "#{name}".match(/^_[0-9]+$/)
         | 
| 200 | 
            +
              end
         | 
| 201 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            require "koyomi/month"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Koyomi::MonthCycle
         | 
| 4 | 
            +
              attr_reader :koyomi_month
         | 
| 5 | 
            +
              attr_reader :dates
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def initialize(koyomi_month)
         | 
| 8 | 
            +
                super()
         | 
| 9 | 
            +
                @koyomi_month = koyomi_month
         | 
| 10 | 
            +
                @dates = []
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def add(*args)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                while arg = args.shift
         | 
| 16 | 
            +
                  case arg
         | 
| 17 | 
            +
                  when Date
         | 
| 18 | 
            +
                    raise Koyomi::WrongRangeError unless koyomi_month.range.include?(arg)
         | 
| 19 | 
            +
                    @dates << arg
         | 
| 20 | 
            +
                  else
         | 
| 21 | 
            +
                    #_args = [arg]
         | 
| 22 | 
            +
                    #_args << args.shift
         | 
| 23 | 
            +
                    @dates += koyomi_month.cycles(*arg)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                uniq_and_sort
         | 
| 27 | 
            +
                self
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def uniq_and_sort
         | 
| 33 | 
            +
                @dates = @dates.uniq.sort
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
    
        data/lib/koyomi/version.rb
    CHANGED
    
    
    
        data/lib/koyomi/week.rb
    CHANGED
    
    | @@ -5,18 +5,18 @@ require "koyomi/period" | |
| 5 5 | 
             
            class Koyomi::Week < Koyomi::Period
         | 
| 6 6 | 
             
              #--------------------#
         | 
| 7 7 | 
             
              # constants
         | 
| 8 | 
            -
             | 
| 8 | 
            +
             | 
| 9 9 | 
             
              DEFAULT_START = :mon
         | 
| 10 10 | 
             
              WDAYS = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
         | 
| 11 11 | 
             
              DAYS = WDAYS.size
         | 
| 12 12 | 
             
              START_RANGE = (0..(DAYS - 1))
         | 
| 13 | 
            -
             | 
| 13 | 
            +
             | 
| 14 14 | 
             
              #--------------------#
         | 
| 15 15 | 
             
              # attributes
         | 
| 16 | 
            -
             | 
| 16 | 
            +
             | 
| 17 17 | 
             
              #--------------------#
         | 
| 18 18 | 
             
              # class methods
         | 
| 19 | 
            -
             | 
| 19 | 
            +
             | 
| 20 20 | 
             
              # week index
         | 
| 21 21 | 
             
              #
         | 
| 22 22 | 
             
              # @param  [Object]  value
         | 
| @@ -37,7 +37,7 @@ class Koyomi::Week < Koyomi::Period | |
| 37 37 | 
             
                raise "Range overflow, required (#{START_RANGE})." unless START_RANGE.cover?(index)
         | 
| 38 38 | 
             
                index
         | 
| 39 39 | 
             
              end
         | 
| 40 | 
            -
             | 
| 40 | 
            +
             | 
| 41 41 | 
             
              # week day name
         | 
| 42 42 | 
             
              #
         | 
| 43 43 | 
             
              # @param  [Object]  value
         | 
| @@ -45,40 +45,38 @@ class Koyomi::Week < Koyomi::Period | |
| 45 45 | 
             
              def self.wday_name(value)
         | 
| 46 46 | 
             
                WDAYS.at(self.windex(value))
         | 
| 47 47 | 
             
              end
         | 
| 48 | 
            -
             | 
| 48 | 
            +
             | 
| 49 49 | 
             
              # week starts?
         | 
| 50 50 | 
             
              #
         | 
| 51 51 | 
             
              # @param  [Date]  date
         | 
| 52 52 | 
             
              # @param  [Object]  start_wday  week start
         | 
| 53 53 | 
             
              # @return [Boolean]
         | 
| 54 | 
            -
              def self.starts?(date, start_wday =  | 
| 55 | 
            -
                start_wday ||= DEFAULT_START
         | 
| 54 | 
            +
              def self.starts?(date, start_wday = DEFAULT_START)
         | 
| 56 55 | 
             
                (date).wday == self.windex(start_wday)
         | 
| 57 56 | 
             
              end
         | 
| 58 | 
            -
             | 
| 57 | 
            +
             | 
| 59 58 | 
             
              # week end?
         | 
| 60 59 | 
             
              #
         | 
| 61 60 | 
             
              # @param  [Date]  date
         | 
| 62 61 | 
             
              # @param  [Object]  start_wday  week start
         | 
| 63 62 | 
             
              # @return [Boolean]
         | 
| 64 | 
            -
              def self.ends?(date, start_wday =  | 
| 65 | 
            -
                start_wday ||= DEFAULT_START
         | 
| 63 | 
            +
              def self.ends?(date, start_wday = DEFAULT_START)
         | 
| 66 64 | 
             
                (date + 1).wday == self.windex(start_wday)
         | 
| 67 65 | 
             
              end
         | 
| 68 | 
            -
             | 
| 66 | 
            +
             | 
| 69 67 | 
             
              #--------------------#
         | 
| 70 68 | 
             
              # instance methods
         | 
| 71 | 
            -
             | 
| 69 | 
            +
             | 
| 72 70 | 
             
              # initialize method
         | 
| 73 71 | 
             
              #
         | 
| 74 72 | 
             
              # @param  [Date]  date optional, default use Date.today.
         | 
| 75 73 | 
             
              # @param  [Object]  start_wday  optionail, default use Koyomi::Week::DEFAULT_START
         | 
| 76 | 
            -
              def initialize(date = nil, start_wday =  | 
| 74 | 
            +
              def initialize(date = nil, start_wday = DEFAULT_START)
         | 
| 77 75 | 
             
                super()
         | 
| 78 76 | 
             
                self.date = date||self.created_at
         | 
| 79 | 
            -
                self.start_wday = start_wday | 
| 77 | 
            +
                self.start_wday = start_wday
         | 
| 80 78 | 
             
              end
         | 
| 81 | 
            -
             | 
| 79 | 
            +
             | 
| 82 80 | 
             
              # sepified week day
         | 
| 83 81 | 
             
              #
         | 
| 84 82 | 
             
              # @param  [Object]  wday_name
         | 
| @@ -88,27 +86,27 @@ class Koyomi::Week < Koyomi::Period | |
| 88 86 | 
             
                factor = diff + ((diff < 0) ? DAYS : 0)
         | 
| 89 87 | 
             
                self.range.first + factor
         | 
| 90 88 | 
             
              end
         | 
| 91 | 
            -
             | 
| 89 | 
            +
             | 
| 92 90 | 
             
              # start date
         | 
| 93 91 | 
             
              #
         | 
| 94 92 | 
             
              # @return [Date]  date
         | 
| 95 93 | 
             
              def starts
         | 
| 96 94 | 
             
                self.range.first
         | 
| 97 95 | 
             
              end
         | 
| 98 | 
            -
             | 
| 96 | 
            +
             | 
| 99 97 | 
             
              # end date
         | 
| 100 98 | 
             
              #
         | 
| 101 99 | 
             
              # @return [Date]  date
         | 
| 102 100 | 
             
              def ends
         | 
| 103 101 | 
             
                self.range.last
         | 
| 104 102 | 
             
              end
         | 
| 105 | 
            -
             | 
| 103 | 
            +
             | 
| 106 104 | 
             
              #--------------------#
         | 
| 107 105 | 
             
              protected
         | 
| 108 | 
            -
             | 
| 106 | 
            +
             | 
| 109 107 | 
             
              attr_accessor :date
         | 
| 110 108 | 
             
              attr_reader :start_wday
         | 
| 111 | 
            -
             | 
| 109 | 
            +
             | 
| 112 110 | 
             
              # set week starts
         | 
| 113 111 | 
             
              #
         | 
| 114 112 | 
             
              # @param  [Object]  value
         | 
| @@ -117,17 +115,17 @@ class Koyomi::Week < Koyomi::Period | |
| 117 115 | 
             
                self.setup_range
         | 
| 118 116 | 
             
                @start_wday
         | 
| 119 117 | 
             
              end
         | 
| 120 | 
            -
             | 
| 118 | 
            +
             | 
| 121 119 | 
             
              # setup week range with given week start
         | 
| 122 120 | 
             
              def setup_range
         | 
| 123 121 | 
             
                diff = self.date.wday - self.class.windex(self.start_wday)
         | 
| 124 122 | 
             
                starts = self.date - (diff + ((diff < 0) ? DAYS : 0))
         | 
| 125 123 | 
             
                @range = Range.new(starts, starts + DAYS - 1)
         | 
| 126 124 | 
             
              end
         | 
| 127 | 
            -
             | 
| 125 | 
            +
             | 
| 128 126 | 
             
              #--------------------#
         | 
| 129 127 | 
             
              private
         | 
| 130 | 
            -
             | 
| 128 | 
            +
             | 
| 131 129 | 
             
              def method_missing(name, *args, &block)
         | 
| 132 130 | 
             
                case
         | 
| 133 131 | 
             
                when WDAYS.include?(name.to_s.to_sym)
         | 
    
        data/lib/koyomi/year.rb
    ADDED
    
    | @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "koyomi/period"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Koyomi::Year < Koyomi::Period
         | 
| 6 | 
            +
              #--------------------#
         | 
| 7 | 
            +
              # class methods
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              # create instance from date
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # @param  [Date]  date
         | 
| 12 | 
            +
              # @return [Koyomi::Year]
         | 
| 13 | 
            +
              def self.of(date = Date.today)
         | 
| 14 | 
            +
                self.new(date.year)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              #--------------------#
         | 
| 18 | 
            +
              # instance methods
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              attr_reader :year
         | 
| 21 | 
            +
              attr_reader :first, :last
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              # initialize instance.
         | 
| 24 | 
            +
              #
         | 
| 25 | 
            +
              # @param  [Integer] year  optional, default use the year of instance created.
         | 
| 26 | 
            +
              def initialize(year = nil)
         | 
| 27 | 
            +
                super()
         | 
| 28 | 
            +
                @year   = year||created_at.year
         | 
| 29 | 
            +
                @first  = Date.new(@year,  1,  1)
         | 
| 30 | 
            +
                @last   = Date.new(@year, 12, 31)
         | 
| 31 | 
            +
                @range  = (@first .. @last)
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              (1..12).each do |m|
         | 
| 35 | 
            +
                define_method("_#{m}") do
         | 
| 36 | 
            +
                  Koyomi::Month.new(m, year)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def month(month)
         | 
| 41 | 
            +
                Koyomi::Month.new(month, year)
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def uruu?
         | 
| 45 | 
            +
                begin
         | 
| 46 | 
            +
                  Date.new(year, 2, 29)
         | 
| 47 | 
            +
                rescue ArgumentError => e
         | 
| 48 | 
            +
                  false
         | 
| 49 | 
            +
                else
         | 
| 50 | 
            +
                  true
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
              alias_method :leap?, :uruu?
         | 
| 54 | 
            +
            end
         | 
| @@ -56,8 +56,8 @@ describe Koyomi::Calendar do | |
| 56 56 |  | 
| 57 57 | 
             
                describe "size" do
         | 
| 58 58 | 
             
                  subject { calendar.weeks.size }
         | 
| 59 | 
            -
                  let(:calendar) { described_class.new(* | 
| 60 | 
            -
                  let(: | 
| 59 | 
            +
                  let(:calendar) { described_class.new(*given) }
         | 
| 60 | 
            +
                  let(:given) { nil }
         | 
| 61 61 |  | 
| 62 62 | 
             
                  context "has 5 weeks" do
         | 
| 63 63 | 
             
                    # 2015-11 ~ 2015-12 start with sunday
         | 
| @@ -69,7 +69,7 @@ describe Koyomi::Calendar do | |
| 69 69 | 
             
                    # 29 30  1  2  3  4  5
         | 
| 70 70 | 
             
                    #
         | 
| 71 71 | 
             
                    # #=> 5 weeks
         | 
| 72 | 
            -
                    let(: | 
| 72 | 
            +
                    let(:given) { [2015, 11, :sun] }
         | 
| 73 73 | 
             
                    it { is_expected.to eq 5 }
         | 
| 74 74 | 
             
                  end # context "has 5 weeks"
         | 
| 75 75 |  | 
| @@ -84,7 +84,7 @@ describe Koyomi::Calendar do | |
| 84 84 | 
             
                    # 30  1  2  3  4  5  6
         | 
| 85 85 | 
             
                    #
         | 
| 86 86 | 
             
                    # #=> 6 weeks
         | 
| 87 | 
            -
                    let(: | 
| 87 | 
            +
                    let(:given) { [2015, 11, :mon] }
         | 
| 88 88 | 
             
                    it { is_expected.to eq 6 }
         | 
| 89 89 | 
             
                  end # context "has 6 weeks"
         | 
| 90 90 | 
             
                end # describe size
         | 
| @@ -113,9 +113,7 @@ describe Koyomi::Calendar do | |
| 113 113 | 
             
                context "range over" do
         | 
| 114 114 | 
             
                  subject { calendar.nth_wday(6, :mon) }
         | 
| 115 115 |  | 
| 116 | 
            -
                   | 
| 117 | 
            -
                    expect { subject }.to raise_error(NoMethodError)
         | 
| 118 | 
            -
                  end
         | 
| 116 | 
            +
                  it { expect { subject }.to raise_error(Koyomi::WrongRangeError) }
         | 
| 119 117 | 
             
                end
         | 
| 120 118 | 
             
              end
         | 
| 121 119 |  | 
| @@ -138,10 +136,10 @@ describe Koyomi::Calendar do | |
| 138 136 | 
             
              end
         | 
| 139 137 |  | 
| 140 138 | 
             
              describe "#cycles" do
         | 
| 141 | 
            -
                subject { calendar.cycles(* | 
| 139 | 
            +
                subject { calendar.cycles(*given) }
         | 
| 142 140 |  | 
| 143 141 | 
             
                context "first and third tuesday and friday" do
         | 
| 144 | 
            -
                  let(: | 
| 142 | 
            +
                  let(:given) { [[1, 3], [:tue, :fri]] }
         | 
| 145 143 | 
             
                  it { expect(subject.size).to eq 4 }
         | 
| 146 144 |  | 
| 147 145 | 
             
                  it "days has requested week day" do
         | 
| @@ -152,7 +150,7 @@ describe Koyomi::Calendar do | |
| 152 150 | 
             
                end # context "first and third tuesday and friday"
         | 
| 153 151 |  | 
| 154 152 | 
             
                context "every monday and friday" do
         | 
| 155 | 
            -
                  let(: | 
| 153 | 
            +
                  let(:given) { [:every, [:mon, :fri]] }
         | 
| 156 154 | 
             
                  let(:calendar) { described_class.new(2015, 12, :mon) }
         | 
| 157 155 | 
             
                  # 2015-11 ~ 2016-01 start with monday
         | 
| 158 156 | 
             
                  #
         | 
| @@ -0,0 +1,116 @@ | |
| 1 | 
            +
            require "koyomi_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Koyomi::MonthCycle do
         | 
| 4 | 
            +
              let(:month_cycle) { described_class.new(*initialized) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe ".new" do
         | 
| 7 | 
            +
                it("initialized with Koyomi::Month") do
         | 
| 8 | 
            +
                  month = Koyomi::Month.new
         | 
| 9 | 
            +
                  expect { described_class.new(month) }.not_to raise_error
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              describe "#dates" do
         | 
| 14 | 
            +
                subject { month_cycle.dates }
         | 
| 15 | 
            +
                let(:initialized) { Koyomi::Month.new }
         | 
| 16 | 
            +
                it { is_expected.to be_kind_of(Array) }
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              context "2015-11" do
         | 
| 20 | 
            +
                let(:initialized) { Koyomi::Month.new(11, 2015) }
         | 
| 21 | 
            +
                let(:action) { month_cycle.add(given) }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                context "[[3, 1], :fri] given" do
         | 
| 24 | 
            +
                  let(:given) { [[3, 1], :fri] }
         | 
| 25 | 
            +
                  let(:expected) { [Date.new(2015, 11, 6), Date.new(2015, 11, 20)] }
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  describe "#add" do
         | 
| 28 | 
            +
                    subject { action }
         | 
| 29 | 
            +
                    it { expect { subject }.not_to raise_error }
         | 
| 30 | 
            +
                    it { expect { subject }.to change { month_cycle.dates.size }.from(0).to(expected.size) }
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  describe "#dates" do
         | 
| 34 | 
            +
                    subject { month_cycle.dates }
         | 
| 35 | 
            +
                    before { action }
         | 
| 36 | 
            +
                    it { is_expected.to eq expected }
         | 
| 37 | 
            +
                    it("sort") { expect(subject.first).to be < subject.last }
         | 
| 38 | 
            +
                    it("uniq") { expect(subject.size).to eq expected.size }
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                context "Date given" do
         | 
| 43 | 
            +
                  let(:given) { date }
         | 
| 44 | 
            +
                  let(:date) { Date.new(2015, 11, 1) }
         | 
| 45 | 
            +
                  let(:expected) { [date] }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  describe "#add" do
         | 
| 48 | 
            +
                    subject { action }
         | 
| 49 | 
            +
                    it { expect { subject }.not_to raise_error }
         | 
| 50 | 
            +
                    it { expect { subject }.to change { month_cycle.dates.size }.from(0).to(expected.size) }
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  describe "#dates" do
         | 
| 54 | 
            +
                    subject { month_cycle.dates }
         | 
| 55 | 
            +
                    before { action }
         | 
| 56 | 
            +
                    it { is_expected.to eq expected }
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                context "invalid date given" do
         | 
| 61 | 
            +
                  let(:given) { date }
         | 
| 62 | 
            +
                  let(:date) { Date.new(2015, 12, 1) }
         | 
| 63 | 
            +
                  it { expect { month_cycle.add(date) }.to raise_error(Koyomi::WrongRangeError) }
         | 
| 64 | 
            +
                  let(:expected) { Koyomi::WrongRangeError }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  describe "#add" do
         | 
| 67 | 
            +
                    subject { action }
         | 
| 68 | 
            +
                    it { expect { subject }.to raise_error(expected) }
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                context "add some times" do
         | 
| 73 | 
            +
                  let(:action) do
         | 
| 74 | 
            +
                    month_cycle.add(Date.new(2015, 11, 6)) # first friday
         | 
| 75 | 
            +
                    month_cycle.add([[1, 3], :fri]) # 2015-11-06, 2015-11-20
         | 
| 76 | 
            +
                    month_cycle.add(Date.new(2015, 11, 1))
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                  let(:expected) { [Date.new(2015, 11,1), Date.new(2015, 11,6), Date.new(2015, 11,20)] }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  describe "#add" do
         | 
| 81 | 
            +
                    subject { action }
         | 
| 82 | 
            +
                    it { expect { subject }.not_to raise_error }
         | 
| 83 | 
            +
                    it { expect { subject }.to change { month_cycle.dates.size }.from(0).to(expected.size) }
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  describe "#dates" do
         | 
| 87 | 
            +
                    subject { month_cycle.dates }
         | 
| 88 | 
            +
                    before { action }
         | 
| 89 | 
            +
                    it { is_expected.to eq expected }
         | 
| 90 | 
            +
                    it("is sorted") { expect(subject.first).to be < subject.last }
         | 
| 91 | 
            +
                    it("is uniqed") { expect(subject.size).to eq expected.size }
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                context "add sequencial" do
         | 
| 96 | 
            +
                  let(:action) do
         | 
| 97 | 
            +
                    month_cycle.add([[3, 1], :fri]).add(Date.new(2015, 11, 1))
         | 
| 98 | 
            +
                  end
         | 
| 99 | 
            +
                  let(:expected) { [Date.new(2015, 11,1), Date.new(2015, 11,6), Date.new(2015, 11,20)] }
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  describe "#add" do
         | 
| 102 | 
            +
                    subject { action }
         | 
| 103 | 
            +
                    it { expect { subject }.not_to raise_error }
         | 
| 104 | 
            +
                    it { expect { subject }.to change { month_cycle.dates.size }.from(0).to(expected.size) }
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  describe "#dates" do
         | 
| 108 | 
            +
                    subject { month_cycle.dates }
         | 
| 109 | 
            +
                    before { action }
         | 
| 110 | 
            +
                    it { is_expected.to eq expected }
         | 
| 111 | 
            +
                    it("is sorted") { expect(subject.first).to be < subject.last }
         | 
| 112 | 
            +
                    it("is uniqed") { expect(subject.size).to eq expected.size }
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
              end
         | 
| 116 | 
            +
            end
         | 
| @@ -6,32 +6,44 @@ describe Koyomi::Month do | |
| 6 6 |  | 
| 7 7 | 
             
              describe "#range" do
         | 
| 8 8 | 
             
                subject { month.range }
         | 
| 9 | 
            -
             | 
| 10 9 | 
             
                it { is_expected.to be_kind_of(Range) }
         | 
| 11 10 | 
             
              end
         | 
| 12 11 |  | 
| 13 12 | 
             
              describe "#month" do
         | 
| 14 13 | 
             
                subject { month.month }
         | 
| 15 | 
            -
             | 
| 16 14 | 
             
                it { is_expected.to eq today.month }
         | 
| 17 15 | 
             
              end
         | 
| 18 16 |  | 
| 19 17 | 
             
              describe "#next" do
         | 
| 20 18 | 
             
                subject { month.next }
         | 
| 21 | 
            -
             | 
| 22 19 | 
             
                it { is_expected.to be_kind_of(described_class) }
         | 
| 23 20 | 
             
                it { expect(subject.month).to eq ((month.first + 32).month) }
         | 
| 24 21 | 
             
              end
         | 
| 25 22 |  | 
| 26 23 | 
             
              describe "#prev" do
         | 
| 27 24 | 
             
                subject { month.prev }
         | 
| 28 | 
            -
             | 
| 29 25 | 
             
                it { is_expected.to be_kind_of(described_class) }
         | 
| 30 26 | 
             
                it { expect(subject.month).to eq ((month.first - 1).month) }
         | 
| 31 27 | 
             
              end
         | 
| 32 28 |  | 
| 29 | 
            +
              describe "#nth_wday!" do
         | 
| 30 | 
            +
                subject { month.nth_wday!(*given) }
         | 
| 31 | 
            +
                let(:month) { described_class.new(12, 2015) }
         | 
| 32 | 
            +
                # 2015-12
         | 
| 33 | 
            +
                #     1  2  3  4  5  6
         | 
| 34 | 
            +
                #  7  8  9 10 11 12 13
         | 
| 35 | 
            +
                # 14 15 16 17 18 19 20
         | 
| 36 | 
            +
                # 21 22 23 24 25 26 27
         | 
| 37 | 
            +
                # 28 29 30 31
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                context "5th friday" do
         | 
| 40 | 
            +
                  let(:given) { [5, :fri] }
         | 
| 41 | 
            +
                  it { expect { subject }.to raise_error(Koyomi::WrongRangeError) }
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 33 45 | 
             
              describe "#nth_wday" do
         | 
| 34 | 
            -
                subject { month.nth_wday(* | 
| 46 | 
            +
                subject { month.nth_wday(*given) }
         | 
| 35 47 | 
             
                let(:month) { described_class.new(12, 2015) }
         | 
| 36 48 | 
             
                # 2015-12
         | 
| 37 49 | 
             
                #     1  2  3  4  5  6
         | 
| @@ -40,26 +52,30 @@ describe Koyomi::Month do | |
| 40 52 | 
             
                # 21 22 23 24 25 26 27
         | 
| 41 53 | 
             
                # 28 29 30 31
         | 
| 42 54 |  | 
| 43 | 
            -
                context " | 
| 44 | 
            -
                  let(: | 
| 55 | 
            +
                context "1st saturday" do
         | 
| 56 | 
            +
                  let(:given) { [1, :sat] }
         | 
| 45 57 | 
             
                  it { is_expected.to eq Date.new(2015, 12, 5) }
         | 
| 46 58 | 
             
                end
         | 
| 47 59 |  | 
| 60 | 
            +
                context "first friday" do
         | 
| 61 | 
            +
                  let(:given) { [:first, :fri] }
         | 
| 62 | 
            +
                  it { is_expected.to eq Date.new(2015, 12, 4) }
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 48 65 | 
             
                context "last saturday" do
         | 
| 49 | 
            -
                  let(: | 
| 50 | 
            -
                   | 
| 66 | 
            +
                  let(:given) { [:last, :sat] }
         | 
| 67 | 
            +
                  it { is_expected.to eq Date.new(2015, 12, 26) }
         | 
| 51 68 | 
             
                end
         | 
| 52 69 |  | 
| 53 70 | 
             
                context "5th friday" do
         | 
| 54 | 
            -
                  let(: | 
| 55 | 
            -
                   | 
| 56 | 
            -
             | 
| 57 | 
            -
                  }
         | 
| 71 | 
            +
                  let(:given) { [5, :fri] }
         | 
| 72 | 
            +
                  it { expect { subject }.not_to raise_error }
         | 
| 73 | 
            +
                  it { is_expected.to eq Date.new(2016, 1, 1) }
         | 
| 58 74 | 
             
                end
         | 
| 59 75 | 
             
              end
         | 
| 60 76 |  | 
| 61 77 | 
             
              describe "#wdays" do
         | 
| 62 | 
            -
                subject { month.wdays( | 
| 78 | 
            +
                subject { month.wdays(given) }
         | 
| 63 79 | 
             
                let(:month) { described_class.new(12, 2015) }
         | 
| 64 80 | 
             
                # 2015-12
         | 
| 65 81 | 
             
                #     1  2  3  4  5  6
         | 
| @@ -69,18 +85,18 @@ describe Koyomi::Month do | |
| 69 85 | 
             
                # 28 29 30 31
         | 
| 70 86 |  | 
| 71 87 | 
             
                context "monday" do
         | 
| 72 | 
            -
                  let(: | 
| 88 | 
            +
                  let(:given) { :mon }
         | 
| 73 89 | 
             
                  it { expect(subject.size).to eq 4 }
         | 
| 74 90 | 
             
                end
         | 
| 75 91 |  | 
| 76 92 | 
             
                context "tuesday" do
         | 
| 77 | 
            -
                  let(: | 
| 93 | 
            +
                  let(:given) { :tue }
         | 
| 78 94 | 
             
                  it { expect(subject.size).to eq 5 }
         | 
| 79 95 | 
             
                end
         | 
| 80 96 | 
             
              end
         | 
| 81 97 |  | 
| 82 98 | 
             
              describe "#cycles" do
         | 
| 83 | 
            -
                subject { month.cycles(* | 
| 99 | 
            +
                subject { month.cycles(*given) }
         | 
| 84 100 | 
             
                let(:month) { described_class.new(12, 2015) }
         | 
| 85 101 | 
             
                # 2015-12
         | 
| 86 102 | 
             
                #     1  2  3  4  5  6
         | 
| @@ -91,7 +107,7 @@ describe Koyomi::Month do | |
| 91 107 |  | 
| 92 108 | 
             
                context "first and third monday, friday" do
         | 
| 93 109 | 
             
                  # 4, 7, 18, 21
         | 
| 94 | 
            -
                  let(: | 
| 110 | 
            +
                  let(:given) { [[1, 3], [:mon, :fri]] }
         | 
| 95 111 | 
             
                  its(:size)  { is_expected.to eq 4 }
         | 
| 96 112 | 
             
                  its(:first) { is_expected.to eq Date.new(2015, 12, 4) }
         | 
| 97 113 | 
             
                  its(:last)  { is_expected.to eq Date.new(2015, 12, 21) }
         | 
| @@ -99,10 +115,129 @@ describe Koyomi::Month do | |
| 99 115 |  | 
| 100 116 | 
             
                context "every monday, thursday" do
         | 
| 101 117 | 
             
                  # 3, 7, 10, 14, 17, 21, 24, 28, 31
         | 
| 102 | 
            -
                  let(: | 
| 118 | 
            +
                  let(:given) { [:every, [:mon, :thu]] }
         | 
| 103 119 | 
             
                  its(:size)  { is_expected.to eq 9 }
         | 
| 104 120 | 
             
                  its(:first) { is_expected.to eq Date.new(2015, 12, 3) }
         | 
| 105 121 | 
             
                  its(:last)  { is_expected.to eq Date.new(2015, 12, 31) }
         | 
| 106 122 | 
             
                end
         | 
| 107 123 | 
             
              end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
              describe "#first" do
         | 
| 126 | 
            +
                subject { month.first }
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                context "given 2015-12" do
         | 
| 129 | 
            +
                  let(:month) { described_class.new(12, 2015) }
         | 
| 130 | 
            +
                  it { expect(subject.day).to eq 1 }
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
              end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
              describe "#last" do
         | 
| 135 | 
            +
                subject { month.last }
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                context "given 2015-12" do
         | 
| 138 | 
            +
                  let(:month) { described_class.new(12, 2015) }
         | 
| 139 | 
            +
                  it { expect(subject.day).to eq 31 }
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
              describe "#date" do
         | 
| 144 | 
            +
                let(:month) { described_class.new(*given) }
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                context "2015-11" do
         | 
| 147 | 
            +
                  let(:given) { [11, 2015] }
         | 
| 148 | 
            +
                  it { expect(month.date(1)).to eq Date.new(2015, 11, 1) }
         | 
| 149 | 
            +
                  it { expect(month._1).to eq Date.new(2015, 11, 1) }
         | 
| 150 | 
            +
                end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                context "2015-02" do
         | 
| 153 | 
            +
                  let(:given) { [2, 2015] }
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                  context "day 28" do
         | 
| 156 | 
            +
                    let(:day) { 28 }
         | 
| 157 | 
            +
                    let(:expected) { Date.new(2015, 2, day) }
         | 
| 158 | 
            +
                    it { expect(month.date(day)).to eq expected }
         | 
| 159 | 
            +
                    it { expect(month._28).to eq expected }
         | 
| 160 | 
            +
                  end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  context "day 29" do
         | 
| 163 | 
            +
                    let(:day) { 29 }
         | 
| 164 | 
            +
                    let(:expected) { Koyomi::WrongRangeError }
         | 
| 165 | 
            +
                    it { expect { month.date(day) }.to raise_error(expected) }
         | 
| 166 | 
            +
                    it { expect { month._29 }.to raise_error(expected) }
         | 
| 167 | 
            +
                  end
         | 
| 168 | 
            +
                end
         | 
| 169 | 
            +
              end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
              describe "#calendar" do
         | 
| 172 | 
            +
                let(:month) { described_class.new(*given) }
         | 
| 173 | 
            +
                context "week start not given" do
         | 
| 174 | 
            +
                  subject { month.calendar() }
         | 
| 175 | 
            +
                  context "2015-11" do
         | 
| 176 | 
            +
                    # 2015-11 month
         | 
| 177 | 
            +
                    #                    1
         | 
| 178 | 
            +
                    #  2  3  4  5  6  7  8
         | 
| 179 | 
            +
                    #  9 10 11 12 13 14 15
         | 
| 180 | 
            +
                    # 16 17 18 19 20 21 22
         | 
| 181 | 
            +
                    # 23 24 25 26 27 28 29
         | 
| 182 | 
            +
                    # 30
         | 
| 183 | 
            +
                    #
         | 
| 184 | 
            +
                    # expected calendar
         | 
| 185 | 
            +
                    # 2015-10 ~ 2015-12
         | 
| 186 | 
            +
                    # 26 27 28 29 30 31  1
         | 
| 187 | 
            +
                    #  2  3  4  5  6  7  8
         | 
| 188 | 
            +
                    #  9 10 11 12 13 14 15
         | 
| 189 | 
            +
                    # 16 17 18 19 20 21 22
         | 
| 190 | 
            +
                    # 23 24 25 26 27 28 29
         | 
| 191 | 
            +
                    # 30  1  2  3  4  5  6
         | 
| 192 | 
            +
                    #
         | 
| 193 | 
            +
                    let(:given) { [11, 2015] }
         | 
| 194 | 
            +
                    it { is_expected.to be_kind_of Koyomi::Calendar }
         | 
| 195 | 
            +
                    describe "calendar attributes" do
         | 
| 196 | 
            +
                      let(:expected_wday) { Koyomi::Week.windex(Koyomi::Week::DEFAULT_START) }
         | 
| 197 | 
            +
                      its("#year") { expect(subject.year).to  eq 2015 }
         | 
| 198 | 
            +
                      its("#month") { expect(subject.month).to eq 11 }
         | 
| 199 | 
            +
                      its("#week_start") { expect(subject.week_start).to eq expected_wday }
         | 
| 200 | 
            +
                      its("#first") { expect(subject.first).to eq Date.new(2015, 10, 26) }
         | 
| 201 | 
            +
                      its("#last") { expect(subject.last).to  eq Date.new(2015, 12, 6) }
         | 
| 202 | 
            +
                    end
         | 
| 203 | 
            +
                  end
         | 
| 204 | 
            +
                end
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                context "week start sunday" do
         | 
| 207 | 
            +
                  subject { month.calendar(week_start) }
         | 
| 208 | 
            +
                  let(:week_start) { :sun }
         | 
| 209 | 
            +
                  context "2015-11" do
         | 
| 210 | 
            +
                    # 2015-11 month
         | 
| 211 | 
            +
                    #  1  2  3  4  5  6  7
         | 
| 212 | 
            +
                    #  8  9 10 11 12 13 14
         | 
| 213 | 
            +
                    # 15 16 17 18 19 20 21
         | 
| 214 | 
            +
                    # 22 23 24 25 26 27 28
         | 
| 215 | 
            +
                    # 29 30
         | 
| 216 | 
            +
                    #
         | 
| 217 | 
            +
                    # expected calendar
         | 
| 218 | 
            +
                    # 2015-11 ~ 2015-12
         | 
| 219 | 
            +
                    #  1  2  3  4  5  6  7
         | 
| 220 | 
            +
                    #  8  9 10 11 12 13 14
         | 
| 221 | 
            +
                    # 15 16 17 18 19 20 21
         | 
| 222 | 
            +
                    # 22 23 24 25 26 27 28
         | 
| 223 | 
            +
                    # 29 30  1  2  3  4  5
         | 
| 224 | 
            +
                    #
         | 
| 225 | 
            +
                    let(:given) { [11, 2015] }
         | 
| 226 | 
            +
                    it { is_expected.to be_kind_of Koyomi::Calendar }
         | 
| 227 | 
            +
                    describe "calendar attributes" do
         | 
| 228 | 
            +
                      let(:expected_wday) { Koyomi::Week::WDAYS.index(week_start) }
         | 
| 229 | 
            +
                      its("#year") { expect(subject.year).to  eq 2015 }
         | 
| 230 | 
            +
                      its("#month") { expect(subject.month).to eq 11 }
         | 
| 231 | 
            +
                      its("#week_start") { expect(subject.week_start).to eq expected_wday }
         | 
| 232 | 
            +
                      its("#first") { expect(subject.first).to eq Date.new(2015, 11, 1) }
         | 
| 233 | 
            +
                      its("#last") { expect(subject.last).to  eq Date.new(2015, 12, 5) }
         | 
| 234 | 
            +
                    end
         | 
| 235 | 
            +
                  end
         | 
| 236 | 
            +
                end
         | 
| 237 | 
            +
              end
         | 
| 238 | 
            +
             | 
| 239 | 
            +
              describe "#cycle" do
         | 
| 240 | 
            +
                subject { month.cycle }
         | 
| 241 | 
            +
                it { is_expected.to be_kind_of(Koyomi::MonthCycle) }
         | 
| 242 | 
            +
              end
         | 
| 108 243 | 
             
            end
         | 
| @@ -0,0 +1,102 @@ | |
| 1 | 
            +
            require "koyomi_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Koyomi::Year do
         | 
| 4 | 
            +
              let(:year) { described_class.new(*given) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe ".of" do
         | 
| 7 | 
            +
                subject { year }
         | 
| 8 | 
            +
                let(:year) { described_class.of(*given) }
         | 
| 9 | 
            +
                let!(:today) { Date.today }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                context "given nothing" do
         | 
| 12 | 
            +
                  let(:given) { }
         | 
| 13 | 
            +
                  it { expect(subject.year).to eq today.year }
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                context "given today" do
         | 
| 17 | 
            +
                  let(:given) { today }
         | 
| 18 | 
            +
                  it { expect(subject.year).to eq today.year }
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                context "given next year's first" do
         | 
| 22 | 
            +
                  let(:given) { Date.new(today.year + 1, 1, 1) }
         | 
| 23 | 
            +
                  it { expect(subject.year).to eq (today.year + 1)}
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                context "given prev year's first" do
         | 
| 27 | 
            +
                  let(:given) { Date.new(today.year - 1, 1, 1) }
         | 
| 28 | 
            +
                  it { expect(subject.year).to eq (today.year - 1)}
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              describe "#first" do
         | 
| 33 | 
            +
                subject { year.first }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                context "given year 2015" do
         | 
| 36 | 
            +
                  let(:given) { 2015 }
         | 
| 37 | 
            +
                  it { is_expected.to eq Date.new(2015, 1, 1) }
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              describe "#last" do
         | 
| 42 | 
            +
                subject { year.last }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                context "given year 2015" do
         | 
| 45 | 
            +
                  let(:given) { 2015 }
         | 
| 46 | 
            +
                  it { is_expected.to eq Date.new(2015, 12, 31) }
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              describe "month mothods" do
         | 
| 51 | 
            +
                (1..12).each do |month|
         | 
| 52 | 
            +
                  context "given month #{month}" do
         | 
| 53 | 
            +
                    let(:given) { month }
         | 
| 54 | 
            +
                    subject { year.__send__("_#{month}") }
         | 
| 55 | 
            +
                    it { is_expected.to be_kind_of(Koyomi::Month) }
         | 
| 56 | 
            +
                    describe "its month" do
         | 
| 57 | 
            +
                      it { expect(subject.month).to eq month }
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              describe "#month" do
         | 
| 64 | 
            +
                subject { year.month(given) }
         | 
| 65 | 
            +
                (1..12).each do |month|
         | 
| 66 | 
            +
                  context "given #{month}" do
         | 
| 67 | 
            +
                    let(:given) { month }
         | 
| 68 | 
            +
                    it { is_expected.to be_kind_of(Koyomi::Month) }
         | 
| 69 | 
            +
                    describe "its month" do
         | 
| 70 | 
            +
                      it { expect(subject.month).to eq month }
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              [:uruu?, :leap?].each do |method|
         | 
| 77 | 
            +
                describe "##{method}" do
         | 
| 78 | 
            +
                  subject { year.__send__(method) }
         | 
| 79 | 
            +
                  let(:year) { described_class.new(given) }
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  context "given year 1999" do
         | 
| 82 | 
            +
                    let(:given) { 1999 }
         | 
| 83 | 
            +
                    it { is_expected.to be_falsy }
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  context "given year 2000" do
         | 
| 87 | 
            +
                    let(:given) { 2000 }
         | 
| 88 | 
            +
                    it { is_expected.to be_truthy }
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                  context "given year 2004" do
         | 
| 92 | 
            +
                    let(:given) { 2004 }
         | 
| 93 | 
            +
                    it { is_expected.to be_truthy }
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  context "given year 2100" do
         | 
| 97 | 
            +
                    let(:given) { 2100 }
         | 
| 98 | 
            +
                    it { is_expected.to be_falsy }
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            require "koyomi_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe Koyomi do
         | 
| 4 | 
            +
              describe ".year" do
         | 
| 5 | 
            +
                subject { described_class.year(*given) }
         | 
| 6 | 
            +
                context "given 2015" do
         | 
| 7 | 
            +
                  let(:given) { 2015 }
         | 
| 8 | 
            +
                  it { is_expected.to be_kind_of(Koyomi::Year) }
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              describe "._ year" do
         | 
| 13 | 
            +
                context "given 2015" do
         | 
| 14 | 
            +
                  subject { described_class._2015 }
         | 
| 15 | 
            +
                  it { is_expected.to be_kind_of(Koyomi::Year)}
         | 
| 16 | 
            +
                  it { expect(subject.year).to eq 2015 }
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: koyomi
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - sekizo
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015-11- | 
| 11 | 
            +
            date: 2015-11-25 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rspec
         | 
| @@ -71,21 +71,29 @@ files: | |
| 71 71 | 
             
            - koyomi.gemspec
         | 
| 72 72 | 
             
            - lib/koyomi.rb
         | 
| 73 73 | 
             
            - lib/koyomi/calendar.rb
         | 
| 74 | 
            +
            - lib/koyomi/error.rb
         | 
| 75 | 
            +
            - lib/koyomi/error/wrong_range_error.rb
         | 
| 74 76 | 
             
            - lib/koyomi/helper.rb
         | 
| 75 77 | 
             
            - lib/koyomi/helper/date.rb
         | 
| 76 78 | 
             
            - lib/koyomi/helper/init.rb
         | 
| 77 79 | 
             
            - lib/koyomi/helper/week.rb
         | 
| 78 80 | 
             
            - lib/koyomi/init.rb
         | 
| 79 81 | 
             
            - lib/koyomi/month.rb
         | 
| 82 | 
            +
            - lib/koyomi/month_cycle.rb
         | 
| 80 83 | 
             
            - lib/koyomi/period.rb
         | 
| 81 84 | 
             
            - lib/koyomi/version.rb
         | 
| 82 85 | 
             
            - lib/koyomi/week.rb
         | 
| 86 | 
            +
            - lib/koyomi/year.rb
         | 
| 87 | 
            +
            - spec/feature/koyomi_sequence_spec.rb
         | 
| 83 88 | 
             
            - spec/koyomi_helper.rb
         | 
| 84 89 | 
             
            - spec/lib/koyomi/calendar_spec.rb
         | 
| 85 90 | 
             
            - spec/lib/koyomi/date_spec.rb
         | 
| 91 | 
            +
            - spec/lib/koyomi/month_cycle_spec.rb
         | 
| 86 92 | 
             
            - spec/lib/koyomi/month_spec.rb
         | 
| 87 93 | 
             
            - spec/lib/koyomi/version_spec.rb
         | 
| 88 94 | 
             
            - spec/lib/koyomi/week_spec.rb
         | 
| 95 | 
            +
            - spec/lib/koyomi/year_spec.rb
         | 
| 96 | 
            +
            - spec/lib/koyomi_spec.rb
         | 
| 89 97 | 
             
            - spec/spec_helper.rb
         | 
| 90 98 | 
             
            homepage: ''
         | 
| 91 99 | 
             
            licenses:
         | 
| @@ -112,10 +120,14 @@ signing_key: | |
| 112 120 | 
             
            specification_version: 4
         | 
| 113 121 | 
             
            summary: Add some classes to handle year, month, period.
         | 
| 114 122 | 
             
            test_files:
         | 
| 123 | 
            +
            - spec/feature/koyomi_sequence_spec.rb
         | 
| 115 124 | 
             
            - spec/koyomi_helper.rb
         | 
| 116 125 | 
             
            - spec/lib/koyomi/calendar_spec.rb
         | 
| 117 126 | 
             
            - spec/lib/koyomi/date_spec.rb
         | 
| 127 | 
            +
            - spec/lib/koyomi/month_cycle_spec.rb
         | 
| 118 128 | 
             
            - spec/lib/koyomi/month_spec.rb
         | 
| 119 129 | 
             
            - spec/lib/koyomi/version_spec.rb
         | 
| 120 130 | 
             
            - spec/lib/koyomi/week_spec.rb
         | 
| 131 | 
            +
            - spec/lib/koyomi/year_spec.rb
         | 
| 132 | 
            +
            - spec/lib/koyomi_spec.rb
         | 
| 121 133 | 
             
            - spec/spec_helper.rb
         |