somatics3-generators 0.0.2

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 (181) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +60 -0
  6. data/VERSION +1 -0
  7. data/bin/somatics +21 -0
  8. data/bin/somatify +21 -0
  9. data/lib/generators/somatics/authenticated/authenticated_generator.rb +220 -0
  10. data/lib/generators/somatics/authenticated/templates/mailer.rb +25 -0
  11. data/lib/generators/somatics/authenticated/templates/migration.rb +26 -0
  12. data/lib/generators/somatics/authenticated/templates/model.rb +83 -0
  13. data/lib/generators/somatics/authenticated/templates/observer.rb +11 -0
  14. data/lib/generators/somatics/authenticated/templates/test/mailer_test.rb +31 -0
  15. data/lib/generators/somatics/authenticated/templates/test/model_functional_test.rb +93 -0
  16. data/lib/generators/somatics/authenticated/templates/test/sessions_functional_test.rb +82 -0
  17. data/lib/generators/somatics/authenticated/templates/test/unit_test.rb +164 -0
  18. data/lib/generators/somatics/authenticated/templates/test/users.yml +60 -0
  19. data/lib/generators/somatics/authenticated_controller/authenticated_controller_generator.rb +323 -0
  20. data/lib/generators/somatics/authenticated_controller/templates/_model_partial.html.erb +8 -0
  21. data/lib/generators/somatics/authenticated_controller/templates/activation.erb +3 -0
  22. data/lib/generators/somatics/authenticated_controller/templates/authenticated_system.rb +189 -0
  23. data/lib/generators/somatics/authenticated_controller/templates/authenticated_test_helper.rb +10 -0
  24. data/lib/generators/somatics/authenticated_controller/templates/config/initializers/site_keys.rb +38 -0
  25. data/lib/generators/somatics/authenticated_controller/templates/controller.rb +55 -0
  26. data/lib/generators/somatics/authenticated_controller/templates/helper.rb +91 -0
  27. data/lib/generators/somatics/authenticated_controller/templates/login.html.erb +29 -0
  28. data/lib/generators/somatics/authenticated_controller/templates/mailer.rb +25 -0
  29. data/lib/generators/somatics/authenticated_controller/templates/migration.rb +26 -0
  30. data/lib/generators/somatics/authenticated_controller/templates/model.rb +83 -0
  31. data/lib/generators/somatics/authenticated_controller/templates/observer.rb +11 -0
  32. data/lib/generators/somatics/authenticated_controller/templates/session_helper.rb +2 -0
  33. data/lib/generators/somatics/authenticated_controller/templates/sessions_controller.rb +43 -0
  34. data/lib/generators/somatics/authenticated_controller/templates/signup.html.erb +19 -0
  35. data/lib/generators/somatics/authenticated_controller/templates/signup_notification.erb +8 -0
  36. data/lib/generators/somatics/authenticated_controller/templates/test/mailer_test.rb +31 -0
  37. data/lib/generators/somatics/authenticated_controller/templates/test/model_functional_test.rb +93 -0
  38. data/lib/generators/somatics/authenticated_controller/templates/test/sessions_functional_test.rb +82 -0
  39. data/lib/generators/somatics/authenticated_controller/templates/test/unit_test.rb +164 -0
  40. data/lib/generators/somatics/authenticated_controller/templates/test/users.yml +60 -0
  41. data/lib/generators/somatics/helper/helper_generator.rb +16 -0
  42. data/lib/generators/somatics/install/install_generator.rb +65 -0
  43. data/lib/generators/somatics/install/templates/config/locales/somatics_en.yml +33 -0
  44. data/lib/generators/somatics/install/templates/config/locales/somatics_zh-TW.yml +33 -0
  45. data/lib/generators/somatics/install/templates/controller_admin.rb +16 -0
  46. data/lib/generators/somatics/install/templates/controller_home.rb +4 -0
  47. data/lib/generators/somatics/install/templates/helper_admin.rb +68 -0
  48. data/lib/generators/somatics/install/templates/layout_admin.html.erb +88 -0
  49. data/lib/generators/somatics/install/templates/lib/somatic_link_renderer.rb +42 -0
  50. data/lib/generators/somatics/install/templates/partial_menu.html.erb +1 -0
  51. data/lib/generators/somatics/install/templates/public/images/somatics/add.png +0 -0
  52. data/lib/generators/somatics/install/templates/public/images/somatics/arrow_collapsed.png +0 -0
  53. data/lib/generators/somatics/install/templates/public/images/somatics/arrow_expanded.png +0 -0
  54. data/lib/generators/somatics/install/templates/public/images/somatics/attachment.png +0 -0
  55. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_left.png +0 -0
  56. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_arrow_right.png +0 -0
  57. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_diamond.png +0 -0
  58. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_end.png +0 -0
  59. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_go.png +0 -0
  60. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_minus.png +0 -0
  61. data/lib/generators/somatics/install/templates/public/images/somatics/bullet_toggle_plus.png +0 -0
  62. data/lib/generators/somatics/install/templates/public/images/somatics/c.png +0 -0
  63. data/lib/generators/somatics/install/templates/public/images/somatics/cancel.png +0 -0
  64. data/lib/generators/somatics/install/templates/public/images/somatics/changeset.png +0 -0
  65. data/lib/generators/somatics/install/templates/public/images/somatics/comment.png +0 -0
  66. data/lib/generators/somatics/install/templates/public/images/somatics/comments.png +0 -0
  67. data/lib/generators/somatics/install/templates/public/images/somatics/content-left.png +0 -0
  68. data/lib/generators/somatics/install/templates/public/images/somatics/content-right.png +0 -0
  69. data/lib/generators/somatics/install/templates/public/images/somatics/copy.png +0 -0
  70. data/lib/generators/somatics/install/templates/public/images/somatics/csharp.png +0 -0
  71. data/lib/generators/somatics/install/templates/public/images/somatics/database_key.png +0 -0
  72. data/lib/generators/somatics/install/templates/public/images/somatics/default.png +0 -0
  73. data/lib/generators/somatics/install/templates/public/images/somatics/delete.png +0 -0
  74. data/lib/generators/somatics/install/templates/public/images/somatics/document.png +0 -0
  75. data/lib/generators/somatics/install/templates/public/images/somatics/draft.png +0 -0
  76. data/lib/generators/somatics/install/templates/public/images/somatics/duplicate.png +0 -0
  77. data/lib/generators/somatics/install/templates/public/images/somatics/edit.png +0 -0
  78. data/lib/generators/somatics/install/templates/public/images/somatics/exclamation.png +0 -0
  79. data/lib/generators/somatics/install/templates/public/images/somatics/external.png +0 -0
  80. data/lib/generators/somatics/install/templates/public/images/somatics/fav.png +0 -0
  81. data/lib/generators/somatics/install/templates/public/images/somatics/fav_off.png +0 -0
  82. data/lib/generators/somatics/install/templates/public/images/somatics/feed.png +0 -0
  83. data/lib/generators/somatics/install/templates/public/images/somatics/folder.png +0 -0
  84. data/lib/generators/somatics/install/templates/public/images/somatics/folder_open.png +0 -0
  85. data/lib/generators/somatics/install/templates/public/images/somatics/footer-bg.png +0 -0
  86. data/lib/generators/somatics/install/templates/public/images/somatics/footer-left.png +0 -0
  87. data/lib/generators/somatics/install/templates/public/images/somatics/footer-right.png +0 -0
  88. data/lib/generators/somatics/install/templates/public/images/somatics/group.png +0 -0
  89. data/lib/generators/somatics/install/templates/public/images/somatics/help.png +0 -0
  90. data/lib/generators/somatics/install/templates/public/images/somatics/history.png +0 -0
  91. data/lib/generators/somatics/install/templates/public/images/somatics/image.png +0 -0
  92. data/lib/generators/somatics/install/templates/public/images/somatics/lightning.png +0 -0
  93. data/lib/generators/somatics/install/templates/public/images/somatics/link.png +0 -0
  94. data/lib/generators/somatics/install/templates/public/images/somatics/loading.gif +0 -0
  95. data/lib/generators/somatics/install/templates/public/images/somatics/locked.png +0 -0
  96. data/lib/generators/somatics/install/templates/public/images/somatics/message.png +0 -0
  97. data/lib/generators/somatics/install/templates/public/images/somatics/milestone.png +0 -0
  98. data/lib/generators/somatics/install/templates/public/images/somatics/move.png +0 -0
  99. data/lib/generators/somatics/install/templates/public/images/somatics/news.png +0 -0
  100. data/lib/generators/somatics/install/templates/public/images/somatics/openid-bg.gif +0 -0
  101. data/lib/generators/somatics/install/templates/public/images/somatics/package.png +0 -0
  102. data/lib/generators/somatics/install/templates/public/images/somatics/pdf.png +0 -0
  103. data/lib/generators/somatics/install/templates/public/images/somatics/php.png +0 -0
  104. data/lib/generators/somatics/install/templates/public/images/somatics/plugin.png +0 -0
  105. data/lib/generators/somatics/install/templates/public/images/somatics/projects.png +0 -0
  106. data/lib/generators/somatics/install/templates/public/images/somatics/rails.png +0 -0
  107. data/lib/generators/somatics/install/templates/public/images/somatics/reload.png +0 -0
  108. data/lib/generators/somatics/install/templates/public/images/somatics/report.png +0 -0
  109. data/lib/generators/somatics/install/templates/public/images/somatics/ruby.png +0 -0
  110. data/lib/generators/somatics/install/templates/public/images/somatics/save.png +0 -0
  111. data/lib/generators/somatics/install/templates/public/images/somatics/sort_asc.png +0 -0
  112. data/lib/generators/somatics/install/templates/public/images/somatics/sort_desc.png +0 -0
  113. data/lib/generators/somatics/install/templates/public/images/somatics/stats.png +0 -0
  114. data/lib/generators/somatics/install/templates/public/images/somatics/table_multiple.png +0 -0
  115. data/lib/generators/somatics/install/templates/public/images/somatics/task_done.png +0 -0
  116. data/lib/generators/somatics/install/templates/public/images/somatics/task_late.png +0 -0
  117. data/lib/generators/somatics/install/templates/public/images/somatics/task_parent_end.png +0 -0
  118. data/lib/generators/somatics/install/templates/public/images/somatics/task_todo.png +0 -0
  119. data/lib/generators/somatics/install/templates/public/images/somatics/text.png +0 -0
  120. data/lib/generators/somatics/install/templates/public/images/somatics/text_list_bullets.png +0 -0
  121. data/lib/generators/somatics/install/templates/public/images/somatics/textfield.png +0 -0
  122. data/lib/generators/somatics/install/templates/public/images/somatics/ticket.png +0 -0
  123. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_checked.png +0 -0
  124. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_edit.png +0 -0
  125. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_go.png +0 -0
  126. data/lib/generators/somatics/install/templates/public/images/somatics/ticket_note.png +0 -0
  127. data/lib/generators/somatics/install/templates/public/images/somatics/time.png +0 -0
  128. data/lib/generators/somatics/install/templates/public/images/somatics/time_add.png +0 -0
  129. data/lib/generators/somatics/install/templates/public/images/somatics/toggle_check.png +0 -0
  130. data/lib/generators/somatics/install/templates/public/images/somatics/true.png +0 -0
  131. data/lib/generators/somatics/install/templates/public/images/somatics/unlock.png +0 -0
  132. data/lib/generators/somatics/install/templates/public/images/somatics/user.png +0 -0
  133. data/lib/generators/somatics/install/templates/public/images/somatics/warning.png +0 -0
  134. data/lib/generators/somatics/install/templates/public/images/somatics/wiki_edit.png +0 -0
  135. data/lib/generators/somatics/install/templates/public/images/somatics/xml.png +0 -0
  136. data/lib/generators/somatics/install/templates/public/images/somatics/zip.png +0 -0
  137. data/lib/generators/somatics/install/templates/public/images/somatics/zoom_in.png +0 -0
  138. data/lib/generators/somatics/install/templates/public/javascripts/somatics/base.js +231 -0
  139. data/lib/generators/somatics/install/templates/public/javascripts/somatics/context_menu.js +237 -0
  140. data/lib/generators/somatics/install/templates/public/javascripts/somatics/controls.js +965 -0
  141. data/lib/generators/somatics/install/templates/public/javascripts/somatics/dragdrop.js +974 -0
  142. data/lib/generators/somatics/install/templates/public/javascripts/somatics/effects.js +1123 -0
  143. data/lib/generators/somatics/install/templates/public/javascripts/somatics/prototype.js +6001 -0
  144. data/lib/generators/somatics/install/templates/public/javascripts/somatics/rails.js +175 -0
  145. data/lib/generators/somatics/install/templates/public/javascripts/somatics/select_list_move.js +82 -0
  146. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/base.css +948 -0
  147. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/context_menu.css +52 -0
  148. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/csshover.htc +122 -0
  149. data/lib/generators/somatics/install/templates/public/stylesheets/somatics/jstoolbar.css +95 -0
  150. data/lib/generators/somatics/install/templates/view_index.html.erb +1 -0
  151. data/lib/generators/somatics/scaffold/scaffold_generator.rb +25 -0
  152. data/lib/generators/somatics/scaffold/templates/_form.html.erb +23 -0
  153. data/lib/generators/somatics/scaffold/templates/edit.html.erb +6 -0
  154. data/lib/generators/somatics/scaffold/templates/index.html.erb +27 -0
  155. data/lib/generators/somatics/scaffold/templates/new.html.erb +5 -0
  156. data/lib/generators/somatics/scaffold/templates/show.html.erb +12 -0
  157. data/lib/generators/somatics/scaffold_controller/USAGE +20 -0
  158. data/lib/generators/somatics/scaffold_controller/scaffold_controller_generator.rb +137 -0
  159. data/lib/generators/somatics/scaffold_controller/templates/builder_index.pdf.prawn +25 -0
  160. data/lib/generators/somatics/scaffold_controller/templates/builder_index.xls.builder +24 -0
  161. data/lib/generators/somatics/scaffold_controller/templates/builder_index.xml.builder +10 -0
  162. data/lib/generators/somatics/scaffold_controller/templates/controller.rb +140 -0
  163. data/lib/generators/somatics/scaffold_controller/templates/locales_en.yml +17 -0
  164. data/lib/generators/somatics/scaffold_controller/templates/locales_zh-TW.yml +20 -0
  165. data/lib/generators/somatics/scaffold_controller/templates/partial_bulk.html.erb +12 -0
  166. data/lib/generators/somatics/scaffold_controller/templates/partial_edit.html.erb +7 -0
  167. data/lib/generators/somatics/scaffold_controller/templates/partial_form.html.erb +13 -0
  168. data/lib/generators/somatics/scaffold_controller/templates/partial_list.html.erb +42 -0
  169. data/lib/generators/somatics/scaffold_controller/templates/partial_menu.html.erb +1 -0
  170. data/lib/generators/somatics/scaffold_controller/templates/partial_show.html.erb +31 -0
  171. data/lib/generators/somatics/scaffold_controller/templates/view_edit.html.erb +24 -0
  172. data/lib/generators/somatics/scaffold_controller/templates/view_index.html.erb +28 -0
  173. data/lib/generators/somatics/scaffold_controller/templates/view_new.html.erb +14 -0
  174. data/lib/generators/somatics/scaffold_controller/templates/view_show.html.erb +24 -0
  175. data/lib/generators/somatics.rb +95 -0
  176. data/lib/somatics3-generators.rb +19 -0
  177. data/somatics3-generators.gemspec +223 -0
  178. data/templates/somatics.rb +128 -0
  179. data/test/helper.rb +10 -0
  180. data/test/test_somatics3-generators.rb +7 -0
  181. metadata +301 -0
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require '<%= sessions_controller_name %>_controller'
3
+
4
+ # Re-raise errors caught by the controller.
5
+ class <%= sessions_controller_class_name %>Controller; def rescue_action(e) raise e end; end
6
+
7
+ class <%= sessions_controller_class_name %>ControllerTest < ActionController::TestCase
8
+ # Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead
9
+ # Then, you can remove it from this and the units test.
10
+ include <%= class_name %>AuthenticatedTestHelper
11
+
12
+ fixtures :<%= table_name %>
13
+
14
+ def test_should_login_and_redirect
15
+ post :create, :login => 'quentin', :password => 'monkey'
16
+ assert session[:<%= file_name %>_id]
17
+ assert_response :redirect
18
+ end
19
+
20
+ def test_should_fail_login_and_not_redirect
21
+ post :create, :login => 'quentin', :password => 'bad password'
22
+ assert_nil session[:<%= file_name %>_id]
23
+ assert_response :success
24
+ end
25
+
26
+ def test_should_logout
27
+ login_as :quentin
28
+ get :destroy
29
+ assert_nil session[:<%= file_name %>_id]
30
+ assert_response :redirect
31
+ end
32
+
33
+ def test_should_remember_me
34
+ @request.cookies["auth_token"] = nil
35
+ post :create, :login => 'quentin', :password => 'monkey', :remember_me => "1"
36
+ assert_not_nil @response.cookies["auth_token"]
37
+ end
38
+
39
+ def test_should_not_remember_me
40
+ @request.cookies["auth_token"] = nil
41
+ post :create, :login => 'quentin', :password => 'monkey', :remember_me => "0"
42
+ puts @response.cookies["auth_token"]
43
+ assert @response.cookies["auth_token"].blank?
44
+ end
45
+
46
+ def test_should_delete_token_on_logout
47
+ login_as :quentin
48
+ get :destroy
49
+ assert @response.cookies["auth_token"].blank?
50
+ end
51
+
52
+ def test_should_login_with_cookie
53
+ <%= table_name %>(:quentin).remember_me
54
+ @request.cookies["auth_token"] = cookie_for(:quentin)
55
+ get :new
56
+ assert @controller.send(:logged_in?)
57
+ end
58
+
59
+ def test_should_fail_expired_cookie_login
60
+ <%= table_name %>(:quentin).remember_me
61
+ <%= table_name %>(:quentin).update_attribute :remember_token_expires_at, 5.minutes.ago
62
+ @request.cookies["auth_token"] = cookie_for(:quentin)
63
+ get :new
64
+ assert !@controller.send(:logged_in?)
65
+ end
66
+
67
+ def test_should_fail_cookie_login
68
+ <%= table_name %>(:quentin).remember_me
69
+ @request.cookies["auth_token"] = auth_token('invalid_auth_token')
70
+ get :new
71
+ assert !@controller.send(:logged_in?)
72
+ end
73
+
74
+ protected
75
+ def auth_token(token)
76
+ CGI::Cookie.new('name' => 'auth_token', 'value' => token)
77
+ end
78
+
79
+ def cookie_for(<%= file_name %>)
80
+ auth_token <%= table_name %>(<%= file_name %>).remember_token
81
+ end
82
+ end
@@ -0,0 +1,164 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class <%= class_name %>Test < ActiveSupport::TestCase
4
+ # Be sure to include AuthenticatedTestHelper in test/test_helper.rb instead.
5
+ # Then, you can remove it from this and the functional test.
6
+ include <%= class_name %>AuthenticatedTestHelper
7
+ fixtures :<%= table_name %>
8
+
9
+ def test_should_create_<%= file_name %>
10
+ assert_difference '<%= class_name %>.count' do
11
+ <%= file_name %> = create_<%= file_name %>
12
+ assert !<%= file_name %>.new_record?, "#{<%= file_name %>.errors.full_messages.to_sentence}"
13
+ end
14
+ end
15
+ <% if options[:include_activation] %>
16
+ def test_should_initialize_activation_code_upon_creation
17
+ <%= file_name %> = create_<%= file_name %>
18
+ <%= file_name %>.reload
19
+ assert_not_nil <%= file_name %>.activation_code
20
+ end
21
+ <% end %><% if options[:stateful] %>
22
+ def test_should_create_and_start_in_pending_state
23
+ <%= file_name %> = create_<%= file_name %>
24
+ <%= file_name %>.reload
25
+ assert <%= file_name %>.pending?
26
+ end
27
+
28
+ <% end %>
29
+ def test_should_require_login
30
+ assert_no_difference '<%= class_name %>.count' do
31
+ u = create_<%= file_name %>(:login => nil)
32
+ assert u.errors.on(:login)
33
+ end
34
+ end
35
+
36
+ def test_should_require_password
37
+ assert_no_difference '<%= class_name %>.count' do
38
+ u = create_<%= file_name %>(:password => nil)
39
+ assert u.errors.on(:password)
40
+ end
41
+ end
42
+
43
+ def test_should_require_password_confirmation
44
+ assert_no_difference '<%= class_name %>.count' do
45
+ u = create_<%= file_name %>(:password_confirmation => nil)
46
+ assert u.errors.on(:password_confirmation)
47
+ end
48
+ end
49
+
50
+ def test_should_require_email
51
+ assert_no_difference '<%= class_name %>.count' do
52
+ u = create_<%= file_name %>(:email => nil)
53
+ assert u.errors.on(:email)
54
+ end
55
+ end
56
+
57
+ def test_should_reset_password
58
+ <%= table_name %>(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
59
+ assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'new password')
60
+ end
61
+
62
+ def test_should_not_rehash_password
63
+ <%= table_name %>(:quentin).update_attributes(:login => 'quentin2')
64
+ assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin2', 'monkey')
65
+ end
66
+
67
+ def test_should_authenticate_<%= file_name %>
68
+ assert_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'monkey')
69
+ end
70
+
71
+ def test_should_set_remember_token
72
+ <%= table_name %>(:quentin).remember_me
73
+ assert_not_nil <%= table_name %>(:quentin).remember_token
74
+ assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
75
+ end
76
+
77
+ def test_should_unset_remember_token
78
+ <%= table_name %>(:quentin).remember_me
79
+ assert_not_nil <%= table_name %>(:quentin).remember_token
80
+ <%= table_name %>(:quentin).forget_me
81
+ assert_nil <%= table_name %>(:quentin).remember_token
82
+ end
83
+
84
+ def test_should_remember_me_for_one_week
85
+ before = 1.week.from_now.utc
86
+ <%= table_name %>(:quentin).remember_me_for 1.week
87
+ after = 1.week.from_now.utc
88
+ assert_not_nil <%= table_name %>(:quentin).remember_token
89
+ assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
90
+ assert <%= table_name %>(:quentin).remember_token_expires_at.between?(before, after)
91
+ end
92
+
93
+ def test_should_remember_me_until_one_week
94
+ time = 1.week.from_now.utc
95
+ <%= table_name %>(:quentin).remember_me_until time
96
+ assert_not_nil <%= table_name %>(:quentin).remember_token
97
+ assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
98
+ assert_equal <%= table_name %>(:quentin).remember_token_expires_at, time
99
+ end
100
+
101
+ def test_should_remember_me_default_two_weeks
102
+ before = 2.weeks.from_now.utc
103
+ <%= table_name %>(:quentin).remember_me
104
+ after = 2.weeks.from_now.utc
105
+ assert_not_nil <%= table_name %>(:quentin).remember_token
106
+ assert_not_nil <%= table_name %>(:quentin).remember_token_expires_at
107
+ assert <%= table_name %>(:quentin).remember_token_expires_at.between?(before, after)
108
+ end
109
+ <% if options[:stateful] %>
110
+ def test_should_register_passive_<%= file_name %>
111
+ <%= file_name %> = create_<%= file_name %>(:password => nil, :password_confirmation => nil)
112
+ assert <%= file_name %>.passive?
113
+ <%= file_name %>.update_attributes(:password => 'new password', :password_confirmation => 'new password')
114
+ <%= file_name %>.register!
115
+ assert <%= file_name %>.pending?
116
+ end
117
+
118
+ def test_should_suspend_<%= file_name %>
119
+ <%= table_name %>(:quentin).suspend!
120
+ assert <%= table_name %>(:quentin).suspended?
121
+ end
122
+
123
+ def test_suspended_<%= file_name %>_should_not_authenticate
124
+ <%= table_name %>(:quentin).suspend!
125
+ assert_not_equal <%= table_name %>(:quentin), <%= class_name %>.authenticate('quentin', 'test')
126
+ end
127
+
128
+ def test_should_unsuspend_<%= file_name %>_to_active_state
129
+ <%= table_name %>(:quentin).suspend!
130
+ assert <%= table_name %>(:quentin).suspended?
131
+ <%= table_name %>(:quentin).unsuspend!
132
+ assert <%= table_name %>(:quentin).active?
133
+ end
134
+
135
+ def test_should_unsuspend_<%= file_name %>_with_nil_activation_code_and_activated_at_to_passive_state
136
+ <%= table_name %>(:quentin).suspend!
137
+ <%= class_name %>.update_all :activation_code => nil, :activated_at => nil
138
+ assert <%= table_name %>(:quentin).suspended?
139
+ <%= table_name %>(:quentin).reload.unsuspend!
140
+ assert <%= table_name %>(:quentin).passive?
141
+ end
142
+
143
+ def test_should_unsuspend_<%= file_name %>_with_activation_code_and_nil_activated_at_to_pending_state
144
+ <%= table_name %>(:quentin).suspend!
145
+ <%= class_name %>.update_all :activation_code => 'foo-bar', :activated_at => nil
146
+ assert <%= table_name %>(:quentin).suspended?
147
+ <%= table_name %>(:quentin).reload.unsuspend!
148
+ assert <%= table_name %>(:quentin).pending?
149
+ end
150
+
151
+ def test_should_delete_<%= file_name %>
152
+ assert_nil <%= table_name %>(:quentin).deleted_at
153
+ <%= table_name %>(:quentin).delete!
154
+ assert_not_nil <%= table_name %>(:quentin).deleted_at
155
+ assert <%= table_name %>(:quentin).deleted?
156
+ end
157
+ <% end %>
158
+ protected
159
+ def create_<%= file_name %>(options = {})
160
+ record = <%= class_name %>.new({ :login => 'quire', :email => 'quire@example.com', :password => 'quire69', :password_confirmation => 'quire69' }.merge(options))
161
+ record.<% if options[:stateful] %>register! if record.valid?<% else %>save<% end %>
162
+ record
163
+ end
164
+ end
@@ -0,0 +1,60 @@
1
+ <%
2
+ ## this code must match that in templates/model.rb
3
+ require 'digest/sha1'
4
+ def make_fake_token
5
+ @fake_token_counter ||= 0
6
+ @fake_token_counter += 1
7
+ Digest::SHA1.hexdigest(@fake_token_counter.to_s)
8
+ end
9
+ salts = (1..2).map{ make_fake_token }
10
+ passwds = salts.map{ |salt| password_digest('monkey', salt) }
11
+ -%>
12
+
13
+ quentin:
14
+ id: 1
15
+ login: quentin
16
+ email: quentin@example.com
17
+ salt: <%= salts[0] %> # SHA1('0')
18
+ crypted_password: <%= passwds[0] %> # 'monkey'
19
+ created_at: <%%= 5.days.ago.to_s :db %>
20
+ remember_token_expires_at: <%%= 1.days.from_now.to_s %>
21
+ remember_token: <%= make_fake_token %>
22
+ <% if options[:include_activation] -%>
23
+ activation_code:
24
+ activated_at: <%%= 5.days.ago.to_s :db %>
25
+ <% end -%>
26
+ <% if options[:stateful] -%>
27
+ state: active
28
+ <% end -%>
29
+
30
+ aaron:
31
+ id: 2
32
+ login: aaron
33
+ email: aaron@example.com
34
+ salt: <%= salts[1] %> # SHA1('1')
35
+ crypted_password: <%= passwds[1] %> # 'monkey'
36
+ created_at: <%%= 1.days.ago.to_s :db %>
37
+ remember_token_expires_at:
38
+ remember_token:
39
+ <% if options[:include_activation] -%>
40
+ activation_code: <%= make_fake_token %>
41
+ activated_at:
42
+ <% end -%>
43
+ <% if options[:stateful] %>
44
+ state: pending
45
+ <% end -%>
46
+
47
+
48
+ old_password_holder:
49
+ id: 3
50
+ login: old_password_holder
51
+ email: salty_dog@example.com
52
+ salt: 7e3041ebc2fc05a40c60028e2c4901a81035d3cd
53
+ crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
54
+ created_at: <%%= 1.days.ago.to_s :db %>
55
+ <% if options[:include_activation] %>
56
+ activation_code:
57
+ activated_at: <%%= 5.days.ago.to_s :db %>
58
+ <% end %>
59
+ <% if options[:stateful] %>
60
+ state: active<% end %>
@@ -0,0 +1,323 @@
1
+ require 'generators/somatics'
2
+ require 'rails/generators/named_base'
3
+ require 'rails/generators/resource_helpers'
4
+ require 'digest/sha1'
5
+ require 'rails/generators/migration'
6
+
7
+ module Somatics
8
+ module Generators
9
+ class AuthenticatedControllerGenerator < Rails::Generators::NamedBase
10
+ extend TemplatePath
11
+ include Rails::Generators::ResourceHelpers
12
+ include Rails::Generators::Migration
13
+ # hook_for :authenticated , :in => :somatics, :as => :scaffold, :default => 'somatics:scaffold' do |instance, command|
14
+ # instance.invoke command, [ class_name, attributes], {:namespace => 'admin' }
15
+ # end
16
+
17
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
18
+ class_option :namespace, :banner => "NAME", :type => :string
19
+ class_option :model, :banner => 'ClasName', :type => :string
20
+
21
+ class_option :skip_routes, :type => :boolean, :desc => "Don't generate a resource line in config/routes.rb."
22
+ class_option :skip_migration, :type => :boolean, :desc => "Don't generate a migration file for this model."
23
+ class_option :aasm, :type => :boolean, :desc => "Works the same as stateful but uses the updated aasm gem"
24
+ class_option :stateful, :type => :boolean, :desc => "Builds in support for acts_as_state_machine and generatesactivation code."
25
+ class_option :rspec, :type => :boolean, :desc => "Generate RSpec tests and Stories in place of standard rails tests."
26
+ class_option :old_passwords, :type => :boolean, :desc => "Use the older password scheme"
27
+ class_option :include_activation, :type => :boolean, :desc => "Skip the code for a ActionMailer and its respective Activation Code through email"
28
+ class_option :dump_generator_attrs, :type => :boolean, :desc => "Dump Generator Attrs"
29
+
30
+ # Try to be idempotent:
31
+ # pull in the existing site key if any,
32
+ # seed it with reasonable defaults otherwise
33
+ #
34
+ def load_or_initialize_site_keys
35
+ case
36
+ when defined? REST_AUTH_SITE_KEY
37
+ if (options[:old_passwords]) && ((! REST_AUTH_SITE_KEY.blank?) || (REST_AUTH_DIGEST_STRETCHES != 1))
38
+ raise "You have a site key, but --old-passwords will overwrite it. If this is really what you want, move the file #{site_keys_file} and re-run."
39
+ end
40
+ $rest_auth_site_key_from_generator = REST_AUTH_SITE_KEY
41
+ $rest_auth_digest_stretches_from_generator = REST_AUTH_DIGEST_STRETCHES
42
+ when options[:old_passwords]
43
+ $rest_auth_site_key_from_generator = nil
44
+ $rest_auth_digest_stretches_from_generator = 1
45
+ $rest_auth_keys_are_new = true
46
+ else
47
+ $rest_auth_site_key_from_generator = make_token
48
+ $rest_auth_digest_stretches_from_generator = 10
49
+ $rest_auth_keys_are_new = true
50
+ end
51
+ # template 'config/initializers/site_keys.rb', "config/initializers/#{controller_file_name}_site_keys.rb"
52
+ template 'config/initializers/site_keys.rb'
53
+ end
54
+
55
+ def create_controller_files
56
+ template 'controller.rb', File.join('app/controllers',"#{options.namespace}", controller_class_path, "#{ controller_file_name }_controller.rb")
57
+ end
58
+
59
+ def generate_lib_files
60
+ # Check for class naming collisions.
61
+ class_collisions [], "#{class_name}AuthenticatedSystem", "#{class_name}AuthenticatedTestHelper"
62
+
63
+ template 'authenticated_system.rb', File.join('lib', "#{file_name}_authenticated_system.rb")
64
+ template 'authenticated_test_helper.rb', File.join('lib', "#{file_name}_authenticated_test_helper.rb")
65
+ end
66
+
67
+ def create_test_files
68
+ #TODO : Create test files
69
+ end
70
+
71
+ def create_helper_files
72
+ template 'session_helper.rb', File.join('app/helpers', sessions_controller_class_path, "#{ sessions_controller_controller_name }_helper.rb")
73
+ template 'helper.rb', File.join('app/helpers', controller_class_path, "#{ controller_file_name }_helper.rb")
74
+ end
75
+
76
+ def generate_sessions_controller
77
+
78
+ # Check for class naming collisions.
79
+ class_collisions sessions_controller_class_path, "#{sessions_controller_class_name}Controller", # Sessions Controller
80
+ "#{sessions_controller_class_name}Helper"
81
+
82
+ template 'sessions_controller.rb', File.join('app/controllers', sessions_controller_class_path, "#{sessions_controller_controller_name}_controller.rb")
83
+ # template 'session_helper.rb', File.join('app/helpers', sessions_controller_class_path, "#{sessions_controller_controller_name}_helper.rb")
84
+ # template 'test/sessions_functional_test.rb', File.join('test/functional', sessions_controller_class_path, "#{sessions_controller_file_name}_controller_test.rb")
85
+
86
+ # View templates
87
+ # template 'login.html.erb', File.join('app/views', sessions_controller_class_path, sessions_controller_file_name, "new.html.erb")
88
+ template 'login.html.erb', File.join('app/views', sessions_controller_file_path, 'new.html.erb')
89
+ # template 'signup.html.erb', File.join('app/views', controller_class_path, controller_file_name, "signup.html.erb")
90
+ template 'signup.html.erb', File.join('app/views', controller_file_path, 'new.html.erb')
91
+ # template '_model_partial.html.erb', File.join('app/views', controller_class_path, controller_file_name, "_#{file_name}_bar.html.erb")
92
+ template '_model_partial.html.erb', File.join('app/views', sessions_controller_file_path, "_#{file_name}_bar.html.erb")
93
+
94
+ end
95
+
96
+ def generate_route
97
+ unless options[:skip_routes]
98
+ route_config = class_path.collect{|namespace| "namespace :#{namespace} do " }.join(" ")
99
+ route_config << "\n"
100
+ route_config << %Q{match '#{file_name}_signup' => '#{controller_plural_name}#new'}
101
+ route_config << "\n"
102
+ route_config << %Q{match '#{file_name}_register' => '#{controller_plural_name}#create'}
103
+ route_config << "\n"
104
+ route_config << %Q{match '#{file_name}_login' => '#{sessions_controller_controller_name}#new'}
105
+ route_config << "\n"
106
+ route_config << %Q{match '#{file_name}_logout' => '#{sessions_controller_controller_name}#destroy'}
107
+ route_config << "\n"
108
+ route_config << "match '/activate/:activation_code' => '#{ controller_plural_name }#activate', :as => :activate, :activation_code => nil"
109
+ route_config << "\n"
110
+ route_config << "resource #{ sessions_controller_singular_name.to_sym.inspect }, :only => [:new, :create, :destroy]"
111
+ route_config << "\n"
112
+ route_config << "resources #{ controller_plural_name.to_sym.inspect }"
113
+ route_config << "\n"
114
+ route_config << " end" * class_path.size
115
+ route route_config
116
+ end
117
+ end
118
+
119
+ def insert_into_application_controller
120
+ puts "TODO: include #{class_name}AuthenticatedSystem"
121
+ puts "TODO: Add require #{class_name}in AuthenticatedSystem"
122
+
123
+
124
+ end
125
+
126
+ def dump_generator_attribute_names
127
+ generator_attribute_names = [
128
+ :namespace_class,
129
+ :namespace_name,
130
+ :table_name,
131
+ :file_name,
132
+ :class_name,
133
+ :sessions_controller_name,
134
+ :sessions_controller_class_path,
135
+ :sessions_controller_file_path,
136
+ # :sessions_controller_class_nesting,
137
+ # :sessions_controller_class_nesting_depth,
138
+ :sessions_controller_class_name,
139
+ :sessions_controller_singular_name,
140
+ :sessions_controller_plural_name,
141
+ :sessions_controller_routing_name, # new_session_path
142
+ :sessions_controller_routing_path, # /session/new
143
+ :sessions_controller_controller_name, # sessions
144
+ :sessions_controller_file_name,
145
+ :sessions_controller_table_name,
146
+ :controller_name,
147
+ :controller_class_path,
148
+ :controller_file_path,
149
+ # :controller_class_nesting,
150
+ # :controller_class_nesting_depth,
151
+ :controller_class_name,
152
+ :controller_singular_name,
153
+ :controller_plural_name,
154
+ :controller_routing_name, # new_user_path
155
+ :controller_routing_path, # /users/new
156
+ :controller_controller_name, # users
157
+ :controller_file_name,
158
+ :controller_singular_name,
159
+ :controller_table_name,
160
+ :controller_plural_name,
161
+ ]
162
+
163
+ generator_attribute_names.each do |attr|
164
+ puts "%-40s %s" % ["#{attr}:", self.send(attr.to_s)] # instance_variable_get("@#{attr.to_s}"
165
+ end
166
+
167
+ end
168
+
169
+ # rails g authenticated FoonParent::Foon SporkParent::Spork -p --force --rspec --dump-generator-attrs
170
+ # table_name: foon_parent_foons
171
+ # file_name: foon
172
+ # class_name: FoonParent::Foon
173
+ # controller_name: SporkParent::Sporks
174
+ # controller_class_path: spork_parent
175
+ # controller_file_path: spork_parent/sporks
176
+ # controller_class_nesting: SporkParent
177
+ # controller_class_nesting_depth: 1
178
+ # controller_class_name: SporkParent::Sporks
179
+ # controller_singular_name: spork
180
+ # controller_plural_name: sporks
181
+ # controller_routing_name: spork
182
+ # controller_routing_path: spork_parent/spork
183
+ # controller_controller_name: sporks
184
+ # controller_file_name: sporks
185
+ # controller_table_name: sporks
186
+ # controller_plural_name: sporks
187
+ # model_controller_name: FoonParent::Foons
188
+ # model_controller_class_path: foon_parent
189
+ # model_controller_file_path: foon_parent/foons
190
+ # model_controller_class_nesting: FoonParent
191
+ # model_controller_class_nesting_depth: 1
192
+ # model_controller_class_name: FoonParent::Foons
193
+ # model_controller_singular_name: foons
194
+ # model_controller_plural_name: foons
195
+ # model_controller_routing_name: foon_parent_foons
196
+ # model_controller_routing_path: foon_parent/foons
197
+ # model_controller_controller_name: foons
198
+ # model_controller_file_name: foons
199
+ # model_controller_singular_name: foons
200
+ # model_controller_table_name: foons
201
+ # model_controller_plural_name: foons
202
+
203
+
204
+ protected
205
+
206
+ def namespace_class
207
+ options[:namespace].classify if options[:namespace].present?
208
+ end
209
+
210
+ def namespace_name
211
+ options[:namespace].underscore if options[:namespace].present?
212
+ end
213
+
214
+ def sessions_controller_name
215
+ file_name + '_sessions'
216
+ end
217
+
218
+ def sessions_controller_class_path
219
+ controller_class_path
220
+ end
221
+
222
+ def sessions_controller_file_path
223
+ controller_file_path.singularize + '_sessions'
224
+ end
225
+
226
+ def sessions_controller_singular_name
227
+ sessions_controller_file_name
228
+ end
229
+
230
+ def sessions_controller_plural_name
231
+ sessions_controller_file_name.pluralize
232
+ end
233
+
234
+ def sessions_controller_routing_name
235
+ sessions_controller_routing_path.parameterize.underscore # HACK
236
+ end
237
+
238
+ def sessions_controller_routing_path
239
+ sessions_controller_file_path.singularize
240
+ end
241
+
242
+ def sessions_controller_class_name
243
+ controller_class_name.singularize + 'Sessions'
244
+ end
245
+
246
+ def sessions_controller_controller_name
247
+ sessions_controller_plural_name
248
+ end
249
+
250
+ def sessions_controller_file_name
251
+ file_name + '_session'
252
+ end
253
+
254
+ def sessions_controller_table_name
255
+ sessions_controller_plural_name
256
+ end
257
+
258
+ def controller_plural_name
259
+ plural_name
260
+ end
261
+
262
+ def controller_singular_name
263
+ singular_name
264
+ end
265
+
266
+ def controller_routing_name
267
+ controller_routing_path.parameterize.underscore # HACK
268
+ end
269
+
270
+ def controller_routing_path
271
+ controller_file_path.singularize
272
+ end
273
+
274
+ def controller_controller_name
275
+ controller_plural_name
276
+ end
277
+
278
+ alias_method :controller_table_name, :controller_plural_name
279
+
280
+ def model_class_name
281
+ class_name unless options[:model].present?
282
+ options[:model].classify
283
+ end
284
+
285
+ def migration_name
286
+ "Create#{ class_name.pluralize.gsub(/::/, '') }"
287
+ end
288
+
289
+ def migration_file_name
290
+ "#{ file_path.gsub(/\//, '_').pluralize }"
291
+ end
292
+
293
+ #
294
+ # Implement the required interface for Rails::Generators::Migration.
295
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
296
+ #
297
+ def self.next_migration_number(dirname) #:nodoc:
298
+ if ActiveRecord::Base.timestamped_migrations
299
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
300
+ else
301
+ "%.3d" % (current_migration_number(dirname) + 1)
302
+ end
303
+ end
304
+
305
+ #
306
+ # !! These must match the corresponding routines in by_password.rb !!
307
+ #
308
+ def secure_digest(*args)
309
+ Digest::SHA1.hexdigest(args.flatten.join('--'))
310
+ end
311
+ def make_token
312
+ secure_digest(Time.now, (1..10).map{ rand.to_s })
313
+ end
314
+ def password_digest(password, salt)
315
+ digest = $rest_auth_site_key_from_generator
316
+ $rest_auth_digest_stretches_from_generator.times do
317
+ digest = secure_digest(digest, salt, password, $rest_auth_site_key_from_generator)
318
+ end
319
+ digest
320
+ end
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,8 @@
1
+ <%% if logged_in? -%>
2
+ <div id="<%= file_name %>-bar-greeting">Logged in as <%%= link_to_current_<%= file_name %> :content_method => :login %></div>
3
+ <div id="<%= file_name %>-bar-action" >(<%%= link_to "Log out", logout_path, { :title => "Log out" } %>)</div>
4
+ <%% else -%>
5
+ <div id="<%= file_name %>-bar-greeting"><%%= link_to_login_with_IP 'Not logged in', :style => 'border: none;' %></div>
6
+ <div id="<%= file_name %>-bar-action" ><%%= link_to "Log in", login_path, { :title => "Log in" } %> /
7
+ <%%= link_to "Sign up", signup_path, { :title => "Create an account" } %></div>
8
+ <%% end -%>
@@ -0,0 +1,3 @@
1
+ <%%=h @<%= file_name %>.login %>, your account has been activated. Welcome aboard!
2
+
3
+ <%%=h @url %>