dcs-eventable 0.0.0 → 0.0.8

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 (100) hide show
  1. data/CHANGELOG.textile +3 -0
  2. data/LICENSE +1 -1
  3. data/README.textile +23 -0
  4. data/Rakefile +69 -19
  5. data/TODO.textile +5 -0
  6. data/VERSION.yml +1 -1
  7. data/app/controllers/eventable/categories_controller.rb +58 -0
  8. data/app/controllers/eventable/categorylists_controller.rb +29 -0
  9. data/app/controllers/eventable/eventable_controller.rb +45 -0
  10. data/app/controllers/eventable/events_controller.rb +54 -0
  11. data/app/controllers/eventable/opening_periodlists_controller.rb +40 -0
  12. data/app/controllers/eventable/opening_periods_controller.rb +78 -0
  13. data/app/controllers/eventable/opening_timelists_controller.rb +45 -0
  14. data/app/controllers/eventable/opening_times_controller.rb +81 -0
  15. data/app/controllers/eventable/pricelists_controller.rb +40 -0
  16. data/app/controllers/eventable/prices_controller.rb +76 -0
  17. data/app/models/eventable/categorization.rb +9 -0
  18. data/app/models/eventable/category.rb +10 -0
  19. data/app/models/eventable/categorylist.rb +49 -0
  20. data/app/models/eventable/opening_period.rb +21 -0
  21. data/app/models/eventable/opening_periodlist.rb +30 -0
  22. data/app/models/eventable/opening_time.rb +42 -0
  23. data/app/models/eventable/opening_timelist.rb +30 -0
  24. data/app/models/eventable/price.rb +15 -0
  25. data/app/models/eventable/pricelist.rb +30 -0
  26. data/app/models/eventable/program_item.rb +11 -0
  27. data/app/models/eventable/review.rb +7 -0
  28. data/app/views/eventable/categories/_form.html.erb +14 -0
  29. data/app/views/eventable/categories/edit.html.erb +13 -0
  30. data/app/views/eventable/categories/index.html.erb +22 -0
  31. data/app/views/eventable/categories/new.html.erb +12 -0
  32. data/app/views/eventable/categories/show.html.erb +17 -0
  33. data/app/views/eventable/categorylists/edit.html.erb +20 -0
  34. data/app/views/eventable/categorylists/show.html.erb +18 -0
  35. data/app/views/eventable/events/edit.html.erb +12 -0
  36. data/app/views/eventable/events/index.html.erb +20 -0
  37. data/app/views/eventable/events/new.html.erb +11 -0
  38. data/app/views/eventable/events/show.html.erb +12 -0
  39. data/app/views/eventable/opening_periodlists/edit.html.erb +16 -0
  40. data/app/views/eventable/opening_periodlists/show.html.erb +28 -0
  41. data/app/views/eventable/opening_periods/_form.html.erb +9 -0
  42. data/app/views/eventable/opening_periods/edit.html.erb +13 -0
  43. data/app/views/eventable/opening_periods/index.html.erb +22 -0
  44. data/app/views/eventable/opening_periods/new.html.erb +12 -0
  45. data/app/views/eventable/opening_periods/show.html.erb +13 -0
  46. data/app/views/eventable/opening_timelists/edit.html.erb +16 -0
  47. data/app/views/eventable/opening_timelists/show.html.erb +30 -0
  48. data/app/views/eventable/opening_times/_form.html.erb +14 -0
  49. data/app/views/eventable/opening_times/edit.html.erb +13 -0
  50. data/app/views/eventable/opening_times/index.html.erb +24 -0
  51. data/app/views/eventable/opening_times/new.html.erb +12 -0
  52. data/app/views/eventable/opening_times/show.html.erb +18 -0
  53. data/app/views/eventable/pricelists/edit.html.erb +16 -0
  54. data/app/views/eventable/pricelists/show.html.erb +28 -0
  55. data/app/views/eventable/prices/_form.html.erb +9 -0
  56. data/app/views/eventable/prices/edit.html.erb +13 -0
  57. data/app/views/eventable/prices/index.html.erb +22 -0
  58. data/app/views/eventable/prices/new.html.erb +12 -0
  59. data/app/views/eventable/prices/show.html.erb +13 -0
  60. data/config/routes.rb +25 -0
  61. data/generators/eventable/USAGE +1 -0
  62. data/generators/eventable/eventable_generator.rb +26 -0
  63. data/generators/eventable/templates/README +1 -0
  64. data/generators/eventable/templates/factories.rb +12 -0
  65. data/generators/eventable/templates/migrations/eventable.rb +134 -0
  66. data/lib/eventable.rb +27 -0
  67. data/lib/eventable/acts_as_event.rb +10 -0
  68. data/lib/eventable/model.rb +58 -0
  69. data/rails/init.rb +1 -0
  70. data/shoulda_macros/eventable.rb +16 -0
  71. data/test/rails_root/app/controllers/application_controller.rb +10 -0
  72. data/test/rails_root/app/controllers/events_controller.rb +85 -0
  73. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  74. data/test/rails_root/app/helpers/events_helper.rb +2 -0
  75. data/test/rails_root/app/models/event.rb +3 -0
  76. data/test/rails_root/app/models/user.rb +2 -0
  77. data/test/rails_root/config/boot.rb +110 -0
  78. data/test/rails_root/config/environment.rb +41 -0
  79. data/test/rails_root/config/environments/development.rb +17 -0
  80. data/test/rails_root/config/environments/production.rb +28 -0
  81. data/test/rails_root/config/environments/test.rb +28 -0
  82. data/test/rails_root/config/initializers/backtrace_silencers.rb +7 -0
  83. data/test/rails_root/config/initializers/inflections.rb +10 -0
  84. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  85. data/test/rails_root/config/initializers/new_rails_defaults.rb +19 -0
  86. data/test/rails_root/config/initializers/session_store.rb +15 -0
  87. data/test/rails_root/config/locales/en.rb +19 -0
  88. data/test/rails_root/config/locales/nl.rb +30 -0
  89. data/test/rails_root/config/routes.rb +3 -0
  90. data/test/rails_root/db/migrate/20090504165857_create_events.rb +13 -0
  91. data/test/rails_root/db/migrate/20090512075657_setup_eventable_0_0_0.rb +60 -0
  92. data/test/rails_root/db/schema.rb +71 -0
  93. data/test/rails_root/test/factories/eventable.rb +12 -0
  94. data/test/rails_root/test/functional/events_controller_test.rb +4 -0
  95. data/test/rails_root/test/unit/event_test.rb +8 -0
  96. data/test/rails_root/test/unit/helpers/events_helper_test.rb +4 -0
  97. data/test/test_helper.rb +23 -6
  98. metadata +134 -10
  99. data/README.rdoc +0 -7
  100. data/test/eventable_test.rb +0 -7
