qcourses 0.1.2

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.
Files changed (65) hide show
  1. data/.rspec +1 -0
  2. data/Gemfile +23 -0
  3. data/Gemfile.lock +75 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +19 -0
  6. data/Rakefile +52 -0
  7. data/VERSION +1 -0
  8. data/config.ru +3 -0
  9. data/db/migrations/001_initial_database.rb +25 -0
  10. data/db/migrations/002_create_registrations.rb +29 -0
  11. data/demo_app.rb +11 -0
  12. data/lib/factories.rb +111 -0
  13. data/lib/qcourses/configuration.rb +35 -0
  14. data/lib/qcourses/controllers/base.rb +20 -0
  15. data/lib/qcourses/controllers/courses_controller.rb +16 -0
  16. data/lib/qcourses/controllers/events_controller.rb +54 -0
  17. data/lib/qcourses/controllers/registrations_controller.rb +51 -0
  18. data/lib/qcourses/controllers.rb +5 -0
  19. data/lib/qcourses/date_ex.rb +18 -0
  20. data/lib/qcourses/models/course.rb +30 -0
  21. data/lib/qcourses/models/course_repository.rb +90 -0
  22. data/lib/qcourses/models/event.rb +54 -0
  23. data/lib/qcourses/models/location.rb +17 -0
  24. data/lib/qcourses/models/registration.rb +36 -0
  25. data/lib/qcourses/models.rb +28 -0
  26. data/lib/qcourses/qcourses.rake.rb +21 -0
  27. data/lib/qcourses/renderers.rb +26 -0
  28. data/lib/qcourses/resource_paths.rb +45 -0
  29. data/lib/qcourses/string_ex.rb +5 -0
  30. data/lib/qcourses/view_helpers.rb +70 -0
  31. data/lib/qcourses/web_app.rb +29 -0
  32. data/lib/qcourses.rb +21 -0
  33. data/public/css/default.css +91 -0
  34. data/public/img/delete.gif +0 -0
  35. data/public/javascript/jquery-1.7.js +9300 -0
  36. data/public/javascript/jquery-1.7.min.js +4 -0
  37. data/public/javascript/qcourses.js +20 -0
  38. data/spec/factories_spec.rb +131 -0
  39. data/spec/qcourses/configuration_spec.rb +37 -0
  40. data/spec/qcourses/controllers/courses_controller_spec.rb +43 -0
  41. data/spec/qcourses/controllers/events_controller_spec.rb +100 -0
  42. data/spec/qcourses/controllers/registrations_controller_spec.rb +100 -0
  43. data/spec/qcourses/models/course_repository_spec.rb +147 -0
  44. data/spec/qcourses/models/event_spec.rb +74 -0
  45. data/spec/qcourses/models/location_spec.rb +19 -0
  46. data/spec/qcourses/models/registration_spec.rb +55 -0
  47. data/spec/qcourses/renderers_spec.rb +82 -0
  48. data/spec/qcourses/string_ex_spec.rb +11 -0
  49. data/spec/qcourses/view_helpers_spec.rb +90 -0
  50. data/spec/spec_helper.rb +38 -0
  51. data/spec/support/factories.rb +24 -0
  52. data/spec/support/matchers.rb +61 -0
  53. data/spec/support/request_specs.rb +4 -0
  54. data/spec/support/test_files.rb +20 -0
  55. data/views/admin.haml +9 -0
  56. data/views/events/index.haml +18 -0
  57. data/views/events/new.haml +34 -0
  58. data/views/layout.haml +9 -0
  59. data/views/registration.haml +9 -0
  60. data/views/registrations/new.haml +37 -0
  61. data/views/registrations/participant.haml +12 -0
  62. data/views/registrations/success.haml +4 -0
  63. data/views/trainings/error.haml +1 -0
  64. data/views/trainings/index.haml +9 -0
  65. metadata +306 -0
