koyomi 0.0.2.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Koyomi
2
2
 
3
- TODO: Write a gem description
3
+ Extends Date class to handling with calendar.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,7 +18,20 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ Handling calendar by this gem.
22
+
23
+ require "koyomi"
24
+ cal = Koyomi::Calendar.new(2012, 12, :mon)
25
+ cal.first.to_s # => "2012-11-26"
26
+
27
+ month = cal.the_month
28
+ month.first.to_s # => "2012-12-01"
29
+
30
+ week = Koyomi::Week.new(month.first, :tue)
31
+ week.first.to_s # => "2012-11-27"
32
+
33
+ cal.first.week_end? # => false
34
+ cal.first.week_end?(:tue) # => true
22
35
 
23
36
  ## Contributing
24
37
 
data/Rakefile CHANGED
@@ -1,9 +1,21 @@
1
+ # encoding: utf-8
1
2
  require "bundler/gem_tasks"
3
+ require "rake/testtask"
2
4
 
3
5
  $: << File.expand_path("../lib", __FILE__)
4
6
 
5
- desc "Test units"
6
- task :test do |t|
7
- require File.expand_path("../test/init", __FILE__)
8
- require File.expand_path("../test/units", __FILE__)
7
+ task :default do
8
+ sh "rake -T"
9
9
  end
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.libs << "test"
13
+ t.test_files = FileList["test/**/test_*.rb"]
14
+ end
15
+
16
+ namespace :test do
17
+ Rake::TestTask.new(:units) do |t|
18
+ t.libs << "test"
19
+ t.test_files = FileList["test/units/**/test_*.rb"]
20
+ end
21
+ end
data/koyomi.gemspec CHANGED
@@ -11,6 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.description = %q{Extends Date class to handling with calendar.}
12
12
  gem.summary = %q{Add some classes to handle year, month, period.}
13
13
  gem.homepage = ""
14
+ gem.license = 'MIT'
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
data/lib/koyomi.rb CHANGED
@@ -5,6 +5,7 @@ require "koyomi/version"
5
5
 
6
6
  require "koyomi/period"
7
7
  require "koyomi/month"
8
+ require "koyomi/week"
8
9
  require "koyomi/calendar"
9
10
  require "koyomi/helper"
10
11
 
@@ -2,17 +2,10 @@
2
2
 
3
3
  require "koyomi/period"
4
4
  require "koyomi/month"
5
+ require "koyomi/helper/week"
5
6
 
6
7
  class Koyomi::Calendar < Koyomi::Period
7
- #--------------------#
8
- # constant
9
- DEFAULT_WEEK_START = :mon
10
- WEEK_DAYS = 7
11
- WEEK_START_RANGE = (0..6)
12
- WEEK_START_STRING = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
13
-
14
- #--------------------#
15
- # class methods
8
+ include Koyomi::Helper::Week
16
9
 
17
10
  # create Koyomi::Calendar instance from date.
18
11
  #
@@ -23,35 +16,6 @@ class Koyomi::Calendar < Koyomi::Period
23
16
  self.new(date.year, date.month, week_start)
24
17
  end
25
18
 
26
- # week index
27
- #
28
- # @param [Object] value
29
- # @return [Integer]
30
- def self.windex(value)
31
- case value
32
- when Numeric
33
- index = value
34
- when Date
35
- index = value.wday
36
- when String, Symbol
37
- value = value.to_s.downcase[0, 3].to_sym
38
- raise "Range invalid, required #{WEEK_START_STRING}." unless WEEK_START_STRING.include?(value)
39
- index = WEEK_START_STRING.index(value)
40
- else
41
- index = value.to_s.to_i
42
- end
43
- raise "Range overflow, required (#{WEEK_START_RANGE})." unless WEEK_START_RANGE.cover?(index)
44
- index
45
- end
46
-
47
- # week label
48
- #
49
- # @param [Object] value
50
- # @return [Symbol]
51
- def self.wlabel(value)
52
- WEEK_START_STRING.at(self.windex(value))
53
- end
54
-
55
19
  #--------------------#
56
20
  # instance methods
57
21
  attr_reader :year, :month, :koyomi_month
@@ -82,14 +46,14 @@ class Koyomi::Calendar < Koyomi::Period
82
46
  #
83
47
  # @return [Date]
84
48
  def first
85
- week_starts(self.koyomi_month.first, self.week_start)
49
+ Koyomi::Week.new(self.koyomi_month.first, self.week_start).first
86
50
  end
