simple_calendar 2.4.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +5 -4
  3. data/.gitignore +4 -0
  4. data/Appraisals +5 -5
  5. data/CHANGELOG.md +11 -0
  6. data/Gemfile +4 -1
  7. data/Gemfile.lock +161 -142
  8. data/README.md +22 -15
  9. data/Rakefile +29 -5
  10. data/app/assets/stylesheets/simple_calendar.scss +4 -0
  11. data/app/views/simple_calendar/_calendar.html.erb +7 -7
  12. data/app/views/simple_calendar/_month_calendar.html.erb +8 -8
  13. data/app/views/simple_calendar/_week_calendar.html.erb +14 -12
  14. data/bin/rails +16 -0
  15. data/gemfiles/rails_6_1.gemfile +3 -1
  16. data/gemfiles/rails_6_1.gemfile.lock +161 -135
  17. data/gemfiles/{rails_6.gemfile → rails_7_0.gemfile} +4 -2
  18. data/gemfiles/rails_7_0.gemfile.lock +222 -0
  19. data/gemfiles/{rails_master.gemfile → rails_main.gemfile} +3 -1
  20. data/gemfiles/rails_main.gemfile.lock +246 -0
  21. data/lib/simple_calendar/calendar.rb +26 -14
  22. data/lib/simple_calendar/{railtie.rb → engine.rb} +3 -1
  23. data/lib/simple_calendar/month_calendar.rb +4 -0
  24. data/lib/simple_calendar/version.rb +1 -1
  25. data/lib/simple_calendar/view_helpers.rb +3 -3
  26. data/lib/simple_calendar/week_calendar.rb +5 -1
  27. data/lib/simple_calendar.rb +8 -1
  28. data/simple_calendar.gemspec +1 -3
  29. data/test/calendars/calendar_test.rb +154 -0
  30. data/test/calendars/month_calendar_test.rb +16 -0
  31. data/test/dummy/Rakefile +6 -0
  32. data/test/dummy/app/assets/config/manifest.js +1 -0
  33. data/test/dummy/app/assets/images/.keep +0 -0
  34. data/test/dummy/app/assets/stylesheets/application.css +1 -0
  35. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  36. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  37. data/test/dummy/app/controllers/application_controller.rb +2 -0
  38. data/test/dummy/app/controllers/concerns/.keep +0 -0
  39. data/test/dummy/app/controllers/meetings_controller.rb +59 -0
  40. data/test/dummy/app/helpers/application_helper.rb +2 -0
  41. data/test/dummy/app/helpers/meetings_helper.rb +2 -0
  42. data/test/dummy/app/jobs/application_job.rb +7 -0
  43. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  44. data/test/dummy/app/models/application_record.rb +7 -0
  45. data/test/dummy/app/models/concerns/.keep +0 -0
  46. data/test/dummy/app/models/meeting.rb +2 -0
  47. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  48. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  49. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  50. data/test/dummy/app/views/meetings/_form.html.erb +32 -0
  51. data/test/dummy/app/views/meetings/_meeting.html.erb +17 -0
  52. data/test/dummy/app/views/meetings/edit.html.erb +10 -0
  53. data/test/dummy/app/views/meetings/index.html.erb +24 -0
  54. data/test/dummy/app/views/meetings/new.html.erb +9 -0
  55. data/test/dummy/app/views/meetings/show.html.erb +10 -0
  56. data/test/dummy/bin/rails +4 -0
  57. data/test/dummy/bin/rake +4 -0
  58. data/test/dummy/bin/setup +33 -0
  59. data/test/dummy/config/application.rb +22 -0
  60. data/test/dummy/config/boot.rb +5 -0
  61. data/test/dummy/config/cable.yml +10 -0
  62. data/test/dummy/config/database.yml +25 -0
  63. data/test/dummy/config/environment.rb +5 -0
  64. data/test/dummy/config/environments/development.rb +67 -0
  65. data/test/dummy/config/environments/production.rb +87 -0
  66. data/test/dummy/config/environments/test.rb +60 -0
  67. data/test/dummy/config/initializers/content_security_policy.rb +25 -0
  68. data/test/dummy/config/initializers/filter_parameter_logging.rb +8 -0
  69. data/test/dummy/config/initializers/inflections.rb +16 -0
  70. data/test/dummy/config/initializers/permissions_policy.rb +11 -0
  71. data/test/dummy/config/locales/en.yml +33 -0
  72. data/test/dummy/config/puma.rb +43 -0
  73. data/test/dummy/config/routes.rb +7 -0
  74. data/test/dummy/config/storage.yml +34 -0
  75. data/test/dummy/config.ru +6 -0
  76. data/test/dummy/db/migrate/20220930184313_create_meetings.rb +11 -0
  77. data/test/dummy/db/schema.rb +21 -0
  78. data/test/dummy/lib/assets/.keep +0 -0
  79. data/test/dummy/log/.keep +0 -0
  80. data/test/dummy/public/404.html +67 -0
  81. data/test/dummy/public/422.html +67 -0
  82. data/test/dummy/public/500.html +66 -0
  83. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  84. data/test/dummy/public/apple-touch-icon.png +0 -0
  85. data/test/dummy/public/favicon.ico +0 -0
  86. data/test/dummy/storage/.keep +0 -0
  87. data/test/dummy/tmp/.keep +0 -0
  88. data/test/dummy/tmp/development_secret.txt +1 -0
  89. data/test/dummy/tmp/pids/.keep +0 -0
  90. data/test/dummy/tmp/pids/server.pid +1 -0
  91. data/test/dummy/tmp/restart.txt +0 -0
  92. data/test/dummy/tmp/storage/.keep +0 -0
  93. data/test/fixtures/meetings.yml +36 -0
  94. data/test/integrations/month_calendar_test.rb +58 -0
  95. data/test/simple_calendar_test.rb +7 -0
  96. data/test/test_helper.rb +14 -0
  97. metadata +80 -39
  98. data/gemfiles/rails_6.gemfile.lock +0 -197
  99. data/gemfiles/rails_master.gemfile.lock +0 -205
  100. data/spec/calendar_spec.rb +0 -176
  101. data/spec/calendars/month_calendar_spec.rb +0 -25
  102. data/spec/simple_calendar_spec.rb +0 -9
  103. data/spec/spec_helper.rb +0 -96
  104. data/spec/support/fake_event.rb +0 -9
  105. data/spec/support/view_context.rb +0 -20
  106. data/spec/views_generators_spec.rb +0 -7