data/CHANGELOG.textile ADDED
@@ -0,0 +1,3 @@
1
+ h2. 0.0.0 (27/04/2009)
2
+
3
+ * started gem
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Mathijs Kwik
1
+ Copyright (c) 2009 Dutch Coast Software
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.textile ADDED
@@ -0,0 +1,23 @@
1
+ h1. Eventable
2
+
3
+ Description goes here.
4
+
5
+ h2. Getting started
6
+
7
+ * ./script/generate eventable will generate a migration.
8
+ * check/adjust this migration and migrate.
9
+ * add acts_as_event (see rdoc) to your site's main event model.
10
+ * general settings like authentication/permissions can be configured
11
+ by creating your own version of EventableController (see rdoc)
12
+ * you can override model behaviour by subclassing the models
13
+ * you can override controller actions by overriding methods from
14
+ Eventable::EventableController in ApplicationController (or a
15
+ mixin). define custom (before|after)_action_controller(_fail)? callbacks
16
+
17
+
18
+
19
+
20
+ h2. Copyright
21
+
22
+ Copyright (c) 2009 Dutch Coast Software. See LICENSE for details.
23
+
data/Rakefile CHANGED
@@ -1,28 +1,50 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
 
4
+ def version
5
+ if File.exist?('VERSION.yml')
6
+ config = YAML.load(File.read('VERSION.yml'))
7
+ "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
8
+ else
9
+ ""
10
+ end
11
+ end
12
+
13
+ # gem builder
4
14
  begin
5
15
  require 'jeweler'
6
16
  Jeweler::Tasks.new do |gem|
7
17
  gem.name = "eventable"
8
18
  gem.summary = %Q{TODO}
19
+ gem.description = %Q{TODO}
9
20
  gem.email = "info@dutchcoastsoftware.com"
