nifty-generators-improved 0.5

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 (112) hide show
  1. data/CHANGELOG +198 -0
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +111 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +109 -0
  6. data/Rakefile +10 -0
  7. data/features/nifty_authentication.feature +80 -0
  8. data/features/nifty_config.feature +17 -0
  9. data/features/nifty_layout.feature +20 -0
  10. data/features/nifty_scaffold.feature +80 -0
  11. data/features/step_definitions/common_steps.rb +62 -0
  12. data/features/step_definitions/rails_setup_steps.rb +6 -0
  13. data/features/support/env.rb +6 -0
  14. data/features/support/matchers.rb +7 -0
  15. data/lib/generators/nifty.rb +28 -0
  16. data/lib/generators/nifty/authentication/USAGE +50 -0
  17. data/lib/generators/nifty/authentication/authentication_generator.rb +154 -0
  18. data/lib/generators/nifty/authentication/templates/authlogic_session.rb +2 -0
  19. data/lib/generators/nifty/authentication/templates/controller_authentication.rb +60 -0
  20. data/lib/generators/nifty/authentication/templates/fixtures.yml +24 -0
  21. data/lib/generators/nifty/authentication/templates/migration.rb +20 -0
  22. data/lib/generators/nifty/authentication/templates/sessions_controller.rb +41 -0
  23. data/lib/generators/nifty/authentication/templates/sessions_helper.rb +2 -0
  24. data/lib/generators/nifty/authentication/templates/tests/rspec/sessions_controller.rb +39 -0
  25. data/lib/generators/nifty/authentication/templates/tests/rspec/user.rb +83 -0
  26. data/lib/generators/nifty/authentication/templates/tests/rspec/users_controller.rb +56 -0
  27. data/lib/generators/nifty/authentication/templates/tests/shoulda/sessions_controller.rb +40 -0
  28. data/lib/generators/nifty/authentication/templates/tests/shoulda/user.rb +85 -0
  29. data/lib/generators/nifty/authentication/templates/tests/shoulda/users_controller.rb +61 -0
  30. data/lib/generators/nifty/authentication/templates/tests/testunit/sessions_controller.rb +36 -0
  31. data/lib/generators/nifty/authentication/templates/tests/testunit/user.rb +88 -0
  32. data/lib/generators/nifty/authentication/templates/tests/testunit/users_controller.rb +53 -0
  33. data/lib/generators/nifty/authentication/templates/user.rb +38 -0
  34. data/lib/generators/nifty/authentication/templates/users_controller.rb +32 -0
  35. data/lib/generators/nifty/authentication/templates/users_helper.rb +2 -0
  36. data/lib/generators/nifty/authentication/templates/views/erb/_form.html.erb +20 -0
  37. data/lib/generators/nifty/authentication/templates/views/erb/edit.html.erb +3 -0
  38. data/lib/generators/nifty/authentication/templates/views/erb/login.html.erb +30 -0
  39. data/lib/generators/nifty/authentication/templates/views/erb/signup.html.erb +5 -0
  40. data/lib/generators/nifty/authentication/templates/views/haml/_form.html.haml +16 -0
  41. data/lib/generators/nifty/authentication/templates/views/haml/edit.html.haml +3 -0
  42. data/lib/generators/nifty/authentication/templates/views/haml/login.html.haml +26 -0
  43. data/lib/generators/nifty/authentication/templates/views/haml/signup.html.haml +5 -0
  44. data/lib/generators/nifty/config/USAGE +23 -0
  45. data/lib/generators/nifty/config/config_generator.rb +24 -0
  46. data/lib/generators/nifty/config/templates/config.yml +8 -0
  47. data/lib/generators/nifty/config/templates/load_config.rb +2 -0
  48. data/lib/generators/nifty/layout/USAGE +25 -0
  49. data/lib/generators/nifty/layout/layout_generator.rb +29 -0
  50. data/lib/generators/nifty/layout/templates/error_messages_helper.rb +23 -0
  51. data/lib/generators/nifty/layout/templates/layout.html.erb +19 -0
  52. data/lib/generators/nifty/layout/templates/layout.html.haml +17 -0
  53. data/lib/generators/nifty/layout/templates/layout_helper.rb +17 -0
  54. data/lib/generators/nifty/layout/templates/stylesheet.css +83 -0
  55. data/lib/generators/nifty/layout/templates/stylesheet.css.scss +88 -0
  56. data/lib/generators/nifty/scaffold/USAGE +51 -0
  57. data/lib/generators/nifty/scaffold/scaffold_generator.rb +318 -0
  58. data/lib/generators/nifty/scaffold/templates/actions/create.rb +8 -0
  59. data/lib/generators/nifty/scaffold/templates/actions/destroy.rb +5 -0
  60. data/lib/generators/nifty/scaffold/templates/actions/edit.rb +3 -0
  61. data/lib/generators/nifty/scaffold/templates/actions/index.rb +3 -0
  62. data/lib/generators/nifty/scaffold/templates/actions/new.rb +3 -0
  63. data/lib/generators/nifty/scaffold/templates/actions/show.rb +3 -0
  64. data/lib/generators/nifty/scaffold/templates/actions/update.rb +8 -0
  65. data/lib/generators/nifty/scaffold/templates/controller.rb +3 -0
  66. data/lib/generators/nifty/scaffold/templates/fixtures.yml +9 -0
  67. data/lib/generators/nifty/scaffold/templates/helper.rb +2 -0
  68. data/lib/generators/nifty/scaffold/templates/migration.rb +16 -0
  69. data/lib/generators/nifty/scaffold/templates/model.rb +4 -0
  70. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/create.rb +11 -0
  71. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/destroy.rb +6 -0
  72. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/edit.rb +4 -0
  73. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/index.rb +4 -0
  74. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/new.rb +4 -0
  75. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/show.rb +4 -0
  76. data/lib/generators/nifty/scaffold/templates/tests/rspec/actions/update.rb +11 -0
  77. data/lib/generators/nifty/scaffold/templates/tests/rspec/controller.rb +8 -0
  78. data/lib/generators/nifty/scaffold/templates/tests/rspec/model.rb +7 -0
  79. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/create.rb +13 -0
  80. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/destroy.rb +8 -0
  81. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/edit.rb +6 -0
  82. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/index.rb +6 -0
  83. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/new.rb +6 -0
  84. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/show.rb +6 -0
  85. data/lib/generators/nifty/scaffold/templates/tests/shoulda/actions/update.rb +13 -0
  86. data/lib/generators/nifty/scaffold/templates/tests/shoulda/controller.rb +5 -0
  87. data/lib/generators/nifty/scaffold/templates/tests/shoulda/model.rb +7 -0
  88. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/create.rb +11 -0
  89. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/destroy.rb +6 -0
  90. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/edit.rb +4 -0
  91. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/index.rb +4 -0
  92. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/new.rb +4 -0
  93. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/show.rb +4 -0
  94. data/lib/generators/nifty/scaffold/templates/tests/testunit/actions/update.rb +11 -0
  95. data/lib/generators/nifty/scaffold/templates/tests/testunit/controller.rb +5 -0
  96. data/lib/generators/nifty/scaffold/templates/tests/testunit/model.rb +7 -0
  97. data/lib/generators/nifty/scaffold/templates/views/erb/_form.html.erb +10 -0
  98. data/lib/generators/nifty/scaffold/templates/views/erb/edit.html.erb +14 -0
  99. data/lib/generators/nifty/scaffold/templates/views/erb/index.html.erb +29 -0
  100. data/lib/generators/nifty/scaffold/templates/views/erb/new.html.erb +7 -0
  101. data/lib/generators/nifty/scaffold/templates/views/erb/show.html.erb +20 -0
  102. data/lib/generators/nifty/scaffold/templates/views/haml/_form.html.haml +9 -0
  103. data/lib/generators/nifty/scaffold/templates/views/haml/edit.html.haml +14 -0
  104. data/lib/generators/nifty/scaffold/templates/views/haml/index.html.haml +25 -0
  105. data/lib/generators/nifty/scaffold/templates/views/haml/new.html.haml +7 -0
  106. data/lib/generators/nifty/scaffold/templates/views/haml/show.html.haml +20 -0
  107. data/test/test_helper.rb +119 -0
  108. data/test/test_nifty_authentication_generator.rb +274 -0
  109. data/test/test_nifty_config_generator.rb +37 -0
  110. data/test/test_nifty_layout_generator.rb +42 -0
  111. data/test/test_nifty_scaffold_generator.rb +534 -0
  112. metadata +231 -0