@@ -0,0 +1,246 @@
1
+ GIT
2
+ remote: https://github.com/rails/rails.git
3
+ revision: c9cdd800d30ec38f079b3df0772ab47f4ba4b11f
4
+ specs:
5
+ actioncable (7.1.0.alpha)
6
+ actionpack (= 7.1.0.alpha)
7
+ activesupport (= 7.1.0.alpha)
8
+ nio4r (~> 2.0)
9
+ websocket-driver (>= 0.6.1)
10
+ zeitwerk (~> 2.6)
11
+ actionmailbox (7.1.0.alpha)
12
+ actionpack (= 7.1.0.alpha)
13
+ activejob (= 7.1.0.alpha)
14
+ activerecord (= 7.1.0.alpha)
15
+ activestorage (= 7.1.0.alpha)
16
+ activesupport (= 7.1.0.alpha)
17
+ mail (>= 2.7.1)
18
+ net-imap
19
+ net-pop
20
+ net-smtp
21
+ actionmailer (7.1.0.alpha)
22
+ actionpack (= 7.1.0.alpha)
23
+ actionview (= 7.1.0.alpha)
24
+ activejob (= 7.1.0.alpha)
25
+ activesupport (= 7.1.0.alpha)
26
+ mail (~> 2.5, >= 2.5.4)
27
+ net-imap
28
+ net-pop
29
+ net-smtp
30
+ rails-dom-testing (~> 2.0)
31
+ actionpack (7.1.0.alpha)
32
+ actionview (= 7.1.0.alpha)
33
+ activesupport (= 7.1.0.alpha)
34
+ nokogiri (>= 1.8.5)
35
+ rack (>= 2.2.4)
36
+ rack-session (>= 1.0.1)
37
+ rack-test (>= 0.6.3)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.6)
40
+ actiontext (7.1.0.alpha)
41
+ actionpack (= 7.1.0.alpha)
42
+ activerecord (= 7.1.0.alpha)
43
+ activestorage (= 7.1.0.alpha)
44
+ activesupport (= 7.1.0.alpha)
45
+ globalid (>= 0.6.0)
46
+ nokogiri (>= 1.8.5)
47
+ actionview (7.1.0.alpha)
48
+ activesupport (= 7.1.0.alpha)
49
+ builder (~> 3.1)
50
+ erubi (~> 1.11)
51
+ rails-dom-testing (~> 2.0)
52
+ rails-html-sanitizer (~> 1.6)
53
+ activejob (7.1.0.alpha)
54
+ activesupport (= 7.1.0.alpha)
55
+ globalid (>= 0.3.6)
56
+ activemodel (7.1.0.alpha)
57
+ activesupport (= 7.1.0.alpha)
58
+ activerecord (7.1.0.alpha)
59
+ activemodel (= 7.1.0.alpha)
60
+ activesupport (= 7.1.0.alpha)
61
+ timeout (>= 0.4.0)
62
+ activestorage (7.1.0.alpha)
63
+ actionpack (= 7.1.0.alpha)
64
+ activejob (= 7.1.0.alpha)
65
+ activerecord (= 7.1.0.alpha)
66
+ activesupport (= 7.1.0.alpha)
67
+ marcel (~> 1.0)
68
+ activesupport (7.1.0.alpha)
69
+ concurrent-ruby (~> 1.0, >= 1.0.2)
70
+ connection_pool (>= 2.2.5)
71
+ i18n (>= 1.6, < 2)
72
+ minitest (>= 5.1)
73
+ tzinfo (~> 2.0)
74
+ rails (7.1.0.alpha)
75
+ actioncable (= 7.1.0.alpha)
76
+ actionmailbox (= 7.1.0.alpha)
77
+ actionmailer (= 7.1.0.alpha)
78
+ actionpack (= 7.1.0.alpha)
79
+ actiontext (= 7.1.0.alpha)
80
+ actionview (= 7.1.0.alpha)
81
+ activejob (= 7.1.0.alpha)
82
+ activemodel (= 7.1.0.alpha)
83
+ activerecord (= 7.1.0.alpha)
84
+ activestorage (= 7.1.0.alpha)
85
+ activesupport (= 7.1.0.alpha)
86
+ bundler (>= 1.15.0)
87
+ railties (= 7.1.0.alpha)
88
+ railties (7.1.0.alpha)
89
+ actionpack (= 7.1.0.alpha)
90
+ activesupport (= 7.1.0.alpha)
91
+ irb
92
+ rackup (>= 1.0.0)
93
+ rake (>= 12.2)
94
+ thor (~> 1.0, >= 1.2.2)
95
+ zeitwerk (~> 2.6)
96
+
97
+ GIT
98
+ remote: https://github.com/thoughtbot/appraisal.git
99
+ revision: b200e636903700098bef25f4f51dbc4c46e4c04c
100
+ specs:
101
+ appraisal (2.4.1)
102
+ bundler
103
+ rake
104
+ thor (>= 0.14.0)
105
+
106
+ PATH
107
+ remote: ..
108
+ specs:
109
+ simple_calendar (3.0.0)
110
+ rails (>= 6.1)
111
+
112
+ GEM
113
+ remote: http://rubygems.org/
114
+ specs:
115
+ ast (2.4.2)
116
+ builder (3.2.4)
117
+ concurrent-ruby (1.2.2)
118
+ connection_pool (2.4.1)
119
+ crass (1.0.6)
120
+ date (3.3.3)
121
+ erubi (1.12.0)
122
+ globalid (1.1.0)
123
+ activesupport (>= 5.0)
124
+ i18n (1.14.1)
125
+ concurrent-ruby (~> 1.0)
126
+ io-console (0.6.0)
127
+ irb (1.7.3)
128
+ reline (>= 0.3.6)
129
+ json (2.6.3)
130
+ language_server-protocol (3.17.0.3)
131
+ lint_roller (1.1.0)
132
+ loofah (2.21.3)
133
+ crass (~> 1.0.2)
134
+ nokogiri (>= 1.12.0)
135
+ mail (2.8.1)
136
+ mini_mime (>= 0.1.1)
137
+ net-imap
138
+ net-pop
139
+ net-smtp
140
+ marcel (1.0.2)
141
+ mini_mime (1.1.2)
142
+ mini_portile2 (2.8.2)
143
+ minitest (5.18.1)
144
+ net-imap (0.3.6)
145
+ date
146
+ net-protocol
147
+ net-pop (0.1.2)
148
+ net-protocol
149
+ net-protocol (0.2.1)
150
+ timeout
151
+ net-smtp (0.3.3)
152
+ net-protocol
153
+ nio4r (2.5.9)
154
+ nokogiri (1.15.3)
155
+ mini_portile2 (~> 2.8.2)
156
+ racc (~> 1.4)
157
+ nokogiri (1.15.3-x86_64-darwin)
158
+ racc (~> 1.4)
159
+ nokogiri (1.15.3-x86_64-linux)
160
+ racc (~> 1.4)
161
+ parallel (1.23.0)
162
+ parser (3.2.2.3)
163
+ ast (~> 2.4.1)
164
+ racc
165
+ puma (6.3.0)
166
+ nio4r (~> 2.0)
167
+ racc (1.7.1)
168
+ rack (3.0.8)
169
+ rack-session (2.0.0)
170
+ rack (>= 3.0.0)
171
+ rack-test (2.1.0)
172
+ rack (>= 1.3)
173
+ rackup (2.1.0)
174
+ rack (>= 3)
175
+ webrick (~> 1.8)
176
+ rails-dom-testing (2.1.1)
177
+ activesupport (>= 5.0.0)
178
+ minitest
179
+ nokogiri (>= 1.6)
180
+ rails-html-sanitizer (1.6.0)
181
+ loofah (~> 2.21)
182
+ nokogiri (~> 1.14)
183
+ rainbow (3.1.1)
184
+ rake (13.0.6)
185
+ regexp_parser (2.8.1)
186
+ reline (0.3.6)
187
+ io-console (~> 0.5)
188
+ rexml (3.2.5)
189
+ rubocop (1.52.1)
190
+ json (~> 2.3)
191
+ parallel (~> 1.10)
192
+ parser (>= 3.2.2.3)
193
+ rainbow (>= 2.2.2, < 4.0)
194
+ regexp_parser (>= 1.8, < 3.0)
195
+ rexml (>= 3.2.5, < 4.0)
196
+ rubocop-ast (>= 1.28.0, < 2.0)
197
+ ruby-progressbar (~> 1.7)
198
+ unicode-display_width (>= 2.4.0, < 3.0)
199
+ rubocop-ast (1.29.0)
200
+ parser (>= 3.2.1.0)
201
+ rubocop-performance (1.18.0)
202
+ rubocop (>= 1.7.0, < 2.0)
203
+ rubocop-ast (>= 0.4.0)
204
+ ruby-progressbar (1.13.0)
205
+ sqlite3 (1.6.3)
206
+ mini_portile2 (~> 2.8.0)
207
+ sqlite3 (1.6.3-x86_64-darwin)
208
+ sqlite3 (1.6.3-x86_64-linux)
209
+ standard (1.30.1)
210
+ language_server-protocol (~> 3.17.0.2)
211
+ lint_roller (~> 1.0)
212
+ rubocop (~> 1.52.0)
213
+ standard-custom (~> 1.0.0)
214
+ standard-performance (~> 1.1.0)
215
+ standard-custom (1.0.2)
216
+ lint_roller (~> 1.0)
217
+ rubocop (~> 1.50)
218
+ standard-performance (1.1.1)
219
+ lint_roller (~> 1.1)
220
+ rubocop-performance (~> 1.18.0)
221
+ thor (1.2.2)
222
+ timeout (0.4.0)
223
+ tzinfo (2.0.6)
224
+ concurrent-ruby (~> 1.0)
225
+ unicode-display_width (2.4.2)
226
+ webrick (1.8.1)
227
+ websocket-driver (0.7.5)
228
+ websocket-extensions (>= 0.1.0)
229
+ websocket-extensions (0.1.5)
230
+ zeitwerk (2.6.8)
231
+
232
+ PLATFORMS
233
+ ruby
234
+ x86_64-darwin-20
235
+ x86_64-linux
236
+
237
+ DEPENDENCIES
238
+ appraisal!
239
+ puma
240
+ rails!
241
+ simple_calendar!
242
+ sqlite3
243
+ standard
244
+
245
+ BUNDLED WITH
246
+ 2.4.16
@@ -6,9 +6,11 @@ module SimpleCalendar
6
6
 
