simple_calendar 0.1.11 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/Gemfile +0 -6
- data/README.md +117 -103
- data/lib/simple_calendar/version.rb +1 -1
- data/lib/simple_calendar/view_helpers.rb +97 -96
- data/simple_calendar.gemspec +3 -3
- metadata +4 -10
- data/spec/helper.rb +0 -24
- data/spec/simple_calendar_spec.rb +0 -102
- data/spec/support/railtie.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc702d5bfc9216617da9921539291ed03e61fd97
|
4
|
+
data.tar.gz: 4eec246dd685d28eea8f822483380c9121e53912
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45d62759c32d0a1ec5dadf6ebe3d819f8604bef0c4d99f5e45832d4e0d5815d001f788155d39d5067ee66979298ec23ac035b37940b571c7c00ca0c909bd8aa0
|
7
|
+
data.tar.gz: b0ece55d4cac8003ca070a9bd8803e02c7ce6f9c6ca6f7357f65eaa4db12540e2a5f0de00544589b4ac1446ce5c91a489c131f945da852086376a24bdd26b7fe
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,158 +1,172 @@
|
|
1
1
|
Simple Calendar
|
2
2
|
===============
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
Simple Calendar is design to do one thing really really well: render a
|
5
|
+
calendar. It lets you render a calendar of any size. Maybe you want a
|
6
|
+
day view, a 4 day agenda, a week view, a month view, or a 6 week
|
7
|
+
calendar. You can do all of that with the new gem, just give it a range
|
8
|
+
of dates to render.
|
8
9
|
|
9
|
-
|
10
|
+
It doesn't depend on any ORM so you're free to use it with ActiveRecord,
|
11
|
+
Mongoid, any other ORM, or pure Ruby objects.
|
12
|
+
|
13
|
+
Thanks to all contributors for your wonderful help!
|
10
14
|
|
11
15
|
Installation
|
12
16
|
------------
|
13
17
|
|
14
18
|
Just add this into your Gemfile followed by a bundle install:
|
15
19
|
|
16
|
-
gem "simple_calendar", "~> 0.
|
20
|
+
gem "simple_calendar", "~> 1.0.0"
|
17
21
|
|
18
22
|
Usage
|
19
23
|
-----
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
SimpleCalendar will look for a method on your model called `start_time`.
|
24
|
-
This is used to determine the day and time of the event. This should be
|
25
|
-
a `DateTime` object or at least respond similarly.
|
25
|
+
Generating calendars is extremely simple with simple_calendar in version 1.0.
|
26
26
|
|
27
|
-
The
|
28
|
-
|
29
|
-
model at all. For example, I used `rails g model Event name:string
|
30
|
-
start_time:datetime` to generate this class:
|
27
|
+
The first parameter is a symbol that looks up the current date in
|
28
|
+
`params`. If no date is found, it will use the current date.
|
31
29
|
|
32
|
-
|
33
|
-
class Event < ActiveRecord::Base
|
34
|
-
attr_accessible :name, :start_time
|
35
|
-
end
|
36
|
-
```
|
30
|
+
In these examples, we're using `:start_date` which is the default.
|
37
31
|
|
38
|
-
|
39
|
-
can simply delegate like so:
|
32
|
+
### Month Calendar
|
40
33
|
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
You can generate a calendar for the month with the `month_calendar`
|
35
|
+
method.
|
36
|
+
This will use `params[:start_date]` to render the calendar.
|
44
37
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
38
|
+
```erb
|
39
|
+
<%= month_calendar :start_date do |day| %>
|
40
|
+
<%= day %>
|
41
|
+
<% end %>
|
49
42
|
```
|
50
43
|
|
51
|
-
|
52
|
-
This means SimpleCalendar is now compatible with any class, whether it's
|
53
|
-
ORM backed like ActiveRecord, Mongoid, or it's just a pure Ruby class.
|
54
|
-
(Yay!)
|
44
|
+
### Week Calendar
|
55
45
|
|
56
|
-
|
46
|
+
You can generate a week calendar with the `week_calendar` method.
|
47
|
+
This will use `params[:start_date]` to render the calendar.
|
57
48
|
|
58
|
-
|
59
|
-
|
60
|
-
|
49
|
+
```erb
|
50
|
+
<%= week_calendar :start_date, number_of_weeks: 2 do |day| %>
|
51
|
+
<%= day %>
|
52
|
+
<% end %>
|
53
|
+
```
|
61
54
|
|
62
|
-
|
55
|
+
Setting `number_of_weeks` is optional and defaults to 1.
|
63
56
|
|
64
|
-
|
65
|
-
will be executed for each event so you can provide your own logic for
|
66
|
-
displaying the events.
|
57
|
+
### Custom Length Calendar
|
67
58
|
|
68
|
-
|
69
|
-
|
70
|
-
the `@events` as discussed above in the querying section.
|
59
|
+
You can generate calendars of any length by passing in the number of days you want to render.
|
60
|
+
This will use `params[:start_date]` to render the calendar.
|
71
61
|
|
72
62
|
```erb
|
73
|
-
<%= calendar
|
74
|
-
|
63
|
+
<%= calendar :start_date, number_of_days: 4 do |day| %>
|
64
|
+
<%= day %>
|
75
65
|
<% end %>
|
76
66
|
```
|
77
67
|
|
78
|
-
|
79
|
-
render whatever you like for the item. In this example, I use the title
|
80
|
-
attribute on the event with a link to the event.
|
68
|
+
Setting `number_of_days` is optional and defaults to 4.
|
81
69
|
|
82
|
-
|
70
|
+
## Customizing The Calendar
|
83
71
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
72
|
+
You can change a couple of global options that will affect how the
|
73
|
+
calendars are generated:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
Time.zone = "Central Time (US & Canada)"
|
88
77
|
```
|
89
78
|
|
90
|
-
|
91
|
-
|
79
|
+
Setting `Time.zone` will make sure the calendar start days are correctly computed
|
80
|
+
in the right timezone. You can set this globally in your `application.rb` file or
|
81
|
+
if you have a User model with a time_zone attribute, you can set it on every request by using
|
82
|
+
a before_filter like the following example.
|
92
83
|
|
93
|
-
|
84
|
+
This code example uses [Devise](https://github.com/plataformatec/devise)'s
|
85
|
+
`current_user` and `user_signed_in?` methods to retrieve the user's timezone and set it for the duration of the request.
|
86
|
+
Make sure to change the `:user_signed_in?` and `current_user` methods if you are
|
87
|
+
using some other method of authentication.
|
94
88
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
:next_text # next month link text, default: »
|
99
|
-
:start_day # starting day of week, default: :sunday
|
100
|
-
:empty_date # block called when a date is empty
|
101
|
-
:class # HTML class attribute for the calendar
|
102
|
-
:params # Any extra params you'd like in the URL (automatically includes month and year)
|
103
|
-
:dont_display_year #Set to true to remove the year in the table header
|
89
|
+
```ruby
|
90
|
+
class ApplicationController < ActionController::Base
|
91
|
+
before_filter :set_time_zone, if: :user_signed_in?
|
104
92
|
|
105
|
-
|
106
|
-
change a couple things. First, when rendering the calendar, use the
|
107
|
-
`:start_day => :monday` option like so:
|
93
|
+
private
|
108
94
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
95
|
+
def set_time_zone
|
96
|
+
Time.zone = current_user.time_zone
|
97
|
+
end
|
98
|
+
end
|
113
99
|
```
|
114
100
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
The `empty_date` option accepts a block that will be called when a day
|
120
|
-
in the calendar is empty. It will be called with the date object that
|
121
|
-
represents the day that has no events.
|
101
|
+
You can also change the beginning day of the week. If you want to set
|
102
|
+
this globally, you can put this line in
|
103
|
+
`config/initializers/simple_calendar.rb`:
|
122
104
|
|
123
|
-
```
|
124
|
-
|
125
|
-
<%= event.name %>
|
126
|
-
<% end %>
|
105
|
+
```ruby
|
106
|
+
Date.beginning_of_week = :sunday
|
127
107
|
```
|
128
|
-
The `not_empty_date` option accepts a block that will be called when a day
|
129
|
-
in the calendar has at least one event. It will be called with the date object that
|
130
|
-
represents the day that has some events.
|
131
108
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
109
|
+
Setting classes on the table and elements are pretty:
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
|
113
|
+
<%= calendar :start_date,
|
114
|
+
table: {class: "table table-bordered"},
|
115
|
+
tr: {class: "row"},
|
116
|
+
td: {class: "day"}, do |day| %>
|
117
|
+
<% end %>
|
136
118
|
```
|
137
119
|
|
120
|
+
This will set the class of `table table-bordered` on the `table` HTML
|
121
|
+
element.
|
122
|
+
|
123
|
+
Each of the `table`, `tr`, and `td`, options are passed directly to the
|
124
|
+
the `content_tag` method so each of them **must** be a hash.
|
125
|
+
|
126
|
+
### Custom Header Links
|
138
127
|
|
139
|
-
|
140
|
-
|
128
|
+
Each of the calendar methods will generate a header with links to the
|
129
|
+
previous and next views. The `month_calendar` also includes a header
|
130
|
+
that tells you the current month and year that you are viewing.
|
141
131
|
|
142
|
-
|
143
|
-
|
144
|
-
the following line to your css:
|
132
|
+
To change these, you can pass in the `prev_link`, `header`, and
|
133
|
+
`next_link` options into the calendar methods.
|
145
134
|
|
146
|
-
|
147
|
-
|
135
|
+
The default `month_calendar` look like this:
|
136
|
+
|
137
|
+
```erb
|
138
|
+
<%= month_calendar :start_date,
|
139
|
+
prev_link: ->(range) { link_to raw("«"), param_name => range.first - 1.day },
|
140
|
+
header: ->{ content_tag :span, "#{I18n.t("date.month_names")[start_date.month]} #{start_date.year}", class: "calendar-header" },
|
141
|
+
next_link: ->(range) { link_to raw("»"), param_name => range.last + 1.day } do |day| %>
|
142
|
+
|
143
|
+
<% end %>
|
148
144
|
```
|
149
145
|
|
150
|
-
|
151
|
-
|
146
|
+
The `prev_link` option is a standard `link_to` that is a left arrow and
|
147
|
+
with the current url having `?start_date=2014-04-30` appended to it as
|
148
|
+
a date in the previous view of the calendar.
|
149
|
+
|
150
|
+
The `next_link` option is a standard `link_to` that is a right arrow and
|
151
|
+
with the current url having `?start_date=2014-06-01` appended to it as
|
152
|
+
a date in the next view of the calendar.
|
152
153
|
|
153
|
-
|
154
|
+
The `header` option is just a simple span tag with the month and year
|
155
|
+
inside of it.
|
156
|
+
|
157
|
+
If you wish to disable any of these partsof the header, just pass in
|
158
|
+
`false` and that will hide it:
|
154
159
|
|
155
160
|
```erb
|
156
|
-
|
157
|
-
|
161
|
+
<%= month_calendar :start_date, header: false do |day| %>
|
162
|
+
<% end %>
|
158
163
|
```
|
164
|
+
|
165
|
+
|
166
|
+
## Author
|
167
|
+
|
168
|
+
Chris Oliver <chris@gorails.com>
|
169
|
+
|
170
|
+
[https://gorails.com](https://gorails.com)
|
171
|
+
|
172
|
+
[@excid3](https://twitter.com/excid3)
|
@@ -1,119 +1,120 @@
|
|
1
1
|
module SimpleCalendar
|
2
2
|
module ViewHelpers
|
3
|
+
def month_calendar(param_name=:start_date, options={}, &block)
|
4
|
+
start_date = (params[param_name] || Time.zone.now).to_date
|
5
|
+
|
6
|
+
options.reverse_merge!(
|
7
|
+
prev_link: ->(range) { link_to raw("«"), param_name => range.first - 1.day },
|
8
|
+
header: ->{ content_tag :span, "#{I18n.t("date.month_names")[start_date.month]} #{start_date.year}", class: "calendar-header" },
|
9
|
+
next_link: ->(range) { link_to raw("»"), param_name => range.last + 1.day },
|
10
|
+
)
|
11
|
+
render_calendar month_range(start_date), options, &block
|
12
|
+
end
|
13
|
+
|
14
|
+
def week_calendar(param_name=:start_date, options={}, &block)
|
15
|
+
start_date = (params[param_name] || Time.zone.now).to_date
|
16
|
+
number_of_weeks = options.fetch(:number_of_weeks, 1)
|
3
17
|
|
4
|
-
|
5
|
-
|
18
|
+
options.reverse_merge!(
|
19
|
+
prev_link: ->(range) { link_to raw("«"), param_name => range.first - 1.day },
|
20
|
+
header: false,
|
21
|
+
next_link: ->(range) { link_to raw("»"), param_name => range.last + 1.day },
|
22
|
+
)
|
23
|
+
render_calendar week_range(start_date, number_of_weeks), options, &block
|
24
|
+
end
|
6
25
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
selected_month = Date.new(options[:year], options[:month])
|
11
|
-
current_date = Time.zone.now.to_date
|
12
|
-
range = build_range selected_month, options
|
13
|
-
month_array = range.each_slice(7).to_a
|
26
|
+
def calendar(param_name=:start_date, options={}, &block)
|
27
|
+
start_date = (params[param_name] || Time.zone.now).to_date
|
28
|
+
number_of_days_to_advance = options.fetch(:number_of_days, 4) - 1
|
14
29
|
|
15
|
-
|
30
|
+
options.reverse_merge!(
|
31
|
+
prev_link: ->(range) { link_to raw("«"), param_name => range.first - 1.day },
|
32
|
+
header: false,
|
33
|
+
next_link: ->(range) { link_to raw("»"), param_name => range.last + 1.day },
|
34
|
+
)
|
35
|
+
render_calendar calendar_range(start_date, number_of_days_to_advance), options, &block
|
16
36
|
end
|
17
37
|
|
18
|
-
|
19
|
-
|
20
|
-
{
|
21
|
-
:year => (params[:year] || Time.zone.now.year).to_i,
|
22
|
-
:month => (params[:month] || Time.zone.now.month).to_i,
|
23
|
-
:prev_text => raw("«"),
|
24
|
-
:next_text => raw("»"),
|
25
|
-
:start_day => :sunday,
|
26
|
-
:class => "table table-bordered table-striped calendar",
|
27
|
-
:params => {},
|
28
|
-
:time_selector => "start_time",
|
29
|
-
:dont_display_year => false
|
30
|
-
}
|
38
|
+
def month_range(start_date)
|
39
|
+
start_date.beginning_of_month.beginning_of_week.to_date..start_date.end_of_month.end_of_week.to_date
|
31
40
|
end
|
32
|
-
# Returns array of dates between start date and end date for selected month
|
33
|
-
def build_range(selected_month, options)
|
34
|
-
start_date = selected_month.beginning_of_month.beginning_of_week(options[:start_day])
|
35
|
-
end_date = selected_month.end_of_month.end_of_week(options[:start_day])
|
36
41
|
|
37
|
-
|
42
|
+
def week_range(start_date, number_of_weeks)
|
43
|
+
number_of_days_to_advance = (number_of_weeks * 7) - 1
|
44
|
+
starting_day = start_date.beginning_of_week.to_date
|
45
|
+
ending_day = starting_day + number_of_days_to_advance.days
|
46
|
+
starting_day..ending_day
|
38
47
|
end
|
39
48
|
|
40
|
-
|
41
|
-
|
42
|
-
tags = []
|
43
|
-
today = Time.zone.now.to_date
|
44
|
-
content_tag(:table, :class => options[:class]) do
|
45
|
-
tags << month_header(selected_month, options)
|
46
|
-
day_names = I18n.t("date.abbr_day_names")
|
47
|
-
day_names = day_names.rotate((Date::DAYS_INTO_WEEK[options[:start_day]] + 1) % 7)
|
48
|
-
tags << content_tag(:thead, content_tag(:tr, day_names.collect { |name| content_tag :th, name, :class => (selected_month.month == today.month && today.strftime("%a") == name ? "current-day" : nil)}.join.html_safe))
|
49
|
-
tags << content_tag(:tbody, :'data-month'=>selected_month.month, :'data-year'=>selected_month.year) do
|
50
|
-
|
51
|
-
month.collect do |week|
|
52
|
-
content_tag(:tr, :class => (week.include?(today) ? "current-week week" : "week")) do
|
53
|
-
|
54
|
-
week.collect do |date|
|
55
|
-
td_class = ["day"]
|
56
|
-
td_class << "today" if today == date
|
57
|
-
td_class << "not-current-month" if selected_month.month != date.month
|
58
|
-
td_class << "past" if today > date
|
59
|
-
td_class << "future" if today < date
|
60
|
-
td_class << "wday-#{date.wday.to_s}" # <- to enable different styles for weekend, etc
|
61
|
-
|
62
|
-
cur_events = day_events(date, events, options[:time_selector])
|
63
|
-
|
64
|
-
td_class << (cur_events.any? ? "events" : "no-events")
|
65
|
-
|
66
|
-
content_tag(:td, :class => td_class.join(" "), :'data-date-iso'=>date.to_s, 'data-date'=>date.to_s.gsub('-', '/')) do
|
67
|
-
content_tag(:div) do
|
68
|
-
divs = []
|
69
|
-
concat content_tag(:div, date.day.to_s, :class=>"day_number")
|
70
|
-
|
71
|
-
if cur_events.empty? && options[:empty_date]
|
72
|
-
concat options[:empty_date].call(date)
|
73
|
-
else
|
74
|
-
if options[:not_empty_date]
|
75
|
-
concat options[:not_empty_date].call(date)
|
76
|
-
end
|
77
|
-
divs << cur_events.collect{ |event| block.call(event) }
|
78
|
-
end
|
79
|
-
|
80
|
-
divs.join.html_safe
|
81
|
-
end #content_tag :div
|
82
|
-
end #content_tag :td
|
83
|
-
|
84
|
-
end.join.html_safe
|
85
|
-
end #content_tag :tr
|
86
|
-
|
87
|
-
end.join.html_safe
|
88
|
-
end #content_tag :tbody
|
89
|
-
|
90
|
-
tags.join.html_safe
|
91
|
-
end #content_tag :table
|
49
|
+
def calendar_range(start_date, number_of_days_to_advance)
|
50
|
+
start_date..(start_date + number_of_days_to_advance.days)
|
92
51
|
end
|
93
52
|
|
94
|
-
|
95
|
-
|
96
|
-
|
53
|
+
def render_calendar(range, options, &block)
|
54
|
+
raise 'SimpleCalendar requires a block' unless block_given?
|
55
|
+
|
56
|
+
@block = block
|
57
|
+
@options = options.reverse_merge default_options
|
58
|
+
|
59
|
+
capture do
|
60
|
+
concat render_header(range)
|
61
|
+
concat render_table(range)
|
62
|
+
end
|
97
63
|
end
|
98
64
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
65
|
+
def render_header(range)
|
66
|
+
capture do
|
67
|
+
content_tag :div do
|
68
|
+
concat get_options(@options[:prev_link], range)
|
69
|
+
concat get_options(@options[:header])
|
70
|
+
concat get_options(@options[:next_link], range)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
105
74
|
|
106
|
-
|
107
|
-
|
108
|
-
|
75
|
+
def render_table(range)
|
76
|
+
content_tag(:table, get_options(@options[:table])) do
|
77
|
+
content_tag(:tbody) do
|
78
|
+
render_weeks(range)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def render_weeks(range)
|
85
|
+
weeks = []
|
86
|
+
range.each_slice(7) do |week|
|
87
|
+
weeks << content_tag(:tr, get_options(@options[:tr], week)) do
|
88
|
+
render_week(week)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
safe_join weeks
|
92
|
+
end
|
109
93
|
|
110
|
-
|
94
|
+
def render_week(week)
|
95
|
+
results = week.map do |day|
|
96
|
+
content_tag :td, get_options(@options[:td], day) do
|
97
|
+
@block.call(day)
|
98
|
+
end
|
111
99
|
end
|
100
|
+
safe_join results
|
112
101
|
end
|
113
102
|
|
114
|
-
|
115
|
-
|
116
|
-
|
103
|
+
def get_options(options, *params)
|
104
|
+
case options
|
105
|
+
when Hash
|
106
|
+
options
|
107
|
+
when String
|
108
|
+
send(options, *params)
|
109
|
+
when Symbol
|
110
|
+
send(options, *params)
|
111
|
+
else
|
112
|
+
options.call(*params) if options.respond_to? :call
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def default_options
|
117
|
+
{ table: {}, tr: {}, td: {}, }
|
117
118
|
end
|
118
119
|
end
|
119
120
|
end
|
data/simple_calendar.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ["Chris Oliver"]
|
9
9
|
s.email = ["excid3@gmail.com"]
|
10
10
|
s.homepage = "https://github.com/excid3/simple_calendar"
|
11
|
-
s.summary = %q{A simple Rails 3 calendar}
|
12
|
-
s.description = %q{A simple Rails 3 calendar}
|
11
|
+
s.summary = %q{A simple Rails 3 and Rails 4 calendar}
|
12
|
+
s.description = %q{A simple Rails 3 and Rails 4 calendar}
|
13
13
|
|
14
14
|
s.rubyforge_project = "simple_calendar"
|
15
15
|
|
@@ -18,5 +18,5 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
-
s.add_dependency
|
21
|
+
s.add_dependency 'rails', '>= 3.0'
|
22
22
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_calendar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Oliver
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
|
-
description: A simple Rails 3 calendar
|
27
|
+
description: A simple Rails 3 and Rails 4 calendar
|
28
28
|
email:
|
29
29
|
- excid3@gmail.com
|
30
30
|
executables: []
|
@@ -41,9 +41,6 @@ files:
|
|
41
41
|
- lib/simple_calendar/version.rb
|
42
42
|
- lib/simple_calendar/view_helpers.rb
|
43
43
|
- simple_calendar.gemspec
|
44
|
-
- spec/helper.rb
|
45
|
-
- spec/simple_calendar_spec.rb
|
46
|
-
- spec/support/railtie.rb
|
47
44
|
homepage: https://github.com/excid3/simple_calendar
|
48
45
|
licenses: []
|
49
46
|
metadata: {}
|
@@ -66,8 +63,5 @@ rubyforge_project: simple_calendar
|
|
66
63
|
rubygems_version: 2.2.2
|
67
64
|
signing_key:
|
68
65
|
specification_version: 4
|
69
|
-
summary: A simple Rails 3 calendar
|
70
|
-
test_files:
|
71
|
-
- spec/helper.rb
|
72
|
-
- spec/simple_calendar_spec.rb
|
73
|
-
- spec/support/railtie.rb
|
66
|
+
summary: A simple Rails 3 and Rails 4 calendar
|
67
|
+
test_files: []
|
data/spec/helper.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'bundler'
|
4
|
-
require 'pry'
|
5
|
-
require 'active_support/all'
|
6
|
-
require 'action_view'
|
7
|
-
|
8
|
-
root_path = Pathname(__FILE__).dirname.join('..').expand_path
|
9
|
-
lib_path = root_path.join('lib')
|
10
|
-
|
11
|
-
Dir[root_path.join("spec/support/*.rb")].each { |f| require f }
|
12
|
-
Dir[lib_path.join("simple_calendar/*.rb")].each { |f| require f }
|
13
|
-
|
14
|
-
Bundler.setup(:default)
|
15
|
-
|
16
|
-
RSpec.configure do |config|
|
17
|
-
config.fail_fast = true
|
18
|
-
|
19
|
-
config.filter_run :focused => true
|
20
|
-
config.alias_example_to :fit, :focused => true
|
21
|
-
config.alias_example_to :xit, :pending => true
|
22
|
-
config.run_all_when_everything_filtered = true
|
23
|
-
end
|
24
|
-
Time.zone = "UTC"
|
@@ -1,102 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class View
|
4
|
-
include SimpleCalendar::ViewHelpers
|
5
|
-
include ActionView::Helpers
|
6
|
-
include ActionView::Context
|
7
|
-
|
8
|
-
def raw(argument)
|
9
|
-
argument
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
describe "SimpleCalendar" do
|
15
|
-
subject { View.new }
|
16
|
-
|
17
|
-
before do
|
18
|
-
subject.stub(:params => {:year => 2013, :month => 5})
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "#calendar" do
|
22
|
-
context "with invalid arguments" do
|
23
|
-
it "should raise an error" do
|
24
|
-
expect { subject.calendar("foo") }.to raise_error(StandardError, /block/)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "with valid arguments" do
|
29
|
-
it "should draw a calendar" do
|
30
|
-
subject.should_receive(:draw_calendar)
|
31
|
-
subject.calendar("foo") { "test" }
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should not overwrite passed in arguments" do
|
35
|
-
subject.should_receive(:build_range).and_return([2,2,3])
|
36
|
-
subject.should_receive(:draw_calendar)
|
37
|
-
subject.calendar("foo") { "test" }
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "#build_range" do
|
43
|
-
it "should return an array representing the days of the month" do
|
44
|
-
selected_month = Date.new(2013, 1)
|
45
|
-
options = {:start_day => :tuesday}
|
46
|
-
result = subject.send(:build_range, selected_month, options)
|
47
|
-
result.class.should == Array
|
48
|
-
result.first.class.should == Date
|
49
|
-
result.last.class.should == Date
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "#draw_calendar" do
|
54
|
-
it "should render a calendar table" do
|
55
|
-
#TODO: refactor draw_calendar to not require so much build up
|
56
|
-
subject.should_receive(:month_header)
|
57
|
-
selected_month = Date.new(2013, 1)
|
58
|
-
month = []
|
59
|
-
current_date = Date.new(2013, 1, 14)
|
60
|
-
events = {}
|
61
|
-
options = {:start_day => :monday}
|
62
|
-
block = Proc.new {}
|
63
|
-
subject.send(:draw_calendar, selected_month, month, current_date, events, options, block).should match(/^<table/)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
describe "#day_events" do
|
68
|
-
it "should return an array of events for a given day" do
|
69
|
-
date = Date.new(2013, 1, 14)
|
70
|
-
matching_event = stub(:start_time => Date.new(2013, 1, 14))
|
71
|
-
other_event = stub(:start_time => Date.new(2013,1,15))
|
72
|
-
events = [matching_event, other_event]
|
73
|
-
subject.send(:day_events, date, events, "start_time").should == [matching_event]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
describe "#month_header" do
|
78
|
-
it "should generate html including the month, next and previous month" do
|
79
|
-
subject.should_receive(:month_link).exactly(2)
|
80
|
-
selected_month = Date.new(2013, 1)
|
81
|
-
options = {}
|
82
|
-
subject.send(:month_header, selected_month, options).should match(/^<h2>January 2013<\/h2>/)
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should allow the display_year option to be set to false and not show the year" do
|
86
|
-
subject.should_receive(:month_link).exactly(2)
|
87
|
-
selected_month = Date.new(2014, 1)
|
88
|
-
options = {:dont_display_year => true}
|
89
|
-
str = subject.send(:month_header, selected_month, options)
|
90
|
-
str.should match(/^<h2>January<\/h2>/)
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "#month_link" do
|
96
|
-
it "should return a link" do
|
97
|
-
#TODO: test even needed?
|
98
|
-
subject.should_receive(:link_to)
|
99
|
-
subject.send(:month_link, "previous", Date.new(2013, 1), {})
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|