crudify 0.0.3 → 0.0.4

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 (64) hide show
  1. data/.gitignore +4 -2
  2. data/Gemfile.lock +57 -28
  3. data/README.md +121 -3
  4. data/Rakefile +3 -4
  5. data/crudify.gemspec +5 -2
  6. data/lib/crudify.rb +5 -1
  7. data/lib/crudify/base.rb +8 -7
  8. data/lib/crudify/class_methods.rb +35 -21
  9. data/lib/crudify/hook_methods.rb +30 -33
  10. data/lib/crudify/version.rb +1 -1
  11. data/test/dummy/Rakefile +7 -0
  12. data/test/dummy/app/controllers/admin/peanut_butters_controller.rb +5 -0
  13. data/test/dummy/app/controllers/application_controller.rb +3 -0
  14. data/test/dummy/app/controllers/jellies_controller.rb +7 -0
  15. data/test/dummy/app/models/jelly.rb +9 -0
  16. data/test/dummy/app/models/peanut_butter.rb +8 -0
  17. data/test/dummy/app/views/admin/peanut_butters/_fields.html.erb +4 -0
  18. data/test/dummy/app/views/admin/peanut_butters/edit.html.erb +11 -0
  19. data/test/dummy/app/views/admin/peanut_butters/index.html.erb +23 -0
  20. data/test/dummy/app/views/admin/peanut_butters/new.html.erb +11 -0
  21. data/test/dummy/app/views/admin/peanut_butters/show.html.erb +14 -0
  22. data/test/dummy/app/views/jellies/_fields.html.erb +8 -0
  23. data/test/dummy/app/views/jellies/edit.html.erb +11 -0
  24. data/test/dummy/app/views/jellies/index.html.erb +23 -0
  25. data/test/dummy/app/views/jellies/new.html.erb +11 -0
  26. data/test/dummy/app/views/jellies/show.html.erb +15 -0
  27. data/test/dummy/app/views/layouts/application.html.erb +72 -0
  28. data/test/dummy/app/views/shared/_error_messages.html.erb +9 -0
  29. data/test/dummy/config.ru +4 -0
  30. data/test/dummy/config/application.rb +45 -0
  31. data/test/dummy/config/boot.rb +10 -0
  32. data/test/dummy/config/database.yml +22 -0
  33. data/test/dummy/config/environment.rb +5 -0
  34. data/test/dummy/config/environments/development.rb +26 -0
  35. data/test/dummy/config/environments/production.rb +49 -0
  36. data/test/dummy/config/environments/test.rb +38 -0
  37. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  38. data/test/dummy/config/initializers/green_eggs_and_spam.rb +2 -0
  39. data/test/dummy/config/initializers/inflections.rb +10 -0
  40. data/test/dummy/config/initializers/mime_types.rb +5 -0
  41. data/test/dummy/config/initializers/secret_token.rb +7 -0
  42. data/test/dummy/config/initializers/session_store.rb +8 -0
  43. data/test/dummy/config/routes.rb +11 -0
  44. data/test/dummy/db/migrate/20110223073415_create_jellies.rb +13 -0
  45. data/test/dummy/db/migrate/20110223073427_create_peanut_butters.rb +12 -0
  46. data/test/dummy/db/schema.rb +28 -0
  47. data/test/dummy/public/404.html +26 -0
  48. data/test/dummy/public/422.html +26 -0
  49. data/test/dummy/public/500.html +26 -0
  50. data/{log/development.log → test/dummy/public/favicon.ico} +0 -0
  51. data/test/dummy/public/javascripts/application.js +2 -0
  52. data/test/dummy/public/javascripts/controls.js +965 -0
  53. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  54. data/test/dummy/public/javascripts/effects.js +1123 -0
  55. data/test/dummy/public/javascripts/index.html +239 -0
  56. data/test/dummy/public/javascripts/prototype.js +6001 -0
  57. data/test/dummy/public/javascripts/rails.js +191 -0
  58. data/test/dummy/public/stylesheets/styles.css +126 -0
  59. data/test/dummy/script/rails +6 -0
  60. data/test/functional/jellies_controller_test.rb +55 -0
  61. data/test/helper.rb +42 -31
  62. data/test/integration/demo_test.rb +79 -0
  63. data/test/{test_controller.rb → unit/crudify_test.rb} +17 -17
  64. metadata +149 -13
