cal 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.3
4
+ - 1.9.2
5
+ - jruby
6
+ - rbx
7
+ script: "rake test"
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A low level calendar engine.
4
4
 
5
+ [![Build Status](https://secure.travis-ci.org/austinthecoder/cal.png?branch=master)](http://travis-ci.org/austinthecoder/poser)
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -18,7 +20,37 @@ Or install it yourself as:
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ ### Rails example
24
+
25
+ ``` ruby
26
+ # in the controller
27
+ - calendar = Cal::Ender.new params[:date]
28
+
29
+ # in the view
30
+ %h3
31
+ = link_to 'Previous month', url_for(:date => calendar.previous.date)
32
+ |
33
+ = calendar.month
34
+ |
35
+ = link_to 'Next month', url_for(:date => calendar.next.date)
36
+
37
+ %table
38
+ %thead
39
+ %tr
40
+ %th Sunday
41
+ %th Monday
42
+ %th Tuesday
43
+ %th Wednesday
44
+ %th Thursday
45
+ %th Friday
46
+ %th Saturday
47
+ %tbody
48
+ - calendar.weeks.each do |week|
49
+ %tr
50
+ - week.days.each do |day|
51
+ %td{:class => ('today' if day.today?)}
52
+ = day.number
53
+ ```
22
54
 
23
55
  ## Contributing
24
56
 
data/Rakefile CHANGED
@@ -1,2 +1,6 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+
4
+ task :test do
5
+ system "bundle exec rspec spec"
6
+ end
data/lib/cal.rb CHANGED
@@ -3,7 +3,7 @@ require "cal/version"
3
3
  module Cal
4
4
 
5
5
  autoload :Ender, 'cal/ender'
6
- autoload :Month, 'cal/month'
7
6
  autoload :Day, 'cal/day'
7
+ autoload :Month, 'cal/month'
8
8
 
9
9
  end
data/lib/cal/day.rb CHANGED
@@ -1,16 +1,24 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+
1
3
  module Cal
2
4
  class Day
3
5
 
4
- def initialize(calendar, date)
5
- @calendar = calendar
6
+ def initialize(date, calendar)
6
7
  @date = date
8
+ @calendar = calendar
7
9
  end
8
10
 
9
11
  attr_reader :calendar, :date
10
12
 
13
+ delegate :today?, :to => :date
14
+
11
15
  def ==(other)
12
16
  other.is_a?(Day) && other.calendar == calendar && other.date == date
13
17
  end
14
18
 
19
+ def number
20
+ date.day
21
+ end
22
+
15
23
  end
16
24
  end
data/lib/cal/ender.rb CHANGED
@@ -1,44 +1,61 @@
1
1
  require 'active_support/time'
2
2
  require 'active_support/core_ext/array/grouping'
3
+ require 'active_support/core_ext/string/conversions'
3
4
 
4
5
  module Cal
5
6
  class Ender
6
7
 
7
- def initialize(date)
8
- @date = date
8
+ def initialize(dateable, options = {})
9
+ options = {:format => :monthly}.merge options
10
+
11
+ if options[:format] != :monthly
12
+ raise ArgumentError, "only supported format currently is :monthly"
13
+ end
14
+
15
+ @date = dateable.to_date
16
+ @format = options[:format]
9
17
  end
10
18
 
11
- attr_reader :date
19
+ attr_reader :format, :date
12
20
 
13
21
  def ==(other)
14
22
  other.is_a?(Ender) && other.date == date
15
23
  end
16
24
 
17
25
  def month
18
- @mont ||= Month.new self
26
+ @month ||= Month.new self
27
+ end
28
+
29
+ def days
30
+ @days ||= dates.map { |date| Day.new self, date }
19
31
  end
20
32
 
21
33
  def weeks
22
34
  @weeks ||= days.in_groups_of 7
23
35
  end
24
36
 
25
- def days
26
- @days ||= begin
37
+ def previous
38
+ self.class.new date.prev_month
39
+ end
40
+
41
+ def next
42
+ self.class.new date.next_month
43
+ end
44
+
45
+ private
46
+
47
+ # TODO: simplify/improve this
48
+ def dates
49
+ [].tap do |dates|
27
50
  day = date.beginning_of_month.beginning_of_week :sunday
28
51
  last_day = date.end_of_month.end_of_week :sunday
29
52
 
30
- days = []
31
53
  while day <= last_day
32
- days << Day.new(self, day)
54
+ dates << day
33
55
  day = day.tomorrow
34
56
  end
35
- days
36
57
  end
37
58
  end
38
59
 
39
- def week_headings
40
- @week_headings ||= %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday]
41
- end
42
-
43
60
  end
44
61
  end
data/lib/cal/month.rb CHANGED
@@ -7,11 +7,13 @@ module Cal
7
7
 
8
8
  attr_reader :calendar
9
9
 
10
- def name
11
- calendar.date.strftime "%B"
10
+ def ==(other)
11
+ other.is_a?(Month) && other.calendar == calendar
12
12
  end
13
13
 
14
- alias_method :to_s, :name
14
+ def to_s
15
+ calendar.date.strftime "%B"
16
+ end
15
17
 
16
18
  end
17
19
  end
data/lib/cal/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Cal
2
2
 
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
 
5
5
  end
data/spec/cal/day_spec.rb CHANGED
@@ -1,16 +1,44 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cal::Day do
4
- subject { described_class.new @calendar, @date }
4
+ subject { described_class.new @date, @calendar }
5
5
 
6
6
  before do
7
- @calendar = OpenStruct.new :date => Date.parse("2012-01-05")
8
- @date = Date.parse("2012-01-05")
7
+ @date = Date.new 2012, 1, 15
8
+ @calendar = OpenStruct.new :current_day => Date.new(2012, 1, 5)
9
9
  end
10
10
 
11
11
  describe "==" do
12
12
  it "is true with another day with the same calendar and date" do
13
- subject.should == described_class.new(@calendar, @date)
13
+ subject.should == described_class.new(@date, @calendar)
14
+ end
15
+
16
+ it "is false with another day with a different calendar" do
17
+ subject.should_not == described_class.new(@date, Object.new)
18
+ end
19
+
20
+ it "is false with another day with a different date" do
21
+ subject.should_not == described_class.new(Date.new(2012, 1, 14), @calendar)
22
+ end
23
+
24
+ it "is false with a non Cal::Day" do
25
+ subject.should_not == Object.new
26
+ end
27
+ end
28
+
29
+ describe "today?" do
30
+ it "is true when the date is today" do
31
+ @date = Date.current
32
+ subject.should be_today
33
+ end
34
+ end
35
+
36
+ describe "number" do
37
+ [3, 15].each do |n|
38
+ it "is the day of the month" do
39
+ @date = Date.new 2012, 1, n
40
+ subject.number.should == n
41
+ end
14
42
  end
15
43
  end
16
44
 
@@ -1,36 +1,88 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cal::Ender do
4
- subject { described_class.new @date }
4
+ subject { described_class.new @date, @options }
5
5
 
6
6
  before do
7
- @date = Date.parse("2012-02-23")
7
+ @date = Date.new 2012, 2, 1
8
+ @options = {}
8
9
  end
9
10
 
10
- describe "=" do
11
- it "is true with another calendar with the same date" do
12
- subject.should == described_class.new(@date)
11
+ describe "initialize" do
12
+ it "raises argument error if given format isn't :monthly" do
13
+ @options[:format] = :weekly
14
+ expect { subject }.to raise_error(ArgumentError)
15
+ end
16
+
17
+ it "raises an error if the first arg can't be converted to a date" do
18
+ ['Octember', Object.new, '2012'].each do |obj|
19
+ expect { described_class.new obj }.to raise_error
20
+ end
21
+ end
22
+
23
+ it "doesn't raise an error if the first arg can be converted to a date" do
24
+ [Date.current, Date.new(2012, 1, 15), '2012-02-24'].each do |obj|
25
+ expect { described_class.new obj }.to_not raise_error
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "format" do
31
+ it "defaults to monthly" do
32
+ subject.format.should == :monthly
33
+ end
34
+
35
+ it "otherwise is the given format" do
36
+ @options[:format] = :monthly
37
+ subject.format.should == :monthly
13
38
  end
14
39
  end
15
40
 
16
41
  describe "date" do
17
- it "is the date given" do
42
+ it "is the given date" do
18
43
  subject.date.should == @date
19
44
  end
20
45
  end
21
46
 
22
- describe "month" do
23
- it "is a month" do
24
- subject.month.should be_a(Cal::Month)
47
+ describe "==" do
48
+ it "is true with another calendar with the same format and date" do
49
+ @date = Date.new 2012, 2, 1
50
+ @options[:format] = :monthly
51
+ subject.should == described_class.new(@date, @options)
25
52
  end
26
53
 
27
- it "has a reference to the calendar" do
28
- subject.month.calendar.should == subject
54
+ it "is false with another calendar with a different date" do
55
+ @date = Date.new 2012, 2, 1
56
+ @options[:format] = :monthly
57
+ subject.should_not == described_class.new(Date.new(2012, 2, 2), @options)
58
+ end
59
+
60
+ it "is false with a non-Ender object" do
61
+ subject.should_not == Object.new
62
+ end
63
+ end
64
+
65
+ describe "month" do
66
+ it { subject.month.should == Cal::Month.new(subject) }
67
+ end
68
+
69
+ describe "days" do
70
+ it "is an array of all the viewable days" do
71
+ @date = Date.new 2012, 2, 23
72
+
73
+ prev_month_days = %w[01-29 01-30 01-31]
74
+ days = %w[02-01 02-02 02-03 02-04 02-05 02-06 02-07 02-08 02-09 02-10 02-11 02-12 02-13 02-14 02-15 02-16 02-17 02-18 02-19 02-20 02-21 02-22 02-23 02-24 02-25 02-26 02-27 02-28 02-29]
75
+ next_month_days = %w[03-01 03-02 03-03]
76
+
77
+ subject.days.should == (prev_month_days + days + next_month_days).map do |s|
78
+ Cal::Day.new subject, Date.parse("2012-#{s}")
79
+ end
29
80
  end
30
81
  end
31
82
 
32
83
  describe "weeks" do
33
84
  it "is the days in groups of 7" do
85
+ @date = Date.parse "2012-02-23"
34
86
  subject.weeks.should == [
35
87
  %w[01-29 01-30 01-31 02-01 02-02 02-03 02-04].map { |s| Cal::Day.new subject, Date.parse("2012-#{s}") },
36
88
  %w[02-05 02-06 02-07 02-08 02-09 02-10 02-11].map { |s| Cal::Day.new subject, Date.parse("2012-#{s}") },
@@ -41,21 +93,15 @@ describe Cal::Ender do
41
93
  end
42
94
  end
43
95
 
44
- describe "days" do
45
- it "is an array of all the viewable days" do
46
- jan = %w[01-29 01-30 01-31]
47
- feb = %w[02-01 02-02 02-03 02-04 02-05 02-06 02-07 02-08 02-09 02-10 02-11 02-12 02-13 02-14 02-15 02-16 02-17 02-18 02-19 02-20 02-21 02-22 02-23 02-24 02-25 02-26 02-27 02-28 02-29]
48
- mar = %w[03-01 03-02 03-03]
49
-
50
- subject.days.should == (jan + feb + mar).map do |s|
51
- Cal::Day.new subject, Date.parse("2012-#{s}")
52
- end
96
+ describe "previous" do
97
+ it "returns the calendar for the previous month" do
98
+ subject.previous.should == described_class.new(@date.prev_month)
53
99
  end
54
100
  end
55
101
 
56
- describe "week_headings" do
57
- it "returns the days of the week" do
58
- subject.week_headings.should == %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday]
102
+ describe "next" do
103
+ it "returns the calendar for the next month" do
104
+ subject.next.should == described_class.new(@date.next_month)
59
105
  end
60
106
  end
61
107
 
@@ -2,22 +2,34 @@ require 'spec_helper'
2
2
 
3
3
  describe Cal::Month do
4
4
 
5
- subject { Cal::Month.new @calendar }
5
+ subject { described_class.new @calendar }
6
6
 
7
7
  before do
8
- @calendar = OpenStruct.new
8
+ @calendar = OpenStruct.new :date => Date.new(2012, 3, 13)
9
9
  end
10
10
 
11
- describe "name" do
12
- it "is the name of the month" do
13
- [
14
- [Date.parse('2012-01-21'), 'January'],
15
- [Date.parse('2012-02-21'), 'February']
16
- ].each do |date, name|
17
- @calendar.date = date
18
- subject.name.should == name
19
- end
11
+ describe "==" do
12
+ it "is true with a Cal::Month with the same calendar" do
13
+ subject.should == described_class.new(@calendar)
20
14
  end
15
+
16
+ it "is false with a Cal::Month with a different calendar" do
17
+ subject.should_not == described_class.new(Object.new)
18
+ end
19
+
20
+ it "is false with a non-Cal::Month" do
21
+ subject.should_not == Object.new
22
+ end
23
+ end
24
+
25
+ describe "calendar" do
26
+ it "is the given calendar" do
27
+ subject.calendar.should == @calendar
28
+ end
29
+ end
30
+
31
+ describe "to_s" do
32
+ it { subject.to_s.should == 'March' }
21
33
  end
22
34
 
23
35
  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.0.1
4
+ version: 0.1.0
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-03 00:00:00.000000000 Z
12
+ date: 2012-06-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -51,6 +51,7 @@ extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
53
  - .gitignore
54
+ - .travis.yml
54
55
  - Gemfile
55
56
  - LICENSE
56
57
  - README.md