qcourses 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: []