10
21
  gem.homepage = "http://github.com/dcs/eventable"
11
22
  gem.authors = ["Mathijs Kwik"]
12
-
13
- # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
23
+ gem.add_development_dependency('redgreen')
24
+ gem.files = FileList["[A-Z]*", "{app,config,generators,lib,shoulda_macros,rails}/**/*"]
25
+ gem.rdoc_options << '--main' << 'README.textile' << '--title' << "Eventable #{version}"
26
+ gem.extra_rdoc_files = ["*.textile", "LICENSE", "app/**/*.rb"]
14
27
  end
15
28
  rescue LoadError
16
29
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
30
  end
18
31
 
19
- require 'rake/testtask'
20
- Rake::TestTask.new(:test) do |test|
21
- test.libs << 'lib' << 'test'
22
- test.pattern = 'test/**/*_test.rb'
23
- test.verbose = true
32
+
33
+
34
+ # rdoc generation
35
+ require 'rake/rdoctask'
36
+ Rake::RDocTask.new do |rdoc|
37
+ rdoc.rdoc_dir = 'rdoc'
38
+ rdoc.title = "Eventable #{version}"
39
+ rdoc.rdoc_files.include('*.textile')
40
+ rdoc.rdoc_files.include('LICENSE')
41
+ rdoc.rdoc_files.include('lib/**/*.rb')
42
+ rdoc.rdoc_files.include('app/**/*.rb')
43
+ rdoc.main = "README.textile"
24
44
  end
25
45
 
46
+
47
+ # rcov test coverage
26
48
  begin
27
49
  require 'rcov/rcovtask'
28
50
  Rcov::RcovTask.new do |test|
@@ -37,20 +59,48 @@ rescue LoadError
37
59
  end
38
60
 
39
61
 
40
- task :default => :test
62
+ # testing with a full empty rails app
63
+ require 'rake/testtask'
64
+ namespace :test do
65
+ Rake::TestTask.new(:all => ['generator:cleanup',
66
+ 'generator:generate']) do |task|
67
+ task.libs << 'lib'
68
+ task.libs << "test"
69
+ task.pattern = 'test/**/*_test.rb'
70
+ task.verbose = false
71
+ end
72
+ end
41
73
 
42
- require 'rake/rdoctask'
43
- Rake::RDocTask.new do |rdoc|
44
- if File.exist?('VERSION.yml')
45
- config = YAML.load(File.read('VERSION.yml'))
46
- version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
47
- else
48
- version = ""
74
+
75
+ generators = %w(eventable)
76
+
77
+ namespace :generator do
78
+ desc "Cleans up the test app before running the generator"
79
+ task :cleanup do
80
+ generators.each do |generator|
81
+ FileList["generators/#{generator}/templates/**/*.*"].each do |each|
82
+ file = "test/rails_root/#{each.gsub("generators/#{generator}/templates/",'')}"
83
+ File.delete(file) if File.exists?(file)
84
+ end
85
+ end
86
+
87
+ FileList["test/rails_root/db/migrate/*_setup_eventable_#{version.gsub('.', '_')}.rb"].each do |each|
88
+ FileUtils.rm_rf(each)
89
+ end
90
+
91
+ FileUtils.rm_rf("test/rails_root/vendor/plugins/eventable")
92
+ FileUtils.mkdir_p("test/rails_root/vendor/plugins")
93
+ eventable_root = File.expand_path(File.dirname(__FILE__))
94
+ system("ln -fns #{eventable_root} test/rails_root/vendor/plugins/eventable")
49
95
  end
50
96
 
51
- rdoc.rdoc_dir = 'rdoc'
52
- rdoc.title = "eventable #{version}"
53
- rdoc.rdoc_files.include('README*')
54
- rdoc.rdoc_files.include('lib/**/*.rb')
97
+ desc "Run the generator on the tests"
98
+ task :generate do
99
+ generators.each do |generator|
100
+ system "cd test/rails_root && ./script/generate #{generator} && rake db:migrate db:test:prepare"
101
+ end
102
+ end
55
103
  end
56
104
 