data/.gitignore CHANGED
@@ -1,5 +1,7 @@
1
1
  .bundle
2
2
  .DS_Store
3
- pkg/*
4
3
  *.gem
5
- test/db/*.sqlite3
4
+ pkg/*
5
+ test/dummy/log
6
+ test/dummy/tmp
7
+ test/dummy/db/*.sqlite3
data/Gemfile.lock CHANGED
@@ -1,45 +1,62 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- crudify (0.0.1)
4
+ crudify (0.1.0.beta)
5
5
  meta_search (>= 1.0.1)
6
6
  rails (>= 3.0.0)
7
+ will_paginate (>= 2.3.15)
7
8
 
8
9
  GEM
9
10
  remote: http://rubygems.org/
10
11
  specs:
11
12
  abstract (1.0.0)
12
- actionmailer (3.0.3)
13
- actionpack (= 3.0.3)
14
- mail (~> 2.2.9)
15
- actionpack (3.0.3)
16
- activemodel (= 3.0.3)
17
- activesupport (= 3.0.3)
13
+ actionmailer (3.0.5)
14
+ actionpack (= 3.0.5)
15
+ mail (~> 2.2.15)
16
+ actionpack (3.0.5)
17
+ activemodel (= 3.0.5)
18
+ activesupport (= 3.0.5)
18
19
  builder (~> 2.1.2)
19
20
  erubis (~> 2.6.6)
20
21
  i18n (~> 0.4)
21
22
  rack (~> 1.2.1)
22
23
  rack-mount (~> 0.6.13)
23
- rack-test (~> 0.5.6)
24
+ rack-test (~> 0.5.7)
24
25
  tzinfo (~> 0.3.23)
25
- activemodel (3.0.3)
26
- activesupport (= 3.0.3)
26
+ activemodel (3.0.5)
27
+ activesupport (= 3.0.5)
27
28
  builder (~> 2.1.2)
28
29
  i18n (~> 0.4)
29
- activerecord (3.0.3)
30
- activemodel (= 3.0.3)
31
- activesupport (= 3.0.3)
30
+ activerecord (3.0.5)
31
+ activemodel (= 3.0.5)
32
+ activesupport (= 3.0.5)
32
33
  arel (~> 2.0.2)
33
34
  tzinfo (~> 0.3.23)
34
- activeresource (3.0.3)
35
- activemodel (= 3.0.3)
36
- activesupport (= 3.0.3)
37
- activesupport (3.0.3)
38
- arel (2.0.7)
35
+ activeresource (3.0.5)
36
+ activemodel (= 3.0.5)
37
+ activesupport (= 3.0.5)
38
+ activesupport (3.0.5)
39
+ arel (2.0.9)
39
40
  builder (2.1.2)
41
+ capybara (0.4.1.2)
42
+ celerity (>= 0.7.9)
43
+ culerity (>= 0.2.4)
44
+ mime-types (>= 1.16)
45
+ nokogiri (>= 1.3.3)
46
+ rack (>= 1.0.0)
47
+ rack-test (>= 0.5.4)
48
+ selenium-webdriver (>= 0.0.27)
49
+ xpath (~> 0.1.3)
50
+ celerity (0.8.8)
51
+ childprocess (0.1.7)
52
+ ffi (~> 0.6.3)
53
+ culerity (0.2.15)
40
54
  erubis (2.6.6)
41
55
  abstract (>= 1.0.0)
56
+ ffi (0.6.3)
57
+ rake (>= 0.8.7)
42
58
  i18n (0.5.0)
59
+ json_pure (1.5.1)
43
60
  mail (2.2.15)
44
61
  activesupport (>= 2.3.6)
45
62
  i18n (>= 0.4.0)
@@ -51,26 +68,33 @@ GEM
51
68
  activesupport (~> 3.0.2)
52
69
  arel (~> 2.0.2)
53
70
  mime-types (1.16)
71
+ nokogiri (1.4.4)
54
72
  polyglot (0.3.1)
55
73
  rack (1.2.1)
56
74
  rack-mount (0.6.13)
57
75
  rack (>= 1.0.0)
58
76
  rack-test (0.5.7)
59
77
  rack (>= 1.0)
60
- rails (3.0.3)
61
- actionmailer (= 3.0.3)
62
- actionpack (= 3.0.3)
63
- activerecord (= 3.0.3)
64
- activeresource (= 3.0.3)
65
- activesupport (= 3.0.3)
78
+ rails (3.0.5)
79
+ actionmailer (= 3.0.5)
80
+ actionpack (= 3.0.5)
81
+ activerecord (= 3.0.5)
82
+ activeresource (= 3.0.5)
83
+ activesupport (= 3.0.5)
66
84
  bundler (~> 1.0)
67
- railties (= 3.0.3)
68
- railties (3.0.3)
69
- actionpack (= 3.0.3)
70
- activesupport (= 3.0.3)
85
+ railties (= 3.0.5)
86
+ railties (3.0.5)
87
+ actionpack (= 3.0.5)
88
+ activesupport (= 3.0.5)
71
89
  rake (>= 0.8.7)
72
90
  thor (~> 0.14.4)
73
91
  rake (0.8.7)
92
+ rubyzip (0.9.4)
93
+ selenium-webdriver (0.1.3)
94
+ childprocess (~> 0.1.5)
95
+ ffi (~> 0.6.3)
96
+ json_pure
97
+ rubyzip
74
98
  shoulda (2.11.3)
75
99
  sqlite3 (1.3.3)
76
100
  sqlite3-ruby (1.3.3)
@@ -79,11 +103,16 @@ GEM
79
103
  treetop (1.4.9)
80
104
  polyglot (>= 0.3.1)
81
105
  tzinfo (0.3.24)
106
+ will_paginate (2.3.15)
107
+ xpath (0.1.3)
108
+ nokogiri (~> 1.3)
82
109
 
83
110
  PLATFORMS
84
111
  ruby
85
112
 
86
113
  DEPENDENCIES
114
+ capybara (>= 0.4.1)
87
115
  crudify!
116
+ selenium-webdriver (>= 0.1.3)
88
117
  shoulda (>= 2.11.3)
89
118
  sqlite3-ruby (>= 1.3.3)
data/README.md CHANGED
@@ -1,14 +1,132 @@
1
1
  Crudify
2
- -------
2
+ =======
3
+
4
+ A dynamic resource controller for Rails 3 that keeps your controllers nice and skinny.
3
5
 
4
- A dynamic resource controller for Rails 3.
6
+ Crudify was shamlessly robbed from [refinerycms](https://github.com/resolve/refinerycms/blob/master/core/lib/refinery/crud.rb)'s internals and customized for use in other projects. Much credit and many thanks to the guys at [resolve digital](http://resolvedigital.com/) for all their hard work on the [refinery cms project](http://resolvedigital.com/development/refinery%C2%A0cms). Keep it up!
5
7
 
6
8
 
7
9
  Usage
8
10
  -----
9
11
 
10
- coming soon!
12
+ In its most basic form, crudify is designed to be use like this:
13
+
14
+ class JelliesController < ApplicationController
15
+ crudify :jelly
16
+ end
17
+
18
+
19
+ Ok, so what does it do? The short answer; _everything_ that you'd want it to. In more detail, crudify turns your controller into a full-fledged CRUD controller with `index`, `new`, `create`, `show`, `edit`, `update`, and `destroy`. But wait, there's more! Inside each of these standard methods are several _hook methods_ designed to make customizing your controllers even easier that over-riding crudify's methods. Over-riding; say what? ...
20
+
21
+ Say you want to customize an action that's being defined by crudify, simply over-ride it!
22
+
23
+ class JelliesController < ApplicationController
24
+ crudify :jelly
25
+
26
+ def create
27
+ @jelly = Jelly.new(params[:jelly])
28
+ # ... the rest of your custom action
29
+ end
30
+ end
31
+
32
+
33
+ Ok that seems easy enough, but what if my action is just a tiny bit different? That's where the _hook methods_ come in...
34
+
35
+ ### Hook Methods
36
+
37
+ Laced into crudify's actions are a module full of methods designed to make customizing your controller quick and simple. Let's examine these methods in further detail starting with create.
38
+
39
+ Here's what lines #45-59 in `lib/crudify/class_methods.rb` will produce in our Jellies controller:
40
+
41
+ def create
42
+ # if the position field exists, set this object as last object, given the conditions of this class.
43
+ if Jelly.column_names.include?("position")
44
+ params[:jelly].merge!({
45
+ :position => ((Jelly.maximum(:position, :conditions => "")||-1) + 1)
46
+ })
47
+ end
48
+ @instance = @jelly = Jelly.create(params[:jelly])
49
+ before_create
50
+ if @instance.valid? && @instance.save
51
+ successful_create
52
+ else
53
+ failed_create
54
+ end
55
+ end
56
+
57
+
58
+ Just before the calls to `valid?` and `save`, you'll see `before_create`; the first hook method in the action. Looking further into the source, `before_create` is nothing more than a blank action, waiting to be overwritten:
59
+
60
+ def before_create
61
+ # just a hook!
62
+ puts "> Crud::before_create" if @crud_options[:log]
63
+ before_action
64
+ end
65
+
66
+
67
+ Notice that `before_create` calls a second hook; `before_action`. This is a generic hook that fires before every crud method's call to `save`, `update` or `destroy`. This means it might be helpful for you to call `super` when over-riding this method so that the chain of hooks keeps firing. Inside the `before_action` method we'll decide what to use as flash messages with `set_what`. Here's the code for `before_action`:
68
+
69
+ def before_action
70
+ # just a hook!
71
+ puts "> Crud::before_action" if @crud_options[:log]
72
+ set_what
73
+ true
74
+ end
75
+
76
+
77
+ *Ok Ok, so we're gettin' kind of deep here.* Let's get back to the basic concept; Skinny, sexy and easy on the eyes. (Are we still talking ruby here?)
78
+
79
+ class InquiriesController < ApplicationController
80
+ crudify :inquiry
81
+
82
+ def before_create
83
+ @inquiry.ip_address = request.remote_addr
84
+ super
85
+ end
86
+
87
+ end
88
+
89
+
90
+ Or an after-action hook:
91
+
92
+ class InquiriesController < ApplicationController
93
+ crudify :inquiry
94
+
95
+ def successful_create
96
+ InquiryMailer.message(@inquiry).deliver!
97
+ super
98
+ end
99
+
100
+ end
101
+
102
+
103
+ ### To find out more about crudify, read the source! Here's some helpful links:
104
+
105
+ * For available options: [Crudify::Base](https://github.com/citrus/crudify/blob/master/lib/crudify/base.rb)
106
+ * For available hooks: [Crudify::HookMethods](https://github.com/citrus/crudify/blob/master/lib/crudify/hook_methods.rb)
107
+ * To see which hooks go where: [Cruidfy::ClassMethods](https://github.com/citrus/crudify/blob/master/lib/crudify/class_methods.rb)
108
+
109
+ Or check out the demo app in `test/dummy`...
110
+
111
+
112
+ Testing
113
+ -------
114
+
115
+ Shoulda and Capybara/Selenium tests can be run by cloning the repo and running `rake`:
116
+
117
+ git clone git://github.com/citrus/crudify.git
118
+ cd crudify
119
+ bundle install
120
+ rake
121
+
122
+
123
+ To Do
124
+ -----
11
125
 
126
+ * Documentation & Examples
127
+ * Nested set tests and demo (haven't even tried this yet :/)
128
+ * Generally more thorough tests
129
+ * Refactoring/Optimizing
12
130
 
13
131
 
14
132
  License
data/Rakefile CHANGED
@@ -3,11 +3,10 @@ require 'rake/testtask'
3
3
  Bundler::GemHelper.install_tasks
4
4
 
5
5
  Rake::TestTask.new do |t|
6
- t.libs << "lib"
6
+ t.libs << "lib" << "test"
7
+ t.pattern = 'test/**/*_test.rb'
7
8
  t.verbose = true