@@ -0,0 +1,61 @@
1
+ RSpec::Matchers.define :accept_values do |*values|
2
+ chain :for do |attribute|
3
+ @attribute = attribute
4
+ end
5
+ match do |model|
6
+ @passed_values = []
7
+ @failed_values = []
8
+ old_value = model.send(@attribute)
9
+ values.each do |value|
10
+ set_value(model, value)
11
+ if (model.valid?)
12
+ @passed_values << value
13
+ else
14
+ @failed_values << value
15
+ end
16
+ end
17
+ set_value(model, old_value)
18
+ @passed_values == values
19
+ end
20
+
21
+ failure_message_for_should do |model|
22
+ "validation for #{@failed_values.inspect} on '#{@attribute}' failed, expected them to pass"
23
+ end
24
+ failure_message_for_should_not do |model|
25
+ "you might want to change this to should reject_values(...).for(#{@attribute})"
26
+ end
27
+ def set_value(model, value)
28
+ model.send("#{@attribute}=", value)
29
+ end
30
+ end
31
+ RSpec::Matchers.define :reject_values do |*values|
32
+ chain :for do |attribute|
33
+ @attribute = attribute
34
+ end
35
+ match do |model|
36
+ @passed_values = []
37
+ @failed_values = []
38
+ old_value = model.send(@attribute)
39
+ values.each do |value|
40
+ set_value(model, value)
41
+ if (model.valid?)
42
+ @passed_values << value
43
+ else
44
+ @failed_values << value
45
+ end
46
+ end
47
+ set_value(model, old_value)
48
+ @failed_values == values
49
+ end
50
+
51
+ failure_message_for_should do |model|
52
+ "validation for #{@passed_values.inspect} on '#{@attribute}' passed, expected them to fail"
53
+ end
54
+ failure_message_for_should_not do |model|
55
+ "you might want to change this to should accept_values(...).for(#{attribute})"
56
+ end
57
+ def set_value(model, value)
58
+ model.send("#{@attribute}=", value)
59
+ end
60
+ end
61
+
@@ -0,0 +1,4 @@
1
+ shared_context "for request specs", :type => :request do
2
+ let (:last_body) { last_response.body }
3
+ end
4
+
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+
3
+ module TestFiles
4
+ include FileUtils
5
+ def spec_path(path = nil)
6
+ return @spec_path ||= File.expand_path('spec') unless path
7
+ raise "create files here" unless File.exists?(spec_path) and File.directory?(spec_path)
8
+ File.expand_path(path, spec_path)
9
+ end
10
+
11
+ def delete_files(root)
12
+ File.exists?(spec_path('files')) && rm_r(spec_path('files'))
13
+ end
14
+
15
+ def create_file(filepath, content)
16
+ mkdir_p File.dirname(spec_path(filepath))
17
+ File.open(spec_path(filepath), "w+") { |f| f.write(content) }
18
+ filepath
19
+ end
20
+ end
data/views/admin.haml ADDED
@@ -0,0 +1,9 @@
1
+ !!! XML
2
+ !!!
3
+ %html
4
+ %head
5
+ %link(href='/css/default.css' media="screen" rel="stylesheet" )
6
+ %script(src='/javascript/jquery-1.7.js' type='text/javascript' )
7
+ %script(src='/javascript/qcourses.js' type='text/javascript' )
8
+ %body
9
+ =yield
@@ -0,0 +1,18 @@
1
+ %section.list
2
+ -if @events.empty?
3
+ .events no events planned
4
+ - else
5
+ .events
6
+ - @events.each do |event|
7
+ %div(id="event_#{event.id}" class='event')
8
+ .event_name
9
+ = event.name
10
+ .event_subtitle
11
+ = event.subtitle
12
+ .event_registration
13
+ %a{ :href=> url("/registrations/new/#{event.id}") } register
14
+ .event_date_location
15
+ = human_period event.from, event.to
16
+ %br
17
+ = event.location_name
18
+ .clear
@@ -0,0 +1,34 @@
1
+
2
+ %section.form
3
+ %form(id='events' action= "#{admin_request_url}" method ='post')
4
+ .label
5
+ %label(for="event[course_id]") Course:
6
+ .input
7
+ %select{:name => "event[course_id]"}
8
+ = course_options
9
+ .label
10
+ %label(for="event[from]") From:
11
+ .input
12
+ %input{:type => "text", :name => "event[from]", :class => "date"}
13
+ .label
14
+ %label(for="event[to]") To:
15
+ .input
16
+ %input{:type => "text", :name => "event[to]", :class => "date"}
17
+ #location_selector{ :style => display_if_locations }
18
+ .label
19
+ %label(for="event[location_id]") Where
20
+ .input
21
+ %select#event_location{:name => "event[location_id]"}
22
+ = location_options
23
+ #location_name{ :style => display_unless_locations }
24
+ .label
25
+ %label(for="event[location]") New location name
26
+ .input
27
+ %input{:type => "text", :name => "event[location]"}
28
+
29
+ .label
30
+ .input
31
+ %input{:type => "submit", :value => "plan event" }
32
+ %span.clear
33
+
34
+ = haml :'/events/index', :layout => false
data/views/layout.haml ADDED
@@ -0,0 +1,9 @@
1
+ !!! XML
2
+ !!!
3
+ %html
4
+ %head
5
+ %link(href='/css/default.css' media="screen" rel="stylesheet" )
6
+ %script(src='/javascript/jquery-1.7.js' type='text/javascript' )
7
+ %script(src='/javascript/qcourses.js' type='text/javascript' )
8
+ %body
9
+ =yield
@@ -0,0 +1,9 @@
1
+ !!! XML
2
+ !!!
3
+ %html
4
+ %head
5
+ %link(href='/css/default.css' media="screen" rel="stylesheet" )
6
+ %script(src='/javascript/jquery-1.7.js' type='text/javascript' )
7
+ %script(src='/javascript/qcourses.js' type='text/javascript' )
8
+ %body
9
+ =yield
@@ -0,0 +1,37 @@
1
+ %h2 Registration
2
+ %h3= "#{@event.name} - #{human_period @event.from, @event.to} - #{@event.location_name}"
3
+ %section.form
4
+ %form(id='registrations' action= "#{url request_url(@event.id)}" method ='post')
5
+ - @employees.each do |employee|
6
+ = haml :'/registrations/participant', locals: { employee: employee }
7
+ %div(id="add-participant" class="add-participant" data-url="#{url '/registrations/add_participant/'}")
8
+ %a(href="#") more participants
9
+ %div(id="add-participant-throbber" class="add-participant" style="display:none;") please wait...
10
+ %fieldset
11
+ %legend Company / invoicing
12
+ .label
13
+ %label(for="company[name]") Name:
14
+ .input
15
+ = input_for :company, :name
16
+ .label
17
+ %label(for="company[contact]") Contact person:
18
+ .input
19
+ = input_for :company, :contact_person
20
+ .label
21
+ %label(for="company[contact_email]") Contact email:
22
+ .input
23
+ = input_for :company, :contact_email
24
+ .label
25
+ %label(for="company[address]") Invoice address:
26
+ .input
27
+ ~ textarea_for :company, :invoice_address
28
+ .label
29
+ %label(for="company[postal_code]") Postal Code - City:
30
+ .input
31
+ = input_for :company, :postal_code, :class => "postal-code", :suppress_error_messages => true
32
+ = input_for :company, :city, :class => 'city'
33
+ .label
34
+ .input
35
+ %input{:type => "submit", :value => "Register" }
36
+ %span.clear
37
+
@@ -0,0 +1,12 @@
1
+ %fieldset
2
+ %legend Participant
3
+ .label
4
+ %label(for="employee[][name]") Name:
5
+ .input
6
+ = input_for(employee, :name, :array_element => true)
7
+ .label
8
+ %label(for="employee[][email]") Email:
9
+ .input
10
+ = input_for(employee, :email, :array_element => true)
11
+ %div(style="text-align:right;")
12
+ %a(href="#" onclick='$(this).parent().parent().remove();') remove
@@ -0,0 +1,4 @@
1
+ %h1 Thank you for registering
2
+
3
+ %p.thanks
4
+ We have received your registration in good order. An email confirming the registration is on its way you
@@ -0,0 +1 @@
1
+ %p.error= message
@@ -0,0 +1,9 @@
1
+ %secton.list
2
+ - if @courses.empty?
3
+ .courses no courses yet
4
+ - else
5
+ .courses
6
+ - @courses.each do |course|
7
+ %div(id="course_#{course.identification}" class="course")
8
+ .training_name= course.name
9
+ .training_subtitle= course.subtitle
metadata ADDED
@@ -0,0 +1,306 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qcourses
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Rob Westgeest
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.2.6
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.2.6
30
+ - !ruby/object:Gem::Dependency
31
+ name: haml
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 3.1.4
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.1.4
46
+ - !ruby/object:Gem::Dependency
47
+ name: sequel
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 3.33.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 3.33.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: sqlite3
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.5
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.3.5
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '2.8'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '2.8'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rack-test
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: ZenTest
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rdoc
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: '3.12'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '3.12'
142
+ - !ruby/object:Gem::Dependency
143
+ name: bundler
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ~>
148
+ - !ruby/object:Gem::Version
149
+ version: 1.1.0
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 1.1.0
158
+ - !ruby/object:Gem::Dependency
159
+ name: jeweler
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: 1.8.3
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 1.8.3
174
+ - !ruby/object:Gem::Dependency
175
+ name: simplecov
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ - !ruby/object:Gem::Dependency
191
+ name: capybara
192
+ requirement: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ type: :development
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ description: Course management module for QWAN nesta site
207
+ email: rob.westgeest@gmail.com
208
+ executables: []
209
+ extensions: []
210
+ extra_rdoc_files:
211
+ - LICENSE.txt
212
+ - README.rdoc
213
+ files:
214
+ - .rspec
215
+ - Gemfile
216
+ - Gemfile.lock
217
+ - README.rdoc
218
+ - Rakefile
219
+ - VERSION
220
+ - config.ru
221
+ - db/migrations/001_initial_database.rb
222
+ - db/migrations/002_create_registrations.rb
223
+ - demo_app.rb
224
+ - lib/factories.rb
225
+ - lib/qcourses.rb
226
+ - lib/qcourses/configuration.rb
227
+ - lib/qcourses/controllers.rb
228
+ - lib/qcourses/controllers/base.rb
229
+ - lib/qcourses/controllers/courses_controller.rb
230
+ - lib/qcourses/controllers/events_controller.rb
231
+ - lib/qcourses/controllers/registrations_controller.rb
232
+ - lib/qcourses/date_ex.rb
233
+ - lib/qcourses/models.rb
234
+ - lib/qcourses/models/course.rb
235
+ - lib/qcourses/models/course_repository.rb
236
+ - lib/qcourses/models/event.rb
237
+ - lib/qcourses/models/location.rb
238
+ - lib/qcourses/models/registration.rb
239
+ - lib/qcourses/qcourses.rake.rb
240
+ - lib/qcourses/renderers.rb
241
+ - lib/qcourses/resource_paths.rb
242
+ - lib/qcourses/string_ex.rb
243
+ - lib/qcourses/view_helpers.rb
244
+ - lib/qcourses/web_app.rb
245
+ - public/css/default.css
246
+ - public/img/delete.gif
247
+ - public/javascript/jquery-1.7.js
248
+ - public/javascript/jquery-1.7.min.js
249
+ - public/javascript/qcourses.js
250
+ - spec/factories_spec.rb
251
+ - spec/qcourses/configuration_spec.rb
252
+ - spec/qcourses/controllers/courses_controller_spec.rb
253
+ - spec/qcourses/controllers/events_controller_spec.rb
254
+ - spec/qcourses/controllers/registrations_controller_spec.rb
255
+ - spec/qcourses/models/course_repository_spec.rb
256
+ - spec/qcourses/models/event_spec.rb
257
+ - spec/qcourses/models/location_spec.rb
258
+ - spec/qcourses/models/registration_spec.rb
259
+ - spec/qcourses/renderers_spec.rb
260
+ - spec/qcourses/string_ex_spec.rb
261
+ - spec/qcourses/view_helpers_spec.rb
262
+ - spec/spec_helper.rb
263
+ - spec/support/factories.rb
264
+ - spec/support/matchers.rb
265
+ - spec/support/request_specs.rb
266
+ - spec/support/test_files.rb
267
+ - views/admin.haml
268
+ - views/events/index.haml
269
+ - views/events/new.haml
270
+ - views/layout.haml
271
+ - views/registration.haml
272
+ - views/registrations/new.haml
273
+ - views/registrations/participant.haml
274
+ - views/registrations/success.haml
275
+ - views/trainings/error.haml
276
+ - views/trainings/index.haml
277
+ - LICENSE.txt
278
+ homepage: http://github.com/rwestgeest/qcourses
279
+ licenses:
280
+ - MIT
281
+ post_install_message:
282
+ rdoc_options: []
283
+ require_paths:
284
+ - lib
285
+ required_ruby_version: !ruby/object:Gem::Requirement
286
+ none: false
287
+ requirements:
288
+ - - ! '>='
289
+ - !ruby/object:Gem::Version
290
+ version: '0'
291
+ segments:
292
+ - 0
293
+ hash: 894493885
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ none: false
296
+ requirements:
297
+ - - ! '>='
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ requirements: []
301
+ rubyforge_project:
302
+ rubygems_version: 1.8.21
303
+ signing_key:
304
+ specification_version: 3
305
+ summary: Course management module for QWAN nesta site
306
+ test_files: []