mac_generators 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/lib/generators/authentication/email/USAGE +39 -0
  3. data/lib/generators/authentication/email/email_generator.rb +128 -0
  4. data/lib/generators/authentication/{templates → email/templates}/create_identities.rb +1 -1
  5. data/lib/generators/authentication/email/templates/database_authentication.rb +16 -0
  6. data/lib/generators/authentication/{templates → email/templates}/erb/identity_new.html.erb +0 -0
  7. data/lib/generators/authentication/email/templates/erb/session_new.html.erb +15 -0
  8. data/lib/generators/authentication/{templates → email/templates}/haml/identity_new.html.haml +0 -0
  9. data/lib/generators/authentication/email/templates/haml/session_new.html.haml +15 -0
  10. data/lib/generators/authentication/{templates → email/templates}/identities_controller.rb +1 -1
  11. data/lib/generators/authentication/email/templates/identity.rb +6 -0
  12. data/lib/generators/authentication/email/templates/sessions_controller.rb +16 -0
  13. data/lib/generators/authentication/email/templates/warden.rb +19 -0
  14. data/lib/generators/authentication/omniauth/USAGE +32 -0
  15. data/lib/generators/authentication/omniauth/omniauth_generator.rb +121 -0
  16. data/lib/generators/authentication/omniauth/templates/authentication_domain.rb +1 -0
  17. data/lib/generators/authentication/omniauth/templates/create_identities.rb +12 -0
  18. data/lib/generators/authentication/omniauth/templates/identity.rb +9 -0
  19. data/lib/generators/authentication/omniauth/templates/oauth_authentication.rb +36 -0
  20. data/lib/generators/authentication/omniauth/templates/omniauth.rb +3 -0
  21. data/lib/generators/authentication/omniauth/templates/sessions_controller.rb +12 -0
  22. data/lib/generators/authentication/omniauth/templates/warden.rb +19 -0
  23. data/lib/mac_generators/version.rb +1 -1
  24. data/test/dummy/app/controllers/application_controller.rb +24 -0
  25. data/test/dummy/config/database.yml +3 -3
  26. data/test/dummy/config/environments/test.rb +0 -3
  27. data/test/dummy/config/locales/en.yml +14 -0
  28. data/test/dummy/config/routes.rb +5 -0
  29. data/test/dummy/db/test.sqlite3 +0 -0
  30. data/test/dummy/log/test.log +3560 -0
  31. data/test/dummy/tmp/Gemfile +3 -0
  32. data/test/dummy/tmp/app/controllers/application_controller.rb +27 -0
  33. data/test/dummy/tmp/app/controllers/sessions_controller.rb +12 -0
  34. data/test/dummy/tmp/app/models/identity.rb +9 -0
  35. data/test/dummy/tmp/config/initializers/authentication_domain.rb +1 -0
  36. data/test/dummy/tmp/config/initializers/omniauth.rb +3 -0
  37. data/test/dummy/tmp/config/initializers/warden.rb +19 -0
  38. data/test/dummy/tmp/config/locales/en.yml +10 -0
  39. data/test/dummy/tmp/config/routes.rb +4 -0
  40. data/test/dummy/tmp/db/migrate/create_identities.rb +12 -0
  41. data/test/dummy/tmp/lib/strategies/oauth_authentication.rb +36 -0
  42. data/test/fixtures/Gemfile +0 -0
  43. data/test/fixtures/application_controller.rb +3 -0
  44. data/test/fixtures/en.yml +1 -0
  45. data/test/fixtures/routes.rb +2 -0
  46. data/test/generators/authentication_email_generator_test.rb +141 -0
  47. data/test/generators/authentication_omniauth_generator_test.rb +107 -0
  48. data/test/support/generators_test_helper.rb +51 -0
  49. data/test/test_helper.rb +20 -0
  50. metadata +115 -37
  51. data/README +0 -3
  52. data/lib/generators/authentication/USAGE +0 -8
  53. data/lib/generators/authentication/authentication_generator.rb +0 -89
  54. data/lib/generators/authentication/templates/erb/session_new.html.erb +0 -14
  55. data/lib/generators/authentication/templates/haml/session_new.html.haml +0 -14
  56. data/lib/generators/authentication/templates/identity.rb +0 -26
  57. data/lib/generators/authentication/templates/sessions_controller.rb +0 -21
  58. data/test/mac_generators_test.rb +0 -7