7
7
  attr_accessor :view_context, :options
8
8
 
9
- def initialize(view_context, opts = {})
9
+ def initialize(view_context, options = {}, &block)
10
10
  @view_context = view_context
11
- @options = opts
11
+ @locals = options.delete(:locals) || {}
12
+ @options = options
13
+ @block = block
12
14
 
13
15
  # Next and previous view links should use the same params as the current view
14
16
  @params = @view_context.respond_to?(:params) ? @view_context.params : {}
@@ -19,16 +21,20 @@ module SimpleCalendar
19
21
  @params.merge!(@options.fetch(:params, {}))
20
22
  end
21
23
 
22
- def render(&block)
24
+ def render_in(view_context)
23
25
  view_context.render(
24
26
  partial: partial_name,
25
- locals: {
26
- passed_block: block,
27
- calendar: self,
28
- date_range: date_range,
29
- start_date: start_date,
30
- sorted_events: sorted_events
31
- }
27
+ locals: locals
28
+ )
29
+ end
30
+
31
+ def locals(&block)
32
+ @locals.merge(
33
+ passed_block: @block,
34
+ calendar: self,
35
+ date_range: date_range,
36
+ start_date: start_date,
37
+ sorted_events: sorted_events
32
38
  )
33
39
  end
34
40
 
