active_crudify 0.1.1

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 (68) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +13 -0
  3. data/Gemfile.lock +123 -0
  4. data/README.md +83 -0
  5. data/active_crudify.gemspec +22 -0
  6. data/config/locales/en.yml +9 -0
  7. data/config/locales/zh-CN.yml +9 -0
  8. data/lib/active_crudify.rb +39 -0
  9. data/lib/active_crudify/class_methods.rb +159 -0
  10. data/lib/active_crudify/hook_methods.rb +22 -0
  11. data/lib/active_crudify/responder.rb +6 -0
  12. data/spec/controllers/admin/posts_controller_spec.rb +33 -0
  13. data/spec/controllers/posts_controller_spec.rb +126 -0
  14. data/spec/dummy/.gitignore +15 -0
  15. data/spec/dummy/Gemfile +38 -0
  16. data/spec/dummy/Gemfile.lock +111 -0
  17. data/spec/dummy/README.rdoc +261 -0
  18. data/spec/dummy/Rakefile +7 -0
  19. data/spec/dummy/app/assets/images/rails.png +0 -0
  20. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  21. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  22. data/spec/dummy/app/controllers/admin/posts_controller.rb +3 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy/app/controllers/posts_controller.rb +4 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/mailers/.gitkeep +0 -0
  27. data/spec/dummy/app/models/.gitkeep +0 -0
  28. data/spec/dummy/app/models/post.rb +3 -0
  29. data/spec/dummy/app/views/admin/posts/index.html.erb +0 -0
  30. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  31. data/spec/dummy/app/views/posts/edit.html.erb +0 -0
  32. data/spec/dummy/app/views/posts/index.html.erb +0 -0
  33. data/spec/dummy/app/views/posts/new.html.erb +0 -0
  34. data/spec/dummy/app/views/posts/show.html.erb +0 -0
  35. data/spec/dummy/config.ru +4 -0
  36. data/spec/dummy/config/application.rb +59 -0
  37. data/spec/dummy/config/boot.rb +6 -0
  38. data/spec/dummy/config/database.yml +25 -0
  39. data/spec/dummy/config/environment.rb +5 -0
  40. data/spec/dummy/config/environments/development.rb +37 -0
  41. data/spec/dummy/config/environments/production.rb +67 -0
  42. data/spec/dummy/config/environments/test.rb +37 -0
  43. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/dummy/config/initializers/inflections.rb +15 -0
  45. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  46. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  47. data/spec/dummy/config/initializers/session_store.rb +8 -0
  48. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  49. data/spec/dummy/config/locales/en.yml +5 -0
  50. data/spec/dummy/config/routes.rb +62 -0
  51. data/spec/dummy/db/migrate/20120521063240_create_posts.rb +10 -0
  52. data/spec/dummy/db/schema.rb +23 -0
  53. data/spec/dummy/db/seeds.rb +7 -0
  54. data/spec/dummy/lib/assets/.gitkeep +0 -0
  55. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  56. data/spec/dummy/log/.gitkeep +0 -0
  57. data/spec/dummy/public/404.html +26 -0
  58. data/spec/dummy/public/422.html +26 -0
  59. data/spec/dummy/public/500.html +25 -0
  60. data/spec/dummy/public/favicon.ico +0 -0
  61. data/spec/dummy/public/index.html +241 -0
  62. data/spec/dummy/public/robots.txt +5 -0
  63. data/spec/dummy/script/rails +6 -0
  64. data/spec/dummy/test/fixtures/posts.yml +9 -0
  65. data/spec/dummy/test/unit/post_test.rb +7 -0
  66. data/spec/spec.opts +5 -0
  67. data/spec/spec_helper.rb +44 -0
  68. metadata +162 -0