87
51
 
88
52
  # last date of the calendar (NOT last date of the MONTH)
89
53
  #
90
54
  # @return [Date]
91
55
  def last
92
- week_ends(self.koyomi_month.last, self.week_start)
56
+ Koyomi::Week.new(self.koyomi_month.last, self.week_start).last
93
57
  end
94
58
 
95
59
  # range of the calendar.
@@ -110,27 +74,4 @@ class Koyomi::Calendar < Koyomi::Period
110
74
  protected
111
75
 
112
76
  attr_writer :year, :month, :koyomi_month
113
-
114
- #--------------------#
115
- private
116
-
117
- # week start date
118
- #
119
- # @param [Date] date
120
- # @param [Object] week_start
121
- # @return [Date]
122
- def week_starts(date, week_start = nil)
123
- week_start ||= self.week_start
124
- diff = date.wday - self.class.windex(week_start)
125
- date - diff - (diff < 0 ? WEEK_DAYS : 0)
126
- end
127
-
128
- # week end date
129
- #
130
- # @param [Date] date
131
- # @param [Object] week_start
132
- # @return [Date]
133
- def week_ends(date, week_start = nil)
134
- week_starts(date, week_start) + WEEK_DAYS - 1
135
- end
136
77
  end
data/lib/koyomi/helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require "koyomi/helper/init"
4
+ require "koyomi/helper/week"
4
5
  require "koyomi/helper/date"
5
6
 
6
7
  module Koyomi::Helper
@@ -1,28 +1,31 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require "date"
4
- require "koyomi/calendar"
5
-
6
- module Koyomi::Helper::Date
7
- # check week end?
8
- #
9
- # @param [Date] date
10
- # @param [Object] week_start
11
- # @return [Boolean]
12
- def week_ends?(date, week_start = nil)
13
- week_start ||= Koyomi::Calendar::DEFAULT_WEEK_START
14
- (date + 1).wday == Koyomi::Calendar.windex(week_start)
15
- end
16
- end
4
+ require "koyomi/helper/init"
5
+ require "koyomi/helper/week"
17
6
 
18
7
  class Date
19
- include Koyomi::Helper::Date
8
+ include Koyomi::Helper::Week
20
9
 
21
10
  # check week end?
22
11
  #
23
12
  # @param [Object] week_start
24
13
  # @return [Boolean]
25
14
  def week_end?(week_start = nil)
26
- week_ends?(self, week_start)
15
+ self.class.week_ends?(self, week_start)
16
+ end
17
+
18
+ # week day index
19
+ #
20
+ # @return [Integer]
21
+ def windex
22
+ self.class.windex(self)
23
+ end
24
+
25
+ # week day name
26
+ #
27
+ # @return [Symbol]
28
+ def wday_name
29
+ self.class.wday_name(self)
27
30
  end
28
31
  end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ require "koyomi/helper/init"
