lazy-head-gen 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,155 @@
1
+ module Padrino
2
+ module Generators
3
+
4
+ class Scaffold < Thor::Group
5
+ # register with Padrino
6
+ Padrino::Generators.add_generator(:scaffold, self)
7
+
8
+ # Define the source template root
9
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
10
+ # Defines the banner for this CLI generator
11
+ def self.banner; "padrino-gen scaffold [name]"; end
12
+
13
+ # Include related modules
14
+ include Thor::Actions
15
+ include Padrino::Generators
16
+ include Padrino::Generators::Actions
17
+ include Padrino::Generators::Runner
18
+ include Padrino::Generators::Components::Actions
19
+
20
+ desc "Description:\n\n\tlazy-head-gen scaffold generates a new Padrino scaffold"
21
+
22
+ argument :name, :desc => "The name of your scaffold resource"
23
+
24
+ argument :properties, :desc => "The properties of the scaffold's model", :type => :array, :default => []
25
+
26
+ class_option :root, :aliases => '-r', :default => ".", :type => :string,
27
+ :desc => "The root destination"
28
+
29
+ class_option :app_path, :aliases => '-a', :default => "/app", :type => :string,
30
+ :desc => "The application destination path"
31
+
32
+ class_option :model_path, :aliases => '-m', :default => ".", :type => :string,
33
+ :desc => "The model destination path"
34
+
35
+ class_option :create_full_actions, :aliases => '-c', :default => false, :type => :boolean,
36
+ :desc => "Specify whether to generate basic (index and show) or full (index, show, new, create, edit, update and delete) actions"
37
+
38
+ class_option :skip_migration, :aliases => "-s", :default => false, :type => :boolean,
39
+ :desc => "Specify whether to skip generating a migration"
40
+
41
+ require_arguments!
42
+
43
+ def create_scaffold
44
+ self.destination_root = options[:root]
45
+
46
+ if in_app_root?
47
+ app = options[:app_path]
48
+ check_app_existence(app)
49
+ @app_name = fetch_app_name(app)
50
+
51
+ say "Generating a Padrino scaffold for '#{name}' in app '#{@app_name}'", :green
52
+
53
+ # Set variables
54
+ @pluralized = name.to_s.underscore.pluralize
55
+ @singular = name.to_s.underscore.singularize
56
+ @controller = @pluralized.camelize
57
+ @model = @singular.camelize
58
+ @properties = properties
59
+ @create_full = options[:create_full_actions]
60
+
61
+ # Create model
62
+ if invalids = invalid_fields(@properties)
63
+ say "Invalid property name:", :red
64
+ say " #{invalids.join(", ")}"
65
+ raise SystemExit
66
+ end
67
+
68
+ unless include_component_module_for(:orm)
69
+ say "You need an ORM adapter to create this scaffold's model", :red
70
+ return
71
+ end
72
+
73
+ # TODO: if model path does not equal "." should we check app exists?
74
+ # model_path = options[:model_path]
75
+ model_path = "."
76
+
77
+ template "templates/model.rb.tt", destination_root(model_path, "models", "#{@singular}.rb")
78
+ template "templates/model_test.rb.tt", destination_root("test", model_path, "models", "#{@singular}_test.rb")
79
+
80
+ # Create controller
81
+ template "templates/controller.rb.tt", destination_root(app, "controllers", "#{@pluralized}.rb")
82
+ template "templates/controller_test.rb.tt", destination_root("test", app, "controllers", "#{@pluralized}_controller_test.rb")
83
+ template "templates/helper.rb.tt", destination_root(app, "helpers", "#{@pluralized}_helper.rb")
84
+
85
+ # Create views
86
+ views = ["index", "show"]
87
+ if @create_full
88
+ views << "new" << "edit"
89
+ end
90
+
91
+ views.each do |view|
92
+ @view = view
93
+ template "templates/view.erb.tt", destination_root(app, "views", "#{@pluralized}", "#{@view}.erb")
94
+ end
95
+
96
+ # Create a migration unless skipped
97
+ create_model_migration("create_#{@pluralized}", name, properties) unless options[:skip_migration]
98
+
99
+ # Check if blueprints file exists and copy into place if not
100
+ if !File.exist?(destination_root("test", "blueprints.rb"))
101
+ template "templates/blueprints.rb.tt", destination_root("test", "blueprints.rb")
102
+ end
103
+
104
+ # Insert into text_config.rb require blueprints.rb
105
+ require_string = "\nrequire File.expand_path(File.dirname(__FILE__) + \"/blueprints.rb\")"
106
+ test_config_contents = File.read(destination_root("test", "test_config.rb"))
107
+ insert_into_file destination_root("test", "test_config.rb"), require_string, :after => "require File.expand_path('../../config/boot', __FILE__)"
108
+
109
+ # Check if a blueprint for the model has already been created as
110
+ # we don't want to wipe out an existing one
111
+ blueprints_contents = File.read(destination_root("test", "blueprints.rb"))
112
+
113
+ if !blueprints_contents.match("#{@model}.blueprint do")
114
+ # build a string of properties to insert into the blueprint entry
115
+ props = ""
116
+ @properties.each do |property|
117
+ values = property.split(":")
118
+ faker = ""
119
+ case values.last
120
+ when "boolean"
121
+ faker += "true"
122
+ when "datetime"
123
+ faker += "DateTime.now"
124
+ when "integer"
125
+ faker += "1 + rand(100)"
126
+ else
127
+ faker += "Faker::Lorem.sentence"
128
+ end
129
+ props += "\t#{values.first} { #{faker} }"
130
+ props += "\n" unless property == @properties.last
131
+ end
132
+
133
+ # Format the blueprint entry
134
+ model_blueprint = <<-MODEL
135
+ #{@model}.blueprint do
136
+ #{props}
137
+ end
138
+
139
+ MODEL
140
+
141
+ # Insert into blueprints.rb
142
+ insert_into_file destination_root("test", "blueprints.rb"), model_blueprint, :before => "# END blueprints"
143
+ else
144
+ say "Blueprints entry already exists for '#{@singular}'", :yellow
145
+ end
146
+
147
+ say "Scaffold generation for '#{name}' in app '#{app}' completed", :green
148
+ else
149
+ say "You are not at the root of a Padrino application! (config/boot.rb not found)", :red
150
+ end
151
+ end
152
+
153
+ end # Scaffold
154
+ end # Generators
155
+ end # Padrino
@@ -0,0 +1,197 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
2
+
3
+ describe "Admin::<%= @controller if @controller %>Controller" do
4
+
5
+ # START NOT LOGGED IN
6
+ describe "when not logged in" do
7
+
8
+ # START GET index
9
+ describe "GET index" do
10
+ before do
11
+ get "/admin/<%= @pluralized %>"
12
+ end
13
+
14
+ it "should not display the <%= @pluralized %> index page" do
15
+ assert_not_logged_in
16
+ end
17
+ end
18
+ # END GET index
19
+
20
+ # START GET new
21
+ describe "GET new" do
22
+ before do
23
+ get "/admin/<%= @pluralized %>/new"
24
+ end
25
+
26
+ it "should not display the <%= @pluralized %> new page" do
27
+ assert_not_logged_in
28
+ end
29
+ end
30
+ # END GET new
31
+
32
+ # START POST create
33
+ describe "Post create" do
34
+ before do
35
+ post "/admin/<%= @pluralized %>/create", :<%= @singular %> => <%= @model %>.plan
36
+ end
37
+
38
+ it "should not return the created text" do
39
+ assert_not_logged_in
40
+ end
41
+ end
42
+ # END POST create
43
+
44
+ # START GET edit
45
+ describe "GET edit" do
46
+ before do
47
+ @<%= @singular %> = <%= @model %>.make
48
+ get "/admin/<%= @pluralized %>/edit/#{@<%= @singular %>.to_param}"
49
+ end
50
+
51
+ it "should not display the <%= @pluralized %> edit page" do
52
+ assert_not_logged_in
53
+ end
54
+ end
55
+ # END GET edit
56
+
57
+ # START PUT update
58
+ describe "PUT update" do
59
+ before do
60
+ @<%= @singular %> = <%= @model %>.make
61
+ put "/admin/<%= @pluralized %>/update/#{@<%= @singular %>.to_param}", :<%= @singular %> => <%= @model %>.plan
62
+ end
63
+
64
+ it "should not return the updated text" do
65
+ assert_not_logged_in
66
+ end
67
+ end
68
+ # END PUT update
69
+
70
+ # START DELETE destroy
71
+ describe "on DELETE destroy" do
72
+ before do
73
+ @<%= @singular %> = <%= @model %>.make
74
+ get "/admin/<%= @pluralized %>/destroy/#{@<%= @singular %>.to_param}"
75
+ end
76
+
77
+ it "should not return the destroyed text" do
78
+ assert_destroy_not_logged_in
79
+ end
80
+ end
81
+ # END DELETE destroy
82
+
83
+ end
84
+ # END NOT LOGGED IN
85
+
86
+ # START LOGGED IN
87
+ describe "when logged in" do
88
+
89
+ before do
90
+ @account = Factory.make_admin
91
+ login_as_admin(@account)
92
+ end
93
+
94
+ # START GET index
95
+ describe "GET index" do
96
+ before do
97
+ get "/admin/<%= @pluralized %>"
98
+ end
99
+
100
+ it "should display the <%= @pluralized %> index page" do
101
+ assert_logged_in
102
+ assert_equal "/admin/<%= @pluralized %>", path
103
+ end
104
+ end
105
+ # END GET index
106
+
107
+ # START GET new
108
+ describe "GET new" do
109
+ before do
110
+ get "/admin/<%= @pluralized %>/new"
111
+ end
112
+
113
+ it "should display the <%= @pluralized %> new page" do
114
+ assert_logged_in
115
+ assert_equal "/admin/<%= @pluralized %>/new", path
116
+ end
117
+ end
118
+ # END GET new
119
+
120
+ # START POST create
121
+ describe "POST create" do
122
+ before do
123
+ @<%= @singular %>_count = <%= @model %>.count
124
+ post "/admin/<%= @pluralized %>/create", :<%= @singular %> => <%= @model %>.plan
125
+ end
126
+
127
+ it "should create a <%= @singular %>" do
128
+ assert_equal 302, status
129
+ assert location.include?("/admin/<%= @pluralized %>/edit/")
130
+ assert_equal @<%= @singular %>_count + 1, <%= @model %>.count
131
+ end
132
+ end
133
+ # END POST create
134
+
135
+ # START GET edit
136
+ describe "GET edit" do
137
+ before do
138
+ @<%= @singular %> = <%= @model %>.make
139
+ get "/admin/<%= @pluralized %>/edit/#{@<%= @singular %>.to_param}"
140
+ end
141
+
142
+ it "should display the <%= @pluralized %> edit page" do
143
+ assert_logged_in
144
+ assert_equal "/admin/<%= @pluralized %>/edit/#{@<%= @singular %>.to_param}", path
145
+ end
146
+ end
147
+ # END GET edit
148
+
149
+ # START PUT update
150
+ describe "PUT update" do
151
+ before do
152
+ @<%= @singular %> = <%= @model %>.make
153
+ @<%= @singular %>_count = <%= @model %>.count
154
+ @<%= @singular %>_hash = <%= @model %>.plan
155
+
156
+ key_and_value = get_key_and_value(@product)
157
+ if key_and_value[0] and key_and_value[1]
158
+ @key = key_and_value[0]
159
+ @value = key_and_value[1]
160
+ @<%= @singular %>_hash = <%= @model %>.plan(@key => @value)
161
+ end
162
+
163
+ put "/admin/<%= @pluralized %>/update/#{@<%= @singular %>.to_param}", :<%= @singular %> => @<%= @singular %>_hash
164
+
165
+ @updated_<%= @singular %> = <%= @model %>.find(@<%= @singular %>.to_param)
166
+ end
167
+
168
+ it "should update a <%= @singular %>" do
169
+ assert_equal status, 302
170
+ assert location.include?("/admin/<%= @pluralized %>/edit/#{@<%= @singular %>.to_param}")
171
+ assert_equal @updated_<%= @singular %>.id, @<%= @singular %>.id
172
+ assert_equal @<%= @singular %>_count, <%= @model %>.count
173
+ # Only assert if the <%= @singular %> has a key other than id or timestamps
174
+ assert_equal @updated_<%= @singular %>.attributes[@key], @value if @key and @value
175
+ end
176
+ end
177
+ # END PUT update
178
+
179
+ # START DELETE destroy
180
+ describe "DELETE destroy" do
181
+ before do
182
+ @<%= @singular %> = <%= @model %>.make
183
+ @<%= @singular %>_count = <%= @model %>.count
184
+ delete "/admin/<%= @pluralized %>/destroy/#{@<%= @singular %>.to_param}"
185
+ end
186
+
187
+ it "should destroy a <%= @singular %>" do
188
+ assert_equal 302, status
189
+ assert_equal @<%= @singular %>_count - 1, <%= @model %>.count
190
+ end
191
+ end
192
+ # END DELETE destroy
193
+
194
+ end
195
+ # END LOGGED IN
196
+
197
+ end
@@ -0,0 +1,32 @@
1
+ require 'machinist/active_record'
2
+ require 'faker'
3
+
4
+ # START blueprints
5
+
6
+ Account.blueprint do
7
+ name { Faker::Name.first_name }
8
+ surname { Faker::Name.last_name }
9
+ email { Faker::Internet.email }
10
+ password { "password" }
11
+ password_confirmation { "password" }
12
+ role { "admin" }
13
+ end
14
+
15
+
16
+ # END blueprints
17
+
18
+ # A factory which we can use to build objects which are a bit more complex or
19
+ # which require special setup which can't be done by Machinist without a bit of
20
+ # help.
21
+ #
22
+ module Factory
23
+ class << self
24
+
25
+ def make_admin
26
+ account = Account.make(:admin)
27
+ account.save!
28
+ account
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ <%= @app_name %>.controllers <%= ":#{@pluralized}" if @pluralized %> do
2
+
3
+ get :index do
4
+ render "<%= @pluralized if @pluralized %>/index"
5
+ end
6
+
7
+ get :show, :with => :id do
8
+ render "<%= @pluralized if @pluralized %>/show"
9
+ end
10
+
11
+ <% if @create_full -%>
12
+ get :new do
13
+ render "<%= @pluralized if @pluralized %>/new"
14
+ end
15
+
16
+ post :create do
17
+ "This is the create action"
18
+ end
19
+
20
+ get :edit, :with => :id do
21
+ render "<%= @pluralized if @pluralized %>/edit"
22
+ end
23
+
24
+ put :update, :with => :id do
25
+ "This is the update action"
26
+ end
27
+
28
+ delete :destroy, :with => :id do
29
+
30
+ end
31
+
32
+ <% end -%>
33
+ end
@@ -0,0 +1,95 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
2
+
3
+ describe "<%= @controller if @controller %>Controller" do
4
+
5
+ # START GET index
6
+ describe "GET index" do
7
+ before do
8
+ get "/<%= @pluralized %>"
9
+ end
10
+
11
+ it "should display the <%= @pluralized %> index page" do
12
+ assert_match "This is the index page", body
13
+ end
14
+ end
15
+ # END GET index
16
+
17
+ # START GET show
18
+ describe "GET show" do
19
+ before do
20
+ @<%= @singular %> = <%= @model %>.make
21
+ get "/<%= @pluralized %>/show/#{@<%= @singular %>.to_param}"
22
+ end
23
+
24
+ it "should display the <%= @pluralized %> show page" do
25
+ assert_match "This is the show page", body
26
+ end
27
+ end
28
+ # END GET show
29
+
30
+ <% if @create_full -%>
31
+ # START GET new
32
+ describe "GET new" do
33
+ before do
34
+ get "/<%= @pluralized %>/new"
35
+ end
36
+
37
+ it "should display the <%= @pluralized %> new page" do
38
+ assert_match "This is the new page", body
39
+ end
40
+ end
41
+ # END GET new
42
+
43
+ # START POST create
44
+ describe "Post create" do
45
+ before do
46
+ post "/<%= @pluralized %>/create", {}
47
+ end
48
+
49
+ it "should return the create text" do
50
+ assert_match "This is the create action", last_response.body
51
+ end
52
+ end
53
+ # END POST create
54
+
55
+ # START GET edit
56
+ describe "GET edit" do
57
+ before do
58
+ @<%= @singular %> = <%= @model %>.make
59
+ get "/<%= @pluralized %>/edit/#{@<%= @singular %>.to_param}"
60
+ end
61
+
62
+ it "should display the <%= @pluralized %> edit page" do
63
+ assert_match "This is the edit page", body
64
+ end
65
+ end
66
+ # END GET edit
67
+
68
+ # START PUT update
69
+ describe "PUT update" do
70
+ before do
71
+ @<%= @singular %> = <%= @singular %>.make
72
+ put "/<%= @pluralized %>/update/#{@<%= @singular %>.to_param}", {}
73
+ end
74
+
75
+ it "should return the update text" do
76
+ assert_match "This is the update action", body
77
+ end
78
+ end
79
+ # END PUT update
80
+
81
+ # START DELETE destroy
82
+ describe "on DELETE destroy" do
83
+ before do
84
+ @<%= @singular %> = <%= @singular %>.make
85
+ get "/<%= @pluralized %>/destroy/#{@<%= @singular %>.to_param}"
86
+ end
87
+
88
+ it "should return a status of 405" do
89
+ assert_equal 405, status
90
+ end
91
+ end
92
+ # END DELETE destroy
93
+
94
+ <% end -%>
95
+ end