8
9
  end
9
10
 
10
-
11
11
  desc "Default Task"
12
- task :default => [ :test ]
13
-
12
+ task :default => [ :test ]
data/crudify.gemspec CHANGED
@@ -11,16 +11,19 @@ Gem::Specification.new do |s|
11
11
  s.homepage = "http://github.com/citrus/crudify"
12
12
 
13
13
  s.summary = %q{Crudify is a dynamic resource controller for Rails 3.}
14
- s.description = %q{Crudify is a dynamic resource controller for Rails 3. The goal is to have very skinny controllers with powerful hooks to easily customize.}
14
+ s.description = %q{Crudify is a dynamic resource controller for Rails 3. The idea is skinny controllers with powerful hooks for easy customization.}
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.require_paths = ["lib"]
19
19
 
20
20
  s.add_dependency('rails', '>= 3.0.0')
21
- # s.add_dependency('will_paginate', '>= ')
21
+ s.add_dependency('will_paginate', '>= 2.3.15')
22
22
  s.add_dependency('meta_search', '>= 1.0.1')
23
23
 
24
24
  s.add_development_dependency('shoulda', '>= 2.11.3')
25
25
  s.add_development_dependency('sqlite3-ruby', '>= 1.3.3')
26
+ s.add_development_dependency('capybara', '>= 0.4.1')
27
+ s.add_development_dependency('selenium-webdriver', '>= 0.1.3')
28
+
26
29
  end