@@ -0,0 +1,80 @@
1
+ Feature: Nifty Authentication Generator
2
+ In order to authenticate users
3
+ As a rails developer
4
+ I want to generate some user authentication
5
+
6
+ Scenario: Generate default authentication
7
+ Given a new Rails app
8
+ When I insert "root :to => 'users#new'" into "config/routes.rb" after line 1
9
+ And I run "rails g nifty:authentication"
10
+ Then I should see the following files
11
+ | app/models/user.rb |
12
+ | app/controllers/users_controller.rb |
13
+ | app/helpers/users_helper.rb |
14
+ | app/views/users/new.html.erb |
15
+ | app/views/users/edit.html.erb |
16
+ | app/controllers/sessions_controller.rb |
17
+ | app/helpers/sessions_helper.rb |
18
+ | app/views/sessions/new.html.erb |
19
+ | lib/controller_authentication.rb |
20
+ | test/fixtures/users.yml |
21
+ | test/unit/user_test.rb |
22
+ | test/functional/users_controller_test.rb |
23
+ | test/functional/sessions_controller_test.rb |
24
+ | db/migrate |
25
+ And I should see the following in file "config/routes.rb"
26
+ | resources :sessions |
27
+ | resources :users |
28
+ | match 'login' => 'sessions#new', :as => :login |
29
+ | match 'logout' => 'sessions#destroy', :as => :logout |
30
+ | match 'signup' => 'users#new', :as => :signup |
31
+ | match 'user/edit' => 'users#edit', :as => :edit_current_user |
32
+ And I should see "include ControllerAuthentication" in file "app/controllers/application_controller.rb"
33
+ And I should see "gem "mocha", :group => :test" in file "Gemfile"
34
+ And I should see "gem "bcrypt-ruby", :require => "bcrypt"" in file "Gemfile"
35
+ When I run "rails g nifty:layout -f"
36
+ And I run "rake db:migrate"
37
+ Then I should successfully run "rake test"
38
+
39
+ Scenario: Generate named authentication
40
+ Given a new Rails app
41
+ When I insert "root :to => 'accounts#new'" into "config/routes.rb" after line 1
42
+ And I run "rails g nifty:authentication Account CurrentSession"
43
+ Then I should see the following files
44
+ | app/models/account.rb |
45
+ | app/controllers/accounts_controller.rb |
46
+ | app/helpers/accounts_helper.rb |
47
+ | app/views/accounts/new.html.erb |
48
+ | app/views/accounts/edit.html.erb |
49
+ | app/controllers/current_sessions_controller.rb |
50
+ | app/helpers/current_sessions_helper.rb |
51
+ | app/views/current_sessions/new.html.erb |
52
+ | test/fixtures/accounts.yml |
53
+ | test/unit/account_test.rb |
54
+ | test/functional/accounts_controller_test.rb |
55
+ | test/functional/current_sessions_controller_test.rb |
56
+ And I should see the following in file "config/routes.rb"
57
+ | resources :current_sessions |
58
+ | resources :accounts |
59
+ | match 'login' => 'current_sessions#new', :as => :login |
60
+ | match 'logout' => 'current_sessions#destroy', :as => :logout |
61
+ | match 'signup' => 'accounts#new', :as => :signup |
62
+ | match 'account/edit' => 'accounts#edit', :as => :edit_current_account |
63
+ When I run "rails g nifty:layout -f"
64
+ And I run "rake db:migrate"
65
+ Then I should successfully run "rake test"
66
+
67
+ Scenario: Generate named authentication with rspec
68
+ Given a new Rails app
69
+ When I insert "root :to => 'accounts#new'" into "config/routes.rb" after line 1
70
+ And I run "rails g nifty:authentication Account CurrentSession --rspec"
71
+ Then I should see the following files
72
+ | spec/models/account_spec.rb |
73
+ | spec/controllers/accounts_controller_spec.rb |
74
+ | spec/controllers/current_sessions_controller_spec.rb |
75
+ When I run "rails g nifty:layout -f"
76
+ And I run "rake db:migrate"
77
+ And I add "gem 'rspec-rails', '>= 2.0.1'" to file "Gemfile"
78
+ And I run "rails g rspec:install"
79
+ And I replace "mock_with :rspec" with "mock_with :mocha" in file "spec/spec_helper.rb"
80
+ Then I should successfully run "rake spec"
@@ -0,0 +1,17 @@
1
+ Feature: Nifty Config Generator
2
+ In order to have configure an app
3
+ As a rails developer
4
+ I want to generate a config file and manager
5
+
6
+ Scenario: Generate normal config
7
+ Given a new Rails app
8
+ When I run "rails g nifty:config"
9
+ Then I should see file "config/app_config.yml"
10
+ And I should see file "config/initializers/load_app_config.rb"
11
+
12
+ Scenario: Generate named config
13
+ Given a new Rails app
14
+ When I run "rails g nifty:config FooBar"
15
+ Then I should see "FOO_BAR_CONFIG" in file "config/initializers/load_foo_bar_config.rb"
16
+ And I should see "config/foo_bar_config.yml" in file "config/initializers/load_foo_bar_config.rb"
17
+ And I should see file "config/foo_bar_config.yml"
@@ -0,0 +1,20 @@
1
+ Feature: Nifty Layout Generator
2
+ In order to have a layout
3
+ As a rails developer
4
+ I want to generate a simple layout
5
+
6
+ Scenario: Generate normal application layout
7
+ Given a new Rails app
8
+ When I run "rails g nifty:layout -f"
9
+ Then I should see "stylesheet_link_tag "application"" in file "app/views/layouts/application.html.erb"
10
+ Then I should see "h(page_title" in file "app/helpers/layout_helper.rb"
11
+ And I should see file "app/helpers/layout_helper.rb"
12
+ And I should see file "app/helpers/error_messages_helper.rb"
13
+ And I should see file "public/stylesheets/application.css"
14
+
15
+ Scenario: Generate named layout with haml and sass
16
+ Given a new Rails app
17
+ When I run "rails g nifty:layout FooBar --haml -f"
18
+ Then I should see "stylesheet_link_tag "foo_bar"" in file "app/views/layouts/foo_bar.html.haml"
19
+ And I should see file "public/stylesheets/sass/foo_bar.sass"
20
+ And I should see file "app/helpers/layout_helper.rb"
@@ -0,0 +1,80 @@
1
+ Feature: Nifty Scaffold Generator
2
+ In order to manage a resource
3
+ As a rails developer
4
+ I want to generate a model, controller, and views for that resource
5
+
6
+ Scenario: Generate scaffold for simple resource
7
+ Given a new Rails app
8
+ When I run "rails g nifty:scaffold Project name:string"
9
+ Then I should see the following files
10
+ | app/models/project.rb |
11
+ | app/controllers/projects_controller.rb |
12
+ | app/helpers/projects_helper.rb |
13
+ | app/views/projects/index.html.erb |
14
+ | app/views/projects/show.html.erb |
15
+ | app/views/projects/new.html.erb |
16
+ | app/views/projects/edit.html.erb |
17
+ | db/migrate |
18
+ And I should see "resources :projects" in file "config/routes.rb"
19
+ And I should see "gem "mocha", :group => :test" in file "Gemfile"
20
+ When I run "rails g nifty:layout -f"
21
+ And I run "rake db:migrate"
22
+ And I should successfully run "rails g nifty:scaffold Project -f"
23
+ Then I should successfully run "rake test"
24
+
25
+ Scenario: Generate scaffold with rspec tests
26
+ Given a new Rails app
27
+ When I run "rails g nifty:scaffold Project name:string --rspec"
28
+ Then I should see the following files
29
+ | spec/models/project_spec.rb |
30
+ | spec/controllers/projects_controller_spec.rb |
31
+ When I run "rails g nifty:scaffold Task project_id:integer"
32
+ Then I should see the following files
33
+ | spec/models/task_spec.rb |
34
+ | spec/controllers/tasks_controller_spec.rb |
35
+ When I run "rails g nifty:layout -f"
36
+ And I run "rake db:migrate"
37
+ And I add "gem 'rspec-rails', '>= 2.0.0.beta.19'" to file "Gemfile"
38
+ And I run "rails g rspec:install"
39
+ And I replace "mock_with :rspec" with "mock_with :mocha" in file "spec/spec_helper.rb"
40
+ Then I should successfully run "rake spec"
41
+
42
+ Scenario: Report error when invalid model name
43
+ Given a new Rails app
44
+ Then I should see "Usage:" when running "rails g nifty:scaffold name:string parent_id:integer"
45
+
46
+ Scenario: Generate scaffold for namespaced resource
47
+ Given a new Rails app
48
+ When I run "rails g nifty:scaffold Admin::User name:string"
49
+ Then I should see the following files
50
+ | app/models/user.rb |
51
+ | app/controllers/admin/users_controller.rb |
52
+ | app/helpers/admin/users_helper.rb |
53
+ | app/views/admin/users/index.html.erb |
54
+ | app/views/admin/users/show.html.erb |
55
+ | app/views/admin/users/new.html.erb |
56
+ | app/views/admin/users/edit.html.erb |
57
+ | db/migrate |
58
+ And I should see "class User" in file "app/models/user.rb"
59
+ And I should not see "set_table_name :" in file "app/models/user.rb"
60
+ And I should see "namespace(:admin){ resources :users }" in file "config/routes.rb"
61
+ When I run "rails g nifty:layout -f"
62
+ And I run "rake db:migrate"
63
+ And I should successfully run "rails g nifty:scaffold Admin::User -f"
64
+ Then I should successfully run "rake test"
65
+
66
+ Scenario: Generate scaffold with a namespaced model
67
+ Given a new Rails app
68
+ When I run "rails g nifty:scaffold Admin::User name:string --namespace_model"
69
+ Then I should see "class Admin::User" in file "app/models/admin/user.rb"
70
+ And I should see "set_table_name :admin_users" in file "app/models/admin/user.rb"
71
+ When I run "rails g nifty:layout -f"
72
+ And I run "rake db:migrate"
73
+ And I should successfully run "rails g nifty:scaffold Admin::User -f --namespace_model"
74
+ Then I should successfully run "rake test"
75
+
76
+ Scenario: Given scaffold with a new and index action
77
+ Given a new Rails app
78
+ When I run "rails g nifty:scaffold Project name:string index new"
79
+ Then I should see "class Project" in file "app/models/project.rb"
80
+ And I should see "<%= form_for @project do |f| %>" in file "app/views/projects/new.html.erb"
@@ -0,0 +1,62 @@
1
+ When /^I run "([^\"]*)"$/ do |command|
2
+ system("cd #{@current_directory} && #{command}").should be_true
3
+ end
4
+
5
+ When /^I add "([^\"]*)" to file "([^\"]*)"$/ do |content, short_path|
6
+ path = File.join(@current_directory, short_path)
7
+ File.should exist(path)
8
+ File.open(path, 'a') { |f| f.write(content + "\n") }
9
+ end
10
+
11
+ When /^I replace "([^\"]*)" with "([^\"]*)" in file "([^\"]*)"$/ do |old_content, new_content, short_path|
12
+ path = File.join(@current_directory, short_path)
13
+ File.should exist(path)
14
+ content = File.read(path).gsub(old_content, new_content)
15
+ File.open(path, 'w') { |f| f.write(content) }
16
+ end
17
+
18
+ When /^I insert "([^\"]*)" into "([^\"]*)" after line (\d+)$/ do |content, short_path, after_line|
19
+ path = File.join(@current_directory, short_path)
20
+ File.should exist(path)
21
+ lines = File.read(path).split("\n")
22
+ lines[after_line.to_i, 0] = content
23
+ File.open(path, 'w') { |f| f.write(lines.join("\n")) }
24
+ end
25
+
26
+ Then /^I should see file "([^\"]*)"$/ do |path|
27
+ File.should exist(File.join(@current_directory, path))
28
+ end
29
+
30
+ Then /^I should see "(.*)" in file "([^\"]*)"$/ do |content, short_path|
31
+ path = File.join(@current_directory, short_path)
32
+ File.should exist(path)
33
+ File.readlines(path).join.should include(content)
34
+ end
35
+
36
+ Then /^I should not see "(.*)" in file "([^\"]*)"$/ do |content, short_path|
37
+ path = File.join(@current_directory, short_path)
38
+ File.should exist(path)
39
+ File.readlines(path).join.should_not include(content)
40
+ end
41
+
42
+ Then /^I should see the following files$/ do |table|
43
+ table.raw.flatten.each do |path|
44
+ File.should exist(File.join(@current_directory, path))
45
+ end
46
+ end
47
+
48
+ Then /^I should see the following in file "([^\"]*)"$/ do |short_path, table|
49
+ path = File.join(@current_directory, short_path)
50
+ File.should exist(path)
51
+ table.raw.flatten.each do |content|
52
+ File.readlines(path).join.should include(content)
53
+ end
54
+ end
55
+
56
+ Then /^I should successfully run "([^\"]*)"$/ do |command|
57
+ system("cd #{@current_directory} && #{command}").should be_true
58
+ end
59
+
60
+ Then /^I should see "([^\"]*)" when running "([^\"]*)"$/ do |expected_response, command|
61
+ `cd #{@current_directory} && #{command}`.should include(expected_response)
62
+ end
@@ -0,0 +1,6 @@
1
+ Given /^a new Rails app$/ do
2
+ FileUtils.mkdir_p("tmp")
3
+ system("rails new tmp/rails_app").should be_true
4
+ system("ln -s ../../../lib/generators tmp/rails_app/lib/generators").should be_true
5
+ @current_directory = File.expand_path("tmp/rails_app")
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'cucumber'
2
+ require 'rspec'
3
+
4
+ Before do
5
+ FileUtils.rm_rf "tmp/rails_app"
6
+ end
@@ -0,0 +1,7 @@
1
+ RSpec::Matchers.define :exist do |path|
2
+ match do
3
+ File.exist?(path)
4
+ end
5
+ failure_message_for_should { "Expected #{path} to exist but no file found" }
6
+ failure_message_for_should_not { "Expected #{path} to not exist but file was found" }
7
+ end
@@ -0,0 +1,28 @@
1
+ require 'rails/generators/base'
2
+
3
+ module Nifty
4
+ module Generators
5
+ class Base < Rails::Generators::Base #:nodoc:
6
+ def self.source_root
7
+ @_nifty_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'nifty', generator_name, 'templates'))
8
+ end
9
+
10
+ def self.banner
11
+ "rails generate nifty:#{generator_name} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]"
12
+ end
13
+
14
+ private
15
+
16
+ def add_gem(name, options = {})
17
+ gemfile_content = File.read(destination_path("Gemfile"))
18
+ File.open(destination_path("Gemfile"), 'a') { |f| f.write("\n") } unless gemfile_content =~ /\n\Z/
19
+ gem name, options unless gemfile_content.include? name
20
+ end
21
+
22
+ def print_usage
23
+ self.class.help(Thor::Base.shell.new)
24
+ exit
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ Description:
2
+ Generates a user model, users controller, and sessions controller. The
3
+ users controller handles the registration and the sessions controller
4
+ handles authentication. This is similar to restful_authentication, but
5
+ simpler.
6
+
7
+ IMPORTANT: This generator uses the "title" helper method which is generated
8
+ by the nifty_layout generator. You may want to run that generator first.
9
+
10
+ Usage:
11
+ If you do not pass any arguments, the model name will default to "user", and
12
+ the authentication controller will default to "session". You can override
13
+ each of these respectively by passing one or two arguments. Either name can
14
+ be CamelCased or under_scored.
15
+
16
+ Make sure to setup the authlogic gem if you are using that option.
17
+
18
+ gem "authlogic" # in Gemfile
19
+
20
+ Examples:
21
+ rails generate nifty:authentication
22
+
23
+ Creates user model, users_controller, and sessions_controller.
24
+
25
+ rails generate nifty:authentication account
26
+
27
+ Creates account model, accounts_controller, and sessions_controller.
28
+
29
+ rails generate nifty:authentication Account UserSession
30
+
31
+ Creates account model, accounts_controller, and user_sessions_controller.
32
+
33
+ Methods:
34
+ There are several methods generated which you can use in your application.
35
+ Here's a common example of what you might add to your layout.
36
+
37
+ <% if logged_in? %>
38
+ Welcome <%= current_user.username %>! Not you?
39
+ <%= link_to "Log out", logout_path %>
40
+ <% else %>
41
+ <%= link_to "Sign up", signup_path %> or
42
+ <%= link_to "log in", login_path %>.
43
+ <% end %>
44
+
45
+ You can also restrict unregistered users from accessing a controller using
46
+ a before filter. For example.
47
+
48
+ before_filter :login_required, :except => [:index, :show]
49
+
50
+ See the generated file lib/authentication.rb for details.
@@ -0,0 +1,154 @@
1
+ require 'generators/nifty'
2
+ require 'rails/generators/migration'
3
+
4
+ module Nifty
5
+ module Generators
6
+ class AuthenticationGenerator < Base
7
+ include Rails::Generators::Migration
8
+
9
+ argument :user_name, :type => :string, :default => 'user', :banner => 'user_name'
10
+ argument :session_name, :type => :string, :default => '[[DEFAULT]]', :banner => 'sessions_controller_name'
11
+
12
+ class_option :testunit, :desc => 'Use test/unit for test files.', :group => 'Test framework', :type => :boolean
13
+ class_option :rspec, :desc => 'Use RSpec for test files.', :group => 'Test framework', :type => :boolean
14
+ class_option :shoulda, :desc => 'Use shoulda for test files.', :group => 'Test framework', :type => :boolean
15
+
16
+ class_option :haml, :desc => 'Generate HAML views instead of ERB.', :type => :boolean
17
+ class_option :authlogic, :desc => 'Use Authlogic for authentication.', :type => :boolean
18
+
19
+ def add_gems
20
+ add_gem "bcrypt-ruby", :require => "bcrypt"
21
+ add_gem "mocha", :group => :test
22
+ end
23
+
24
+ def create_model_files
25
+ template 'user.rb', "app/models/#{user_singular_name}.rb"
26
+ template 'authlogic_session.rb', "app/models/#{user_singular_name}_session.rb" if options.authlogic?
27
+ end
28
+
29
+ def create_controller_files
30
+ template 'users_controller.rb', "app/controllers/#{user_plural_name}_controller.rb"
31
+ template 'sessions_controller.rb', "app/controllers/#{session_plural_name}_controller.rb"
32
+ end
33
+
34
+ def create_helper_files
35
+ template 'users_helper.rb', "app/helpers/#{user_plural_name}_helper.rb"
36
+ template 'sessions_helper.rb', "app/helpers/#{session_plural_name}_helper.rb"
37
+ end
38
+
39
+ def create_view_files
40
+ template "views/#{view_language}/signup.html.#{view_language}", "app/views/#{user_plural_name}/new.html.#{view_language}"
41
+ template "views/#{view_language}/edit.html.#{view_language}", "app/views/#{user_plural_name}/edit.html.#{view_language}"
42
+ template "views/#{view_language}/_form.html.#{view_language}", "app/views/#{user_plural_name}/_form.html.#{view_language}"
43
+ template "views/#{view_language}/login.html.#{view_language}", "app/views/#{session_plural_name}/new.html.#{view_language}"
44
+ end
45
+
46
+ def create_lib_files
47
+ template 'controller_authentication.rb', 'lib/controller_authentication.rb'
48
+ end
49
+
50
+ def create_routes
51
+ route "resources #{user_plural_name.to_sym.inspect}"
52
+ route "resources #{session_plural_name.to_sym.inspect}"
53
+ route "match 'login' => '#{session_plural_name}#new', :as => :login"
54
+ route "match 'logout' => '#{session_plural_name}#destroy', :as => :logout"
55
+ route "match 'signup' => '#{user_plural_name}#new', :as => :signup"
56
+ route "match '#{user_singular_name}/edit' => '#{user_plural_name}#edit', :as => :edit_current_#{user_singular_name}"
57
+ end
58
+
59
+ def create_migration
60
+ migration_template 'migration.rb', "db/migrate/create_#{user_plural_name}.rb"
61
+ end
62
+
63
+ def load_and_include_authentication
64
+ inject_into_class "config/application.rb", "Application", " config.autoload_paths << \"\#{config.root}/lib\""
65
+ inject_into_class "app/controllers/application_controller.rb", "ApplicationController", " include ControllerAuthentication\n"
66
+ end
67
+
68
+ def create_test_files
69
+ if test_framework == :rspec
70
+ template 'fixtures.yml', "spec/fixtures/#{user_plural_name}.yml"
71
+ template 'tests/rspec/user.rb', "spec/models/#{user_singular_name}_spec.rb"
72
+ template 'tests/rspec/users_controller.rb', "spec/controllers/#{user_plural_name}_controller_spec.rb"
73
+ template 'tests/rspec/sessions_controller.rb', "spec/controllers/#{session_plural_name}_controller_spec.rb"
74
+ else
75
+ template 'fixtures.yml', "test/fixtures/#{user_plural_name}.yml"
76
+ template "tests/#{test_framework}/user.rb", "test/unit/#{user_singular_name}_test.rb"
77
+ template "tests/#{test_framework}/users_controller.rb", "test/functional/#{user_plural_name}_controller_test.rb"
78
+ template "tests/#{test_framework}/sessions_controller.rb", "test/functional/#{session_plural_name}_controller_test.rb"
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def session_name
85
+ @_session_name ||= @session_name == '[[DEFAULT]]' ?
86
+ (options.authlogic? ? user_name + '_session' : 'session') :
87
+ @session_name
88
+ end
89
+
90
+ def user_singular_name
91
+ user_name.underscore
92
+ end
93
+
94
+ def user_plural_name
95
+ user_singular_name.pluralize
96
+ end
97
+
98
+ def user_class_name
99
+ user_name.camelize
100
+ end
101
+
102
+ def user_plural_class_name
103
+ user_plural_name.camelize
104
+ end
105
+
106
+ def session_singular_name
107
+ session_name.underscore
108
+ end
109
+
110
+ def session_plural_name
111
+ session_singular_name.pluralize
112
+ end
113
+
114
+ def session_class_name
115
+ session_name.camelize
116
+ end
117
+
118
+ def session_plural_class_name
119
+ session_plural_name.camelize
120
+ end
121
+
122
+ def view_language
123
+ options.haml? ? 'haml' : 'erb'
124
+ end
125
+
126
+ def test_framework
127
+ return @test_framework if defined?(@test_framework)
128
+ if options.testunit?
129
+ return @test_framework = :testunit
130
+ elsif options.rspec?
131
+ return @test_framework = :rspec
132
+ elsif options.shoulda?
133
+ return @test_framework = :shoulda
134
+ else
135
+ return @test_framework = File.exist?(destination_path('spec')) ? :rspec : :testunit
136
+ end
137
+ end
138
+
139
+ def destination_path(path)
140
+ File.join(destination_root, path)
141
+ end
142
+
143
+ # FIXME: Should be proxied to ActiveRecord::Generators::Base
144
+ # Implement the required interface for Rails::Generators::Migration.
145
+ def self.next_migration_number(dirname) #:nodoc:
146
+ if ActiveRecord::Base.timestamped_migrations
147
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
148
+ else
149
+ "%.3d" % (current_migration_number(dirname) + 1)
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end