@@ -0,0 +1,2 @@
1
+ *.swp
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'rails'
6
+ gem 'sqlite3'
7
+
8
+ group :development, :test do
9
+ gem 'rspec'
10
+ gem 'rspec-rails'
11
+ gem 'factory_girl'
12
+ gem 'database_cleaner'
13
+ end
@@ -0,0 +1,123 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ active_crudify (0.1.0)
5
+ actionpack (>= 3.1)
6
+ kaminari
7
+ responders
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.3)
13
+ actionpack (= 3.2.3)
14
+ mail (~> 2.4.4)
15
+ actionpack (3.2.3)
16
+ activemodel (= 3.2.3)
17
+ activesupport (= 3.2.3)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.1)
21
+ rack (~> 1.4.0)
22
+ rack-cache (~> 1.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.1.2)
25
+ activemodel (3.2.3)
26
+ activesupport (= 3.2.3)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.3)
29
+ activemodel (= 3.2.3)
30
+ activesupport (= 3.2.3)
31
+ arel (~> 3.0.2)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.3)
34
+ activemodel (= 3.2.3)
35
+ activesupport (= 3.2.3)
36
+ activesupport (3.2.3)
37
+ i18n (~> 0.6)
38
+ multi_json (~> 1.0)
39
+ arel (3.0.2)
40
+ builder (3.0.0)
41
+ database_cleaner (0.7.2)
42
+ diff-lcs (1.1.3)
43
+ erubis (2.7.0)
44
+ factory_girl (3.0.0)
45
+ activesupport (>= 3.0.0)
46
+ hike (1.2.1)
47
+ i18n (0.6.0)
48
+ journey (1.0.3)
49
+ json (1.7.1)
50
+ kaminari (0.13.0)
51
+ actionpack (>= 3.0.0)
52
+ activesupport (>= 3.0.0)
53
+ railties (>= 3.0.0)
54
+ mail (2.4.4)
55
+ i18n (>= 0.4.0)
56
+ mime-types (~> 1.16)
57
+ treetop (~> 1.4.8)
58
+ mime-types (1.18)
59
+ multi_json (1.3.4)
60
+ polyglot (0.3.3)
61
+ rack (1.4.1)
62
+ rack-cache (1.2)
63
+ rack (>= 0.4)
64
+ rack-ssl (1.3.2)
65
+ rack
66
+ rack-test (0.6.1)
67
+ rack (>= 1.0)
68
+ rails (3.2.3)
69
+ actionmailer (= 3.2.3)
70
+ actionpack (= 3.2.3)
71
+ activerecord (= 3.2.3)
72
+ activeresource (= 3.2.3)
73
+ activesupport (= 3.2.3)
74
+ bundler (~> 1.0)
75
+ railties (= 3.2.3)
76
+ railties (3.2.3)
77
+ actionpack (= 3.2.3)
78
+ activesupport (= 3.2.3)
79
+ rack-ssl (~> 1.3.2)
80
+ rake (>= 0.8.7)
81
+ rdoc (~> 3.4)
82
+ thor (~> 0.14.6)
83
+ rake (0.9.2.2)
84
+ rdoc (3.12)
85
+ json (~> 1.4)
86
+ responders (0.9.1)
87
+ railties (~> 3.1)
88
+ rspec (2.9.0)
89
+ rspec-core (~> 2.9.0)
90
+ rspec-expectations (~> 2.9.0)
91
+ rspec-mocks (~> 2.9.0)
92
+ rspec-core (2.9.0)
93
+ rspec-expectations (2.9.0)
94
+ diff-lcs (~> 1.1.3)
95
+ rspec-mocks (2.9.0)
96
+ rspec-rails (2.9.0)
97
+ actionpack (>= 3.0)
98
+ activesupport (>= 3.0)
99
+ railties (>= 3.0)
100
+ rspec (~> 2.9.0)
101
+ sprockets (2.1.3)
102
+ hike (~> 1.2)
103
+ rack (~> 1.0)
104
+ tilt (~> 1.1, != 1.3.0)
105
+ sqlite3 (1.3.6)
106
+ thor (0.14.6)
107
+ tilt (1.3.3)
108
+ treetop (1.4.10)
109
+ polyglot
110
+ polyglot (>= 0.3.1)
111
+ tzinfo (0.3.33)
112
+
113
+ PLATFORMS
114
+ ruby
115
+
116
+ DEPENDENCIES
117
+ active_crudify!
118
+ database_cleaner
119
+ factory_girl
120
+ rails
121
+ rspec
122
+ rspec-rails
123
+ sqlite3
@@ -0,0 +1,83 @@
1
+ ActiveCrudify
2
+ =======
3
+
4
+ A dynamic resource controller for Rails > 3.0 that keeps your controllers nice and skinny.
5
+
6
+ ActiveCrudify was inspired from Crudify.
7
+
8
+
9
+ Installation
10
+ ------------
11
+
12
+ It's best to install ActiveCrudify by adding your Rails project's Gemfile:
13
+
14
+ # Gemfile
15
+ source "http://rubygems.org"
16
+ gem 'active_crudify', '>= 0.1.0'
17
+
18
+ Now run:
19
+
20
+ bundle install
21
+
22
+
23
+ Usage
24
+ -----
25
+
26
+ In its most basic form, active_crudify is designed to be used like this:
27
+
28
+ class PostsController < ApplicationController
29
+ crudify :post
30
+ end
31
+
32
+
33
+ Say you want to customize an action that's being defined by crudify, simply overwrite it!
34
+
35
+ class PostsController < ApplicationController
36
+ crudify :post
37
+
38
+ def create
39
+ @post = Post.new(params[:post])
40
+ # ... the rest of your custom action
41
+ end
42
+ end
43
+
44
+
45
+ Ok that seems easy enough, but what if my action is just a tiny bit different? That's where the _hook methods_ come in...
46
+
47
+ ### Hook Methods
48
+
49
+ `before_create`
50
+ `before_update`
51
+ `before_destroy`
52
+ `before_action`
53
+
54
+ You can define hook_methods in your controller just like this:
55
+
56
+ def before_create
57
+ do_something
58
+ supre
59
+ end
60
+
61
+ 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 overwriting this method so that the chain of hooks keeps firing.
62
+
63
+ Notice: if hook_methods return false, the action will return. Because in action it call hook_methods just like this:
64
+
65
+ def create
66
+ ...
67
+ return if before_create === false
68
+ ...
69
+ end
70
+
71
+ Here's an example of a `before_create` hook:
72
+
73
+ class PostsController < ApplicationController
74
+ crudify :post
75
+
76
+ def before_create
77
+ @post.author == current_user
78
+ super
79
+ end
80
+
81
+ end
82
+
83
+ ### MIT License
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+
5
+ s.name = "active_crudify"
6
+ s.version = "0.1.1"
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["kame"]
9
+ s.email = ["kamechb@gmail.com"]
10
+ s.homepage = "http://github.com/kamechb/active_crudify"
11
+
12
+ s.summary = %q{DRY controller actions for Rails > 3.0 and keeps your controllers nice and skinny.}
13
+ s.description = %q{DRY controller actions for Rails > 3.0 and keeps your controllers nice and skinny.}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency('actionpack', '>= 3.1')
20
+ s.add_dependency('kaminari')
21
+ s.add_dependency('responders')
22
+ end
@@ -0,0 +1,9 @@
1
+ en:
2
+ flash:
3
+ actions:
4
+ create:
5
+ notice: "%{resource_name} create successfully!"
6
+ alert: "%{resource_name} create failure!"
7
+ update:
8
+ notice: "%{resource_name} update successfully!"
9
+ alert: "%{resource_name} update failure!"
@@ -0,0 +1,9 @@
1
+ zh-CN:
2
+ flash:
3
+ actions:
4
+ create:
5
+ notice: "%{resource_name} 创建成功"
6
+ alert: "%{resource_name} 创建失败"
7
+ update:
8
+ notice: "%{resource_name} 更新成功"
9
+ alert: "%{resource_name} 更新失败"
@@ -0,0 +1,39 @@
1
+ require 'active_support'
2
+ require 'i18n'
3
+ require 'responders'
4
+ require 'action_controller'
5
+ require 'active_crudify/class_methods'
6
+ require 'active_crudify/hook_methods'
7
+ require 'active_crudify/responder'
8
+
9
+ module ActiveCrudify
10
+ class Engine < Rails::Engine
11
+ end
12
+
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ include ActiveCrudify::HookMethods
17
+ end
18
+
19
+ def self.default_options(model_name)
20
+ singular_name = model_name.to_s
21
+ plural_name = singular_name.pluralize
22
+ class_name = singular_name.camelize
23
+ {
24
+ :singular_name => singular_name,
25
+ :plural_name => plural_name,
26
+ :class_name => class_name,
27
+ :paginate => true,
28
+ :order_by => "created_at DESC",
29
+ :conditions => {},
30
+ :namespace => nil,
31
+ :log => Rails.env == 'development'
32
+ }
33
+ end
34
+
35
+ end
36
+
37
+ ActionController::Base.send(:include, ActiveCrudify)
38
+
39
+
@@ -0,0 +1,159 @@
1
+ module ActiveCrudify
2
+ module ClassMethods
3
+ # === Parameters
4
+ # * model_name
5
+ # Specify the model name like :post, :blog
6
+ # * options
7
+ #
8
+ # === Options
9
+ # [:class_name]
10
+ # Specify the class name for model.
11
+ # [:plural_name]
12
+ # [:order_by]
13
+ # [:conditions]
14
+ # Specify the condition which will be used in where clauses.
15
+ # [:namespace]
16
+ # Specify the controller in which namespace, like admin.
17
+ # [:only]
18
+ # Actions will be defined for controller.
19
+ # [:except]
20
+ # Define the actions exclude this option specified.
21
+ def crudify(model_name, options = {})
22
+ self.responder = ActiveCrudify::Responder
23
+ respond_to :html, :json, :xml
24
+
25
+ options = ActiveCrudify.default_options(model_name).merge(options)
26
+
27
+ allowed_actions = [:index, :new, :create, :show, :edit, :update, :destroy]
28
+ if options[:only]
29
+ allowed_actions = options[:only]
30
+ elsif options[:except]
31
+ allowed_actions = allowed_actions - options[:except]
32
+ end
33
+
34
+ singular_name = options[:singular_name]
35
+ plural_name = options[:plural_name]
36
+ class_name = options[:class_name]
37
+ klass = class_name.constantize
38
+ namespace = options[:namespace]
39
+ responded = namespace ? [namespace] : []
40
+
41
+
42
+ options[:paginate] = options[:paginate] && klass.respond_to?(:page)
43
+
44
+ module_eval %(
45
+ protected
46
+
47
+ def set_crud_options
48
+ @crud_options ||= #{options.inspect}
49
+ end
50
+
51
+ def what
52
+ @what ||= '#{options[:title]}'
53
+ end
54
+
55
+ def find_#{singular_name}
56
+ set_instance(#{class_name}.find(params[:id]))
57
+ end
58
+
59
+ def paginate_all_#{plural_name}
60
+ set_collection(#{class_name}.page(params[:page]).order(@crud_options[:order_by]).where(conditions))
61
+ end
62
+
63
+ def find_all_#{plural_name}
64
+ set_collection(#{class_name}.order(@crud_options[:order_by]).where(conditions))
65
+ end
66
+
67
+ def conditions
68
+ @conditions ||= @crud_options[:conditions]
69
+ end
70
+
71
+ def set_instance(record)
72
+ @instance = @#{singular_name} = record
73
+ end
74
+
75
+ def set_collection(records)
76
+ @collection = @#{plural_name} = records
77
+ end
78
+ )
79
+
80
+ module_eval %(
81
+
82
+ before_filter :find_#{singular_name},
83
+ :only => [:update, :destroy, :edit, :show]
84
+
85
+ before_filter :set_crud_options
86
+
87
+
88
+
89
+ if #{allowed_actions.include?(:new)}
90
+ def new
91
+ @#{singular_name} = #{class_name}.new
92
+ end
93
+ end
94
+
95
+ if #{allowed_actions.include?(:show)}
96
+ def show
97
+ respond_with(@#{singular_name})
98
+ end
99
+ end
100
+
101
+
102
+ if #{allowed_actions.include?(:create)}
103
+ def create
104
+ @instance = @#{singular_name} = #{class_name}.new(params[:#{singular_name}])
105
+ return if before_create === false
106
+ @instance.save
107
+ respond_with(#{namespace.inspect}, @#{singular_name})
108
+ end
109
+ end
110
+
111
+ if #{allowed_actions.include?(:edit)}
112
+ def edit
113
+
114
+ end
115
+ end
116
+
117
+ if #{allowed_actions.include?(:update)}
118
+ def update
119
+ return if before_update === false
120
+ @#{singular_name}.update_attributes(params[:#{singular_name}])
121
+ respond_with(#{namespace.inspect}, @#{singular_name})
122
+ end
123
+ end
124
+
125
+ if #{allowed_actions.include?(:destroy)}
126
+ def destroy
127
+ return if before_destroy === false
128
+ @#{singular_name}.destroy
129
+ respond_to do |f|
130
+ f.html { redirect_to([#{namespace.inspect}, :#{plural_name}]) }
131
+ f.any(:xml, :json) {head :ok}
132
+ end
133
+ end
134
+ end
135
+ )
136
+
137
+
138
+ if allowed_actions.include?(:index)
139
+ if options[:paginate]
140
+ module_eval %(
141
+ def index
142
+ paginate_all_#{plural_name}
143
+ respond_with(#{responded} << @#{plural_name})
144
+ end
145
+ )
146
+ else
147
+ module_eval %(
148
+ def index
149
+ find_all_#{plural_name}
150
+ respond_with(#{responded} << @#{plural_name})
151
+ end
152
+ )
153
+ end
154
+ end
155
+
156
+ end
157
+
158
+ end
159
+ end