OSDN Git Service

add rspec-rails
[praisedb/praisedb.git] / vendor / plugins / rspec-rails / generators / rspec_scaffold / rspec_scaffold_generator.rb
1 require File.dirname(__FILE__) + '/../rspec_default_values'
2
3 class RspecScaffoldGenerator < Rails::Generator::NamedBase
4   default_options :skip_migration => false
5   
6   attr_reader   :controller_name,
7                 :controller_class_path,
8                 :controller_file_path,
9                 :controller_class_nesting,
10                 :controller_class_nesting_depth,
11                 :controller_class_name,
12                 :controller_singular_name,
13                 :controller_plural_name,
14                 :resource_edit_path,
15                 :default_file_extension
16   alias_method  :controller_file_name,  :controller_singular_name
17   alias_method  :controller_table_name, :controller_plural_name
18
19   def initialize(runtime_args, runtime_options = {})
20     super
21
22     @controller_name = @name.pluralize
23
24     base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
25     @controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
26
27     if @controller_class_nesting.empty?
28       @controller_class_name = @controller_class_name_without_nesting
29     else
30       @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
31     end
32     
33     @default_file_extension = "html.erb"
34   end
35
36   def manifest
37     record do |m|
38       
39       # Check for class naming collisions.
40       m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper")
41       m.class_collisions(class_path, "#{class_name}")
42
43       # Controller, helper, views, and spec directories.
44       m.directory(File.join('app/models', class_path))
45       m.directory(File.join('app/controllers', controller_class_path))
46       m.directory(File.join('app/helpers', controller_class_path))
47       m.directory(File.join('app/views', controller_class_path, controller_file_name))
48       m.directory(File.join('app/views/layouts', controller_class_path))
49       m.directory(File.join('public/stylesheets', class_path))
50
51       m.directory(File.join('spec/controllers', controller_class_path))
52       m.directory(File.join('spec/routing', controller_class_path))
53       m.directory(File.join('spec/models', class_path))
54       m.directory(File.join('spec/helpers', class_path))
55       m.directory File.join('spec/fixtures', class_path)
56       m.directory File.join('spec/views', controller_class_path, controller_file_name)
57       m.directory File.join('spec/integration', class_path)
58       
59       # Layout and stylesheet.
60       m.template("scaffold:layout.html.erb", File.join('app/views/layouts', controller_class_path, "#{controller_file_name}.html.erb"))
61       m.template("scaffold:style.css", 'public/stylesheets/scaffold.css')
62
63       # Controller spec, class, and helper.
64       m.template 'rspec_scaffold:routing_spec.rb',
65         File.join('spec/routing', controller_class_path, "#{controller_file_name}_routing_spec.rb")
66
67       m.template 'rspec_scaffold:controller_spec.rb',
68         File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb")
69
70       m.template "scaffold:controller.rb",
71         File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
72
73       m.template 'rspec_scaffold:helper_spec.rb',
74         File.join('spec/helpers', class_path, "#{controller_file_name}_helper_spec.rb")
75
76       m.template "scaffold:helper.rb",
77         File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb")
78
79       for action in scaffold_views
80         m.template(
81           "scaffold:view_#{action}.#{@default_file_extension}",
82           File.join('app/views', controller_class_path, controller_file_name, "#{action}.#{default_file_extension}")
83         )
84       end
85       
86       # Model class, unit test, and fixtures.
87       m.template 'model:model.rb',            File.join('app/models', class_path, "#{file_name}.rb")
88       m.template 'model:fixtures.yml',        File.join('spec/fixtures', class_path, "#{table_name}.yml")
89       m.template 'rspec_model:model_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb")
90
91       # View specs
92       m.template "rspec_scaffold:edit_erb_spec.rb",
93         File.join('spec/views', controller_class_path, controller_file_name, "edit.#{default_file_extension}_spec.rb")
94       m.template "rspec_scaffold:index_erb_spec.rb",
95         File.join('spec/views', controller_class_path, controller_file_name, "index.#{default_file_extension}_spec.rb")
96       m.template "rspec_scaffold:new_erb_spec.rb",
97         File.join('spec/views', controller_class_path, controller_file_name, "new.#{default_file_extension}_spec.rb")
98       m.template "rspec_scaffold:show_erb_spec.rb",
99         File.join('spec/views', controller_class_path, controller_file_name, "show.#{default_file_extension}_spec.rb")
100
101       # Integration
102       m.template 'integration_spec:integration_spec.rb', File.join('spec/integration', class_path, "#{table_name}_spec.rb")
103
104       unless options[:skip_migration]
105         m.migration_template(
106           'model:migration.rb', 'db/migrate', 
107           :assigns => {
108             :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}",
109             :attributes     => attributes
110           }, 
111           :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
112         )
113       end
114
115       m.route_resources controller_file_name
116
117     end
118   end
119
120   protected
121     # Override with your own usage banner.
122     def banner
123       "Usage: #{$0} rspec_scaffold ModelName [field:type field:type]"
124     end
125
126     def add_options!(opt)
127       opt.separator ''
128       opt.separator 'Options:'
129       opt.on("--skip-migration", 
130              "Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
131     end
132
133     def scaffold_views
134       %w[ index show new edit ]
135     end
136
137     def model_name 
138       class_name.demodulize
139     end
140 end
141
142 module Rails
143   module Generator
144     class GeneratedAttribute
145       def input_type
146         @input_type ||= case type
147           when :text                        then "textarea"
148           else
149             "input"
150         end      
151       end
152     end
153   end
154 end