resource_controller 0.4.9
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.
- data/LICENSE +22 -0
- data/README +282 -0
- data/README.rdoc +282 -0
- data/Rakefile +35 -0
- data/generators/scaffold_resource/USAGE +29 -0
- data/generators/scaffold_resource/scaffold_resource_generator.rb +179 -0
- data/generators/scaffold_resource/templates/controller.rb +2 -0
- data/generators/scaffold_resource/templates/fixtures.yml +10 -0
- data/generators/scaffold_resource/templates/functional_test.rb +57 -0
- data/generators/scaffold_resource/templates/helper.rb +2 -0
- data/generators/scaffold_resource/templates/migration.rb +15 -0
- data/generators/scaffold_resource/templates/model.rb +2 -0
- data/generators/scaffold_resource/templates/old_migration.rb +13 -0
- data/generators/scaffold_resource/templates/rspec/functional_spec.rb +255 -0
- data/generators/scaffold_resource/templates/rspec/helper_spec.rb +11 -0
- data/generators/scaffold_resource/templates/rspec/routing_spec.rb +61 -0
- data/generators/scaffold_resource/templates/rspec/unit_spec.rb +11 -0
- data/generators/scaffold_resource/templates/rspec/views/edit_spec.rb +28 -0
- data/generators/scaffold_resource/templates/rspec/views/index_spec.rb +26 -0
- data/generators/scaffold_resource/templates/rspec/views/new_spec.rb +30 -0
- data/generators/scaffold_resource/templates/rspec/views/show_spec.rb +25 -0
- data/generators/scaffold_resource/templates/shoulda_functional_test.rb +19 -0
- data/generators/scaffold_resource/templates/unit_test.rb +7 -0
- data/generators/scaffold_resource/templates/view__form.erb +6 -0
- data/generators/scaffold_resource/templates/view__form.haml +5 -0
- data/generators/scaffold_resource/templates/view_edit.erb +16 -0
- data/generators/scaffold_resource/templates/view_edit.haml +11 -0
- data/generators/scaffold_resource/templates/view_index.erb +22 -0
- data/generators/scaffold_resource/templates/view_index.haml +19 -0
- data/generators/scaffold_resource/templates/view_new.erb +12 -0
- data/generators/scaffold_resource/templates/view_new.haml +9 -0
- data/generators/scaffold_resource/templates/view_show.erb +9 -0
- data/generators/scaffold_resource/templates/view_show.haml +9 -0
- data/init.rb +1 -0
- data/lib/resource_controller.rb +15 -0
- data/lib/resource_controller/accessors.rb +77 -0
- data/lib/resource_controller/action_options.rb +40 -0
- data/lib/resource_controller/actions.rb +75 -0
- data/lib/resource_controller/base.rb +15 -0
- data/lib/resource_controller/class_methods.rb +22 -0
- data/lib/resource_controller/controller.rb +63 -0
- data/lib/resource_controller/failable_action_options.rb +25 -0
- data/lib/resource_controller/helpers.rb +28 -0
- data/lib/resource_controller/helpers/current_objects.rb +69 -0
- data/lib/resource_controller/helpers/internal.rb +76 -0
- data/lib/resource_controller/helpers/nested.rb +45 -0
- data/lib/resource_controller/helpers/urls.rb +124 -0
- data/lib/resource_controller/response_collector.rb +27 -0
- data/lib/resource_controller/version.rb +9 -0
- data/lib/tasks/gem.rake +67 -0
- data/lib/urligence.rb +50 -0
- data/rails/init.rb +6 -0
- data/test/Rakefile +10 -0
- data/test/app/controllers/application.rb +7 -0
- data/test/app/controllers/cms/options_controller.rb +3 -0
- data/test/app/controllers/cms/products_controller.rb +3 -0
- data/test/app/controllers/comments_controller.rb +3 -0
- data/test/app/controllers/people_controller.rb +9 -0
- data/test/app/controllers/photos_controller.rb +11 -0
- data/test/app/controllers/posts_controller.rb +10 -0
- data/test/app/controllers/projects_controller.rb +3 -0
- data/test/app/controllers/somethings_controller.rb +3 -0
- data/test/app/controllers/tags_controller.rb +13 -0
- data/test/app/controllers/users_controller.rb +12 -0
- data/test/app/helpers/application_helper.rb +3 -0
- data/test/app/helpers/cms/products_helper.rb +2 -0
- data/test/app/helpers/comments_helper.rb +2 -0
- data/test/app/helpers/options_helper.rb +2 -0
- data/test/app/helpers/people_helper.rb +2 -0
- data/test/app/helpers/photos_helper.rb +2 -0
- data/test/app/helpers/posts_helper.rb +2 -0
- data/test/app/helpers/projects_helper.rb +2 -0
- data/test/app/helpers/somethings_helper.rb +2 -0
- data/test/app/helpers/tags_helper.rb +2 -0
- data/test/app/helpers/users_helper.rb +2 -0
- data/test/app/models/account.rb +3 -0
- data/test/app/models/comment.rb +3 -0
- data/test/app/models/option.rb +3 -0
- data/test/app/models/photo.rb +4 -0
- data/test/app/models/post.rb +3 -0
- data/test/app/models/product.rb +3 -0
- data/test/app/models/project.rb +2 -0
- data/test/app/models/something.rb +2 -0
- data/test/app/models/tag.rb +3 -0
- data/test/app/views/cms/options/edit.rhtml +17 -0
- data/test/app/views/cms/options/index.rhtml +20 -0
- data/test/app/views/cms/options/new.rhtml +16 -0
- data/test/app/views/cms/options/show.rhtml +8 -0
- data/test/app/views/cms/products/edit.rhtml +17 -0
- data/test/app/views/cms/products/index.rhtml +20 -0
- data/test/app/views/cms/products/new.rhtml +16 -0
- data/test/app/views/cms/products/show.rhtml +8 -0
- data/test/app/views/comments/edit.rhtml +27 -0
- data/test/app/views/comments/index.rhtml +24 -0
- data/test/app/views/comments/new.rhtml +26 -0
- data/test/app/views/comments/show.rhtml +18 -0
- data/test/app/views/layouts/application.rhtml +17 -0
- data/test/app/views/layouts/comments.rhtml +17 -0
- data/test/app/views/layouts/options.rhtml +17 -0
- data/test/app/views/layouts/people.rhtml +17 -0
- data/test/app/views/layouts/photos.rhtml +17 -0
- data/test/app/views/layouts/projects.rhtml +17 -0
- data/test/app/views/layouts/somethings.rhtml +17 -0
- data/test/app/views/layouts/tags.rhtml +17 -0
- data/test/app/views/people/edit.rhtml +17 -0
- data/test/app/views/people/index.rhtml +20 -0
- data/test/app/views/people/new.rhtml +16 -0
- data/test/app/views/people/show.rhtml +8 -0
- data/test/app/views/photos/edit.rhtml +17 -0
- data/test/app/views/photos/index.rhtml +20 -0
- data/test/app/views/photos/new.rhtml +16 -0
- data/test/app/views/photos/show.rhtml +8 -0
- data/test/app/views/posts/edit.rhtml +22 -0
- data/test/app/views/posts/index.rhtml +22 -0
- data/test/app/views/posts/new.rhtml +21 -0
- data/test/app/views/posts/show.rhtml +13 -0
- data/test/app/views/projects/edit.rhtml +17 -0
- data/test/app/views/projects/index.rhtml +20 -0
- data/test/app/views/projects/new.rhtml +16 -0
- data/test/app/views/projects/show.rhtml +8 -0
- data/test/app/views/somethings/edit.rhtml +17 -0
- data/test/app/views/somethings/index.rhtml +20 -0
- data/test/app/views/somethings/new.rhtml +16 -0
- data/test/app/views/somethings/show.rhtml +8 -0
- data/test/app/views/tags/edit.rhtml +17 -0
- data/test/app/views/tags/index.rhtml +20 -0
- data/test/app/views/tags/index.rjs +0 -0
- data/test/app/views/tags/new.rhtml +16 -0
- data/test/app/views/tags/show.rhtml +8 -0
- data/test/app/views/users/edit.rhtml +17 -0
- data/test/app/views/users/index.rhtml +20 -0
- data/test/app/views/users/new.rhtml +16 -0
- data/test/app/views/users/show.rhtml +8 -0
- data/test/config/boot.rb +109 -0
- data/test/config/database.yml +16 -0
- data/test/config/environment.rb +64 -0
- data/test/config/environments/development.rb +21 -0
- data/test/config/environments/test.rb +19 -0
- data/test/config/routes.rb +51 -0
- data/test/db/migrate/001_create_posts.rb +12 -0
- data/test/db/migrate/002_create_products.rb +11 -0
- data/test/db/migrate/003_create_comments.rb +13 -0
- data/test/db/migrate/004_create_options.rb +12 -0
- data/test/db/migrate/005_create_photos.rb +11 -0
- data/test/db/migrate/006_create_tags.rb +17 -0
- data/test/db/migrate/007_create_somethings.rb +11 -0
- data/test/db/migrate/008_create_accounts.rb +11 -0
- data/test/db/migrate/009_add_account_id_to_photos.rb +9 -0
- data/test/db/migrate/010_create_projects.rb +11 -0
- data/test/db/schema.rb +65 -0
- data/test/log/development.log +2918 -0
- data/test/log/test.log +135619 -0
- data/test/log/thin.log +12 -0
- data/test/script/console +3 -0
- data/test/script/destroy +3 -0
- data/test/script/generate +3 -0
- data/test/script/server +3 -0
- data/test/test/fixtures/accounts.yml +7 -0
- data/test/test/fixtures/comments.yml +11 -0
- data/test/test/fixtures/options.yml +9 -0
- data/test/test/fixtures/photos.yml +9 -0
- data/test/test/fixtures/photos_tags.yml +3 -0
- data/test/test/fixtures/posts.yml +9 -0
- data/test/test/fixtures/products.yml +7 -0
- data/test/test/fixtures/projects.yml +7 -0
- data/test/test/fixtures/somethings.yml +7 -0
- data/test/test/fixtures/tags.yml +7 -0
- data/test/test/functional/cms/options_controller_test.rb +23 -0
- data/test/test/functional/cms/products_controller_test.rb +23 -0
- data/test/test/functional/comments_controller_test.rb +26 -0
- data/test/test/functional/people_controller_test.rb +34 -0
- data/test/test/functional/photos_controller_test.rb +130 -0
- data/test/test/functional/posts_controller_test.rb +34 -0
- data/test/test/functional/projects_controller_test.rb +18 -0
- data/test/test/functional/somethings_controller_test.rb +28 -0
- data/test/test/functional/tags_controller_test.rb +64 -0
- data/test/test/functional/users_controller_test.rb +24 -0
- data/test/test/test_helper.rb +12 -0
- data/test/test/unit/accessors_test.rb +110 -0
- data/test/test/unit/account_test.rb +7 -0
- data/test/test/unit/action_options_test.rb +109 -0
- data/test/test/unit/base_test.rb +11 -0
- data/test/test/unit/comment_test.rb +10 -0
- data/test/test/unit/failable_action_options_test.rb +77 -0
- data/test/test/unit/helpers/current_objects_test.rb +127 -0
- data/test/test/unit/helpers/internal_test.rb +106 -0
- data/test/test/unit/helpers/nested_test.rb +82 -0
- data/test/test/unit/helpers/urls_test.rb +71 -0
- data/test/test/unit/helpers_test.rb +25 -0
- data/test/test/unit/option_test.rb +10 -0
- data/test/test/unit/photo_test.rb +10 -0
- data/test/test/unit/post_test.rb +10 -0
- data/test/test/unit/project_test.rb +10 -0
- data/test/test/unit/response_collector_test.rb +49 -0
- data/test/test/unit/something_test.rb +10 -0
- data/test/test/unit/tag_test.rb +10 -0
- data/test/test/unit/urligence_test.rb +203 -0
- data/test/vendor/plugins/shoulda/Rakefile +32 -0
- data/test/vendor/plugins/shoulda/bin/convert_to_should_syntax +40 -0
- data/test/vendor/plugins/shoulda/init.rb +3 -0
- data/test/vendor/plugins/shoulda/lib/shoulda.rb +43 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/active_record_helpers.rb +580 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/color.rb +77 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/controller_tests.rb +467 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/html.rb +201 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/xml.rb +170 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/gem/proc_extensions.rb +14 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/gem/shoulda.rb +239 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/general.rb +118 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/private_helpers.rb +22 -0
- metadata +312 -0
data/Rakefile
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
require 'rake/testtask'
|
|
3
|
+
require 'rake/rdoctask'
|
|
4
|
+
require File.dirname(__FILE__)+'/lib/resource_controller/version'
|
|
5
|
+
Dir['lib/tasks/**.rake'].each { |tasks| load tasks }
|
|
6
|
+
|
|
7
|
+
desc 'Default: run unit tests.'
|
|
8
|
+
task :default => :test
|
|
9
|
+
|
|
10
|
+
desc 'Test the ResourceController plugin.'
|
|
11
|
+
Rake::TestTask.new(:test) do |t|
|
|
12
|
+
t.libs << 'lib'
|
|
13
|
+
t.pattern = 'test/test/**/*_test.rb'
|
|
14
|
+
t.verbose = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
desc 'Generate documentation for the ResourceController plugin.'
|
|
18
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
19
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
20
|
+
rdoc.title = 'ResourceController'
|
|
21
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
|
22
|
+
rdoc.rdoc_files.include('README')
|
|
23
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
task :upload_docs => :rdoc do
|
|
27
|
+
puts 'Deleting previous rdoc'
|
|
28
|
+
`ssh jamesgolick.com 'rm -Rf /home/apps/jamesgolick.com/public/resource_controller/rdoc'`
|
|
29
|
+
|
|
30
|
+
puts "Uploading current rdoc"
|
|
31
|
+
`scp -r rdoc jamesgolick.com:/home/apps/jamesgolick.com/public/resource_controller`
|
|
32
|
+
|
|
33
|
+
puts "Deleting rdoc"
|
|
34
|
+
`rm -Rf rdoc`
|
|
35
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
The scaffold resource generator creates a model, a controller, and a set of templates that's ready to use as the
|
|
3
|
+
starting point for your REST-like, resource-oriented application. This basically means that it follows a set of
|
|
4
|
+
conventions to exploit the full set of HTTP verbs (GET/POST/PUT/DELETE) and is prepared for multi-client access
|
|
5
|
+
(like one view for HTML, one for an XML API, one for ATOM, etc). Everything comes with sample unit and functional
|
|
6
|
+
tests as well.
|
|
7
|
+
|
|
8
|
+
The generator takes the name of the model as its first argument. This model name is then pluralized to get the
|
|
9
|
+
controller name. So "scaffold_resource post" will generate a Post model and a PostsController and will be intended
|
|
10
|
+
for URLs like /posts and /posts/45.
|
|
11
|
+
|
|
12
|
+
As additional parameters, the generator will take attribute pairs described by name and type. These attributes will
|
|
13
|
+
be used to prepopulate the migration to create the table for the model and to give you a set of templates for the
|
|
14
|
+
view. For example, "scaffold_resource post title:string created_on:date body:text published:boolean" will give
|
|
15
|
+
you a model with those four attributes, forms to create and edit those models from, and an index that'll list them
|
|
16
|
+
all.
|
|
17
|
+
|
|
18
|
+
You don't have to think up all attributes up front, but it's a good idea of adding just the baseline of what's
|
|
19
|
+
needed to start really working with the resource.
|
|
20
|
+
|
|
21
|
+
Once the generator has run, you'll need to add a declaration to your config/routes.rb file to hook up the rules
|
|
22
|
+
that'll point URLs to this new resource. If you create a resource like "scaffold_resource post", you'll need to
|
|
23
|
+
add "map.resources :posts" (notice the plural form) in the routes file. Then your new resource is accessible from
|
|
24
|
+
/posts.
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
./script/generate scaffold_resource post # no attributes, view will be anemic
|
|
28
|
+
./script/generate scaffold_resource post title:string created_on:date body:text published:boolean
|
|
29
|
+
./script/generate scaffold_resource purchase order_id:integer created_at:datetime amount:decimal
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
class ScaffoldResourceGenerator < Rails::Generator::NamedBase
|
|
2
|
+
attr_reader :controller_name,
|
|
3
|
+
:controller_class_path,
|
|
4
|
+
:controller_file_path,
|
|
5
|
+
:controller_class_nesting,
|
|
6
|
+
:controller_class_nesting_depth,
|
|
7
|
+
:controller_class_name,
|
|
8
|
+
:controller_singular_name,
|
|
9
|
+
:controller_plural_name,
|
|
10
|
+
:resource_edit_path,
|
|
11
|
+
:default_file_extension,
|
|
12
|
+
:generator_default_file_extension
|
|
13
|
+
alias_method :controller_file_name, :controller_singular_name
|
|
14
|
+
alias_method :controller_table_name, :controller_plural_name
|
|
15
|
+
|
|
16
|
+
def initialize(runtime_args, runtime_options = {})
|
|
17
|
+
super
|
|
18
|
+
|
|
19
|
+
if @rspec = has_rspec?
|
|
20
|
+
if ActionController::Base.respond_to?(:resource_action_separator)
|
|
21
|
+
@resource_edit_path = "/edit"
|
|
22
|
+
else
|
|
23
|
+
@resource_edit_path = ";edit"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
@generator_default_file_extension = (defined? Haml )? "haml" : "erb"
|
|
28
|
+
|
|
29
|
+
# we want to call erb templates .rhtml or .haml if this is rails 1
|
|
30
|
+
if RAILS_GEM_VERSION.to_i == 1
|
|
31
|
+
@default_file_extension = @generator_default_file_extension == 'erb' ? 'rhtml' : @generator_default_file_extension
|
|
32
|
+
else
|
|
33
|
+
@default_file_extension = "html.#{@generator_default_file_extension}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
@controller_name = @name.pluralize
|
|
37
|
+
|
|
38
|
+
base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
|
|
39
|
+
@controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
|
|
40
|
+
|
|
41
|
+
if @controller_class_nesting.empty?
|
|
42
|
+
@controller_class_name = @controller_class_name_without_nesting
|
|
43
|
+
else
|
|
44
|
+
@controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def manifest
|
|
49
|
+
record do |m|
|
|
50
|
+
# Check for class naming collisions.
|
|
51
|
+
m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper")
|
|
52
|
+
m.class_collisions(class_path, "#{class_name}")
|
|
53
|
+
|
|
54
|
+
# Controller, helper, views, and test directories.
|
|
55
|
+
m.directory(File.join('app/models', class_path))
|
|
56
|
+
m.directory(File.join('app/controllers', controller_class_path))
|
|
57
|
+
m.directory(File.join('app/helpers', controller_class_path))
|
|
58
|
+
m.directory(File.join('app/views', controller_class_path, controller_file_name))
|
|
59
|
+
|
|
60
|
+
if @rspec
|
|
61
|
+
m.directory(File.join('spec/controllers', controller_class_path))
|
|
62
|
+
m.directory(File.join('spec/helpers', class_path))
|
|
63
|
+
m.directory(File.join('spec/models', class_path))
|
|
64
|
+
m.directory File.join('spec/views', controller_class_path, controller_file_name)
|
|
65
|
+
m.directory(File.join('spec/fixtures', class_path))
|
|
66
|
+
else
|
|
67
|
+
m.directory(File.join('test/functional', controller_class_path))
|
|
68
|
+
m.directory(File.join('test/unit', class_path))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
scaffold_views.each do |action|
|
|
72
|
+
m.template(
|
|
73
|
+
"view_#{action}.#{generator_default_file_extension}",
|
|
74
|
+
File.join('app/views', controller_class_path, controller_file_name, "#{action}.#{default_file_extension}")
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
m.template('model.rb', File.join('app/models', class_path, "#{file_name}.rb"))
|
|
79
|
+
m.template('controller.rb', File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb"))
|
|
80
|
+
m.template('helper.rb', File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb"))
|
|
81
|
+
|
|
82
|
+
if @rspec
|
|
83
|
+
m.template('rspec/functional_spec.rb', File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb"))
|
|
84
|
+
m.template('rspec/routing_spec.rb', File.join('spec/controllers', controller_class_path, "#{controller_file_name}_routing_spec.rb"))
|
|
85
|
+
m.template('rspec/helper_spec.rb', File.join('spec/helpers', class_path, "#{controller_file_name}_helper_spec.rb"))
|
|
86
|
+
m.template('rspec/unit_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb"))
|
|
87
|
+
m.template('fixtures.yml', File.join('spec/fixtures', "#{table_name}.yml"))
|
|
88
|
+
|
|
89
|
+
rspec_views.each do |action|
|
|
90
|
+
m.template(
|
|
91
|
+
"rspec/views/#{action}_spec.rb",
|
|
92
|
+
File.join('spec/views', controller_class_path, controller_file_name, "#{action}_spec.rb")
|
|
93
|
+
)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
else
|
|
97
|
+
functional_test = (defined? ThoughtBot::Shoulda) ? "shoulda_functional_test.rb" : "functional_test.rb"
|
|
98
|
+
|
|
99
|
+
m.template("#{functional_test}", File.join('test/functional', controller_class_path, "#{controller_file_name}_controller_test.rb"))
|
|
100
|
+
m.template('unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb"))
|
|
101
|
+
m.template('fixtures.yml', File.join('test/fixtures', "#{table_name}.yml"))
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
unless options[:skip_migration]
|
|
106
|
+
migration_template = RAILS_GEM_VERSION.to_i == 1 ? 'old_migration.rb' : 'migration.rb'
|
|
107
|
+
|
|
108
|
+
m.migration_template(
|
|
109
|
+
migration_template, 'db/migrate',
|
|
110
|
+
:assigns => {
|
|
111
|
+
:migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}",
|
|
112
|
+
:attributes => attributes
|
|
113
|
+
},
|
|
114
|
+
:migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
|
|
115
|
+
)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
m.route_resources controller_file_name
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Lifted from Rick Olson's restful_authentication
|
|
123
|
+
def has_rspec?
|
|
124
|
+
options[:rspec] || (File.exist?('spec') && File.directory?('spec'))
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
protected
|
|
128
|
+
# Override with your own usage banner.
|
|
129
|
+
def banner
|
|
130
|
+
"Usage: #{$0} scaffold_resource ModelName [field:type, field:type]"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def rspec_views
|
|
134
|
+
%w[ index show new edit ]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def scaffold_views
|
|
138
|
+
rspec_views + %w[ _form ]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def model_name
|
|
142
|
+
class_name.demodulize
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def add_options!(opt)
|
|
146
|
+
opt.separator ''
|
|
147
|
+
opt.separator 'Options:'
|
|
148
|
+
opt.on("--rspec", "Force rspec mode (checks for RAILS_ROOT/spec by default)") { |v| options[:rspec] = true }
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
module Rails
|
|
153
|
+
module Generator
|
|
154
|
+
class GeneratedAttribute
|
|
155
|
+
def default_value
|
|
156
|
+
@default_value ||= case type
|
|
157
|
+
when :int, :integer then "\"1\""
|
|
158
|
+
when :float then "\"1.5\""
|
|
159
|
+
when :decimal then "\"9.99\""
|
|
160
|
+
when :datetime, :timestamp, :time then "Time.now"
|
|
161
|
+
when :date then "Date.today"
|
|
162
|
+
when :string then "\"MyString\""
|
|
163
|
+
when :text then "\"MyText\""
|
|
164
|
+
when :boolean then "false"
|
|
165
|
+
else
|
|
166
|
+
""
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def input_type
|
|
171
|
+
@input_type ||= case type
|
|
172
|
+
when :text then "textarea"
|
|
173
|
+
else
|
|
174
|
+
"input"
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../test_helper'
|
|
2
|
+
require '<%= controller_file_path %>_controller'
|
|
3
|
+
|
|
4
|
+
# Re-raise errors caught by the controller.
|
|
5
|
+
class <%= controller_class_name %>Controller; def rescue_action(e) raise e end; end
|
|
6
|
+
|
|
7
|
+
class <%= controller_class_name %>ControllerTest < Test::Unit::TestCase
|
|
8
|
+
fixtures :<%= table_name %>
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@controller = <%= controller_class_name %>Controller.new
|
|
12
|
+
@request = ActionController::TestRequest.new
|
|
13
|
+
@response = ActionController::TestResponse.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_should_get_index
|
|
17
|
+
get :index
|
|
18
|
+
assert_response :success
|
|
19
|
+
assert assigns(:<%= table_name %>)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_should_get_new
|
|
23
|
+
get :new
|
|
24
|
+
assert_response :success
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_should_create_<%= file_name %>
|
|
28
|
+
old_count = <%= class_name %>.count
|
|
29
|
+
post :create, :<%= file_name %> => { }
|
|
30
|
+
assert_equal old_count+1, <%= class_name %>.count
|
|
31
|
+
|
|
32
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_should_show_<%= file_name %>
|
|
36
|
+
get :show, :id => 1
|
|
37
|
+
assert_response :success
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_should_get_edit
|
|
41
|
+
get :edit, :id => 1
|
|
42
|
+
assert_response :success
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_should_update_<%= file_name %>
|
|
46
|
+
put :update, :id => 1, :<%= file_name %> => { }
|
|
47
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_should_destroy_<%= file_name %>
|
|
51
|
+
old_count = <%= class_name %>.count
|
|
52
|
+
delete :destroy, :id => 1
|
|
53
|
+
assert_equal old_count-1, <%= class_name %>.count
|
|
54
|
+
|
|
55
|
+
assert_redirected_to <%= table_name %>_path
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :<%= table_name %>, :force => true do |t|
|
|
4
|
+
<% for attribute in attributes -%>
|
|
5
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
|
6
|
+
<% end -%>
|
|
7
|
+
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.down
|
|
13
|
+
drop_table :<%= table_name %>
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :<%= table_name %>, :force => true do |t|
|
|
4
|
+
<% for attribute in attributes -%>
|
|
5
|
+
t.column :<%= attribute.name %>, :<%= attribute.type %>
|
|
6
|
+
<% end -%>
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.down
|
|
11
|
+
drop_table :<%= table_name %>
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../spec_helper')
|
|
2
|
+
|
|
3
|
+
describe <%= controller_class_name %>Controller do
|
|
4
|
+
describe "handling GET /<%= table_name %>" do
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
8
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return([@<%= file_name %>])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def do_get
|
|
12
|
+
get :index
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should be successful" do
|
|
16
|
+
do_get
|
|
17
|
+
response.should be_success
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should render index template" do
|
|
21
|
+
do_get
|
|
22
|
+
response.should render_template('index')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should find all <%= table_name %>" do
|
|
26
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with(:all).and_return([@<%= file_name %>])
|
|
27
|
+
do_get
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should assign the found <%= table_name %> for the view" do
|
|
31
|
+
do_get
|
|
32
|
+
assigns[:<%= table_name %>].should == [@<%= file_name %>]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "handling GET /<%= table_name %>/1" do
|
|
37
|
+
|
|
38
|
+
before(:each) do
|
|
39
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
40
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def do_get
|
|
44
|
+
get :show, :id => "1"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should be successful" do
|
|
48
|
+
do_get
|
|
49
|
+
response.should be_success
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should render show template" do
|
|
53
|
+
do_get
|
|
54
|
+
response.should render_template('show')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should find the <%= file_name %> requested" do
|
|
58
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
59
|
+
do_get
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should assign the found <%= file_name %> for the view" do
|
|
63
|
+
do_get
|
|
64
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "handling GET /<%= table_name %>/new" do
|
|
69
|
+
|
|
70
|
+
before(:each) do
|
|
71
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
72
|
+
<%= controller_class_name.singularize %>.stub!(:new).and_return(@<%= file_name %>)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def do_get
|
|
76
|
+
get :new
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should be successful" do
|
|
80
|
+
do_get
|
|
81
|
+
response.should be_success
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should render new template" do
|
|
85
|
+
do_get
|
|
86
|
+
response.should render_template('new')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should create an new <%= file_name %>" do
|
|
90
|
+
<%= controller_class_name.singularize %>.should_receive(:new).and_return(@<%= file_name %>)
|
|
91
|
+
do_get
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should not save the new <%= file_name %>" do
|
|
95
|
+
@<%= file_name %>.should_not_receive(:save)
|
|
96
|
+
do_get
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should assign the new <%= file_name %> for the view" do
|
|
100
|
+
do_get
|
|
101
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe "handling GET /<%= table_name %>/1/edit" do
|
|
106
|
+
|
|
107
|
+
before(:each) do
|
|
108
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
109
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def do_get
|
|
113
|
+
get :edit, :id => "1"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should be successful" do
|
|
117
|
+
do_get
|
|
118
|
+
response.should be_success
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should render edit template" do
|
|
122
|
+
do_get
|
|
123
|
+
response.should render_template('edit')
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should find the <%= file_name %> requested" do
|
|
127
|
+
<%= controller_class_name.singularize %>.should_receive(:find).and_return(@<%= file_name %>)
|
|
128
|
+
do_get
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "should assign the found <%= controller_class_name %> for the view" do
|
|
132
|
+
do_get
|
|
133
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe "handling POST /<%= table_name %>" do
|
|
138
|
+
|
|
139
|
+
before(:each) do
|
|
140
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :to_param => "1")
|
|
141
|
+
<%= controller_class_name.singularize %>.stub!(:new).and_return(@<%= file_name %>)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe "with successful save" do
|
|
145
|
+
|
|
146
|
+
def do_post
|
|
147
|
+
@<%= file_name %>.should_receive(:save).and_return(true)
|
|
148
|
+
post :create, :<%= file_name %> => {}
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should create a new <%= file_name %>" do
|
|
152
|
+
<%= controller_class_name.singularize %>.should_receive(:new).with({}).and_return(@<%= file_name %>)
|
|
153
|
+
do_post
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "should redirect to the new <%= file_name %>" do
|
|
157
|
+
do_post
|
|
158
|
+
response.should redirect_to(<%= table_name.singularize %>_url("1"))
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "with failed save" do
|
|
164
|
+
|
|
165
|
+
def do_post
|
|
166
|
+
@<%= file_name %>.should_receive(:save).and_return(false)
|
|
167
|
+
post :create, :<%= file_name %> => {}
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "should re-render 'new'" do
|
|
171
|
+
do_post
|
|
172
|
+
response.should render_template('new')
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "handling PUT /<%= table_name %>/1" do
|
|
179
|
+
|
|
180
|
+
before(:each) do
|
|
181
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :to_param => "1")
|
|
182
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
describe "with successful update" do
|
|
186
|
+
|
|
187
|
+
def do_put
|
|
188
|
+
@<%= file_name %>.should_receive(:update_attributes).and_return(true)
|
|
189
|
+
put :update, :id => "1"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "should find the <%= file_name %> requested" do
|
|
193
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
194
|
+
do_put
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "should update the found <%= file_name %>" do
|
|
198
|
+
do_put
|
|
199
|
+
assigns(:<%= file_name %>).should equal(@<%= file_name %>)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "should assign the found <%= file_name %> for the view" do
|
|
203
|
+
do_put
|
|
204
|
+
assigns(:<%= file_name %>).should equal(@<%= file_name %>)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should redirect to the <%= file_name %>" do
|
|
208
|
+
do_put
|
|
209
|
+
response.should redirect_to(<%= table_name.singularize %>_url("1"))
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe "with failed update" do
|
|
215
|
+
|
|
216
|
+
def do_put
|
|
217
|
+
@<%= file_name %>.should_receive(:update_attributes).and_return(false)
|
|
218
|
+
put :update, :id => "1"
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "should re-render 'edit'" do
|
|
222
|
+
do_put
|
|
223
|
+
response.should render_template('edit')
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
describe "handling DELETE /<%= table_name %>/1" do
|
|
230
|
+
|
|
231
|
+
before(:each) do
|
|
232
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :destroy => true)
|
|
233
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def do_delete
|
|
237
|
+
delete :destroy, :id => "1"
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should find the <%= file_name %> requested" do
|
|
241
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
242
|
+
do_delete
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should call destroy on the found <%= file_name %>" do
|
|
246
|
+
@<%= file_name %>.should_receive(:destroy).and_return(true)
|
|
247
|
+
do_delete
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "should redirect to the <%= table_name %> list" do
|
|
251
|
+
do_delete
|
|
252
|
+
response.should redirect_to(<%= table_name %>_url)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|