4
+ require "koyomi/week"
5
+
6
+ module Koyomi::Helper::Week
7
+ DEFAULT_WEEK_START = Koyomi::Week::DEFAULT_START
8
+ WEEK_WDAYS = Koyomi::Week::WDAYS
9
+ WEEK_DAYS = Koyomi::Week::DAYS
10
+ WEEK_START_RANGE = Koyomi::Week::START_RANGE
11
+
12
+ def self.included(mod)
13
+ mod.class_eval do
14
+ extend Koyomi::Helper::Week::ClassMethod
15
+ end
16
+ end
17
+
18
+ module ClassMethod
19
+ # week index
20
+ #
21
+ # @param [Object] value
22
+ # @return [Integer]
23
+ def windex(value)
24
+ Koyomi::Week.windex(value)
25
+ end
26
+
27
+ # week day name
28
+ #
29
+ # @param [Object] value
30
+ # @return [Symbol]
31
+ def wday_name(value)
32
+ Koyomi::Week.wday_name(value)
33
+ end
34
+
35
+ # week end?
36
+ #
37
+ # @param [Date] date
38
+ # @param [Object] week_start week start
39
+ # @return [Boolean]
40
+ def week_ends?(date, week_start = nil)
41
+ Koyomi::Week.ends?(date, week_start)
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Koyomi
4
- VERSION = "0.0.2.2"
4
+ VERSION = "0.0.3"
5
5
  end
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+
3
+ require "koyomi/period"
4
+
5
+ class Koyomi::Week < Koyomi::Period
6
+ #--------------------#
7
+ # constants
8
+
9
+ DEFAULT_START = :mon
10
+ WDAYS = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
11
+ DAYS = WDAYS.size
12
+ START_RANGE = (0..(DAYS - 1))
13
+
14
+ #--------------------#
15
+ # attributes
16
+
17
+ #--------------------#
18
+ # class methods
19
+
20
+ # week index
21
+ #
22
+ # @param [Object] value
23
+ # @return [Integer]
24
+ def self.windex(value)
25
+ case value
26
+ when Numeric
27
+ index = value
28
+ when Date
29
+ index = value.wday
30
+ when String, Symbol
31
+ value = value.to_s.downcase[0, 3].to_sym
32
+ raise "Range invalid, required #{WDAYS}." unless WDAYS.include?(value)
33
+ index = WDAYS.index(value)
34
+ else
35
+ index = value.to_s.to_i
36
+ end
37
+ raise "Range overflow, required (#{START_RANGE})." unless START_RANGE.cover?(index)
38
+ index
39
+ end
40
+
41
+ # week day name
42
+ #
43
+ # @param [Object] value
44
+ # @return [Symbol]
45
+ def self.wday_name(value)
46
+ WDAYS.at(self.windex(value))
47
+ end
48
+
49
+ # week starts?
50
+ #
51
+ # @param [Date] date
52
+ # @param [Object] start_wday week start
53
+ # @return [Boolean]
54
+ def self.starts?(date, start_wday = nil)
55
+ start_wday ||= DEFAULT_START
56
+ (date).wday == self.windex(start_wday)
57
+ end
58
+
59
+ # week end?
60
+ #
61
+ # @param [Date] date
62
+ # @param [Object] start_wday week start
63
+ # @return [Boolean]
64
+ def self.ends?(date, start_wday = nil)
65
+ start_wday ||= DEFAULT_START
66
+ (date + 1).wday == self.windex(start_wday)
67
+ end
68
+
69
+ #--------------------#
70
+ # instance methods
71
+
72
+ # initialize method
73
+ #
74
+ # @param [Date] date optional, default use Date.today.
75
+ # @param [Object] start_wday optionail, default use Koyomi::Week::DEFAULT_START
76
+ def initialize(date = nil, start_wday = nil)
77
+ super()
78
+ self.date = date||self.created_at
79
+ self.start_wday = start_wday||DEFAULT_START
80
+ end
81
+
82
+ # sepified week day
83
+ #
84
+ # @param [Object] wday_name
85
+ # @return [Date]
86
+ def wday(wday_name)
87
+ diff = self.class.windex(wday_name) - self.class.windex(self.start_wday)
88
+ factor = diff + ((diff < 0) ? DAYS : 0)
89
+ self.range.first + factor
90
+ end
91
+
92
+ # start date
93
+ #
94
+ # @return [Date] date
95
+ def starts
96
+ self.range.first
97
+ end
98
+
99
+ # end date
100
+ #
101
+ # @return [Date] date
102
+ def ends
103
+ self.range.last
104
+ end
105
+
106
+ #--------------------#
107
+ protected
108
+
109
+ attr_accessor :date
110
+ attr_reader :start_wday
111
+
112
+ # set week starts
113
+ #
114
+ # @param [Object] value
115
+ def start_wday=(value)
116
+ @start_wday = value
117
+ self.setup_range
118
+ @start_wday
119
+ end
120
+
121
+ # setup week range with given week start
122
+ def setup_range
123
+ diff = self.date.wday - self.class.windex(self.start_wday)
124
+ starts = self.date - (diff + ((diff < 0) ? DAYS : 0))
125
+ @range = Range.new(starts, starts + DAYS - 1)
126
+ end
127
+
128
+ #--------------------#
129
+ private
130
+
131
+ def method_missing(name, *args, &block)
132
+ case
133
+ when WDAYS.include?(name.to_s.to_sym)
134
+ self.wday(name,*args, &block)
135
+ else
136
+ super
137
+ end
138
+ end
139
+ end
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require "test/unit"
4
3
  require "shoulda"
5
-
6
- $: << File.expand_path("../test", __FILE__)
7
4
  require File.expand_path("../../lib/koyomi", __FILE__)
5
+
6
+ require "test/unit"
@@ -1,5 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "test_helper"
4
+
3
5
  class TestKoyomiCalendar < Test::Unit::TestCase