data/lib/crudify.rb CHANGED
@@ -1,12 +1,16 @@
1
1
  require 'active_support'
2
2
  require 'active_record'
3
3
  require 'action_controller'
4
+ require 'will_paginate'
5
+ require 'meta_search'
4
6
 
5
7
  require 'crudify/hook_methods'
6
8
  require 'crudify/class_methods'
7
9
  require 'crudify/base'
8
10
 
9
- module Crudify
11
+ module Crudify
12
+ class Engine < Rails::Engine
13
+ end
10
14
  end
11
15
 
12
16
  ActionController::Base.send(:include, Crudify::Base)
data/lib/crudify/base.rb CHANGED
@@ -3,10 +3,10 @@
3
3
  # Don't forget to add:
4
4
  # resources :plural_model_name_here
5
5
  # to your routes.rb file.
6
- # Full documentation about CRUD and resources go here:
7
- # -> http://caboo.se/doc/classes/ActionController/Resources.html#M003716
6
+ # Full documentation about CRUD and resources start here:
7
+ # -> http://www.google.com/search?q=rails%20REST
8
8
  # Example (add to your controller):
9
- # crudify :foo, {:title_attribute => 'name'}
9
+ # crudify :foo, { :title_attribute => 'name' }
10
10
 
11
11
 