@@ -62,15 +68,17 @@ module SimpleCalendar
62
68
  end
63
69
 
64
70
  def url_for_previous_view
65
- view_context.url_for(@params.merge(start_date_param => (date_range.first - 1.day).iso8601))
71
+ view_context.url_for(@params.merge(start_date_param => (date_range.first - date_range.count.days).iso8601))
72
+ end
73
+
74
+ def url_for_today_view
75
+ view_context.url_for(@params.merge(start_date_param => Time.current.to_date.iso8601))
66
76
  end
67
77
 
68
78
  def date_range
69
79
  (start_date..(start_date + additional_days.days)).to_a
70
80
  end
71
81
 
72
- private
73
-
74
82
  def partial_name
75
83
  @options[:partial] || self.class.name.underscore
76
84
  end
@@ -94,12 +102,16 @@ module SimpleCalendar
94
102
  end
95
103
  end
96
104
 
105
+ def sorted_events_for(day)
106
+ sorted_events.fetch(day, [])
107
+ end
108
+
97
109
  def group_events_by_date(events)
98
110
  events_grouped_by_date = Hash.new { |h, k| h[k] = [] }
99
111
 
100
112
  events.each do |event|
101
113
  event_start_date = event.send(attribute).to_date
102
- event_end_date = event.respond_to?(end_attribute) && !event.send(end_attribute).nil? ? event.send(end_attribute).to_date : event_start_date
114
+ event_end_date = (event.respond_to?(end_attribute) && !event.send(end_attribute).nil?) ? event.send(end_attribute).to_date : event_start_date
103
115
  (event_start_date..event_end_date.to_date).each do |enumerated_date|