4
6
  context "Koyomi::Calendar" do
5
7
  setup do
@@ -1,10 +1,12 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "test_helper"
4
+
3
5
  class TestKoyomiDate < Test::Unit::TestCase
4
6
  context "Koyomi::Date" do
5
7
  setup do
6
8
  @date = Date.new(2012, 12, 16)
7
- @wdays = Koyomi::Calendar::WEEK_START_STRING
9
+ @wdays = Date::WEEK_WDAYS
8
10
  end # setup
9
11
 
10
12
  should "correct week end" do
@@ -1,5 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "test_helper"
4
+
3
5
  class TestKoyomiMonth < Test::Unit::TestCase
4
6
  context "Koyomi::Month" do
5
7
 
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ require "test_helper"
4
+
5
+ class TestKoyomiWeek < Test::Unit::TestCase
6
+ context "Koyomi::Week" do
7
+
8
+ setup do
9
+ @today = Date.today
10
+ @year = @today.year
11
+ @month = @today.month
12
+ end # setup
13
+
14
+ should "generate week instance" do
15
+ assert_nothing_raised(Exception) do
16
+ @week = Koyomi::Week.new(@today, Koyomi::Week::DEFAULT_START)
17
+ end
18
+ end # should "generate week instance"
19
+
20
+ should "calcurate windex" do
21
+ date = Date.new(2012, 12, 23)
22
+ assert(Koyomi::Week.windex(:sun) == (date).wday)
23
+ assert(Koyomi::Week.windex(:mon) == (date + 1).wday)
24
+ assert(Koyomi::Week.windex(:tue) == (date + 2).wday)
25
+ assert(Koyomi::Week.windex(:wed) == (date + 3).wday)
26
+ assert(Koyomi::Week.windex(:thu) == (date + 4).wday)
27
+ assert(Koyomi::Week.windex(:fri) == (date + 5).wday)
28
+ assert(Koyomi::Week.windex(:sat) == (date + 6).wday)
29
+ end
30
+
31
+ should "start specified week day" do
32
+ date = Date.new(2012, 12, 23)
33
+ Koyomi::Week::WDAYS.each do |wday|
34
+ assert_equal(Koyomi::Week.windex(wday), Koyomi::Week.new(date, wday).range.first.wday)
35
+ end
36
+ end
37
+
38
+ should "respond date to request of week day" do
39
+ date = Date.new(2012, 12, 23)
40
+ Koyomi::Week::WDAYS.each do |wday|
41
+ assert_equal(Koyomi::Week.windex(wday), Koyomi::Week.new(date, wday).__send__(wday).wday)
42
+ end
43
+ end
44
+
45
+ end # context "Koyomi::Week"
46
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: koyomi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: shoulda
@@ -45,17 +45,20 @@ files:
45
45
  - lib/koyomi/helper.rb
46
46
  - lib/koyomi/helper/date.rb
47
47
  - lib/koyomi/helper/init.rb
48
+ - lib/koyomi/helper/week.rb
48
49
  - lib/koyomi/init.rb
49
50
  - lib/koyomi/month.rb
50
51
  - lib/koyomi/period.rb
51
52
  - lib/koyomi/version.rb
52
- - test/init.rb
53
- - test/units.rb
53
+ - lib/koyomi/week.rb
54
+ - test/test_helper.rb
54
55
  - test/units/test_calendar.rb
55
56
  - test/units/test_date.rb
56
57
  - test/units/test_month.rb
58
+ - test/units/test_week.rb
57
59
  homepage: ''
58
- licenses: []
60
+ licenses:
61
+ - MIT
59
62
  post_install_message:
60
63
  rdoc_options: []
61
64
  require_paths:
@@ -79,9 +82,9 @@ signing_key:
79
82
  specification_version: 3
80
83
  summary: Add some classes to handle year, month, period.
81
84
  test_files:
82
- - test/init.rb
83
- - test/units.rb
85
+ - test/test_helper.rb
84
86
  - test/units/test_calendar.rb
85
87
  - test/units/test_date.rb
86
88
  - test/units/test_month.rb
89
+ - test/units/test_week.rb
87
90
  has_rdoc:
data/test/units.rb DELETED
@@ -1,5 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.expand_path("../units/test_month", __FILE__)
4
- require File.expand_path("../units/test_calendar", __FILE__)
5
- require File.expand_path("../units/test_date", __FILE__)