12
12
  module Crudify
@@ -21,14 +21,15 @@ module Crudify
21
21
  {
22
22
  :title_attribute => "title",
23
23
  :use_class_name_as_title => false,
24
- :order => ('position ASC' if this_class.table_exists? and this_class.column_names.include?('position')),
25
- :conditions => '',
24
+ :paginate => true,
26
25
  :sortable => true,
27
26
  :searchable => true,
28
27
  :include => [],
29
- :paging => true,
28
+ :order => ('position ASC' if this_class.table_exists? && this_class.column_names.include?('position')),
29
+ :conditions => '',
30
30
  :search_conditions => '',
31
- :redirect_to_url => "admin_#{plural_name}_url"
31
+ :redirect_to_url => "admin_#{plural_name}_url",
32
+ :log => Rails.env == 'development'
32
33
  }
33
34
  end
34
35
 
@@ -1,3 +1,10 @@
1
+ #
2
+ # Disclaimer:
3
+ #
4
+ # The majority of this was originally written by
5
+ # the splendid fellows at Resolve Digital for their
6
+ # awesome refinerycms project.
7
+ #
1
8
  module Crudify
2
9
 
3
10
  module ClassMethods
@@ -9,7 +16,7 @@ module Crudify
9
16
  class_name = singular_name.camelize