104
116
  events_grouped_by_date[enumerated_date] << event
105
117
  end
@@ -1,7 +1,9 @@
1
1
  module SimpleCalendar
2
2
  class Engine < Rails::Engine
3
3
  initializer "simple_calendar.view_helpers" do
4
- ActionView::Base.send :include, ViewHelpers
4
+ ActiveSupport.on_load(:action_view) do
5
+ include ViewHelpers
6
+ end
5
7
  end
6
8
  end
7
9
  end
@@ -3,5 +3,9 @@ module SimpleCalendar
3
3
  def date_range
4
4
  (start_date.beginning_of_month.beginning_of_week..start_date.end_of_month.end_of_week).to_a
5
5
  end
6
+
7
+ def url_for_previous_view
8
+ view_context.url_for(@params.merge(start_date_param => (date_range.first - 1.day).iso8601))
9
+ end
6
10
  end
7
11
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleCalendar
2
- VERSION = "2.4.2"
2
+ VERSION = "3.0.0"
3
3
  end
@@ -2,17 +2,17 @@ module SimpleCalendar
2
2
  module ViewHelpers
3
3
  def calendar(options = {}, &block)
4
4
  raise "calendar requires a block" unless block
5
- SimpleCalendar::Calendar.new(self, options).render(&block)
5
+ render SimpleCalendar::Calendar.new(self, options, &block)
6
6
  end
