corntrace-nifty-generators 0.4.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.
Files changed (193) hide show
  1. data/CHANGELOG +128 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +104 -0
  4. data/Rakefile +18 -0
  5. data/features/nifty_authentication.feature +59 -0
  6. data/features/nifty_config.feature +17 -0
  7. data/features/nifty_layout.feature +19 -0
  8. data/features/nifty_scaffold.feature +22 -0
  9. data/features/step_definitions/common_steps.rb +37 -0
  10. data/features/step_definitions/rails_setup_steps.rb +6 -0
  11. data/features/support/env.rb +6 -0
  12. data/features/support/matchers.rb +7 -0
  13. data/lib/generators/nifty/authentication/USAGE +50 -0
  14. data/lib/generators/nifty/authentication/authentication_generator.rb +145 -0
  15. data/lib/generators/nifty/authentication/templates/authentication.rb +60 -0
  16. data/lib/generators/nifty/authentication/templates/authlogic_session.rb +2 -0
  17. data/lib/generators/nifty/authentication/templates/fixtures.yml +24 -0
  18. data/lib/generators/nifty/authentication/templates/migration.rb +20 -0
  19. data/lib/generators/nifty/authentication/templates/sessions_controller.rb +45 -0
  20. data/lib/generators/nifty/authentication/templates/sessions_helper.rb +2 -0
  21. data/lib/generators/nifty/authentication/templates/tests/rspec/sessions_controller.rb +39 -0
  22. data/lib/generators/nifty/authentication/templates/tests/rspec/user.rb +83 -0
  23. data/lib/generators/nifty/authentication/templates/tests/rspec/users_controller.rb +26 -0
  24. data/lib/generators/nifty/authentication/templates/tests/shoulda/sessions_controller.rb +40 -0
  25. data/lib/generators/nifty/authentication/templates/tests/shoulda/user.rb +85 -0
  26. data/lib/generators/nifty/authentication/templates/tests/shoulda/users_controller.rb +27 -0
  27. data/lib/generators/nifty/authentication/templates/tests/testunit/sessions_controller.rb +36 -0
  28. data/lib/generators/nifty/authentication/templates/tests/testunit/user.rb +88 -0
  29. data/lib/generators/nifty/authentication/templates/tests/testunit/users_controller.rb +23 -0
  30. data/lib/generators/nifty/authentication/templates/user.rb +42 -0
  31. data/lib/generators/nifty/authentication/templates/users_controller.rb +18 -0
  32. data/lib/generators/nifty/authentication/templates/users_helper.rb +2 -0
  33. data/lib/generators/nifty/authentication/templates/views/erb/login.html.erb +30 -0
  34. data/lib/generators/nifty/authentication/templates/views/erb/signup.html.erb +24 -0
  35. data/lib/generators/nifty/authentication/templates/views/haml/login.html.haml +30 -0
  36. data/lib/generators/nifty/authentication/templates/views/haml/signup.html.haml +24 -0
  37. data/lib/generators/nifty/config/USAGE +23 -0
  38. data/lib/generators/nifty/config/config_generator.rb +24 -0
  39. data/lib/generators/nifty/config/templates/config.yml +8 -0
  40. data/lib/generators/nifty/config/templates/load_config.rb +2 -0
  41. data/lib/generators/nifty/layout/USAGE +25 -0
  42. data/lib/generators/nifty/layout/layout_generator.rb +29 -0
  43. data/lib/generators/nifty/layout/templates/error_messages_helper.rb +23 -0
  44. data/lib/generators/nifty/layout/templates/layout.html.erb +19 -0
  45. data/lib/generators/nifty/layout/templates/layout.html.haml +21 -0
  46. data/lib/generators/nifty/layout/templates/layout_helper.rb +22 -0
  47. data/lib/generators/nifty/layout/templates/stylesheet.css +75 -0
  48. data/lib/generators/nifty/layout/templates/stylesheet.sass +66 -0
  49. data/lib/generators/nifty/scaffold/USAGE +51 -0
  50. data/lib/generators/nifty/scaffold/scaffold_generator.rb +241 -0
  51. data/lib/generators/nifty/scaffold/templates/actions/create.rb +9 -0
  52. data/lib/generators/nifty/scaffold/templates/actions/destroy.rb +6 -0
  53. data/lib/generators/nifty/scaffold/templates/actions/edit.rb +3 -0
  54. data/lib/generators/nifty/scaffold/templates/actions/index.rb +3 -0
  55. data/lib/generators/nifty/scaffold/templates/actions/new.rb +3 -0
  56. data/lib/generators/nifty/scaffold/templates/actions/show.rb +3 -0
  57. data/lib/generators/nifty/scaffold/templates/actions/update.rb +9 -0
  58. data/lib/generators/nifty/scaffold/templates/controller.rb +3 -0
  59. data/lib/generators/nifty/scaffold/templates/fixtures.yml +9 -0
  60. data/lib/generators/nifty/scaffold/templates/helper.rb +2 -0
  61. data/lib/generators/nifty/scaffold/templates/migration.rb +16 -0
  62. data/lib/generators/nifty/scaffold/templates/model.rb +3 -0
  63. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/create.rb +11 -0
  64. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/destroy.rb +6 -0
  65. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/edit.rb +4 -0
  66. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/index.rb +4 -0
  67. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/new.rb +4 -0
  68. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/show.rb +4 -0
  69. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/update.rb +11 -0
  70. data/lib/generators/nifty/scaffold/templates/tests/rspec/controller.rb +8 -0
  71. data/lib/generators/nifty/scaffold/templates/tests/rspec/model.rb +7 -0
  72. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/create.rb +13 -0
  73. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/destroy.rb +8 -0
  74. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/edit.rb +6 -0
  75. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/index.rb +6 -0
  76. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/new.rb +6 -0
  77. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/show.rb +6 -0
  78. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/update.rb +13 -0
  79. data/lib/generators/nifty/scaffold/templates/tests/shoulda/controller.rb +5 -0
  80. data/lib/generators/nifty/scaffold/templates/tests/shoulda/model.rb +7 -0
  81. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/create.rb +11 -0
  82. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/destroy.rb +6 -0
  83. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/edit.rb +4 -0
  84. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/index.rb +4 -0
  85. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/new.rb +4 -0
  86. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/show.rb +4 -0
  87. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/update.rb +11 -0
  88. data/lib/generators/nifty/scaffold/templates/tests/testunit/controller.rb +5 -0
  89. data/lib/generators/nifty/scaffold/templates/tests/testunit/model.rb +7 -0
  90. data/lib/generators/nifty/scaffold/templates/views/erb/_form.html.erb +10 -0
  91. data/lib/generators/nifty/scaffold/templates/views/erb/edit.html.erb +14 -0
  92. data/lib/generators/nifty/scaffold/templates/views/erb/index.html.erb +29 -0
  93. data/lib/generators/nifty/scaffold/templates/views/erb/new.html.erb +7 -0
  94. data/lib/generators/nifty/scaffold/templates/views/erb/show.html.erb +20 -0
  95. data/lib/generators/nifty/scaffold/templates/views/haml/_form.html.haml +10 -0
  96. data/lib/generators/nifty/scaffold/templates/views/haml/edit.html.haml +14 -0
  97. data/lib/generators/nifty/scaffold/templates/views/haml/index.html.haml +25 -0
  98. data/lib/generators/nifty/scaffold/templates/views/haml/new.html.haml +7 -0
  99. data/lib/generators/nifty/scaffold/templates/views/haml/show.html.haml +20 -0
  100. data/lib/generators/nifty.rb +15 -0
  101. data/rails_generators/nifty_authentication/USAGE +50 -0
  102. data/rails_generators/nifty_authentication/lib/insert_commands.rb +74 -0
  103. data/rails_generators/nifty_authentication/nifty_authentication_generator.rb +128 -0
  104. data/rails_generators/nifty_authentication/templates/authentication.rb +61 -0
  105. data/rails_generators/nifty_authentication/templates/authlogic_session.rb +2 -0
  106. data/rails_generators/nifty_authentication/templates/fixtures.yml +24 -0
  107. data/rails_generators/nifty_authentication/templates/migration.rb +20 -0
  108. data/rails_generators/nifty_authentication/templates/sessions_controller.rb +45 -0
  109. data/rails_generators/nifty_authentication/templates/sessions_helper.rb +2 -0
  110. data/rails_generators/nifty_authentication/templates/tests/rspec/sessions_controller.rb +39 -0
  111. data/rails_generators/nifty_authentication/templates/tests/rspec/user.rb +83 -0
  112. data/rails_generators/nifty_authentication/templates/tests/rspec/users_controller.rb +26 -0
  113. data/rails_generators/nifty_authentication/templates/tests/shoulda/sessions_controller.rb +40 -0
  114. data/rails_generators/nifty_authentication/templates/tests/shoulda/user.rb +85 -0
  115. data/rails_generators/nifty_authentication/templates/tests/shoulda/users_controller.rb +27 -0
  116. data/rails_generators/nifty_authentication/templates/tests/testunit/sessions_controller.rb +36 -0
  117. data/rails_generators/nifty_authentication/templates/tests/testunit/user.rb +88 -0
  118. data/rails_generators/nifty_authentication/templates/tests/testunit/users_controller.rb +23 -0
  119. data/rails_generators/nifty_authentication/templates/user.rb +42 -0
  120. data/rails_generators/nifty_authentication/templates/users_controller.rb +18 -0
  121. data/rails_generators/nifty_authentication/templates/users_helper.rb +2 -0
  122. data/rails_generators/nifty_authentication/templates/views/erb/login.html.erb +30 -0
  123. data/rails_generators/nifty_authentication/templates/views/erb/signup.html.erb +24 -0
  124. data/rails_generators/nifty_authentication/templates/views/haml/login.html.haml +30 -0
  125. data/rails_generators/nifty_authentication/templates/views/haml/signup.html.haml +24 -0
  126. data/rails_generators/nifty_config/USAGE +23 -0
  127. data/rails_generators/nifty_config/nifty_config_generator.rb +32 -0
  128. data/rails_generators/nifty_config/templates/config.yml +8 -0
  129. data/rails_generators/nifty_config/templates/load_config.rb +2 -0
  130. data/rails_generators/nifty_layout/USAGE +25 -0
  131. data/rails_generators/nifty_layout/nifty_layout_generator.rb +44 -0
  132. data/rails_generators/nifty_layout/templates/helper.rb +22 -0
  133. data/rails_generators/nifty_layout/templates/layout.html.erb +22 -0
  134. data/rails_generators/nifty_layout/templates/layout.html.haml +19 -0
  135. data/rails_generators/nifty_layout/templates/stylesheet.css +81 -0
  136. data/rails_generators/nifty_layout/templates/stylesheet.sass +67 -0
  137. data/rails_generators/nifty_scaffold/USAGE +51 -0
  138. data/rails_generators/nifty_scaffold/nifty_scaffold_generator.rb +232 -0
  139. data/rails_generators/nifty_scaffold/templates/actions/create.rb +9 -0
  140. data/rails_generators/nifty_scaffold/templates/actions/destroy.rb +6 -0
  141. data/rails_generators/nifty_scaffold/templates/actions/edit.rb +3 -0
  142. data/rails_generators/nifty_scaffold/templates/actions/index.rb +3 -0
  143. data/rails_generators/nifty_scaffold/templates/actions/new.rb +3 -0
  144. data/rails_generators/nifty_scaffold/templates/actions/show.rb +3 -0
  145. data/rails_generators/nifty_scaffold/templates/actions/update.rb +9 -0
  146. data/rails_generators/nifty_scaffold/templates/controller.rb +3 -0
  147. data/rails_generators/nifty_scaffold/templates/fixtures.yml +9 -0
  148. data/rails_generators/nifty_scaffold/templates/helper.rb +2 -0
  149. data/rails_generators/nifty_scaffold/templates/migration.rb +16 -0
  150. data/rails_generators/nifty_scaffold/templates/model.rb +3 -0
  151. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/create.rb +11 -0
  152. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/destroy.rb +6 -0
  153. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/edit.rb +4 -0
  154. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/index.rb +4 -0
  155. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/new.rb +4 -0
  156. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/show.rb +4 -0
  157. data/rails_generators/nifty_scaffold/templates/tests/rspec/actions/update.rb +11 -0
  158. data/rails_generators/nifty_scaffold/templates/tests/rspec/controller.rb +8 -0
  159. data/rails_generators/nifty_scaffold/templates/tests/rspec/model.rb +7 -0
  160. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/create.rb +13 -0
  161. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/destroy.rb +8 -0
  162. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/edit.rb +6 -0
  163. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/index.rb +6 -0
  164. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/new.rb +6 -0
  165. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/show.rb +6 -0
  166. data/rails_generators/nifty_scaffold/templates/tests/shoulda/actions/update.rb +13 -0
  167. data/rails_generators/nifty_scaffold/templates/tests/shoulda/controller.rb +5 -0
  168. data/rails_generators/nifty_scaffold/templates/tests/shoulda/model.rb +7 -0
  169. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/create.rb +11 -0
  170. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/destroy.rb +6 -0
  171. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/edit.rb +4 -0
  172. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/index.rb +4 -0
  173. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/new.rb +4 -0
  174. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/show.rb +4 -0
  175. data/rails_generators/nifty_scaffold/templates/tests/testunit/actions/update.rb +11 -0
  176. data/rails_generators/nifty_scaffold/templates/tests/testunit/controller.rb +5 -0
  177. data/rails_generators/nifty_scaffold/templates/tests/testunit/model.rb +7 -0
  178. data/rails_generators/nifty_scaffold/templates/views/erb/_form.html.erb +10 -0
  179. data/rails_generators/nifty_scaffold/templates/views/erb/edit.html.erb +14 -0
  180. data/rails_generators/nifty_scaffold/templates/views/erb/index.html.erb +29 -0
  181. data/rails_generators/nifty_scaffold/templates/views/erb/new.html.erb +7 -0
  182. data/rails_generators/nifty_scaffold/templates/views/erb/show.html.erb +20 -0
  183. data/rails_generators/nifty_scaffold/templates/views/haml/_form.html.haml +10 -0
  184. data/rails_generators/nifty_scaffold/templates/views/haml/edit.html.haml +14 -0
  185. data/rails_generators/nifty_scaffold/templates/views/haml/index.html.haml +25 -0
  186. data/rails_generators/nifty_scaffold/templates/views/haml/new.html.haml +7 -0
  187. data/rails_generators/nifty_scaffold/templates/views/haml/show.html.haml +20 -0
  188. data/test/test_helper.rb +119 -0
  189. data/test/test_nifty_authentication_generator.rb +274 -0
  190. data/test/test_nifty_config_generator.rb +37 -0
  191. data/test/test_nifty_layout_generator.rb +42 -0
  192. data/test/test_nifty_scaffold_generator.rb +534 -0
  193. metadata +255 -0
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe <%= user_plural_class_name %>Controller do
4
+ fixtures :all
5
+ integrate_views
6
+
7
+ it "new action should render new template" do
8
+ get :new
9
+ response.should render_template(:new)
10
+ end
11
+
12
+ it "create action should render new template when model is invalid" do
13
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(false)
14
+ post :create
15
+ response.should render_template(:new)
16
+ end
17
+
18
+ it "create action should redirect when model is valid" do
19
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(true)
20
+ post :create
21
+ response.should redirect_to(root_url)
22
+ <%- unless options[:authlogic] -%>
23
+ session['<%= user_singular_name %>_id'].should == assigns['<%= user_singular_name %>'].id
24
+ <%- end -%>
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class <%= session_plural_class_name %>ControllerTest < ActionController::TestCase
4
+ context "new action" do
5
+ should "render new template" do
6
+ get :new
7
+ assert_template 'new'
8
+ end
9
+ end
10
+
11
+ context "create action" do
12
+ <%- if options[:authlogic] -%>
13
+ should "render new template when authentication is invalid" do
14
+ post :create, :<%= session_singular_name %> => { :username => "foo", :password => "badpassword" }
15
+ assert_template 'new'
16
+ assert_nil <%= session_class_name %>.find
17
+ end
18
+
19
+ should "redirect when authentication is valid" do
20
+ post :create, :<%= session_singular_name %> => { :username => "foo", :password => "secret" }
21
+ assert_redirected_to root_url
22
+ assert_equal <%= user_plural_name %>(:foo), <%= session_class_name %>.find.<%= user_singular_name %>
23
+ end
24
+ <%- else -%>
25
+ should "render new template when authentication is invalid" do
26
+ <%= user_class_name %>.stubs(:authenticate).returns(nil)
27
+ post :create
28
+ assert_template 'new'
29
+ assert_nil session['<%= user_singular_name %>_id']
30
+ end
31
+
32
+ should "redirect when authentication is valid" do
33
+ <%= user_class_name %>.stubs(:authenticate).returns(<%= user_class_name %>.first)
34
+ post :create
35
+ assert_redirected_to root_url
36
+ assert_equal <%= user_class_name %>.first.id, session['<%= user_singular_name %>_id']
37
+ end
38
+ <%- end -%>
39
+ end
40
+ end
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+
3
+ class <%= user_class_name %>Test < ActiveSupport::TestCase
4
+ <%- unless options[:authlogic] -%>
5
+ def new_<%= user_singular_name %>(attributes = {})
6
+ attributes[:username] ||= 'foo'
7
+ attributes[:email] ||= 'foo@example.com'
8
+ attributes[:password] ||= 'abc123'
9
+ attributes[:password_confirmation] ||= attributes[:password]
10
+ <%= user_singular_name %> = <%= user_class_name %>.new(attributes)
11
+ <%= user_singular_name %>.valid? # run validations
12
+ <%= user_singular_name %>
13
+ end
14
+
15
+ def setup
16
+ <%= user_class_name %>.delete_all
17
+ end
18
+
19
+ should "be valid" do
20
+ assert new_<%= user_singular_name %>.valid?
21
+ end
22
+
23
+ should "require username" do
24
+ assert new_<%= user_singular_name %>(:username => '').errors.on(:username)
25
+ end
26
+
27
+ should "require password" do
28
+ assert new_<%= user_singular_name %>(:password => '').errors.on(:password)
29
+ end
30
+
31
+ should "require well formed email" do
32
+ assert new_<%= user_singular_name %>(:email => 'foo@bar@example.com').errors.on(:email)
33
+ end
34
+
35
+ should "validate uniqueness of email" do
36
+ new_<%= user_singular_name %>(:email => 'bar@example.com').save!
37
+ assert new_<%= user_singular_name %>(:email => 'bar@example.com').errors.on(:email)
38
+ end
39
+
40
+ should "validate uniqueness of username" do
41
+ new_<%= user_singular_name %>(:username => 'uniquename').save!
42
+ assert new_<%= user_singular_name %>(:username => 'uniquename').errors.on(:username)
43
+ end
44
+
45
+ should "not allow odd characters in username" do
46
+ assert new_<%= user_singular_name %>(:username => 'odd ^&(@)').errors.on(:username)
47
+ end
48
+
49
+ should "validate password is longer than 3 characters" do
50
+ assert new_<%= user_singular_name %>(:password => 'bad').errors.on(:password)
51
+ end
52
+
53
+ should "require matching password confirmation" do
54
+ assert new_<%= user_singular_name %>(:password_confirmation => 'nonmatching').errors.on(:password)
55
+ end
56
+
57
+ should "generate password hash and salt on create" do
58
+ <%= user_singular_name %> = new_<%= user_singular_name %>
59
+ <%= user_singular_name %>.save!
60
+ assert <%= user_singular_name %>.password_hash
61
+ assert <%= user_singular_name %>.password_salt
62
+ end
63
+
64
+ should "authenticate by username" do
65
+ <%= user_singular_name %> = new_<%= user_singular_name %>(:username => 'foobar', :password => 'secret')
66
+ <%= user_singular_name %>.save!
67
+ assert_equal <%= user_singular_name %>, <%= user_class_name %>.authenticate('foobar', 'secret')
68
+ end
69
+
70
+ should "authenticate by email" do
71
+ <%= user_singular_name %> = new_<%= user_singular_name %>(:email => 'foo@bar.com', :password => 'secret')
72
+ <%= user_singular_name %>.save!
73
+ assert_equal <%= user_singular_name %>, <%= user_class_name %>.authenticate('foo@bar.com', 'secret')
74
+ end
75
+
76
+ should "not authenticate bad username" do
77
+ assert_nil <%= user_class_name %>.authenticate('nonexisting', 'secret')
78
+ end
79
+
80
+ should "not authenticate bad password" do
81
+ new_<%= user_singular_name %>(:username => 'foobar', :password => 'secret').save!
82
+ assert_nil <%= user_class_name %>.authenticate('foobar', 'badpassword')
83
+ end
84
+ <%- end -%>
85
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class <%= user_plural_class_name %>ControllerTest < ActionController::TestCase
4
+ context "new action" do
5
+ should "render new template" do
6
+ get :new
7
+ assert_template 'new'
8
+ end
9
+ end
10
+
11
+ context "create action" do
12
+ should "render new template when model is invalid" do
13
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(false)
14
+ post :create
15
+ assert_template 'new'
16
+ end
17
+
18
+ should "redirect when model is valid" do
19
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(true)
20
+ post :create
21
+ assert_redirected_to root_url
22
+ <%- unless options[:authlogic] -%>
23
+ assert_equal assigns['<%= user_singular_name %>'].id, session['<%= user_singular_name %>_id']
24
+ <%- end -%>
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ class <%= session_plural_class_name %>ControllerTest < ActionController::TestCase
4
+ def test_new
5
+ get :new
6
+ assert_template 'new'
7
+ end
8
+
9
+ <%- if options[:authlogic] -%>
10
+ def test_create_invalid
11
+ post :create, :<%= session_singular_name %> => { :username => "foo", :password => "badpassword" }
12
+ assert_template 'new'
13
+ assert_nil <%= session_class_name %>.find
14
+ end
15
+
16
+ def test_create_valid
17
+ post :create, :<%= session_singular_name %> => { :username => "foo", :password => "secret" }
18
+ assert_redirected_to root_url
19
+ assert_equal <%= user_plural_name %>(:foo), <%= session_class_name %>.find.<%= user_singular_name %>
20
+ end
21
+ <%- else -%>
22
+ def test_create_invalid
23
+ <%= user_class_name %>.stubs(:authenticate).returns(nil)
24
+ post :create
25
+ assert_template 'new'
26
+ assert_nil session['<%= user_singular_name %>_id']
27
+ end
28
+
29
+ def test_create_valid
30
+ <%= user_class_name %>.stubs(:authenticate).returns(<%= user_class_name %>.first)
31
+ post :create
32
+ assert_redirected_to root_url
33
+ assert_equal <%= user_class_name %>.first.id, session['<%= user_singular_name %>_id']
34
+ end
35
+ <%- end -%>
36
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ class <%= user_class_name %>Test < ActiveSupport::TestCase
4
+ <%- unless options[:authlogic] -%>
5
+ def new_<%= user_singular_name %>(attributes = {})
6
+ attributes[:username] ||= 'foo'
7
+ attributes[:email] ||= 'foo@example.com'
8
+ attributes[:password] ||= 'abc123'
9
+ attributes[:password_confirmation] ||= attributes[:password]
10
+ <%= user_singular_name %> = <%= user_class_name %>.new(attributes)
11
+ <%= user_singular_name %>.valid? # run validations
12
+ <%= user_singular_name %>
13
+ end
14
+
15
+ def setup
16
+ <%= user_class_name %>.delete_all
17
+ end
18
+
19
+ def test_valid
20
+ assert new_<%= user_singular_name %>.valid?
21
+ end
22
+
23
+ def test_require_username
24
+ assert new_<%= user_singular_name %>(:username => '').errors.on(:username)
25
+ end
26
+
27
+ def test_require_password
28
+ assert new_<%= user_singular_name %>(:password => '').errors.on(:password)
29
+ end
30
+
31
+ def test_require_well_formed_email
32
+ assert new_<%= user_singular_name %>(:email => 'foo@bar@example.com').errors.on(:email)
33
+ end
34
+
35
+ def test_validate_uniqueness_of_email
36
+ new_<%= user_singular_name %>(:email => 'bar@example.com').save!
37
+ assert new_<%= user_singular_name %>(:email => 'bar@example.com').errors.on(:email)
38
+ end
39
+
40
+ def test_validate_uniqueness_of_username
41
+ new_<%= user_singular_name %>(:username => 'uniquename').save!
42
+ assert new_<%= user_singular_name %>(:username => 'uniquename').errors.on(:username)
43
+ end
44
+
45
+ def test_validate_odd_characters_in_username
46
+ assert new_<%= user_singular_name %>(:username => 'odd ^&(@)').errors.on(:username)
47
+ end
48
+
49
+ def test_validate_password_length
50
+ assert new_<%= user_singular_name %>(:password => 'bad').errors.on(:password)
51
+ end
52
+
53
+ def test_require_matching_password_confirmation
54
+ assert new_<%= user_singular_name %>(:password_confirmation => 'nonmatching').errors.on(:password)
55
+ end
56
+
57
+ def test_generate_password_hash_and_salt_on_create
58
+ <%= user_singular_name %> = new_<%= user_singular_name %>
59
+ <%= user_singular_name %>.save!
60
+ assert <%= user_singular_name %>.password_hash
61
+ assert <%= user_singular_name %>.password_salt
62
+ end
63
+
64
+ def test_authenticate_by_username
65
+ <%= user_class_name %>.delete_all
66
+ <%= user_singular_name %> = new_<%= user_singular_name %>(:username => 'foobar', :password => 'secret')
67
+ <%= user_singular_name %>.save!
68
+ assert_equal <%= user_singular_name %>, <%= user_class_name %>.authenticate('foobar', 'secret')
69
+ end
70
+
71
+ def test_authenticate_by_email
72
+ <%= user_class_name %>.delete_all
73
+ <%= user_singular_name %> = new_<%= user_singular_name %>(:email => 'foo@bar.com', :password => 'secret')
74
+ <%= user_singular_name %>.save!
75
+ assert_equal <%= user_singular_name %>, <%= user_class_name %>.authenticate('foo@bar.com', 'secret')
76
+ end
77
+
78
+ def test_authenticate_bad_username
79
+ assert_nil <%= user_class_name %>.authenticate('nonexisting', 'secret')
80
+ end
81
+
82
+ def test_authenticate_bad_password
83
+ <%= user_class_name %>.delete_all
84
+ new_<%= user_singular_name %>(:username => 'foobar', :password => 'secret').save!
85
+ assert_nil <%= user_class_name %>.authenticate('foobar', 'badpassword')
86
+ end
87
+ <%- end -%>
88
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class <%= user_plural_class_name %>ControllerTest < ActionController::TestCase
4
+ def test_new
5
+ get :new
6
+ assert_template 'new'
7
+ end
8
+
9
+ def test_create_invalid
10
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(false)
11
+ post :create
12
+ assert_template 'new'
13
+ end
14
+
15
+ def test_create_valid
16
+ <%= user_class_name %>.any_instance.stubs(:valid?).returns(true)
17
+ post :create
18
+ assert_redirected_to root_url
19
+ <%- unless options[:authlogic] -%>
20
+ assert_equal assigns['<%= user_singular_name %>'].id, session['<%= user_singular_name %>_id']
21
+ <%- end -%>
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ class <%= user_class_name %> < ActiveRecord::Base
2
+ <%- if options[:authlogic] -%>
3
+ acts_as_authentic
4
+ <%- else -%>
5
+ # new columns need to be added here to be writable through mass assignment
6
+ attr_accessible :username, :email, :password, :password_confirmation
7
+
8
+ attr_accessor :password
9
+ before_save :prepare_password
10
+
11
+ validates_presence_of :username
12
+ validates_uniqueness_of :username, :email, :allow_blank => true
13
+ validates_format_of :username, :with => /^[-\w\._@]+$/i, :allow_blank => true, :message => "should only contain letters, numbers, or .-_@"
14
+ validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
15
+ validates_presence_of :password, :on => :create
16
+ validates_confirmation_of :password
17
+ validates_length_of :password, :minimum => 4, :allow_blank => true
18
+
19
+ # login can be either username or email address
20
+ def self.authenticate(login, pass)
21
+ <%= user_singular_name %> = find_by_username(login) || find_by_email(login)
22
+ return <%= user_singular_name %> if <%= user_singular_name %> && <%= user_singular_name %>.matching_password?(pass)
23
+ end
24
+
25
+ def matching_password?(pass)
26
+ self.password_hash == encrypt_password(pass)
27
+ end
28
+
29
+ private
30
+
31
+ def prepare_password
32
+ unless password.blank?
33
+ self.password_salt = Digest::SHA1.hexdigest([Time.now, rand].join)
34
+ self.password_hash = encrypt_password(password)
35
+ end
36
+ end
37
+
38
+ def encrypt_password(pass)
39
+ Digest::SHA1.hexdigest([pass, password_salt].join)
40
+ end
41
+ <%- end -%>
42
+ end
@@ -0,0 +1,18 @@
1
+ class <%= user_plural_class_name %>Controller < ApplicationController
2
+ def new
3
+ @<%= user_singular_name %> = <%= user_class_name %>.new
4
+ end
5
+
6
+ def create
7
+ @<%= user_singular_name %> = <%= user_class_name %>.new(params[:<%= user_singular_name %>])
8
+ if @<%= user_singular_name %>.save
9
+ <%- unless options[:authlogic] -%>
10
+ session[:<%= user_singular_name %>_id] = @<%= user_singular_name %>.id
11
+ <%- end -%>
12
+ flash[:notice] = "Thank you for signing up! You are now logged in."
13
+ redirect_to root_url
14
+ else
15
+ render :action => 'new'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,2 @@
1
+ module <%= user_plural_class_name %>Helper
2
+ end
@@ -0,0 +1,30 @@
1
+ <%% title "Log in" %>
2
+
3
+ <p>Don't have an account? <%%= link_to "Sign up!", signup_path %></p>
4
+
5
+ <%- if options[:authlogic] -%>
6
+ <%% form_for @<%= session_singular_name %> do |f| %>
7
+ <%%= f.error_messages %>
8
+ <p>
9
+ <%%= f.label :username %><br />
10
+ <%%= f.text_field :username %>
11
+ </p>
12
+ <p>
13
+ <%%= f.label :password %><br />
14
+ <%%= f.password_field :password %>
15
+ </p>
16
+ <p><%%= f.submit "Log in" %></p>
17
+ <%% end %>
18
+ <%- else -%>
19
+ <%% form_tag <%= session_plural_name %>_path do %>
20
+ <p>
21
+ <%%= label_tag :login, "Username or Email Address" %><br />
22
+ <%%= text_field_tag :login, params[:login] %>
23
+ </p>
24
+ <p>
25
+ <%%= label_tag :password %><br />
26
+ <%%= password_field_tag :password %>
27
+ </p>
28
+ <p><%%= submit_tag "Log in" %></p>
29
+ <%% end %>
30
+ <%- end -%>
@@ -0,0 +1,24 @@
1
+ <%% title "Sign up" %>
2
+
3
+ <p>Already have an account? <%%= link_to "Log in", login_path %>.</p>
4
+
5
+ <%% form_for @<%= user_singular_name %> do |f| %>
6
+ <%%= f.error_messages %>
7
+ <p>
8
+ <%%= f.label :username %><br />
9
+ <%%= f.text_field :username %>
10
+ </p>
11
+ <p>
12
+ <%%= f.label :email, "Email Address" %><br />
13
+ <%%= f.text_field :email %>
14
+ </p>
15
+ <p>
16
+ <%%= f.label :password %><br />
17
+ <%%= f.password_field :password %>
18
+ </p>
19
+ <p>
20
+ <%%= f.label :password_confirmation, "Confirm Password" %><br />
21
+ <%%= f.password_field :password_confirmation %>
22
+ </p>
23
+ <p><%%= f.submit "Sign up" %></p>
24
+ <%% end %>
@@ -0,0 +1,30 @@
1
+ - title "Log in"
2
+
3
+ %p== Don't have an account? #{link_to "Sign up!", signup_path}
4
+
5
+ <%- if options[:authlogic] -%>
6
+ - form_for @<%= session_singular_name %> do |f|
7
+ = f.error_messages
8
+ %p
9
+ = f.label :username
10
+ %br
11
+ = f.text_field :username
12
+ %p
13
+ = f.label :password
14
+ %br
15
+ = f.password_field :password
16
+ %p
17
+ = f.submit "Log in"
18
+ <%- else -%>
19
+ - form_tag <%= session_plural_name %>_path do
20
+ %p
21
+ = label_tag :login, "Username or Email Address"
22
+ %br
23
+ = text_field_tag :login, params[:login]
24
+ %p
25
+ = label_tag :password
26
+ %br
27
+ = password_field_tag :password
28
+ %p
29
+ = submit_tag "Log in"
30
+ <%- end -%>
@@ -0,0 +1,24 @@
1
+ - title "Sign up"
2
+
3
+ %p== Already have an account? #{link_to "Log in", login_path}.
4
+
5
+ - form_for @<%= user_singular_name %> do |f|
6
+ = f.error_messages
7
+ %p
8
+ = f.label :username
9
+ %br
10
+ = f.text_field :username
11
+ %p
12
+ = f.label :email, "Email Address"
13
+ %br
14
+ = f.text_field :email
15
+ %p
16
+ = f.label :password
17
+ %br
18
+ = f.password_field :password
19
+ %p
20
+ = f.label :password_confirmation, "Confirm Password"
21
+ %br
22
+ = f.password_field :password_confirmation
23
+ %p
24
+ = f.submit "Sign up"
@@ -0,0 +1,23 @@
1
+ Description:
2
+ The nifty_config generator creates YAML file in your config
3
+ directory and an initializer to load this config. The config has a
4
+ separate section for each environment. This is a great place to put
5
+ any config settings you don't want in your app.
6
+
7
+ The config is loaded into a constant called APP_CONFIG by default,
8
+ this changes depending on the name you choose to pass the generator.
9
+ Use this constant to access the config settings like this.
10
+
11
+ APP_CONFIG[:some_setting]
12
+
13
+
14
+ Examples:
15
+ script/generate nifty_config
16
+
17
+ Config: config/app_config.yml
18
+ Initializer: config/initializers/load_app_config.rb
19
+
20
+ script/generate nifty_config passwords
21
+
22
+ Config: config/passwords_config.yml
23
+ Initializer: config/initializers/load_passwords_config.rb
@@ -0,0 +1,32 @@
1
+ class NiftyConfigGenerator < Rails::Generator::Base
2
+ def initialize(runtime_args, runtime_options = {})
3
+ super
4
+ @name = @args.first || 'app'
5
+ end
6
+
7
+ def manifest
8
+ record do |m|
9
+ m.directory 'config/initializers'
10
+
11
+ m.template "load_config.rb", "config/initializers/load_#{file_name}_config.rb"
12
+ m.file "config.yml", "config/#{file_name}_config.yml"
13
+ end
14
+ end
15
+
16
+ def file_name
17
+ @name.underscore
18
+ end
19
+
20
+ def constant_name
21
+ @name.underscore.upcase
22
+ end
23
+
24
+ protected
25
+ def banner
26
+ <<-EOS
27
+ Creates config and loader files.
28
+
29
+ USAGE: #{$0} #{spec.name} [config_name]
30
+ EOS
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ development:
2
+ domain: localhost:3000
3
+
4
+ test:
5
+ domain: test.host
6
+
7
+ production:
8
+ domain: example.com
@@ -0,0 +1,2 @@
1
+ raw_config = File.read(RAILS_ROOT + "/config/<%= file_name %>_config.yml")
2
+ <%= constant_name %>_CONFIG = YAML.load(raw_config)[RAILS_ENV].symbolize_keys
@@ -0,0 +1,25 @@
1
+ Description:
2
+ The nifty_layout generator creates a basic layout, stylesheet and
3
+ helper which will give some structure to a starting Rails app.
4
+
5
+ The generator takes one argument which will be the name of the
6
+ layout and stylesheet files. If no argument is passed then it defaults
7
+ to "application".
8
+
9
+ The helper module includes some methods which can be called in any
10
+ template or partial to set variables to be used in the layout, such as
11
+ page title and javascript/stylesheet includes.
12
+
13
+ Examples:
14
+ script/generate nifty_layout
15
+
16
+ Layout: app/views/layouts/application.html.erb
17
+ Stylesheet: public/stylesheets/application.css
18
+ Helper: app/helpers/layout_helper.rb
19
+
20
+
21
+ script/generate nifty_layout admin
22
+
23
+ Layout: app/views/layouts/admin.html.erb
24
+ Stylesheet: public/stylesheets/admin.css
25
+ Helper: app/helpers/layout_helper.rb
@@ -0,0 +1,44 @@
1
+ class NiftyLayoutGenerator < Rails::Generator::Base
2
+ def initialize(runtime_args, runtime_options = {})
3
+ super
4
+ @name = @args.first || 'application'
5
+ end
6
+
7
+ def manifest
8
+ record do |m|
9
+ m.directory 'app/views/layouts'
10
+ m.directory 'public/stylesheets'
11
+ m.directory 'app/helpers'
12
+
13
+ if options[:haml]
14
+ m.directory 'public/stylesheets/sass'
15
+ m.template "layout.html.haml", "app/views/layouts/#{file_name}.html.haml"
16
+ m.file "stylesheet.sass", "public/stylesheets/sass/#{file_name}.sass"
17
+ else
18
+ m.template "layout.html.erb", "app/views/layouts/#{file_name}.html.erb"
19
+ m.file "stylesheet.css", "public/stylesheets/#{file_name}.css"
20
+ end
21
+ m.file "helper.rb", "app/helpers/layout_helper.rb"
22
+ end
23
+ end
24
+
25
+ def file_name
26
+ @name.underscore
27
+ end
28
+
29
+ protected
30
+
31
+ def add_options!(opt)
32
+ opt.separator ''
33
+ opt.separator 'Options:'
34
+ opt.on("--haml", "Generate HAML for view, and SASS for stylesheet.") { |v| options[:haml] = v }
35
+ end
36
+
37
+ def banner
38
+ <<-EOS
39
+ Creates generic layout, stylesheet, and helper files.
40
+
41
+ USAGE: #{$0} #{spec.name} [layout_name]
42
+ EOS
43
+ end
44
+ end
@@ -0,0 +1,22 @@
1
+ # These helper methods can be called in your template to set variables to be used in the layout
2
+ # This module should be included in all views globally,
3
+ # to do so you may need to add this line to your ApplicationController
4
+ # helper :layout
5
+ module LayoutHelper
6
+ def title(page_title, show_title = true)
7
+ @content_for_title = page_title.to_s
8
+ @show_title = show_title
9
+ end
10
+
11
+ def show_title?
12
+ @show_title
13
+ end
14
+
15
+ def stylesheet(*args)
16
+ content_for(:head) { stylesheet_link_tag(*args) }
17
+ end
18
+
19
+ def javascript(*args)
20
+ content_for(:head) { javascript_include_tag(*args) }
21
+ end
22
+ end