10
17
  plural_name = singular_name.pluralize
11
18
 
12
- options[:paging] = (options[:paging] && eval(class_name).respond_to?(:paginate))
19
+ options[:paginate] = (options[:paginate] && eval(class_name).respond_to?(:paginate))
13
20
 
14
21
  module_eval %(
15
22
 
@@ -23,8 +30,20 @@ module Crudify
23
30
  def set_crud_options
24
31
  @crud_options = #{options}
25
32
  end
26
-
27
-
33
+
34
+ def set_what
35
+ return @what if @what
36
+ what = @crud_options[:use_class_name_as_title] ? @instance.class.to_s.underscore.humanize : @instance.send(@crud_options[:title_attribute].to_sym).inspect
37
+ what = @instance.class.to_s.underscore.humanize if what.nil? || what == '""'
38
+ @what = what
39
+ end
40
+
41
+ def index
42
+ end
43
+
44
+ def show
45
+ end
46
+
28
47
  def new
29
48
  @#{singular_name} = #{class_name}.new
30
49
  end
@@ -62,7 +81,6 @@ module Crudify
62
81
  def destroy
63
82
  before_destroy
64
83
  # object gets found by find_#{singular_name} function
65
- title = @#{singular_name}.#{options[:title_attribute]}
66
84
  if @#{singular_name}.destroy
67
85
  successful_destroy
68
86
  else
@@ -110,14 +128,14 @@ module Crudify
110
128
  # If we have already found a set then we don't need to again
111
129
  find_all_#{plural_name} if @#{plural_name}.nil?
112
130
 
113
- paging_options = {:page => params[:page]}
131
+ paginate_options = {:page => params[:page]}
114
132
 
115
133
  # Seems will_paginate doesn't always use the implicit method.
116
134
  if #{class_name}.methods.map(&:to_sym).include?(:per_page)
117
- paging_options.update({:per_page => #{class_name}.per_page})
135
+ paginate_options.update({:per_page => #{class_name}.per_page})
118
136
  end
119
137
 
120
- set_collection(@#{plural_name}.paginate(paging_options), false)
138
+ set_collection(@#{plural_name}.paginate(paginate_options), false)
121
139
  end
122
140
 
123
141
  # Returns results based on the query specified by the user.
@@ -137,7 +155,14 @@ module Crudify
137
155
 
138
156
  # Methods that are only included when this controller is searchable.
139
157
  if options[:searchable]
140
- if options[:paging]
158
+
159
+ module_eval %(
160
+ def searching?
161
+ params && !params[:search].nil?
162
+ end
163
+ )
164
+
165
+ if options[:paginate]
141
166
  module_eval %(
142
167
  def index
143
168
  search_all_#{plural_name} if searching?
@@ -156,7 +181,7 @@ module Crudify
156
181
  )
157
182
  end
158
183
  else
159
- if options[:paging]
184
+ if options[:paginate]
160
185
  module_eval %(
161
186
  def index
162
187
  paginate_all_#{plural_name}
@@ -223,18 +248,7 @@ module Crudify
223
248
 
224
249
  )
225
250
  end
226
-
227
- module_eval %(
228
- def self.sortable?
229
- #{options[:sortable].to_s}
230
- end
231
-
232
- def self.searchable?
233
- #{options[:searchable].to_s}
234
- end
235
- )
236
-
237
-
251
+
238
252
  end
239
253
 
240
254
  end