7
7
 
8
8
  def month_calendar(options = {}, &block)
9
9
  raise "month_calendar requires a block" unless block
10
- SimpleCalendar::MonthCalendar.new(self, options).render(&block)
10
+ render SimpleCalendar::MonthCalendar.new(self, options, &block)
11
11
  end
12
12
 
13
13
  def week_calendar(options = {}, &block)
14
14
  raise "week_calendar requires a block" unless block
15
- SimpleCalendar::WeekCalendar.new(self, options).render(&block)
15
+ render SimpleCalendar::WeekCalendar.new(self, options, &block)
16
16
  end
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
1
  module SimpleCalendar
2
2
  class WeekCalendar < SimpleCalendar::Calendar
3
3
  def week_number
4
- format = Date.beginning_of_week == :sunday ? "%U" : "%V"
4
+ format = (Date.beginning_of_week == :sunday) ? "%U" : "%V"
5
5
  start_date.beginning_of_week.strftime(format).to_i
6
6
  end
7
7
 
@@ -19,5 +19,9 @@ module SimpleCalendar
19
19
 
20
20
  (starting..ending).to_a
21
21
  end
22
+
23
+ def url_for_previous_view
24
+ view_context.url_for(@params.merge(start_date_param => (date_range.first - 1.day).iso8601))
25
+ end
22
26
  end
23
27
  end
@@ -1,6 +1,13 @@
1
+ require "simple_calendar/engine"
1
2
  require "simple_calendar/calendar"
2
3
  require "simple_calendar/month_calendar"
3
4
  require "simple_calendar/week_calendar"
4
- require "simple_calendar/railtie"
5
5
  require "simple_calendar/version"
6
6
  require "simple_calendar/view_helpers"
7
+
8
+ module SimpleCalendar
9
+ autoload :Calendar, "simple_calendar/calendar"
10
+ autoload :MonthCalendar, "simple_calendar/month_calendar"
11
+ autoload :WeekCalendar, "simple_calendar/week_calendar"
12
+ autoload :ViewHelpers, "simple_calendar/view_helpers"
13
+ end
@@ -14,9 +14,7 @@ Gem::Specification.new do |s|
14
14
  s.rubyforge_project = "simple_calendar"
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
17
  s.require_paths = ["lib"]
19
18
 
20
- s.add_dependency "rails", ">= 3.0"
21
- s.add_development_dependency "rspec"
19
+ s.add_dependency "rails", ">= 6.1"
22
20
  end