@@ -0,0 +1,3 @@
1
+
2
+ gem "warden", "~> 1.2.0"
3
+ gem "omniauth"
@@ -0,0 +1,27 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery with: :exception
3
+
4
+ helper_method :current_identity, :identity_signed_in?, :warden_message
5
+
6
+ protected
7
+ def current_identity
8
+ warden.user(scope: :identity)
9
+ end
10
+
11
+ def identity_signed_in?
12
+ warden.authenticate?(scope: :identity)
13
+ end
14
+
15
+ def authenticate!
16
+ redirect_to root_path, notice: t('.not_logged') unless identity_signed_in?
17
+ end
18
+
19
+ def warden_message
20
+ warden.message
21
+ end
22
+
23
+ def warden
24
+ request.env['warden']
25
+ end
26
+
27
+ end
@@ -0,0 +1,12 @@
1
+ class SessionsController < ApplicationController
2
+ def create
3
+ warden.authenticate!(scope: :identity)
4
+ redirect_to root_url, notice: t('.logged_in')
5
+ end
6
+
7
+ def destroy
8
+ warden.logout(:identity)
9
+ redirect_to root_url, notice: t('.logged_out')
10
+ end
11
+ end
12
+
@@ -0,0 +1,9 @@
1
+ class Identity < ActiveRecord::Base
2
+
3
+ class << self
4
+ def find_identity(uid, provider)
5
+ where(uid: uid, provider: provider).first
6
+ end
7
+ end
8
+
9
+ end
@@ -0,0 +1 @@
1
+ Rails.application.config.authentication_domain = ''
@@ -0,0 +1,3 @@
1
+ Rails.application.config.middleware.use OmniAuth::Builder do
2
+ provider :provider, ENV["KEY"], ENV["SECRET"]
3
+ end
@@ -0,0 +1,19 @@
1
+ load File.expand_path("../../../lib/strategies/oauth_authentication.rb", __FILE__)
2
+ Rails.application.config.middleware.use Warden::Manager do |manager|
3
+ manager.default_strategies :oauth_authentication
4
+
5
+ # TODO: Setup warden's failure app, this will be called everytime that
6
+ # and authentication failure happen.
7
+ # Failure app should be a Rack application.
8
+ # In Rails a controller can be used as a Rack app, just specify the
9
+ # controller and the action to be called. Example:
10
+ #manager.failure_app = lambda { |env| HomeController.action(:index).call(env) }
11
+ end
12
+
13
+ Warden::Manager.serialize_into_session(:identity) do |identity|
14
+ identity.id
15
+ end
16
+
17
+ Warden::Manager.serialize_from_session(:identity) do |id|
18
+ Identity.find(id)
19
+ end
@@ -0,0 +1,10 @@
1
+ en:
2
+ sessions:
3
+ new:
4
+ log_in: 'Log in'
5
+ create:
6
+ unauthorized_domain: 'Sorry but your domain is not authorized'
7
+ logged_in: 'Welcome back!'
8
+ destroy:
9
+ logged_out: 'See you later!'
10
+
@@ -0,0 +1,4 @@
1
+ Dummy::Application.routes.draw do
2
+ delete '/sessions/destroy' => 'sessions#destroy', as: :log_out
3
+ get 'auth/:provider/callback' => 'sessions#create', as: :log_in
4
+ end
@@ -0,0 +1,12 @@
1
+ class CreateIdentities < ActiveRecord::Migration
2
+ def change
3
+ create_table :identities do |t|
4
+ t.string :provider
5
+ t.string :uid
6
+ t.string :name
7
+ t.string :email
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ module Strategies
2
+ class OauthAuthentication < ::Warden::Strategies::Base
3
+ def valid?
4
+ request.env['omniauth.auth'].present?
5
+ end
6
+
7
+ def authenticate!
8
+ auth = request.env['omniauth.auth']
9
+
10
+ if authorized_domain?(auth)
11
+ identity = Identity.find_identity(auth['uid'], auth['provider']) || create_identity(auth)
12
+ return success! identity
13
+ end
14
+
15
+ fail! I18n.t('sessions.create.unauthorized_domain')
16
+ end
17
+
18
+ private
19
+ def authorized_domain?(auth)
20
+ if Rails.application.config.respond_to?(:authentication_domain) && Rails.application.config.authentication_domain.present?
21
+ return auth['info']['email'].split('@').last == Rails.application.config.authentication_domain
22
+ end
23
+
24
+ true
25
+ end
26
+
27
+ def create_identity(auth)
28
+ params = { uid: auth['uid'], provider: auth['provider'],
29
+ name: auth['info']['name'], email: auth['info']['email'] }
30
+
31
+ Identity.create! params
32
+ end
33
+ end
34
+ end
35
+
36
+ Warden::Strategies.add(:oauth_authentication, Strategies::OauthAuthentication)
File without changes
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery with: :exception
3
+ end
@@ -0,0 +1 @@
1
+ en:
@@ -0,0 +1,2 @@
1
+ Dummy::Application.routes.draw do
2
+ end
@@ -0,0 +1,141 @@
1
+ require 'test_helper'
2
+ require 'generators/authentication/email/email_generator'
3
+
4
+ describe Authentication::Generators::EmailGenerator do
5
+ include GeneratorsTestHelper
6
+
7
+ before do
8
+ copy_routes
9
+ copy_locales
10
+ copy_gemfile
11
+ copy_application_controller
12
+ make_migrations_dir
13
+ end
14
+
15
+ it 'copies controllers templates for user signup and session' do
16
+ run_generator
17
+
18
+ assert_file 'app/controllers/identities_controller.rb' do |m|
19
+ assert_match 'IdentitiesController', m
20
+ assert_match 'def new', m
21
+ assert_match 'def create', m
22
+ end
23
+
24
+ assert_file 'app/controllers/sessions_controller.rb' do |m|
25
+ assert_match 'SessionsController', m
26
+ assert_match 'def new', m
27
+ assert_match 'def create', m
28
+ assert_match 'def destroy', m
29
+ end
30
+ end
31
+
32
+ it 'copies user_controller template for user class' do
33
+ run_generator ['user']
34
+
35
+ assert_file 'app/controllers/users_controller.rb' do |m|
36
+ assert_match 'UsersController', m
37
+ assert_match 'def new', m
38
+ assert_match 'def create', m
39
+ assert_match '@user = User.new', m
40
+ end
41
+ end
42
+
43
+ it 'copies erb templates' do
44
+ run_generator
45
+
46
+ assert_file 'app/views/identities/new.html.erb' do |m|
47
+ assert_match 'form_for @identity, url: identity_path', m
48
+ end
49
+
50
+ assert_file 'app/views/sessions/new.html.erb' do |m|
51
+ assert_match 'form_for @identity, url: sessions_path', m
52
+ end
53
+ end
54
+
55
+ it 'copies haml templates' do
56
+ run_generator ['--haml']
57
+
58
+ assert_file 'app/views/identities/new.html.haml' do |m|
59
+ assert_match 'form_for @identity, url: identity_path', m
60
+ end
61
+
62
+ assert_file 'app/views/sessions/new.html.haml' do |m|
63
+ assert_match 'form_for @identity, url: sessions_path', m
64
+ end
65
+ end
66
+
67
+ it 'add routes' do
68
+ run_generator
69
+
70
+ assert_file 'config/routes.rb' do |m|
71
+ assert_match "get 'sign_up' => 'identities#new'", m
72
+ assert_match "get 'log_in' => 'sessions#new'", m
73
+ assert_match "delete 'log_out' => 'sessions#destroy'", m
74
+
75
+ assert_match "resource :identity, only: [:create, :new]", m
76
+ assert_match "resource :sessions, only: [:create, :new]", m
77
+ end
78
+ end
79
+
80
+ it 'generate migration' do
81
+ Authentication::Generators::EmailGenerator.class_eval do
82
+ def migration_name
83
+ "create_#{resource_pluralize}.rb"
84
+ end
85
+ end
86
+
87
+ run_generator
88
+
89
+ assert_file 'db/migrate/create_identities.rb' do |m|
90
+ assert_match 'create_table :identities', m
91
+ assert_match 't.string :email', m
92
+ assert_match 't.string :password_hash', m
93
+ assert_match 't.string :password_digest', m
94
+ end
95
+
96
+ assert_file 'app/models/identity.rb' do |m|
97
+ assert_match 'class Identity < ActiveRecord::Base', m
98
+ assert_match 'has_secure_password validations: true', m
99
+ end
100
+ end
101
+
102
+ it 'add helper methods to application controller' do
103
+ run_generator
104
+
105
+ assert_file 'app/controllers/application_controller.rb' do |m|
106
+ assert_match 'helper_method :current_identity, :identity_signed_in?', m
107
+ assert_match 'def current_identity', m
108
+ assert_match 'def identity_signed_in?', m
109
+ assert_match 'def authenticate!', m
110
+ end
111
+ end
112
+
113
+ it 'add warden gem to Gemfile' do
114
+ run_generator
115
+
116
+ assert_file 'Gemfile' do |m|
117
+ assert_match "gem \"warden\", \"~> 1.2.0\"", m
118
+ assert_match "gem \"bcrypt-ruby\"", m
119
+ end
120
+ end
121
+
122
+ it 'copy warden configuration' do
123
+ run_generator
124
+
125
+ assert_file 'config/initializers/warden.rb' do |m|
126
+ assert_match 'manager.default_strategies :database_authentication', m
127
+ assert_match 'Warden::Manager.serialize_into_session(:identity)', m
128
+ assert_match 'Warden::Manager.serialize_from_session(:identity)', m
129
+ end
130
+ end
131
+
132
+ it 'copy warden strategies' do
133
+ run_generator
134
+
135
+ assert_file 'lib/strategies/database_authentication.rb' do |m|
136
+ assert_match 'def valid?', m
137
+ assert_match 'authenticate!', m
138
+ end
139
+ end
140
+ end
141
+
@@ -0,0 +1,107 @@
1
+ require 'test_helper'
2
+ require 'generators/authentication/omniauth/omniauth_generator'
3
+
4
+ describe Authentication::Generators::OmniauthGenerator do
5
+ include GeneratorsTestHelper
6
+
7
+ before do
8
+ copy_routes
9
+ copy_locales
10
+ copy_gemfile
11
+ copy_application_controller
12
+ make_migrations_dir
13
+ end
14
+
15
+ it 'copies controllers templates for session' do
16
+ run_generator
17
+
18
+ assert_file 'app/controllers/sessions_controller.rb' do |m|
19
+ assert_match 'SessionsController', m
20
+ assert_match 'def create', m
21
+ assert_match 'def destroy', m
22
+ end
23
+ end
24
+
25
+ it 'add routes' do
26
+ run_generator
27
+
28
+ assert_file 'config/routes.rb' do |m|
29
+ assert_match "get 'auth/:provider/callback' => 'sessions#create'", m
30
+ assert_match "delete '/sessions/destroy' => 'sessions#destroy'", m
31
+ end
32
+ end
33
+
34
+ it 'generate migration' do
35
+ Authentication::Generators::OmniauthGenerator.class_eval do
36
+ def migration_name
37
+ "create_#{resource_pluralize}.rb"
38
+ end
39
+ end
40
+
41
+ run_generator
42
+
43
+ assert_file 'db/migrate/create_identities.rb' do |m|
44
+ assert_match 'create_table :identities', m
45
+ assert_match 't.string :provider', m
46
+ assert_match 't.string :uid', m
47
+ assert_match 't.string :name', m
48
+ assert_match 't.string :email', m
49
+ end
50
+
51
+ assert_file 'app/models/identity.rb' do |m|
52
+ assert_match 'class Identity < ActiveRecord::Base', m
53
+ assert_match 'def find_identity(uid, provider)', m
54
+ end
55
+ end
56
+
57
+ it 'add helper methods to application controller' do
58
+ run_generator
59
+
60
+ assert_file 'app/controllers/application_controller.rb' do |m|
61
+ assert_match 'helper_method :current_identity, :identity_signed_in?', m
62
+ assert_match 'def current_identity', m
63
+ assert_match 'def identity_signed_in?', m
64
+ assert_match 'def authenticate!', m
65
+ end
66
+ end
67
+
68
+ it 'add warden gem to Gemfile' do
69
+ run_generator
70
+
71
+ assert_file 'Gemfile' do |m|
72
+ assert_match "gem \"warden\", \"~> 1.2.0\"", m
73
+ assert_match "gem \"omniauth\"", m
74
+ end
75
+ end
76
+
77
+ it 'copy warden configuration' do
78
+ run_generator
79
+
80
+ assert_file 'config/initializers/warden.rb' do |m|
81
+ assert_match 'manager.default_strategies :oauth_authentication', m
82
+ assert_match 'Warden::Manager.serialize_into_session(:identity)', m
83
+ assert_match 'Warden::Manager.serialize_from_session(:identity)', m
84
+ end
85
+ end
86
+
87
+ it 'copy domain authentication configuration' do
88
+ run_generator
89
+
90
+ assert_file 'config/initializers/authentication_domain.rb'
91
+ end
92
+
93
+ it 'copy omniauth configuration' do
94
+ run_generator
95
+
96
+ assert_file 'config/initializers/omniauth.rb'
97
+ end
98
+
99
+ it 'copy warden strategies' do
100
+ run_generator
101
+
102
+ assert_file 'lib/strategies/oauth_authentication.rb' do |m|
103
+ assert_match 'def valid?', m
104
+ assert_match 'authenticate!', m
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,51 @@
1
+ module GeneratorsTestHelper
2
+ def self.included(base)
3
+ base.class_eval do
4
+ destination File.join(Rails.root, "tmp")
5
+ setup :prepare_destination
6
+
7
+ begin
8
+ base.tests Rails::Generators.const_get(base.name.sub(/Test$/, ''))
9
+ rescue
10
+ end
11
+ end
12
+ end
13
+
14
+ def copy_routes
15
+ routes = File.expand_path("../../fixtures/routes.rb", __FILE__)
16
+ destination = File.join(destination_root, "config")
17
+
18
+ copy_file routes, destination
19
+ end
20
+
21
+ def copy_gemfile
22
+ gemfile = File.expand_path("../../fixtures/Gemfile", __FILE__)
23
+
24
+ copy_file gemfile, destination_root
25
+ end
26
+
27
+ def copy_application_controller
28
+ controller = File.expand_path("../../fixtures/application_controller.rb", __FILE__)
29
+ destination = File.join(destination_root, 'app', 'controllers')
30
+
31
+ copy_file controller, destination
32
+ end
33
+
34
+ def copy_locales
35
+ controller = File.expand_path("../../fixtures/en.yml", __FILE__)
36
+ destination = File.join(destination_root, 'config', 'locales')
37
+
38
+ copy_file controller, destination
39
+ end
40
+
41
+ def copy_file(file, destination)
42
+ FileUtils.mkdir_p(destination)
43
+ FileUtils.cp file, destination
44
+ end
45
+
46
+ def make_migrations_dir
47
+ destination = File.join(destination_root, 'db', 'migrate')
48
+
49
+ FileUtils.mkdir_p(destination)
50
+ end
51
+ end
data/test/test_helper.rb CHANGED
@@ -3,6 +3,9 @@ ENV["RAILS_ENV"] = "test"
3
3
 
4
4
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
5
  require "rails/test_help"
6
+ require "minitest/rails"
7
+ require "minitest/focus"
8
+ require "minitest/colorize"
6
9
 
7
10
  Rails.backtrace_cleaner.remove_silencers!
8
11
 
@@ -13,3 +16,20 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
13
16
  if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
17
  ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
15
18
  end
19
+
20
+ require 'rails/generators/test_case'
21
+ class Rails::Generators::TestCase
22
+ register_spec_type(self) do |desc|
23
+ Class === desc && desc < Rails::Generators::Base
24
+ end
25
+
26
+ register_spec_type(/Generator( ?Test)?\z/i, self)
27
+
28
+ def self.determine_default_generator(name)
29
+ generator = determine_constant_from_test_name(name) do |constant|
30
+ Class === constant && constant < Rails::Generators::Base
31
+ end
32
+ raise NameError.new("Unable to resolve generator for #{name}") if generator.nil?
33
+ generator
34
+ end
35
+ end