rails3-generators 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|