rows_controller 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.rspec +2 -0
  2. data/.rvmrc +3 -0
  3. data/.watchr +56 -0
  4. data/Gemfile +16 -0
  5. data/Gemfile.lock +136 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +91 -0
  8. data/Rakefile +30 -0
  9. data/app/controllers/rows_controller.rb +80 -0
  10. data/app/controllers/rows_controller/helpers.rb +86 -0
  11. data/app/views/rows/_form.html.erb +3 -0
  12. data/app/views/rows/_list.html.erb +31 -0
  13. data/app/views/rows/_submit.html.erb +22 -0
  14. data/app/views/rows/_submit_part.html.erb +4 -0
  15. data/app/views/rows/destroy.js.erb +1 -0
  16. data/app/views/rows/edit.html.erb +22 -0
  17. data/app/views/rows/index.html.erb +20 -0
  18. data/app/views/rows/new.html.erb +22 -0
  19. data/app/views/rows/show.html.erb +25 -0
  20. data/app/views/shared/_error_explanation.html.erb +14 -0
  21. data/app/views/shared/_flash.html.erb +9 -0
  22. data/lib/rows_controller.rb +5 -0
  23. data/lib/rows_controller/engine.rb +4 -0
  24. data/lib/rows_controller/locales/en.yml +33 -0
  25. data/lib/rows_controller/version.rb +3 -0
  26. data/rows_controller.gemspec +27 -0
  27. data/spec/controllers/orders_spec.rb +65 -0
  28. data/spec/controllers/rows_spec.rb +19 -0
  29. data/spec/dummy/Rakefile +7 -0
  30. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  31. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  32. data/spec/dummy/app/controllers/orders_controller.rb +3 -0
  33. data/spec/dummy/app/models/order.rb +10 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +13 -0
  35. data/spec/dummy/app/views/orders/_form.html.erb +12 -0
  36. data/spec/dummy/config.ru +4 -0
  37. data/spec/dummy/config/application.rb +49 -0
  38. data/spec/dummy/config/boot.rb +9 -0
  39. data/spec/dummy/config/database.yml +22 -0
  40. data/spec/dummy/config/environment.rb +5 -0
  41. data/spec/dummy/config/environments/development.rb +30 -0
  42. data/spec/dummy/config/environments/production.rb +60 -0
  43. data/spec/dummy/config/environments/test.rb +40 -0
  44. data/spec/dummy/config/initializers/secret_token.rb +1 -0
  45. data/spec/dummy/config/initializers/session_store.rb +8 -0
  46. data/spec/dummy/config/routes.rb +7 -0
  47. data/spec/dummy/db/migrate/001_create_orders.rb +10 -0
  48. data/spec/dummy/db/schema.rb +23 -0
  49. data/spec/dummy/db/seeds.rb +7 -0
  50. data/spec/dummy/public/favicon.ico +0 -0
  51. data/spec/dummy/script/rails +6 -0
  52. data/spec/integration/order_spec.rb +45 -0
  53. data/spec/models/order_spec.rb +7 -0
  54. data/spec/spec_helper.rb +63 -0
  55. data/spec/support/describe_private.rb +14 -0
  56. metadata +164 -0
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour --drb
2
+ #--format=documentation
data/.rvmrc ADDED
@@ -0,0 +1,3 @@
1
+ rvm use 1.9.2@rails31
2
+
3
+ # rvm_gemset_create_on_use_flag=1
data/.watchr ADDED
@@ -0,0 +1,56 @@
1
+ def run(cmd)
2
+ puts "***** #{cmd}"
3
+ system "/usr/bin/time --format 'Elapsed time %E' #{cmd}"
4
+ end
5
+
6
+ def run_without(list)
7
+ all = Dir.glob("spec/**/*_spec.rb")
8
+ res = []
9
+ list.each { |str|
10
+ files = Dir.glob("spec/**/#{str}/*_spec.rb")
11
+ res << files
12
+ }
13
+ run "rspec #{(all - res.flatten).sort.uniq.join(' ')}"
14
+ end
15
+
16
+ def run_matching(name)
17
+ arr = name.gsub('_', '/').split('/')
18
+ bool = false
19
+ arr.each { |str|
20
+ files = Dir.glob("spec/**/#{str}_spec.rb")
21
+ files.each { |file|
22
+ bool = true
23
+ run "rspec #{file}"
24
+ }
25
+ }
26
+ puts "***** Changed #{name}; not yet done" unless bool
27
+ end
28
+
29
+
30
+ watch('spec/.*/*_spec\.rb') { |match| run "rspec #{match[0]}" }
31
+ watch('spec/.*/.*/*_spec\.rb') { |match| run "rspec #{match[0]}" }
32
+
33
+ watch('app/(.*)?\.rb') { |match|
34
+ puts "** touched #{match[1]}"
35
+ file = "spec/#{match[1]}_spec.rb"
36
+ if File.exists?(file)
37
+ run "rspec #{file}"
38
+ else
39
+ run_matching match[1]
40
+ end
41
+ }
42
+
43
+ watch('app/views/(.*)?\.erb') { |match|
44
+ puts "** touched #{match[1]}"
45
+ run_without ['models']
46
+ }
47
+
48
+
49
+ # Ctrl-\ or ctrl-4
50
+ Signal.trap('QUIT') do
51
+ puts "\n--- Running all tests ---\n"
52
+ run 'rake spec'
53
+ end
54
+
55
+ # Ctrl-C
56
+ Signal.trap('INT') { abort("Interrupted\n") }
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "rails", '3.1.0'
4
+ gem 'jquery-rails'
5
+ gem 'decent_exposure'
6
+
7
+ group :test do
8
+ gem "capybara"
9
+ gem 'rspec-rails'
10
+ end
11
+
12
+ group :development, :test do
13
+ gem "sqlite3"
14
+ gem 'watchr'
15
+ gem 'spork'
16
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,136 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ actionmailer (3.1.0)
5
+ actionpack (= 3.1.0)
6
+ mail (~> 2.3.0)
7
+ actionpack (3.1.0)
8
+ activemodel (= 3.1.0)
9
+ activesupport (= 3.1.0)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ i18n (~> 0.6)
13
+ rack (~> 1.3.2)
14
+ rack-cache (~> 1.0.3)
15
+ rack-mount (~> 0.8.2)
16
+ rack-test (~> 0.6.1)
17
+ sprockets (~> 2.0.0)
18
+ activemodel (3.1.0)
19
+ activesupport (= 3.1.0)
20
+ bcrypt-ruby (~> 3.0.0)
21
+ builder (~> 3.0.0)
22
+ i18n (~> 0.6)
23
+ activerecord (3.1.0)
24
+ activemodel (= 3.1.0)
25
+ activesupport (= 3.1.0)
26
+ arel (~> 2.2.1)
27
+ tzinfo (~> 0.3.29)
28
+ activeresource (3.1.0)
29
+ activemodel (= 3.1.0)
30
+ activesupport (= 3.1.0)
31
+ activesupport (3.1.0)
32
+ multi_json (~> 1.0)
33
+ arel (2.2.1)
34
+ bcrypt-ruby (3.0.1)
35
+ builder (3.0.0)
36
+ capybara (1.1.2)
37
+ mime-types (>= 1.16)
38
+ nokogiri (>= 1.3.3)
39
+ rack (>= 1.0.0)
40
+ rack-test (>= 0.5.4)
41
+ selenium-webdriver (~> 2.0)
42
+ xpath (~> 0.1.4)
43
+ childprocess (0.3.0)
44
+ ffi (~> 1.0.6)
45
+ decent_exposure (1.0.2)
46
+ diff-lcs (1.1.3)
47
+ erubis (2.7.0)
48
+ ffi (1.0.11)
49
+ hike (1.2.1)
50
+ i18n (0.6.0)
51
+ jquery-rails (1.0.19)
52
+ railties (~> 3.0)
53
+ thor (~> 0.14)
54
+ json (1.6.4)
55
+ mail (2.3.0)
56
+ i18n (>= 0.4.0)
57
+ mime-types (~> 1.16)
58
+ treetop (~> 1.4.8)
59
+ mime-types (1.17.2)
60
+ multi_json (1.0.4)
61
+ nokogiri (1.5.0)
62
+ polyglot (0.3.3)
63
+ rack (1.3.6)
64
+ rack-cache (1.0.3)
65
+ rack (>= 0.4)
66
+ rack-mount (0.8.3)
67
+ rack (>= 1.0.0)
68
+ rack-ssl (1.3.2)
69
+ rack
70
+ rack-test (0.6.1)
71
+ rack (>= 1.0)
72
+ rails (3.1.0)
73
+ actionmailer (= 3.1.0)
74
+ actionpack (= 3.1.0)
75
+ activerecord (= 3.1.0)
76
+ activeresource (= 3.1.0)
77
+ activesupport (= 3.1.0)
78
+ bundler (~> 1.0)
79
+ railties (= 3.1.0)
80
+ railties (3.1.0)
81
+ actionpack (= 3.1.0)
82
+ activesupport (= 3.1.0)
83
+ rack-ssl (~> 1.3.2)
84
+ rake (>= 0.8.7)
85
+ rdoc (~> 3.4)
86
+ thor (~> 0.14.6)
87
+ rake (0.9.2.2)
88
+ rdoc (3.12)
89
+ json (~> 1.4)
90
+ rspec (2.8.0)
91
+ rspec-core (~> 2.8.0)
92
+ rspec-expectations (~> 2.8.0)
93
+ rspec-mocks (~> 2.8.0)
94
+ rspec-core (2.8.0)
95
+ rspec-expectations (2.8.0)
96
+ diff-lcs (~> 1.1.2)
97
+ rspec-mocks (2.8.0)
98
+ rspec-rails (2.8.1)
99
+ actionpack (>= 3.0)
100
+ activesupport (>= 3.0)
101
+ railties (>= 3.0)
102
+ rspec (~> 2.8.0)
103
+ rubyzip (0.9.5)
104
+ selenium-webdriver (2.16.0)
105
+ childprocess (>= 0.2.5)
106
+ ffi (~> 1.0.9)
107
+ multi_json (~> 1.0.4)
108
+ rubyzip
109
+ spork (0.8.5)
110
+ sprockets (2.0.3)
111
+ hike (~> 1.2)
112
+ rack (~> 1.0)
113
+ tilt (~> 1.1, != 1.3.0)
114
+ sqlite3 (1.3.5)
115
+ thor (0.14.6)
116
+ tilt (1.3.3)
117
+ treetop (1.4.10)
118
+ polyglot
119
+ polyglot (>= 0.3.1)
120
+ tzinfo (0.3.31)
121
+ watchr (0.7)
122
+ xpath (0.1.4)
123
+ nokogiri (~> 1.3)
124
+
125
+ PLATFORMS
126
+ ruby
127
+
128
+ DEPENDENCIES
129
+ capybara
130
+ decent_exposure
131
+ jquery-rails
132
+ rails (= 3.1.0)
133
+ rspec-rails
134
+ spork
135
+ sqlite3
136
+ watchr
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 Dittmar Krall - http://matique.de
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,91 @@
1
+ Rows
2
+ ====
3
+
4
+ DRYs Rails controllers. Imagine replacing that @order by 'resource' in the
5
+ controllers/views and, imho, an area for DRYing appears.
6
+ Instead of:
7
+
8
+ class OrdersController < ApplicationController
9
+ ...
10
+
11
+ use:
12
+
13
+ class OrdersController < RowsController # < ApplicationController
14
+
15
+
16
+ The OrdersController may end there as RowsController has all the usual
17
+ methods (index, show, edit,...).
18
+
19
+ The methods may be redefined in OrdersController overwritting the
20
+ methods from RowsController.
21
+
22
+ Protected low level methods like 'resources' may be redefined as well.
23
+ An example:
24
+
25
+ def resources
26
+ @_resources ||= model_class.paginate(:page => params[:page])
27
+ end
28
+
29
+ RowsController inherites from ApplicationController, i.e. all the helpers
30
+ defined there will be available.
31
+
32
+
33
+ Customization of views
34
+ ----------------------
35
+
36
+ Providing e.g. an "#{Rails.root}/app/views/order/index.html.erb"
37
+ overwrites the default view as Rails will first look
38
+ into the directory "#{Rails.root}/app/views" before looking
39
+ into the RowsController.
40
+
41
+
42
+ model_class
43
+ -----------
44
+
45
+ RowsController guesses the model from params[:controller]. This can
46
+ be changed by e.g.:
47
+
48
+ class OrdersController < RowsController
49
+ model_class Booking
50
+
51
+ The model class can be retrieved with model_class.
52
+
53
+
54
+ Copy
55
+ ----
56
+
57
+ The method "copy" was added to the RowsController as several applications
58
+ required it. "copy" is like "new", however its attributes are initialized
59
+ from an existing resource. The "id" of the cloned resource
60
+ is set to nil.
61
+
62
+ Usage of "copy" requires a defining in config/routes.rb. An example:
63
+
64
+ resources :orders
65
+ get 'copy', :on => :member
66
+ end
67
+
68
+
69
+ Installation and Testing
70
+ ------------------------
71
+
72
+ As usual:
73
+
74
+ gem 'rows_controller' # in Gemfile
75
+ bundle
76
+ ( cd spec/dummy; rake db:create db:migrate )
77
+ rake
78
+
79
+
80
+ Credits
81
+ -------
82
+
83
+ Inspiration from the web.
84
+ Look for:
85
+
86
+ - Radiant
87
+ - inherited_resources
88
+ - decent_exposure
89
+
90
+
91
+ Copyright (c) 2009-2011 [Dittmar Krall], released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+
3
+ begin
4
+ require 'bundler'
5
+ require 'bundler/setup'
6
+ rescue LoadError
7
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
8
+ end
9
+
10
+ require 'rspec/core'
11
+ require 'rspec/core/rake_task'
12
+
13
+ Bundler::GemHelper.install_tasks
14
+ RSpec::Core::RakeTask.new(:spec)
15
+
16
+ task :default => :spec
17
+
18
+
19
+ desc "Clean automatically generated files"
20
+ task :clean do
21
+ FileUtils.rm_rf "pkg"
22
+ end
23
+
24
+ desc "Check syntax"
25
+ task :syntax do
26
+ Dir["**/*.rb"].each do |file|
27
+ print "#{file}: "
28
+ system("ruby -c #{file}")
29
+ end
30
+ end
@@ -0,0 +1,80 @@
1
+ class RowsController < ApplicationController
2
+ require_dependency 'rows_controller/helpers'
3
+
4
+ respond_to :html, :xml
5
+
6
+ def index
7
+ respond_with(resources)
8
+ end
9
+
10
+ def show
11
+ respond_with(resource)
12
+ end
13
+
14
+ def new
15
+ respond_with(resource)
16
+ end
17
+
18
+ def edit
19
+ respond_with(resource)
20
+ end
21
+
22
+ def create
23
+ # merge_bag
24
+ msg = t('ui.created', :model => model_name,
25
+ :default => "%{model} created.")
26
+ save_and_respond(msg, 'rows/new')
27
+ end
28
+
29
+ def update
30
+ # merge_bag
31
+ msg = t('ui.updated', :model => model_name,
32
+ :default => "%{model} updated.")
33
+ save_and_respond(msg, 'rows/edit')
34
+ end
35
+
36
+ def destroy
37
+ resource.destroy
38
+ respond_with(resource) do |format|
39
+ format.html { redirect_to :action => :index }
40
+ format.js { render :template => 'rows/destroy' }
41
+ end
42
+ flash[:notice] = t('ui.deleted', :model => model_name,
43
+ :default => "%{model} deleted.")
44
+ end
45
+
46
+ def copy
47
+ @_resource = resource.dup
48
+ @_resource.id = nil
49
+ respond_with(resource) do |format|
50
+ format.html { render :action => :new }
51
+ end
52
+ end
53
+
54
+
55
+ private
56
+ def save_and_respond(notice, failure_template)
57
+ if resource.save
58
+ respond_with(resource)
59
+ flash[:notice] = notice
60
+ else
61
+ respond_with(resource) do |format|
62
+ format.html { render :template => failure_template, :id => resource.id }
63
+ format.xml { render :xml => resource.errors, :status => :unprocessable_entity }
64
+ end
65
+ end
66
+ end
67
+
68
+ # May be useful:
69
+ # def multi_deletion
70
+ # items = params[:multi_deletion] || []
71
+ # items -= ['']
72
+ # items.map {|id| model_class.find(id).destroy }
73
+ # redirect_to :action => :index
74
+ # end
75
+
76
+ # def merge_bag
77
+ # self.params = model_class.merge({}, self.params) if model_class.respond_to?(:merge)
78
+ # end
79
+
80
+ end