cal 0.5.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -24,6 +24,28 @@ Cal is a simple calendar structure. It **does not** render a calendar. It **does
24
24
 
25
25
  See the Rails app [https://github.com/austinthecoder/cal-app](https://github.com/austinthecoder/cal-app) for an example.
26
26
 
27
+ ### API
28
+
29
+ ``` ruby
30
+ calendar = Cal::MonthlyCalendar.new 2012, 11, :start_week_on => :monday
31
+
32
+ calendar.month # a Cal::Month
33
+
34
+ calendar.first_day # a Cal::Day representing the first day on the calendar, might be in the previous month
35
+
36
+ calendar.last_day # a Cal::Day representing the last day on the calendar, might be in the next month
37
+
38
+ calendar.days # a Range of Cal::Day's from the first day to the last
39
+
40
+ calendar.weeks # an Array of Cal::Day Arrays
41
+
42
+ calendar.previous # the calendar for the previous month
43
+
44
+ calendar.next # the calendar for the next month
45
+
46
+ calendar.day_names # an Array of the day names, e.g. ['Sunday', 'Monday', ...], depends on the `:start_week_on` option
47
+ ```
48
+
27
49
  ### Rails example
28
50
 
29
51
  ``` ruby
@@ -37,7 +59,7 @@ calendar = Cal::MonthlyCalendar.from_param params[:month], :start_week_on => :mo
37
59
  %h3
38
60
  = link_to 'Previous month', calendar_path(calendar.previous)
39
61
  |
40
- = "#{calendar.month} #{calendar.year}"
62
+ = "#{calendar.month.to_s "%B"} #{calendar.year}"
41
63
  |
42
64
  = link_to 'Next month', calendar_path(calendar.next)
43
65
 
@@ -60,4 +82,4 @@ calendar = Cal::MonthlyCalendar.from_param params[:month], :start_week_on => :mo
60
82
  2. Create your feature branch (`git checkout -b my-new-feature`)
61
83
  3. Commit your changes (`git commit -am 'Added some feature'`)
62
84
  4. Push to the branch (`git push origin my-new-feature`)
63
- 5. Create new Pull Request
85
+ 5. Create new Pull Request
data/lib/cal.rb CHANGED
@@ -6,5 +6,12 @@ module Cal
6
6
  autoload :MonthlyCalendar, 'cal/monthly_calendar'
7
7
  autoload :Day, 'cal/day'
8
8
  autoload :Month, 'cal/month'
9
+ autoload :DayName, 'cal/day_name'
10
+
11
+ class << self
12
+ def new_monthly_calendar(*args)
13
+ MonthlyCalendar.new *args
14
+ end
15
+ end
9
16
 
10
17
  end
@@ -0,0 +1,73 @@
1
+ module Cal
2
+ class DayName
3
+
4
+ class << self
5
+ def all(options = {})
6
+ if options[:start_on]
7
+ sunday_to_saturday.rotate(send(options[:start_on].to_s.downcase.to_sym).position - 1)
8
+ else
9
+ sunday_to_saturday
10
+ end
11
+ end
12
+
13
+ def sunday
14
+ @sunday ||= new :sunday, 'Sunday', 1
15
+ end
16
+
17
+ def monday
18
+ @monday ||= new :monday, 'Monday', 2
19
+ end
20
+
21
+ def tuesday
22
+ @tuesday ||= new :tuesday, 'Tuesday', 3
23
+ end
24
+
25
+ def wednesday
26
+ @wednesday ||= new :wednesday, 'Wednesday', 4
27
+ end
28
+
29
+ def thursday
30
+ @thursday ||= new :thursday, 'Thursday', 5
31
+ end
32
+
33
+ def friday
34
+ @friday ||= new :friday, 'Friday', 6
35
+ end
36
+
37
+ def saturday
38
+ @saturday ||= new :saturday, 'Saturday', 7
39
+ end
40
+
41
+ private
42
+
43
+ def sunday_to_saturday
44
+ @sunday_to_saturday ||= [sunday, monday, tuesday, wednesday, thursday, friday, saturday]
45
+ end
46
+ end
47
+
48
+ private_class_method :new
49
+
50
+ def initialize(symbol, string, position)
51
+ @to_sym = symbol
52
+ @to_s = string
53
+ @position = position
54
+ end
55
+
56
+ attr_reader :to_sym, :to_s, :position
57
+
58
+ def succ
59
+ self.class.all.detect do |day_name|
60
+ day_name.position == (position < 7 ? position + 1 : 1)
61
+ end
62
+ end
63
+
64
+ alias_method :next, :succ
65
+
66
+ def previous
67
+ self.class.all.detect do |day_name|
68
+ day_name.position == (position > 1 ? position - 1 : 7)
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -6,16 +6,6 @@ module Cal
6
6
 
7
7
  include Comparable
8
8
 
9
- DAY_NAMES = {
10
- :sunday => 0,
11
- :monday => 1,
12
- :tuesday => 2,
13
- :wednesday => 3,
14
- :thursday => 4,
15
- :friday => 5,
16
- :saturday => 6
17
- }
18
-
19
9
  class << self
20
10
  def from_month(month, options = {})
21
11
  month = month.to_month
@@ -79,7 +69,7 @@ module Cal
79
69
  end
80
70
 
81
71
  def day_names
82
- %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday].rotate DAY_NAMES[start_week_on]
72
+ @day_names ||= DayName.all :start_on => start_week_on
83
73
  end
84
74
 
85
75
  def to_param
@@ -1,5 +1,5 @@
1
1
  module Cal
2
2
 
3
- VERSION = "0.5.1"
3
+ VERSION = "0.6.1"
4
4
 
5
5
  end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cal::DayName do
4
+
5
+ describe "class method" do
6
+ subject { described_class }
7
+
8
+ describe "all" do
9
+ it "returns all the days, starting with sunday" do
10
+ subject.all.should == [
11
+ subject.sunday,
12
+ subject.monday,
13
+ subject.tuesday,
14
+ subject.wednesday,
15
+ subject.thursday,
16
+ subject.friday,
17
+ subject.saturday
18
+ ]
19
+ end
20
+
21
+ it "when given a day name symbol as the :start_on option, it starts the week on that day" do
22
+ subject.all(:start_on => :tuesday).should == [
23
+ subject.tuesday,
24
+ subject.wednesday,
25
+ subject.thursday,
26
+ subject.friday,
27
+ subject.saturday,
28
+ subject.sunday,
29
+ subject.monday
30
+ ]
31
+ end
32
+
33
+ it "accepts the :start_on option in various formats" do
34
+ [:tuesday, 'Tuesday', 'tuesday'].each do |start_on|
35
+ subject.all(:start_on => start_on).should == [
36
+ subject.tuesday,
37
+ subject.wednesday,
38
+ subject.thursday,
39
+ subject.friday,
40
+ subject.saturday,
41
+ subject.sunday,
42
+ subject.monday
43
+ ]
44
+ end
45
+ end
46
+
47
+ it "without the :start_on option, it returns the same object" do
48
+ subject.all.equal?(subject.all).should be_true
49
+ end
50
+ end
51
+
52
+ it "doesn't allow direct initialization" do
53
+ expect { subject.new }.to raise_error NoMethodError
54
+ end
55
+ end
56
+
57
+ describe "instance method" do
58
+ [
59
+ [:sunday, 'Sunday', 1],
60
+ [:monday, 'Monday', 2],
61
+ [:tuesday, 'Tuesday', 3],
62
+ [:wednesday, 'Wednesday', 4],
63
+ [:thursday, 'Thursday', 5],
64
+ [:friday, 'Friday', 6],
65
+ [:saturday, 'Saturday', 7]
66
+ ].each do |day, string, position|
67
+ context "when the day is #{day}" do
68
+ subject { described_class.send day }
69
+
70
+ it "is the same instance as another #{day}" do
71
+ subject.equal?(described_class.send(day)).should be_true
72
+ end
73
+
74
+ describe "to_sym" do
75
+ it "is #{day.inspect}" do
76
+ subject.to_sym.should == day
77
+ end
78
+ end
79
+
80
+ describe "to_s" do
81
+ it "is #{string.inspect}" do
82
+ subject.to_s.should == string
83
+ end
84
+ end
85
+
86
+ describe "position" do
87
+ it "is #{position.inspect}" do
88
+ subject.position.should == position
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "succ" do
95
+ [
96
+ [:sunday, :monday],
97
+ [:monday, :tuesday],
98
+ [:tuesday, :wednesday],
99
+ [:wednesday, :thursday],
100
+ [:thursday, :friday],
101
+ [:friday, :saturday],
102
+ [:saturday, :sunday]
103
+ ].each do |day, next_day|
104
+ it "is #{next_day} when the say is #{day}" do
105
+ described_class.send(day).succ.should == described_class.send(next_day)
106
+ end
107
+ end
108
+ end
109
+
110
+ describe "next" do
111
+ it "is an alias of #succ" do
112
+ day_name = described_class.friday
113
+ day_name.next.should == day_name.succ
114
+ end
115
+ end
116
+
117
+ describe "previous" do
118
+ [
119
+ [:sunday, :saturday],
120
+ [:monday, :sunday],
121
+ [:tuesday, :monday],
122
+ [:wednesday, :tuesday],
123
+ [:thursday, :wednesday],
124
+ [:friday, :thursday],
125
+ [:saturday, :friday]
126
+ ].each do |day, previous_day|
127
+ it "is #{previous_day} when the say is #{day}" do
128
+ described_class.send(day).previous.should == described_class.send(previous_day)
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ end
@@ -172,20 +172,28 @@ describe Cal::MonthlyCalendar do
172
172
 
173
173
  describe "day_names" do
174
174
  it "defaults to sunday through saturday" do
175
- subject.day_names.should == %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday]
175
+ subject.day_names.should == [
176
+ Cal::DayName.sunday,
177
+ Cal::DayName.monday,
178
+ Cal::DayName.tuesday,
179
+ Cal::DayName.wednesday,
180
+ Cal::DayName.thursday,
181
+ Cal::DayName.friday,
182
+ Cal::DayName.saturday
183
+ ]
176
184
  end
177
185
 
178
186
  [
179
- %w[Monday Tuesday Wednesday Thursday Friday Saturday Sunday],
180
- %w[Tuesday Wednesday Thursday Friday Saturday Sunday Monday],
181
- %w[Wednesday Thursday Friday Saturday Sunday Monday Tuesday],
182
- %w[Thursday Friday Saturday Sunday Monday Tuesday Wednesday],
183
- %w[Friday Saturday Sunday Monday Tuesday Wednesday Thursday],
184
- %w[Saturday Sunday Monday Tuesday Wednesday Thursday Friday]
187
+ [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday],
188
+ [:tuesday, :wednesday, :thursday, :friday, :saturday, :sunday, :monday],
189
+ [:wednesday, :thursday, :friday, :saturday, :sunday, :monday, :tuesday],
190
+ [:thursday, :friday, :saturday, :sunday, :monday, :tuesday, :wednesday],
191
+ [:friday, :saturday, :sunday, :monday, :tuesday, :wednesday, :thursday],
192
+ [:saturday, :sunday, :monday, :tuesday, :wednesday, :thursday, :friday]
185
193
  ].each do |day_names|
186
194
  it "is #{day_names[0]} through #{day_names[6]} when the weekday is set to start on #{day_names[0]}" do
187
- @options[:start_week_on] = day_names[0].downcase.to_sym
188
- subject.day_names.should == day_names
195
+ @options[:start_week_on] = day_names[0]
196
+ subject.day_names.should == day_names.map { |dn| Cal::DayName.send dn }
189
197
  end
190
198
  end
191
199
  end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cal do
4
+ subject { described_class }
5
+
6
+ describe "new_monthly_calendar" do
7
+ it "creates a new monthly calendar with the given args" do
8
+ @args = [1, 2, 3]
9
+ monthly_calendar = Object.new
10
+ Cal::MonthlyCalendar.stub :new do |*args|
11
+ monthly_calendar if args == @args
12
+ end
13
+ subject.new_monthly_calendar(*@args).should == monthly_calendar
14
+ end
15
+ end
16
+
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.1
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-06-13 00:00:00.000000000 Z
12
+ date: 2012-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -59,12 +59,15 @@ files:
59
59
  - cal.gemspec
60
60
  - lib/cal.rb
61
61
  - lib/cal/day.rb
62
+ - lib/cal/day_name.rb
62
63
  - lib/cal/month.rb
63
64
  - lib/cal/monthly_calendar.rb
64
65
  - lib/cal/version.rb
66
+ - spec/cal/day_name_spec.rb
65
67
  - spec/cal/day_spec.rb
66
68
  - spec/cal/month_spec.rb
67
69
  - spec/cal/monthly_calendar_spec.rb
70
+ - spec/cal_spec.rb
68
71
  - spec/spec_helper.rb
69
72
  homepage: https://github.com/austinthecoder/cal
70
73
  licenses: []
@@ -91,7 +94,9 @@ signing_key:
91
94
  specification_version: 3
92
95
  summary: A low level calendar engine.
93
96
  test_files:
97
+ - spec/cal/day_name_spec.rb
94
98
  - spec/cal/day_spec.rb
95
99
  - spec/cal/month_spec.rb
96
100
  - spec/cal/monthly_calendar_spec.rb
101
+ - spec/cal_spec.rb
97
102
  - spec/spec_helper.rb