rails3-generators 0.9.2 → 0.10.0
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/.gitignore +1 -1
- data/CHANGELOG.rdoc +11 -1
- data/VERSION +1 -1
- data/lib/generators/mustache.rb +9 -0
- data/lib/generators/mustache/README.md +22 -0
- data/lib/generators/mustache/controller/controller_generator.rb +39 -0
- data/lib/generators/mustache/controller/templates/view.html.mustache.erb +0 -0
- data/lib/generators/mustache/controller/templates/view.rb.erb +3 -0
- data/lib/generators/mustache/install/install_generator.rb +15 -0
- data/lib/generators/mustache/install/templates/config/initializers/mustache.rb +6 -0
- data/lib/generators/mustache/install/templates/lib/mustache_rails.rb +123 -0
- data/lib/generators/mustache/scaffold/scaffold_generator.rb +38 -0
- data/lib/generators/mustache/scaffold/templates/_form.html.mustache.erb +4 -0
- data/lib/generators/mustache/scaffold/templates/edit.html.mustache.erb +10 -0
- data/lib/generators/mustache/scaffold/templates/edit.rb.erb +53 -0
- data/lib/generators/mustache/scaffold/templates/index.html.mustache.erb +13 -0
- data/lib/generators/mustache/scaffold/templates/index.rb.erb +18 -0
- data/lib/generators/mustache/scaffold/templates/new.html.mustache.erb +11 -0
- data/lib/generators/mustache/scaffold/templates/new.rb.erb +50 -0
- data/lib/generators/mustache/scaffold/templates/show.html.mustache.erb +7 -0
- data/lib/generators/mustache/scaffold/templates/show.rb.erb +18 -0
- data/lib/generators/shoulda/controller/templates/controller.rb +15 -15
- data/lib/rails3-generators.rb +7 -0
- data/rails3-generators.gemspec +27 -3
- data/test/lib/generators/mustache/controller_generator_test.rb +31 -0
- data/test/lib/generators/mustache/scaffold_generator_test.rb +202 -0
- data/test/lib/generators/shoulda/controller_generator_test.rb +37 -0
- data/test/test_helper.rb +19 -0
- metadata +29 -5
data/.gitignore
CHANGED
data/CHANGELOG.rdoc
CHANGED
@@ -1,8 +1,18 @@
|
|
1
1
|
== TODO
|
2
|
-
* Mustache
|
2
|
+
* Grow Mustache up.(fix the TODOs and move the source to a mustache-rails like gem)
|
3
|
+
* Write some documentation. (In both the github wiki and the source code)
|
3
4
|
* Datamapper Tests
|
4
5
|
* Mongomapper Tests
|
5
6
|
|
7
|
+
== 0.10.0
|
8
|
+
* enhancements
|
9
|
+
* added mustache:install
|
10
|
+
* added mustache:controller
|
11
|
+
* added mustache:scaffold
|
12
|
+
|
13
|
+
* fix
|
14
|
+
* fixed shoulda controller CamelCase problem.
|
15
|
+
|
6
16
|
== 0.9.2
|
7
17
|
* enhancements
|
8
18
|
* added koala:install
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
## Rails 3 Generators for Mustache
|
2
|
+
|
3
|
+
[Mustache](http://github.com/defunkt/mustache) support for [Rails 3](http://weblog.rubyonrails.org/2010/6/8/rails-3-0-beta-4-now-rc-in-days) is [still developing](http://github.com/defunkt/mustache/issues/#issue/3). Following the work of others, I have built a provisional template handler that is included with these generators. To install it in your project, `rails g mustache:install`
|
4
|
+
|
5
|
+
I'm assuming that the Mustache template engine that gets the official blessing will expect to find files where Chris W. and others have suggested the files should go, so I have built my generators and provisional template handler accordingly. I.e. the files for widget views go in:
|
6
|
+
|
7
|
+
* app/views/widgets/action.rb for view class definitions
|
8
|
+
* app/templates/widgets/action.html.mustache for templates
|
9
|
+
|
10
|
+
|
11
|
+
### To Do
|
12
|
+
|
13
|
+
* Enable mustache layout usage (uses default application.erb for now)
|
14
|
+
* Add controller-retrofit generator to build default mustache views for existing controllers
|
15
|
+
* Generate different fields for different attribute types
|
16
|
+
* Helper generation for leaner view files
|
17
|
+
|
18
|
+
### Thanks
|
19
|
+
|
20
|
+
* Louis T. for running the umbrella Rails 3 Generators project and giving me pointers on writing generators.
|
21
|
+
* Paul Barry for invaluable help figuring out how Rails template handlers work.
|
22
|
+
* José Valim, Paul Barry, and Jeremy McAnally for good information.
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'generators/mustache'
|
2
|
+
require 'rails/generators/named_base'
|
3
|
+
|
4
|
+
class Mustache
|
5
|
+
module Generators
|
6
|
+
class ControllerGenerator < ::Rails::Generators::NamedBase
|
7
|
+
extend TemplatePath
|
8
|
+
|
9
|
+
argument :actions, :type => :array, :default => [], :banner => "action action"
|
10
|
+
|
11
|
+
def create_view_files
|
12
|
+
model_path = File.join(class_path, file_name)
|
13
|
+
|
14
|
+
base_mustache_view_path = File.join("app/views", model_path)
|
15
|
+
empty_directory base_mustache_view_path
|
16
|
+
|
17
|
+
base_mustache_template_path = File.join("app/templates", model_path)
|
18
|
+
empty_directory base_mustache_template_path
|
19
|
+
|
20
|
+
actions.each do |action|
|
21
|
+
@action = action
|
22
|
+
mustache_view_path = File.join(base_mustache_view_path,
|
23
|
+
"#{action}.rb")
|
24
|
+
mustache_template_path = File.join(base_mustache_template_path,
|
25
|
+
"#{action}.html.mustache")
|
26
|
+
|
27
|
+
template "view.rb.erb", mustache_view_path
|
28
|
+
template "view.html.mustache.erb", mustache_template_path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def handler
|
35
|
+
:haml
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'generators/mustache'
|
2
|
+
|
3
|
+
class Mustache
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
extend TemplatePath
|
7
|
+
|
8
|
+
def copy_initializer_files
|
9
|
+
copy_file "config/initializers/mustache.rb", "config/initializers/mustache.rb"
|
10
|
+
copy_file "lib/mustache_rails.rb", "lib/mustache_rails.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'action_view'
|
2
|
+
require 'active_support'
|
3
|
+
require 'mustache'
|
4
|
+
|
5
|
+
class Mustache
|
6
|
+
|
7
|
+
# Remember to use {{{yield}}} (3 mustaches) to skip escaping HTML
|
8
|
+
# Using {{{tag}}} will skip escaping HTML so if your mustache methods return
|
9
|
+
# HTML, be sure to interpolate them using 3 mustaches.
|
10
|
+
|
11
|
+
class Rails < Mustache
|
12
|
+
attr_accessor :view
|
13
|
+
|
14
|
+
def method_missing(method, *args, &block)
|
15
|
+
view.send(method, *args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def respond_to?(method, include_private=false)
|
19
|
+
super(method, include_private) || view.respond_to?(method, include_private)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Redefine where Mustache::Rails templates locate their partials:
|
23
|
+
#
|
24
|
+
# (1) in the same directory as the current template file.
|
25
|
+
# (2) in the shared templates path (can be configured via Config.shared_path=(value))
|
26
|
+
#
|
27
|
+
def partial(name)
|
28
|
+
partial_name = "_#{name}.#{Config.template_extension}"
|
29
|
+
template_dir = Pathname.new(self.class.template_file).dirname
|
30
|
+
partial_path = File.expand_path("#{template_dir}/#{partial_name}")
|
31
|
+
unless File.file?(partial_path)
|
32
|
+
partial_path = "#{Config.shared_path}/#{partial_name}"
|
33
|
+
end
|
34
|
+
File.read(partial_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
# You can change these defaults in, say, a Rails initializer or
|
38
|
+
# environment.rb, e.g.:
|
39
|
+
#
|
40
|
+
# Mustache::Rails::Config.template_base_path = Rails.root.join('app', 'templates')
|
41
|
+
module Config
|
42
|
+
def self.template_base_path
|
43
|
+
@template_base_path ||= ::Rails.root.join('app', 'templates')
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.template_base_path=(value)
|
47
|
+
@template_base_path = value
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.template_extension
|
51
|
+
@template_extension ||= 'html.mustache'
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.template_extension=(value)
|
55
|
+
@template_extension = value
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.shared_path
|
59
|
+
@shared_path ||= ::Rails.root.join('app', 'templates', 'shared')
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.shared_path=(value)
|
63
|
+
@shared_path = value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class TemplateHandler < ActionView::Template::Handler
|
68
|
+
|
69
|
+
include ActionView::Template::Handlers::Compilable
|
70
|
+
|
71
|
+
self.default_format = :mustache
|
72
|
+
|
73
|
+
# @return [String] its evaled in the context of the action view
|
74
|
+
# hence the hack below
|
75
|
+
#
|
76
|
+
# @param [ActionView::Template]
|
77
|
+
def compile(template)
|
78
|
+
mustache_class = mustache_class_from_template(template)
|
79
|
+
mustache_class.template_file = mustache_template_file(template)
|
80
|
+
|
81
|
+
<<-MUSTACHE
|
82
|
+
mustache = ::#{mustache_class}.new
|
83
|
+
mustache.view = self
|
84
|
+
mustache[:yield] = content_for(:layout)
|
85
|
+
mustache.context.update(local_assigns)
|
86
|
+
variables = controller.instance_variable_names
|
87
|
+
variables -= %w[@template]
|
88
|
+
|
89
|
+
if controller.respond_to?(:protected_instance_variables)
|
90
|
+
variables -= controller.protected_instance_variables
|
91
|
+
end
|
92
|
+
|
93
|
+
variables.each do |name|
|
94
|
+
mustache.instance_variable_set(name, controller.instance_variable_get(name))
|
95
|
+
end
|
96
|
+
|
97
|
+
# Declaring an +attr_reader+ for each instance variable in the
|
98
|
+
# Mustache::Rails subclass makes them available to your templates.
|
99
|
+
mustache.class.class_eval do
|
100
|
+
attr_reader *variables.map { |name| name.sub(/^@/, '').to_sym }
|
101
|
+
end
|
102
|
+
|
103
|
+
mustache.render
|
104
|
+
MUSTACHE
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def mustache_class_from_template(template)
|
110
|
+
const_name = ActiveSupport::Inflector.camelize(template.virtual_path.to_s)
|
111
|
+
defined?(const_name) ? const_name.constantize : Mustache
|
112
|
+
end
|
113
|
+
|
114
|
+
def mustache_template_file(template)
|
115
|
+
"#{Config.template_base_path}/#{template.virtual_path}.#{Config.template_extension}"
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
::ActiveSupport::Dependencies.load_paths << Rails.root.join("app", "views")
|
123
|
+
::ActionView::Template.register_template_handler(:rb, Mustache::Rails::TemplateHandler)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'generators/mustache'
|
2
|
+
require 'rails/generators/erb/scaffold/scaffold_generator'
|
3
|
+
|
4
|
+
class Mustache
|
5
|
+
module Generators
|
6
|
+
class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
|
7
|
+
extend TemplatePath
|
8
|
+
|
9
|
+
# TODO Layout files? snusnu claims his template engine supports layouts:
|
10
|
+
# http://github.com/defunkt/mustache/issues/#issue/3/comment/263445
|
11
|
+
|
12
|
+
def copy_view_files
|
13
|
+
views = available_views
|
14
|
+
views.delete("index") if options[:singleton]
|
15
|
+
|
16
|
+
views.each do |view|
|
17
|
+
template "#{view}.rb.erb",
|
18
|
+
File.join("app/views", controller_file_path, "#{view}.rb")
|
19
|
+
template "#{view}.html.mustache.erb",
|
20
|
+
File.join("app/templates",
|
21
|
+
controller_file_path,
|
22
|
+
"#{view}.html.mustache")
|
23
|
+
end
|
24
|
+
template "_form.html.mustache.erb",
|
25
|
+
File.join("app/templates",
|
26
|
+
controller_file_path,
|
27
|
+
"_form.html.mustache")
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def available_views
|
33
|
+
%w(index edit show new)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class <%= plural_name.camelize %>::Edit < Mustache::Rails
|
2
|
+
|
3
|
+
<%# TODO: extract errors_display settings to to module methods -%>
|
4
|
+
def errors_display_div
|
5
|
+
return "" unless <%= singular_name %>.errors.any?
|
6
|
+
content_tag("div", :id=>"errorExplanation", :class=>"errorExplanation") do
|
7
|
+
content_tag("h2", error_header) + content_tag("ul") do
|
8
|
+
<%= singular_name %>.errors.full_messages.inject("") do |memo,msg|
|
9
|
+
memo += content_tag("li", msg)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def <%= singular_name %>_form_tag
|
16
|
+
form_tag(update_path, :class => "<%= singular_name %>_form", :method => :put, :id => "edit_<%= singular_name %>_#{<%= singular_name %>.id}_form")
|
17
|
+
end
|
18
|
+
|
19
|
+
<% for attribute in attributes -%>
|
20
|
+
def <%= attribute.name %>_label
|
21
|
+
label :<%= singular_name %>, :<%= attribute.name %>
|
22
|
+
end
|
23
|
+
<%# TODO: Different fields for different attribute types -%>
|
24
|
+
|
25
|
+
def <%= attribute.name %>_text_field
|
26
|
+
text_field(:<%= singular_name %>, :<%= attribute.name %>, :id => "<%= attribute.name %>_text_field")
|
27
|
+
end
|
28
|
+
|
29
|
+
<% end -%>
|
30
|
+
|
31
|
+
def form_submit
|
32
|
+
submit_tag "Update"
|
33
|
+
end
|
34
|
+
|
35
|
+
def show_path
|
36
|
+
<%= singular_name %>_path(<%= singular_name %>)
|
37
|
+
end
|
38
|
+
|
39
|
+
def index_path
|
40
|
+
<%= plural_name %>_path
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def update_path
|
46
|
+
<%= singular_name %>_path(<%= singular_name %>)
|
47
|
+
end
|
48
|
+
|
49
|
+
def error_header
|
50
|
+
"u r dong it rong"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<p>Listing <%= plural_name.capitalize %></p>
|
2
|
+
|
3
|
+
{{#listing}}
|
4
|
+
|
5
|
+
<p>
|
6
|
+
<% attributes.collect do |attribute| -%>
|
7
|
+
<b><%= attribute.human_name %></b>: {{<%= attribute.name %>}}
|
8
|
+
<% end.join(" | ") -%>
|
9
|
+
| <a href="{{show_path}}">Details</a></p>
|
10
|
+
|
11
|
+
{{/listing}}
|
12
|
+
|
13
|
+
<p><a href="{{new_path}}">New</a></p>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class <%= plural_name.camelize %>::Index < Mustache::Rails
|
2
|
+
|
3
|
+
def new_path
|
4
|
+
new_<%= singular_name %>_path()
|
5
|
+
end
|
6
|
+
|
7
|
+
def listing
|
8
|
+
<%= plural_name %>.collect do |record|
|
9
|
+
{
|
10
|
+
<% for attribute in attributes -%>
|
11
|
+
:<%= attribute.name %> => record.<%= attribute.name %>,
|
12
|
+
<% end -%>
|
13
|
+
:show_path => <%= singular_name %>_path(record)
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class <%= plural_name.camelize %>::New < Mustache::Rails
|
2
|
+
|
3
|
+
<%# TODO: extract errors_display settings to to module methods -%>
|
4
|
+
def errors_display_div
|
5
|
+
return "" unless <%= singular_name %>.errors.any?
|
6
|
+
content_tag("div", :id=>"errorExplanation", :class=>"errorExplanation") do
|
7
|
+
content_tag("h2", error_header) + content_tag("ul") do
|
8
|
+
<%= singular_name %>.errors.full_messages.inject("") do |memo,msg|
|
9
|
+
memo += content_tag("li", msg)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def <%= singular_name %>_form_tag
|
16
|
+
form_tag(create_path, :class => "<%= singular_name %>_form", :id => "edit_<%= singular_name %>_#{<%= singular_name %>.id}_form")
|
17
|
+
end
|
18
|
+
|
19
|
+
<% for attribute in attributes -%>
|
20
|
+
def <%= attribute.name %>_label
|
21
|
+
label :<%= singular_name %>, :<%= attribute.name %>
|
22
|
+
end
|
23
|
+
<%# TODO: Different fields for different attribute types -%>
|
24
|
+
|
25
|
+
def <%= attribute.name %>_text_field
|
26
|
+
text_field(:<%= singular_name %>, :<%= attribute.name %>, :id => "<%= attribute.name %>_text_field")
|
27
|
+
end
|
28
|
+
|
29
|
+
<% end -%>
|
30
|
+
|
31
|
+
def form_submit
|
32
|
+
submit_tag "Create"
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def index_path
|
37
|
+
<%= plural_name %>_path
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def create_path
|
43
|
+
<%= plural_name %>_path
|
44
|
+
end
|
45
|
+
|
46
|
+
def error_header
|
47
|
+
"u r dong it rong"
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class <%= plural_name.camelize %>::Show < Mustache::Rails
|
2
|
+
|
3
|
+
<% for attribute in attributes -%>
|
4
|
+
def <%= attribute.name %>
|
5
|
+
<%= singular_name %>.<%= attribute.name %>
|
6
|
+
end
|
7
|
+
|
8
|
+
<% end -%>
|
9
|
+
|
10
|
+
def edit_path
|
11
|
+
edit_<%= singular_name %>_path(@<%= singular_name %>)
|
12
|
+
end
|
13
|
+
|
14
|
+
def index_path
|
15
|
+
<%= plural_name %>_path
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class <%=
|
4
|
-
<% if actions.include?('index')
|
3
|
+
class <%= class_name %>ControllerTest < ActionController::TestCase
|
4
|
+
<% if actions.include?('index') -%>
|
5
5
|
|
6
6
|
context "index action" do
|
7
7
|
should "render index template" do
|
@@ -9,8 +9,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
9
9
|
assert_template 'index'
|
10
10
|
end
|
11
11
|
end
|
12
|
-
<% end
|
13
|
-
<% if actions.include?('show')
|
12
|
+
<% end -%>
|
13
|
+
<% if actions.include?('show') -%>
|
14
14
|
|
15
15
|
context "show action" do
|
16
16
|
should "render show template" do
|
@@ -18,8 +18,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
18
18
|
assert_template 'show'
|
19
19
|
end
|
20
20
|
end
|
21
|
-
<% end
|
22
|
-
<% if actions.include?('new')
|
21
|
+
<% end -%>
|
22
|
+
<% if actions.include?('new') -%>
|
23
23
|
|
24
24
|
context "new action" do
|
25
25
|
should "render new template" do
|
@@ -27,8 +27,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
27
27
|
assert_template 'new'
|
28
28
|
end
|
29
29
|
end
|
30
|
-
<% end
|
31
|
-
<% if actions.include?('create')
|
30
|
+
<% end -%>
|
31
|
+
<% if actions.include?('create') -%>
|
32
32
|
|
33
33
|
context "create action" do
|
34
34
|
should "render new template when model is invalid" do
|
@@ -43,8 +43,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
43
43
|
assert_redirected_to
|
44
44
|
end
|
45
45
|
end
|
46
|
-
<% end
|
47
|
-
<% if actions.include?('edit')
|
46
|
+
<% end -%>
|
47
|
+
<% if actions.include?('edit') -%>
|
48
48
|
|
49
49
|
context "edit action" do
|
50
50
|
should "render edit template" do
|
@@ -52,8 +52,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
52
52
|
assert_template 'edit'
|
53
53
|
end
|
54
54
|
end
|
55
|
-
<% end
|
56
|
-
<% if actions.include?('update')
|
55
|
+
<% end -%>
|
56
|
+
<% if actions.include?('update') -%>
|
57
57
|
|
58
58
|
context "update action" do
|
59
59
|
should "render edit template when model is invalid" do
|
@@ -68,8 +68,8 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
68
68
|
assert_redirected_to
|
69
69
|
end
|
70
70
|
end
|
71
|
-
<% end
|
72
|
-
<% if actions.include?('destroy')
|
71
|
+
<% end -%>
|
72
|
+
<% if actions.include?('destroy') -%>
|
73
73
|
|
74
74
|
context "destroy action" do
|
75
75
|
should "destroy model and redirect to index action" do
|
@@ -79,6 +79,6 @@ class <%= plural_name %>ControllerTest < ActionController::TestCase
|
|
79
79
|
assert !<%= class_name %>.exists?(<%= singular_name %>.id)
|
80
80
|
end
|
81
81
|
end
|
82
|
-
<% end
|
82
|
+
<% end -%>
|
83
83
|
|
84
84
|
end
|
data/lib/rails3-generators.rb
CHANGED
data/rails3-generators.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails3-generators}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.10.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jose Valim", "Anuj Dutta", "Paul Berry", "Jeff Tucker", "Louis T.", "Jai-Gouk Kim", "Darcy Laycock", "Peter Haza", "Peter Gumeson"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-07-02}
|
13
13
|
s.description = %q{Rails 3 compatible generators for DataMapper, Haml, Factory-girl, Authlogic, Mongomapper, Shoulda, Formtastic and SimpleForm}
|
14
14
|
s.email = %q{andre@arko.net}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -76,6 +76,24 @@ Gem::Specification.new do |s|
|
|
76
76
|
"lib/generators/mongomapper/model/model_generator.rb",
|
77
77
|
"lib/generators/mongomapper/model/templates/model.rb",
|
78
78
|
"lib/generators/mongomapper/observer/observer_generator.rb",
|
79
|
+
"lib/generators/mustache.rb",
|
80
|
+
"lib/generators/mustache/README.md",
|
81
|
+
"lib/generators/mustache/controller/controller_generator.rb",
|
82
|
+
"lib/generators/mustache/controller/templates/view.html.mustache.erb",
|
83
|
+
"lib/generators/mustache/controller/templates/view.rb.erb",
|
84
|
+
"lib/generators/mustache/install/install_generator.rb",
|
85
|
+
"lib/generators/mustache/install/templates/config/initializers/mustache.rb",
|
86
|
+
"lib/generators/mustache/install/templates/lib/mustache_rails.rb",
|
87
|
+
"lib/generators/mustache/scaffold/scaffold_generator.rb",
|
88
|
+
"lib/generators/mustache/scaffold/templates/_form.html.mustache.erb",
|
89
|
+
"lib/generators/mustache/scaffold/templates/edit.html.mustache.erb",
|
90
|
+
"lib/generators/mustache/scaffold/templates/edit.rb.erb",
|
91
|
+
"lib/generators/mustache/scaffold/templates/index.html.mustache.erb",
|
92
|
+
"lib/generators/mustache/scaffold/templates/index.rb.erb",
|
93
|
+
"lib/generators/mustache/scaffold/templates/new.html.mustache.erb",
|
94
|
+
"lib/generators/mustache/scaffold/templates/new.rb.erb",
|
95
|
+
"lib/generators/mustache/scaffold/templates/show.html.mustache.erb",
|
96
|
+
"lib/generators/mustache/scaffold/templates/show.rb.erb",
|
79
97
|
"lib/generators/shoulda.rb",
|
80
98
|
"lib/generators/shoulda/controller/controller_generator.rb",
|
81
99
|
"lib/generators/shoulda/controller/templates/controller.rb",
|
@@ -104,12 +122,15 @@ Gem::Specification.new do |s|
|
|
104
122
|
"test/lib/generators/machinist/model_generator_test.rb",
|
105
123
|
"test/lib/generators/mongomapper/model_generator_test.rb",
|
106
124
|
"test/lib/generators/mongomapper/observer_generator_test.rb",
|
125
|
+
"test/lib/generators/mustache/controller_generator_test.rb",
|
126
|
+
"test/lib/generators/mustache/scaffold_generator_test.rb",
|
127
|
+
"test/lib/generators/shoulda/controller_generator_test.rb",
|
107
128
|
"test/lib/generators/simple_form/scaffold_generators_test.rb",
|
108
129
|
"test/test_helper.rb"
|
109
130
|
]
|
110
131
|
s.homepage = %q{http://github.com/indirect/rails3-generators}
|
111
132
|
s.post_install_message = %q{
|
112
|
-
rails3-generators-0.
|
133
|
+
rails3-generators-0.10.0
|
113
134
|
|
114
135
|
Be sure to check out the wiki, http://wiki.github.com/indirect/rails3-generators/,
|
115
136
|
for information about recent changes to this project.
|
@@ -140,6 +161,9 @@ g.template_engine :erubis
|
|
140
161
|
"test/lib/generators/machinist/model_generator_test.rb",
|
141
162
|
"test/lib/generators/mongomapper/model_generator_test.rb",
|
142
163
|
"test/lib/generators/mongomapper/observer_generator_test.rb",
|
164
|
+
"test/lib/generators/mustache/controller_generator_test.rb",
|
165
|
+
"test/lib/generators/mustache/scaffold_generator_test.rb",
|
166
|
+
"test/lib/generators/shoulda/controller_generator_test.rb",
|
143
167
|
"test/lib/generators/simple_form/scaffold_generators_test.rb",
|
144
168
|
"test/test_helper.rb"
|
145
169
|
]
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Mustache::Generators::ControllerGeneratorTest < Rails::Generators::TestCase
|
4
|
+
destination File.join(Rails.root)
|
5
|
+
tests Rails::Generators::ControllerGenerator
|
6
|
+
arguments %w(Account foo bar --template-engine mustache)
|
7
|
+
|
8
|
+
setup :prepare_destination
|
9
|
+
setup :copy_routes
|
10
|
+
|
11
|
+
test "should generate mustache views" do
|
12
|
+
run_generator
|
13
|
+
assert_file "app/views/account/foo.rb"
|
14
|
+
assert_file "app/views/account/bar.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
test "should generate mustache views as classes with scoped names extending Mustache::Rails" do
|
18
|
+
run_generator
|
19
|
+
assert_file "app/views/account/foo.rb",
|
20
|
+
%r(class Account::Foo < Mustache::Rails)
|
21
|
+
assert_file "app/views/account/bar.rb",
|
22
|
+
%r(class Account::Bar < Mustache::Rails)
|
23
|
+
end
|
24
|
+
|
25
|
+
test "should generate mustache template files" do
|
26
|
+
run_generator
|
27
|
+
assert_file "app/templates/account/foo.html.mustache"
|
28
|
+
assert_file "app/templates/account/bar.html.mustache"
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Mustache::Generators::ScaffoldGeneratorTest < Rails::Generators::TestCase
|
4
|
+
destination File.join(Rails.root)
|
5
|
+
tests Rails::Generators::ScaffoldGenerator
|
6
|
+
arguments %w(product_line title:string price:integer --template-engine mustache)
|
7
|
+
|
8
|
+
setup :prepare_destination
|
9
|
+
setup :copy_routes
|
10
|
+
|
11
|
+
test "should generate mustache views for each action" do
|
12
|
+
run_generator
|
13
|
+
%w(index edit new show).each { |view| assert_file "app/views/product_lines/#{view}.rb" }
|
14
|
+
end
|
15
|
+
|
16
|
+
test "should generate a form partial mustache template" do
|
17
|
+
run_generator
|
18
|
+
assert_file "app/templates/product_lines/_form.html.mustache"
|
19
|
+
end
|
20
|
+
|
21
|
+
test "should generate mustache templates for each action" do
|
22
|
+
run_generator
|
23
|
+
%w(index edit new show).each { |view| assert_file "app/templates/product_lines/#{view}.html.mustache" }
|
24
|
+
end
|
25
|
+
|
26
|
+
### SHOW
|
27
|
+
|
28
|
+
test "should place methods for each attribute in the show view" do
|
29
|
+
run_generator
|
30
|
+
assert_file "app/views/product_lines/show.rb",
|
31
|
+
%r(def title)
|
32
|
+
assert_file "app/views/product_lines/show.rb",
|
33
|
+
%r(def price)
|
34
|
+
end
|
35
|
+
|
36
|
+
test "should place methods for edit path and index path in the show view" do
|
37
|
+
run_generator
|
38
|
+
assert_file "app/views/product_lines/show.rb",
|
39
|
+
%r(def edit_path)
|
40
|
+
assert_file "app/views/product_lines/show.rb",
|
41
|
+
%r(def index_path)
|
42
|
+
end
|
43
|
+
|
44
|
+
test "should place attribute tags in the mustache template for show action" do
|
45
|
+
run_generator
|
46
|
+
assert_file "app/templates/product_lines/show.html.mustache",
|
47
|
+
%r({{title}})
|
48
|
+
assert_file "app/templates/product_lines/show.html.mustache",
|
49
|
+
%r({{price}})
|
50
|
+
end
|
51
|
+
|
52
|
+
test "should place tags for edit path and index path in the mustache template for show action" do
|
53
|
+
run_generator
|
54
|
+
assert_file "app/templates/product_lines/show.html.mustache",
|
55
|
+
%r({{edit_path}})
|
56
|
+
assert_file "app/templates/product_lines/show.html.mustache",
|
57
|
+
%r({{index_path}})
|
58
|
+
end
|
59
|
+
|
60
|
+
### INDEX
|
61
|
+
|
62
|
+
test "should place methods for listing each item in the index view" do
|
63
|
+
run_generator
|
64
|
+
assert_file "app/views/product_lines/index.rb",
|
65
|
+
%r(def listing)
|
66
|
+
end
|
67
|
+
|
68
|
+
test "should place methods for new path in the index view" do
|
69
|
+
run_generator
|
70
|
+
assert_file "app/views/product_lines/index.rb",
|
71
|
+
%r(def new_path)
|
72
|
+
end
|
73
|
+
|
74
|
+
test "should place 'listing' loop tags in the mustache template for index action" do
|
75
|
+
run_generator
|
76
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
77
|
+
%r({{#listing}})
|
78
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
79
|
+
%r({{/listing}})
|
80
|
+
end
|
81
|
+
|
82
|
+
test "should place a tag for each attribute in the mustache template for index action" do
|
83
|
+
run_generator
|
84
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
85
|
+
%r({{title}})
|
86
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
87
|
+
%r({{price}})
|
88
|
+
end
|
89
|
+
|
90
|
+
test "should place a tag for the item's show link the mustache template for index action" do
|
91
|
+
run_generator
|
92
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
93
|
+
%r({{show_path}})
|
94
|
+
end
|
95
|
+
|
96
|
+
test "should place a tag for a new index link the mustache template for index action" do
|
97
|
+
run_generator
|
98
|
+
assert_file "app/templates/product_lines/index.html.mustache",
|
99
|
+
%r({{new_path}})
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
### FORM partial
|
104
|
+
|
105
|
+
test "should place attribute tags in the mustache template for form partial" do
|
106
|
+
run_generator
|
107
|
+
assert_file "app/templates/product_lines/_form.html.mustache",
|
108
|
+
%r({{title_label}})
|
109
|
+
assert_file "app/templates/product_lines/_form.html.mustache",
|
110
|
+
%r({{title_text_field}})
|
111
|
+
assert_file "app/templates/product_lines/_form.html.mustache",
|
112
|
+
%r({{price_text_field}})
|
113
|
+
assert_file "app/templates/product_lines/_form.html.mustache",
|
114
|
+
%r({{price_label}})
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
### NEW
|
119
|
+
|
120
|
+
test "should place a method that returns a form tag to create item" do
|
121
|
+
run_generator
|
122
|
+
assert_file "app/views/product_lines/new.rb",
|
123
|
+
%r(def product_line_form_tag\s*form_tag\(create_path,)
|
124
|
+
end
|
125
|
+
|
126
|
+
test "should place label and form input methods for each item attribute in the new view" do
|
127
|
+
run_generator
|
128
|
+
assert_file "app/views/product_lines/new.rb",
|
129
|
+
%r(def title_label)
|
130
|
+
assert_file "app/views/product_lines/new.rb",
|
131
|
+
%r(def title_text_field)
|
132
|
+
assert_file "app/views/product_lines/new.rb",
|
133
|
+
%r(def price_label)
|
134
|
+
assert_file "app/views/product_lines/new.rb",
|
135
|
+
%r(def price_text_field)
|
136
|
+
end
|
137
|
+
|
138
|
+
test "should place methods for create path and index path in the new view" do
|
139
|
+
run_generator
|
140
|
+
assert_file "app/views/product_lines/new.rb",
|
141
|
+
%r(def index_path)
|
142
|
+
assert_file "app/views/product_lines/new.rb",
|
143
|
+
%r(def create_path)
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
test "should place a new form tag in the mustache template for new action" do
|
148
|
+
run_generator
|
149
|
+
assert_file "app/templates/product_lines/new.html.mustache",
|
150
|
+
%r({{product_line_form_tag}})
|
151
|
+
end
|
152
|
+
|
153
|
+
test "should place tags for index path in the mustache template for new action" do
|
154
|
+
run_generator
|
155
|
+
assert_file "app/templates/product_lines/new.html.mustache",
|
156
|
+
%r({{index_path}})
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
### EDIT
|
161
|
+
|
162
|
+
test "should place a method that returns a form tag to update item in the edit view" do
|
163
|
+
run_generator
|
164
|
+
assert_file "app/views/product_lines/edit.rb",
|
165
|
+
%r(def product_line_form_tag\s*form_tag\(update_path,)
|
166
|
+
end
|
167
|
+
|
168
|
+
test "should place label and form input methods for each item attribute in the edit view" do
|
169
|
+
run_generator
|
170
|
+
assert_file "app/views/product_lines/edit.rb",
|
171
|
+
%r(def title_label)
|
172
|
+
assert_file "app/views/product_lines/edit.rb",
|
173
|
+
%r(def title_text_field)
|
174
|
+
assert_file "app/views/product_lines/edit.rb",
|
175
|
+
%r(def price_label)
|
176
|
+
assert_file "app/views/product_lines/edit.rb",
|
177
|
+
%r(def price_text_field)
|
178
|
+
end
|
179
|
+
|
180
|
+
test "should place methods for update path and show path in the edit view" do
|
181
|
+
run_generator
|
182
|
+
assert_file "app/views/product_lines/edit.rb",
|
183
|
+
%r(def show_path)
|
184
|
+
assert_file "app/views/product_lines/edit.rb",
|
185
|
+
%r(def update_path)
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
test "should place a form tag in the mustache template for edit action" do
|
190
|
+
run_generator
|
191
|
+
assert_file "app/templates/product_lines/edit.html.mustache",
|
192
|
+
%r({{product_line_form_tag}})
|
193
|
+
end
|
194
|
+
|
195
|
+
test "should place tags for show path in the mustache template for edit action" do
|
196
|
+
run_generator
|
197
|
+
assert_file "app/templates/product_lines/edit.html.mustache",
|
198
|
+
%r({{show_path}})
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Shoulda::Generators::ControllerGeneratorTest < Rails::Generators::TestCase
|
4
|
+
destination File.join(Rails.root)
|
5
|
+
tests Rails::Generators::ControllerGenerator
|
6
|
+
arguments %w(accounts index show new create edit update destroy --test-framework shoulda)
|
7
|
+
|
8
|
+
setup :prepare_destination
|
9
|
+
setup :copy_routes
|
10
|
+
|
11
|
+
test "should invoke test framework" do
|
12
|
+
run_generator
|
13
|
+
assert_file "test/functional/accounts_controller_test.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
test "should create test class" do
|
17
|
+
run_generator
|
18
|
+
assert_file "test/functional/accounts_controller_test.rb" do |controller_test|
|
19
|
+
assert_class "AccountsControllerTest", controller_test
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
test "should create controller action tests" do
|
24
|
+
run_generator
|
25
|
+
assert_file "test/functional/accounts_controller_test.rb" do |controller_test|
|
26
|
+
assert_class "AccountsControllerTest", controller_test do |klass|
|
27
|
+
assert_match /context "index action"/, klass
|
28
|
+
assert_match /context "show action"/, klass
|
29
|
+
assert_match /context "new action"/, klass
|
30
|
+
assert_match /context "create action"/, klass
|
31
|
+
assert_match /context "edit action"/, klass
|
32
|
+
assert_match /context "update action"/, klass
|
33
|
+
assert_match /context "destroy action"/, klass
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -29,9 +29,27 @@ def copy_routes
|
|
29
29
|
FileUtils.cp File.expand_path(routes), destination
|
30
30
|
end
|
31
31
|
|
32
|
+
# Asserts the given class exists in the given content. When a block is given,
|
33
|
+
# it yields the content of the class.
|
34
|
+
#
|
35
|
+
# assert_file "test/functional/accounts_controller_test.rb" do |controller_test|
|
36
|
+
# assert_class "AccountsControllerTest", controller_test do |klass|
|
37
|
+
# assert_match /context "index action"/, klass
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
def assert_class(klass, content)
|
42
|
+
assert content =~ /class #{klass}(\(.+\))?(.*?)\nend/m, "Expected to have class #{klass}"
|
43
|
+
yield $2.strip if block_given?
|
44
|
+
end
|
45
|
+
|
32
46
|
require 'rails/generators/rails/scaffold/scaffold_generator'
|
33
47
|
require 'rails/generators/rails/controller/controller_generator'
|
34
48
|
|
49
|
+
# require 'generators/mustache/install/install_generator'
|
50
|
+
require 'generators/mustache/scaffold/scaffold_generator'
|
51
|
+
require 'generators/mustache/controller/controller_generator'
|
52
|
+
|
35
53
|
require 'generators/haml/install/install_generator'
|
36
54
|
require 'generators/haml/scaffold/scaffold_generator'
|
37
55
|
require 'generators/haml/controller/controller_generator'
|
@@ -55,3 +73,4 @@ require 'generators/jquery/install/install_generator'
|
|
55
73
|
|
56
74
|
require 'generators/koala/install/install_generator'
|
57
75
|
|
76
|
+
require 'generators/shoulda/controller/controller_generator'
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 10
|
8
|
+
- 0
|
9
|
+
version: 0.10.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jose Valim
|
@@ -22,7 +22,7 @@ autorequire:
|
|
22
22
|
bindir: bin
|
23
23
|
cert_chain: []
|
24
24
|
|
25
|
-
date: 2010-
|
25
|
+
date: 2010-07-02 00:00:00 -04:00
|
26
26
|
default_executable:
|
27
27
|
dependencies: []
|
28
28
|
|
@@ -95,6 +95,24 @@ files:
|
|
95
95
|
- lib/generators/mongomapper/model/model_generator.rb
|
96
96
|
- lib/generators/mongomapper/model/templates/model.rb
|
97
97
|
- lib/generators/mongomapper/observer/observer_generator.rb
|
98
|
+
- lib/generators/mustache.rb
|
99
|
+
- lib/generators/mustache/README.md
|
100
|
+
- lib/generators/mustache/controller/controller_generator.rb
|
101
|
+
- lib/generators/mustache/controller/templates/view.html.mustache.erb
|
102
|
+
- lib/generators/mustache/controller/templates/view.rb.erb
|
103
|
+
- lib/generators/mustache/install/install_generator.rb
|
104
|
+
- lib/generators/mustache/install/templates/config/initializers/mustache.rb
|
105
|
+
- lib/generators/mustache/install/templates/lib/mustache_rails.rb
|
106
|
+
- lib/generators/mustache/scaffold/scaffold_generator.rb
|
107
|
+
- lib/generators/mustache/scaffold/templates/_form.html.mustache.erb
|
108
|
+
- lib/generators/mustache/scaffold/templates/edit.html.mustache.erb
|
109
|
+
- lib/generators/mustache/scaffold/templates/edit.rb.erb
|
110
|
+
- lib/generators/mustache/scaffold/templates/index.html.mustache.erb
|
111
|
+
- lib/generators/mustache/scaffold/templates/index.rb.erb
|
112
|
+
- lib/generators/mustache/scaffold/templates/new.html.mustache.erb
|
113
|
+
- lib/generators/mustache/scaffold/templates/new.rb.erb
|
114
|
+
- lib/generators/mustache/scaffold/templates/show.html.mustache.erb
|
115
|
+
- lib/generators/mustache/scaffold/templates/show.rb.erb
|
98
116
|
- lib/generators/shoulda.rb
|
99
117
|
- lib/generators/shoulda/controller/controller_generator.rb
|
100
118
|
- lib/generators/shoulda/controller/templates/controller.rb
|
@@ -123,6 +141,9 @@ files:
|
|
123
141
|
- test/lib/generators/machinist/model_generator_test.rb
|
124
142
|
- test/lib/generators/mongomapper/model_generator_test.rb
|
125
143
|
- test/lib/generators/mongomapper/observer_generator_test.rb
|
144
|
+
- test/lib/generators/mustache/controller_generator_test.rb
|
145
|
+
- test/lib/generators/mustache/scaffold_generator_test.rb
|
146
|
+
- test/lib/generators/shoulda/controller_generator_test.rb
|
126
147
|
- test/lib/generators/simple_form/scaffold_generators_test.rb
|
127
148
|
- test/test_helper.rb
|
128
149
|
has_rdoc: true
|
@@ -130,7 +151,7 @@ homepage: http://github.com/indirect/rails3-generators
|
|
130
151
|
licenses: []
|
131
152
|
|
132
153
|
post_install_message: "\n\
|
133
|
-
rails3-generators-0.
|
154
|
+
rails3-generators-0.10.0\n\n\
|
134
155
|
Be sure to check out the wiki, http://wiki.github.com/indirect/rails3-generators/,\n\
|
135
156
|
for information about recent changes to this project.\n\n\
|
136
157
|
note: if you use erb templates add the follow to your generators block to take full advantage of this gem.\n\
|
@@ -180,5 +201,8 @@ test_files:
|
|
180
201
|
- test/lib/generators/machinist/model_generator_test.rb
|
181
202
|
- test/lib/generators/mongomapper/model_generator_test.rb
|
182
203
|
- test/lib/generators/mongomapper/observer_generator_test.rb
|
204
|
+
- test/lib/generators/mustache/controller_generator_test.rb
|
205
|
+
- test/lib/generators/mustache/scaffold_generator_test.rb
|
206
|
+
- test/lib/generators/shoulda/controller_generator_test.rb
|
183
207
|
- test/lib/generators/simple_form/scaffold_generators_test.rb
|
184
208
|
- test/test_helper.rb
|