@@ -0,0 +1,154 @@
1
+ require "test_helper"
2
+
3
+ class CalendarTest < ActionView::TestCase
4
+ attr_reader :calendar
5
+
6
+ setup do
7
+ @calendar = SimpleCalendar::Calendar.new(view)
8
+ end
9
+
10
+ test "renders a partial with the same name as the class" do
11
+ assert_equal "simple_calendar/calendar", calendar.partial_name
12
+ end
13
+
14
+ test "has start_time as the default attribute" do
15
+ assert_equal :start_time, calendar.attribute
16
+ end
17
+
18
+ test "allows you to override the default attribute" do
19
+ assert_equal :starts_at, SimpleCalendar::Calendar.new(view, attribute: :starts_at).attribute
20
+ end
21
+
22
+ test "set a default when `partial` option isn't present" do
23
+ assert_equal "simple_calendar/calendar", SimpleCalendar::Calendar.new(view).partial_name
24
+ assert_equal "simple_calendar/month_calendar", SimpleCalendar::MonthCalendar.new(view).partial_name
25
+ assert_equal "simple_calendar/week_calendar", SimpleCalendar::WeekCalendar.new(view).partial_name
26
+ end
27
+
28
+ test "allows to override the default partial" do
29
+ assert_equal "simple_calendar/custom_calendar", SimpleCalendar::Calendar.new(view, partial: "simple_calendar/custom_calendar").partial_name
30
+ end
31
+
32
+ test "converts an array of events to a hash sorted by days" do
33
+ today, tomorrow = Date.today, Date.tomorrow
34
+
35
+ event1 = Meeting.new(start_time: today.at_midnight)
36
+ event2 = Meeting.new(start_time: today.at_noon)
37
+ event3 = Meeting.new(start_time: tomorrow.at_noon)
38
+
39
+ events = [event1, event2, event3].shuffle
40
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
41
+
42
+ sorted_events = calendar.sorted_events
43
+
44
+ assert_equal [event1, event2], sorted_events[today]
45
+ assert_equal [event3], sorted_events[tomorrow]
46
+ end
47
+
48
+ test "converts an array of multi-day events to a hash sorted by days" do
49
+ today, tomorrow = Date.today, Date.tomorrow
50
+
51
+ event1 = Meeting.new(start_time: today.at_midnight, end_time: tomorrow.at_midnight)
52
+ event2 = Meeting.new(start_time: today.at_noon)
53
+ event3 = Meeting.new(start_time: tomorrow.at_noon)
54
+
55
+ events = [event1, event2, event3].shuffle
56
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
57
+
58
+ assert_equal [event1, event2], calendar.sorted_events[today]
59
+ assert_equal [event1, event3], calendar.sorted_events[tomorrow]
60
+ end
61
+
62
+ test "handles events without a start time" do
63
+ event = Meeting.new(start_time: nil)
64
+ calendar = SimpleCalendar::Calendar.new(view, events: [event])
65
+
66
+ assert_nothing_raised do
67
+ calendar.sorted_events
68
+ end
69
+ end
70
+
71
+ test "defaults to today's date" do
72
+ calendar = SimpleCalendar::Calendar.new(view)
73
+ assert_equal Date.today, calendar.start_date
74
+ end
75
+
76
+ test "uses the view context's params start_date to override" do
77
+ params[:start_date] = Date.yesterday
78
+ calendar = SimpleCalendar::Calendar.new(view)
79
+ assert_equal Date.yesterday, calendar.start_date
80
+ end
81
+
82
+ test "uses the optional argument's start_date to override view_context's start_date" do
83
+ params[:start_date] = Date.yesterday
84
+ calendar = SimpleCalendar::Calendar.new(view, start_date: Date.tomorrow)
85
+ assert_equal Date.tomorrow, calendar.start_date
86
+ end
87
+
88
+ test "takes an option to override the start_date parameter" do
89
+ params[:date] = Date.yesterday
90
+ calendar = SimpleCalendar::Calendar.new(view, start_date_param: :date)
91
+ assert_equal Date.yesterday, calendar.start_date
92
+ end
93
+
94
+ test "should have the current week" do
95
+ calendar = SimpleCalendar::Calendar.new(view)
96
+ week = calendar.date_range.each_slice(7).to_a[0]
97
+ assert_includes calendar.tr_classes_for(week), "current-week"
98
+ end
99
+
100
+ test "should not have the current week if it does not contain today" do
101
+ params[:start_date] = 6.months.ago
102
+ calendar = SimpleCalendar::MonthCalendar.new(view)
103
+ week = calendar.date_range.each_slice(7).to_a[0]
104
+ assert_not_includes calendar.tr_classes_for(week), "current-week"
105
+ end
106
+
107
+ test "has a param that determines the start date of the calendar" do
108
+ calendar = SimpleCalendar::Calendar.new(view)
109
+ rendering_variables = calendar.locals
110
+ assert_not_nil rendering_variables[:start_date]
111
+ end
112
+
113
+ test "generates a default date if no start date is present" do
114
+ calendar = SimpleCalendar::Calendar.new(view)
115
+ calendar_start_date = calendar.locals[:start_date]
116
+ assert_not_nil calendar_start_date
117
+ assert_kind_of Date, calendar_start_date
118
+ end
119
+
120
+ test "has a range of dates" do
121
+ calendar = SimpleCalendar::Calendar.new(view)
122
+ calendar_date_range = calendar.date_range
123
+ assert_kind_of Array, calendar_date_range
124
+ calendar_date_range.each do |date|
125
+ assert_kind_of Date, date
126
+ end
127
+ end
128
+
129
+ test "accepts an array of events" do
130
+ first_event = Meeting.new(name: "event1", start_time: Date.today)
131
+ second_event = Meeting.new(name: "event2", start_time: Date.today + 1.day)
132
+ events = [first_event, second_event]
133
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
134
+ calendar_sorted_events = calendar.locals[:sorted_events]
135
+
136
+ assert_equal 2, calendar_sorted_events.length
137
+ end
138
+
139
+ test "sorts the events" do
140
+ first_event = Meeting.new(name: "event1", start_time: Date.today + 2.days)
141
+ second_event = Meeting.new(name: "event2", start_time: Date.today + 1.day)
142
+ third_event = Meeting.new(name: "event3", start_time: Date.today)
143
+ events = [first_event, third_event, second_event]
144
+ calendar = SimpleCalendar::Calendar.new(view, events: events)
145
+ calendar_sorted_events = calendar.locals[:sorted_events]
146
+ first_key = calendar_sorted_events.keys[0]
147
+ second_key = calendar_sorted_events.keys[1]
148
+ third_key = calendar_sorted_events.keys[2]
149
+
150
+ assert_equal third_event, calendar_sorted_events[first_key][0]
151
+ assert_equal second_event, calendar_sorted_events[second_key][0]
152
+ assert_equal first_event, calendar_sorted_events[third_key][0]
153
+ end
154
+ end
@@ -0,0 +1,16 @@
1
+ require "test_helper"
2
+
3
+ class MonthCalendarTest < ActionView::TestCase
4
+ test "date_range returns a full calendar month" do
5
+ today = Date.today
6
+ calendar = SimpleCalendar::MonthCalendar.new(view, start_date: today)
7
+ assert calendar.date_range.min <= today.beginning_of_month
8
+ assert calendar.date_range.max >= today.end_of_month
9
+ end
10
+
11
+ test "date_range returns the days of next and previous months on the edges of the calendar" do
12
+ calendar = SimpleCalendar::MonthCalendar.new(view, start_date: Date.new(2018, 8, 1))
13
+ assert_equal Date.new(2018, 7, 30), calendar.date_range.first
14
+ assert_equal Date.new(2018, 9, 2), calendar.date_range.last
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative "config/application"
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets
File without changes
@@ -0,0 +1 @@
1
+ /* Application styles */
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
File without changes
@@ -0,0 +1,59 @@
1
+ class MeetingsController < ApplicationController
2
+ before_action :set_meeting, only: %i[show edit update destroy]
3
+
4
+ # GET /meetings
5
+ def index
6
+ @meetings = Meeting.all
7
+ end
8
+
9
+ # GET /meetings/1
10
+ def show
11
+ end
12
+
13
+ # GET /meetings/new
14
+ def new
15
+ @meeting = Meeting.new
16
+ end
17
+
18
+ # GET /meetings/1/edit
19
+ def edit
20
+ end
21
+
22
+ # POST /meetings
23
+ def create
24
+ @meeting = Meeting.new(meeting_params)
25
+
26
+ if @meeting.save
27
+ redirect_to @meeting, notice: "Meeting was successfully created."
28
+ else
29
+ render :new, status: :unprocessable_entity
30
+ end
31
+ end
32
+
33
+ # PATCH/PUT /meetings/1
34
+ def update
35
+ if @meeting.update(meeting_params)
36
+ redirect_to @meeting, notice: "Meeting was successfully updated."
37
+ else
38
+ render :edit, status: :unprocessable_entity
39
+ end
40
+ end
41
+
42
+ # DELETE /meetings/1
43
+ def destroy
44
+ @meeting.destroy
45
+ redirect_to meetings_url, notice: "Meeting was successfully destroyed."
46
+ end
47
+
48
+ private
49
+
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_meeting
52
+ @meeting = Meeting.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def meeting_params
57
+ params.require(:meeting).permit(:name, :start_time, :end_time)
58
+ end
59
+ end