cal 0.0.1 → 0.1.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.
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