105
+ desc "Run the test suite"
106
+ task :default => 'test:all'
data/TODO.textile ADDED
@@ -0,0 +1,5 @@
1
+ h2. To-do
2
+
3
+ * use delocalize plugin/gem instead of manual setter-intervention
4
+
5
+
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 0
4
- :patch: 0
4
+ :patch: 8
@@ -0,0 +1,58 @@
1
+ class Eventable::CategoriesController < Eventable::EventableController
2
+
3
+ before_filter :get_categories, :only => [:index]
4
+ before_filter :get_category, :only => [:show, :edit, :update, :destroy]
5
+ before_filter :new_category, :only => [:new, :create]
6
+
7
+ def create
8
+ if @category.update_attributes(params[:eventable_category])
9
+ try_after_callback do
10
+ flash[:notice] = 'Category was successfully created.'
11
+ redirect_to(eventable_category_path(@category))
12
+ end
13
+ else
14
+ try_after_callback :fail do
15
+ render :action => "new"
16
+ end
17
+ end
18
+ end
19
+
20
+ def update
21
+ if @category.update_attributes(params[:eventable_category])
22
+ try_after_callback do
23
+ flash[:notice] = 'Category was successfully updated.'
24
+ redirect_to(eventable_category_path(@category))
25
+ end
26
+ else
27
+ try_after_callback :fail do
28
+ render :action => "edit"
29
+ end
30
+ end
31
+ end
32
+
33
+ def destroy
34
+ @category.destroy
35
+ try_after_callback do
36
+ redirect_to(eventable_categories_path)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def model
43
+ Eventable::Category
44
+ end
45
+
46
+ def get_categories
47
+ @categories = model.all
48
+ end
49
+
50
+ def get_category
51
+ @category = model.find(params[:id])
52
+ end
53
+
54
+ def new_category
55
+ @category = model.new
56
+ end
57
+
58
+ end
@@ -0,0 +1,29 @@
1
+ class Eventable::CategorylistsController < Eventable::EventableController
2
+
3
+ before_filter :get_event
4
+ before_filter :get_categorylist
5
+
6
+ def update
7
+ if @categorylist.update_attributes(params[:eventable_categorylist])
8
+ try_after_callback do
9
+ flash[:notice] = 'Categories were successfully updated.'
10
+ redirect_to(eventable_event_categorylist_path(@event))
11
+ end
12
+ else
13
+ try_after_callback :fail do
14
+ render :action => "edit"
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def get_event
22
+ @event = event_model.find(params[:event_id])
23
+ end
24
+
25
+ def get_categorylist
26
+ @categorylist = @event.categorylist
27
+ end
28
+
29
+ end
@@ -0,0 +1,45 @@
1
+ class Eventable::EventableController < ApplicationController
2
+
3
+ before_filter :try_before_callback
4
+
5
+ # make default actions that do nothing but just execute the callback
6
+ %w(index show new create edit update destroy).each do |action|
7
+ define_method action do
8
+ try_after_callback
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ # auto detected from the model that uses acts_as_event
15
+ def event_model
16
+ Eventable.model
17
+ end
18
+
19
+ # events themselves should be handled by the application
20
+ # override to true to use the (debugging) eventscontroller from this
21
+ # gem
22
+ def enable_events_controller
23
+ false
24
+ end
25
+
26
+ def try_before_callback
27
+ m = "before_#{action_name}_#{controller_name}"
28
+ send(m) if respond_to?(m)
29
+ end
30
+
31
+
32
+ # influence eventable controller actions below here
33
+ # the naming scheme is (before|after)_action / after_action_fail
34
+
35
+ def try_after_callback(failing = false)
36
+ m = "after_#{action_name}_#{controller_name}"
37
+ m << "_fail" if failing
38
+ if respond_to? m
39
+ send(m)
40
+ else
41
+ yield if block_given?
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,54 @@
1
+ class Eventable::EventsController < Eventable::EventableController
2
+
3
+ before_filter :service_not_available, :unless => :enable_events_controller
4
+
5
+ before_filter :get_events, :only => [:index]
6
+ before_filter :get_event, :only => [:show, :edit, :update, :destroy]
7
+ before_filter :new_event, :only => [:new, :create]
8
+
9
+ def create
10
+ if @event.update_attributes(params[:eventable_event])
11
+ flash[:notice] = 'Event was successfully created.'
12
+ redirect_to(eventable_event_path(@event))
13
+ else
14
+ render :action => "new"
15
+ end
16
+ end
17
+
18
+ def update
19
+ if @event.update_attributes(params[:eventable_event])
20
+ flash[:notice] = 'Event was successfully updated.'
21
+ redirect_to(eventable_event_path(@event))
22
+ else
23
+ render :action => "edit"
24
+ end
25
+ end
26
+
27
+ def destroy
28
+ @event.destroy
29
+ redirect_to(eventable_events_path)
30
+ end
31
+
32
+ private
33
+
34
+ def model
35
+ event_model
36
+ end
37
+
38
+ def get_events
39
+ @events = model.all
40
+ end
41
+
42
+ def get_event
43
+ @event = model.find(params[:id])
44
+ end
45
+
46
+ def new_event
47
+ @event = model.new
48
+ end
49
+
50
+ def service_not_available
51
+ raise "the events controller from the eventable gem should not be used except for debugging"
52
+ end
53
+
54
+ end
@@ -0,0 +1,40 @@
1
+ class Eventable::OpeningPeriodlistsController < Eventable::EventableController
2
+
3
+ before_filter :get_event
4
+ before_filter :get_opening_periodlist
5
+
6
+ def show
7
+ @new_opening_period = @event.opening_periods.build
8
+ try_after_callback
9
+ end
10
+
11
+ def edit
12
+ # you can add a blank/new item like this:
13
+ # @opening_periodlist.add_blank
14
+ try_after_callback
15
+ end
16
+
17
+ def update
18
+ if @opening_periodlist.update_attributes(params[:eventable_opening_periodlist])
19
+ try_after_callback do
20
+ flash[:notice] = 'Opening periods were successfully updated.'
21
+ redirect_to(eventable_event_opening_periodlist_path(@event))
22
+ end
23
+ else
24
+ try_after_callback :fail do
25
+ render :action => "edit"
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def get_event
33
+ @event = event_model.find(params[:event_id])
34
+ end
35
+
36
+ def get_opening_periodlist
37
+ @opening_periodlist = @event.opening_periodlist
38
+ end
39
+
40
+ end
@@ -0,0 +1,78 @@
1
+ class Eventable::OpeningPeriodsController < Eventable::EventableController
2
+
3
+ before_filter :get_event
4
+
5
+ before_filter :get_opening_periods, :only => [:index]
6
+ before_filter :get_opening_period, :only => [:show, :edit, :update, :destroy]
7
+ before_filter :new_opening_period, :only => [:new, :create]
8
+
9
+ def create
10
+ if @opening_period.update_attributes(params[:eventable_opening_period])
11
+ try_after_callback do
12
+ flash[:notice] = 'Opening Period was successfully added.'
13
+ redirect_to (if params[:list]
14
+ eventable_event_opening_periodlist_path @event
15
+ else
16
+ eventable_event_opening_period_path @event, @opening_period
17
+ end)
18
+ end
19
+ else
20
+ try_after_callback :fail do
21
+ render :action => "new"
22
+ end
23
+ end
24
+ end
25
+
26
+ def update
27
+ if @opening_period.update_attributes(params[:eventable_opening_period])
28
+ try_after_callback do
29
+ flash[:notice] = 'Opening period was successfully updated.'
30
+ redirect_to (if params[:list]
31
+ eventable_event_opening_periodlist_path @event
32
+ else
33
+ eventable_event_opening_period_path @event, @opening_period
34
+ end)
35
+ end
36
+ else
37
+ try_after_callback :fail do
38
+ render :action => "edit"
39
+ end
40
+ end
41
+ end
42
+
43
+ def destroy
44
+ @opening_period.destroy
45
+ try_after_callback do
46
+ redirect_to (if params[:list]
47
+ eventable_event_opening_periodlist_path @event
48
+ else
49
+ eventable_event_opening_periods_path @event
50
+ end)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def model
57
+ @event ? @event.opening_periods : Eventable::OpeningPeriod
58
+ end
59
+
60
+ def get_opening_periods
61
+ @opening_periods = model.all
62
+ end
63
+
64
+ def get_opening_period
65
+ @opening_period = model.find(params[:id])
66
+ @event ||= @opening_period.event #fix @event in case we aren't
67
+ #below /events
68
+ end
69
+
70
+ def new_opening_period
71
+ @opening_period = @event ? model.build : model.new
72
+ end
73
+
74
+ def get_event
75
+ @event = event_model.find(params[:event_id]) if params[:event_id]
76
+ end
77
+
78
+ end