maquina-generators 0.1.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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +158 -0
- data/Rakefile +10 -0
- data/lib/generators/maquina/clave/USAGE +11 -0
- data/lib/generators/maquina/clave/clave_generator.rb +184 -0
- data/lib/generators/maquina/clave/templates/app/controllers/concerns/authentication.rb.tt +63 -0
- data/lib/generators/maquina/clave/templates/app/controllers/registration/verification_resends_controller.rb.tt +38 -0
- data/lib/generators/maquina/clave/templates/app/controllers/registration/verifications_controller.rb.tt +51 -0
- data/lib/generators/maquina/clave/templates/app/controllers/registrations_controller.rb.tt +63 -0
- data/lib/generators/maquina/clave/templates/app/controllers/session/verification_resends_controller.rb.tt +44 -0
- data/lib/generators/maquina/clave/templates/app/controllers/session/verifications_controller.rb.tt +55 -0
- data/lib/generators/maquina/clave/templates/app/controllers/sessions_controller.rb.tt +56 -0
- data/lib/generators/maquina/clave/templates/app/helpers/authentication_helper.rb.tt +20 -0
- data/lib/generators/maquina/clave/templates/app/jobs/authentication_cleanup_job.rb.tt +13 -0
- data/lib/generators/maquina/clave/templates/app/mailers/verification_mailer.rb.tt +15 -0
- data/lib/generators/maquina/clave/templates/app/models/current.rb.tt +4 -0
- data/lib/generators/maquina/clave/templates/app/models/email_verification.rb.tt +40 -0
- data/lib/generators/maquina/clave/templates/app/models/session.rb.tt +18 -0
- data/lib/generators/maquina/clave/templates/app/models/user.rb.tt +38 -0
- data/lib/generators/maquina/clave/templates/app/views/registration/verifications/new.html.erb.tt +42 -0
- data/lib/generators/maquina/clave/templates/app/views/registrations/new.html.erb.tt +38 -0
- data/lib/generators/maquina/clave/templates/app/views/session/verifications/new.html.erb.tt +42 -0
- data/lib/generators/maquina/clave/templates/app/views/sessions/new.html.erb.tt +39 -0
- data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.html.erb.tt +37 -0
- data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.text.erb.tt +11 -0
- data/lib/generators/maquina/clave/templates/config/locales/clave.en.yml +101 -0
- data/lib/generators/maquina/clave/templates/config/locales/clave.es.yml +101 -0
- data/lib/generators/maquina/clave/templates/migration_create_email_verifications.rb.tt +17 -0
- data/lib/generators/maquina/clave/templates/migration_create_sessions.rb.tt +12 -0
- data/lib/generators/maquina/clave/templates/migration_create_users.rb.tt +16 -0
- data/lib/generators/maquina/clave/templates/test/test_helpers/session_test_helper.rb.tt +19 -0
- data/lib/generators/maquina/mission_control_jobs/USAGE +14 -0
- data/lib/generators/maquina/mission_control_jobs/mission_control_jobs_generator.rb +75 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/controllers/backstage_controller.rb.tt +4 -0
- data/lib/generators/maquina/mission_control_jobs/templates/config/initializers/mission_control.rb.tt +10 -0
- data/lib/generators/maquina/solid_errors/USAGE +15 -0
- data/lib/generators/maquina/solid_errors/solid_errors_generator.rb +85 -0
- data/lib/generators/maquina/solid_errors/templates/app/controllers/backstage_controller.rb.tt +4 -0
- data/lib/generators/maquina/solid_errors/templates/config/initializers/solid_errors.rb.tt +10 -0
- data/lib/maquina_generators/version.rb +3 -0
- data/lib/maquina_generators.rb +1 -0
- data/test/generators/maquina/clave_generator_test.rb +187 -0
- data/test/generators/maquina/mission_control_jobs_generator_test.rb +97 -0
- data/test/generators/maquina/solid_errors_generator_test.rb +97 -0
- data/test/test_helper.rb +7 -0
- data/test/tmp/Gemfile +3 -0
- data/test/tmp/app/controllers/backstage_controller.rb +4 -0
- data/test/tmp/config/initializers/solid_errors.rb +10 -0
- data/test/tmp/config/routes.rb +3 -0
- metadata +134 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
es:
|
|
2
|
+
flash:
|
|
3
|
+
sessions:
|
|
4
|
+
create:
|
|
5
|
+
success: "Has iniciado sesion correctamente."
|
|
6
|
+
destroy:
|
|
7
|
+
success: "Has cerrado sesion correctamente."
|
|
8
|
+
code_sent: "Te enviamos un codigo de verificacion."
|
|
9
|
+
invalid_code: "El codigo es incorrecto. Por favor, intenta de nuevo."
|
|
10
|
+
code_expired: "El codigo ha expirado. Solicita uno nuevo."
|
|
11
|
+
code_resent: "Te enviamos un nuevo codigo."
|
|
12
|
+
cooldown: "Debes esperar %{minutes} minutos antes de solicitar otro codigo."
|
|
13
|
+
code_already_sent: "Ya te enviamos un codigo. Revisa tu correo (incluyendo spam). Podras solicitar uno nuevo en %{minutes} minutos."
|
|
14
|
+
registrations:
|
|
15
|
+
create:
|
|
16
|
+
success: "Tu cuenta ha sido creada. Bienvenido!"
|
|
17
|
+
code_sent: "Te enviamos un codigo de verificacion a tu correo."
|
|
18
|
+
email_plus_not_allowed: "No se permiten correos con '+'. Usa tu direccion principal sin alias."
|
|
19
|
+
email_taken: "Ya existe una cuenta con este correo. Quieres iniciar sesion?"
|
|
20
|
+
invalid_code: "El codigo es incorrecto. Por favor, intenta de nuevo."
|
|
21
|
+
code_expired: "El codigo ha expirado. Solicita uno nuevo."
|
|
22
|
+
code_resent: "Te enviamos un nuevo codigo."
|
|
23
|
+
cooldown: "Debes esperar %{minutes} minutos antes de solicitar otro codigo."
|
|
24
|
+
code_already_sent: "Ya te enviamos un codigo. Revisa tu correo (incluyendo spam). Podras solicitar uno nuevo en %{minutes} minutos."
|
|
25
|
+
general:
|
|
26
|
+
unauthorized: "Debes iniciar sesion para acceder a esta pagina."
|
|
27
|
+
forbidden: "No tienes permiso para realizar esta accion."
|
|
28
|
+
not_found: "El recurso que buscas no existe."
|
|
29
|
+
rate_limited: "Demasiados intentos. Por favor, espera unos minutos e intenta de nuevo."
|
|
30
|
+
|
|
31
|
+
sessions:
|
|
32
|
+
new:
|
|
33
|
+
title: "Iniciar sesion"
|
|
34
|
+
email: "Correo electronico"
|
|
35
|
+
email_placeholder: "tu@correo.com"
|
|
36
|
+
email_instructions: "Ingresa tu correo y te enviaremos un codigo de 6 digitos."
|
|
37
|
+
spam_note: "Revisa tu carpeta de spam si no recibes el correo."
|
|
38
|
+
submit: "Enviar codigo"
|
|
39
|
+
no_account: "No tienes cuenta?"
|
|
40
|
+
sign_up: "Registrate"
|
|
41
|
+
|
|
42
|
+
session:
|
|
43
|
+
verifications:
|
|
44
|
+
new:
|
|
45
|
+
title: "Verifica tu identidad"
|
|
46
|
+
sent_to: "Si tienes cuenta, enviamos un codigo a %{email}"
|
|
47
|
+
enter_code: "Ingresa el codigo"
|
|
48
|
+
submit: "Iniciar sesion"
|
|
49
|
+
check_spam: "Revisa tu carpeta de spam."
|
|
50
|
+
didnt_receive: "No recibiste el codigo?"
|
|
51
|
+
resend: "Reenviar codigo"
|
|
52
|
+
|
|
53
|
+
registrations:
|
|
54
|
+
new:
|
|
55
|
+
title: "Crear cuenta"
|
|
56
|
+
email: "Correo electronico"
|
|
57
|
+
email_placeholder: "tu@correo.com"
|
|
58
|
+
email_instructions: "Ingresa tu correo electronico. Te enviaremos un codigo de 6 digitos para verificar tu cuenta."
|
|
59
|
+
spam_note: "Revisa tu carpeta de spam si no recibes el correo."
|
|
60
|
+
submit: "Enviar codigo"
|
|
61
|
+
have_account: "Ya tienes cuenta?"
|
|
62
|
+
sign_in: "Inicia sesion"
|
|
63
|
+
|
|
64
|
+
registration:
|
|
65
|
+
verifications:
|
|
66
|
+
new:
|
|
67
|
+
title: "Verifica tu correo"
|
|
68
|
+
sent_to: "Enviamos un codigo de 6 digitos a %{email}"
|
|
69
|
+
enter_code: "Ingresa el codigo"
|
|
70
|
+
submit: "Verificar"
|
|
71
|
+
check_spam: "Revisa tu carpeta de spam si no lo recibes."
|
|
72
|
+
didnt_receive: "No recibiste el codigo?"
|
|
73
|
+
resend: "Reenviar codigo"
|
|
74
|
+
|
|
75
|
+
verification_mailer:
|
|
76
|
+
verification_code:
|
|
77
|
+
subject: "Tu codigo de verificacion"
|
|
78
|
+
title: "Codigo de verificacion"
|
|
79
|
+
instructions: "Ingresa este codigo para continuar:"
|
|
80
|
+
expires_in: "Este codigo expira en 15 minutos."
|
|
81
|
+
ignore_if_not_you: "Si no solicitaste este codigo, puedes ignorar este correo."
|
|
82
|
+
|
|
83
|
+
activerecord:
|
|
84
|
+
models:
|
|
85
|
+
user:
|
|
86
|
+
one: "Usuario"
|
|
87
|
+
other: "Usuarios"
|
|
88
|
+
attributes:
|
|
89
|
+
user:
|
|
90
|
+
email_address: "Correo electronico"
|
|
91
|
+
name: "Nombre"
|
|
92
|
+
password: "Contrasena"
|
|
93
|
+
locale: "Idioma"
|
|
94
|
+
blocked_at: "Bloqueado en"
|
|
95
|
+
blocked_reason: "Razon de bloqueo"
|
|
96
|
+
errors:
|
|
97
|
+
models:
|
|
98
|
+
user:
|
|
99
|
+
attributes:
|
|
100
|
+
email_address:
|
|
101
|
+
plus_not_allowed: "No se permiten direcciones con '+'. Por favor, usa tu correo principal sin alias."
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class CreateEmailVerifications < ActiveRecord::Migration<%= migration_version %>
|
|
2
|
+
def change
|
|
3
|
+
create_table :email_verifications do |t|
|
|
4
|
+
t.string :email, null: false
|
|
5
|
+
t.string :code, null: false
|
|
6
|
+
t.string :verification_type, null: false
|
|
7
|
+
t.datetime :expires_at, null: false
|
|
8
|
+
t.datetime :verified_at
|
|
9
|
+
t.integer :attempts, default: 0
|
|
10
|
+
t.string :locale
|
|
11
|
+
|
|
12
|
+
t.timestamps
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
add_index :email_verifications, [:email, :created_at]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class CreateSessions < ActiveRecord::Migration<%= migration_version %>
|
|
2
|
+
def change
|
|
3
|
+
create_table :sessions do |t|
|
|
4
|
+
t.references :user, null: false, foreign_key: true
|
|
5
|
+
t.string :ip_address
|
|
6
|
+
t.string :user_agent
|
|
7
|
+
t.datetime :expires_at
|
|
8
|
+
|
|
9
|
+
t.timestamps
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration<%= migration_version %>
|
|
2
|
+
def change
|
|
3
|
+
create_table :users do |t|
|
|
4
|
+
t.string :email_address, null: false
|
|
5
|
+
t.string :password_digest, null: false
|
|
6
|
+
t.string :name
|
|
7
|
+
t.string :locale
|
|
8
|
+
t.datetime :blocked_at
|
|
9
|
+
t.text :blocked_reason
|
|
10
|
+
|
|
11
|
+
t.timestamps
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
add_index :users, :email_address, unique: true
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module SessionTestHelper
|
|
2
|
+
def sign_in_as(user)
|
|
3
|
+
Current.session = user.sessions.create!
|
|
4
|
+
|
|
5
|
+
ActionDispatch::TestRequest.create.cookie_jar.tap do |cookie_jar|
|
|
6
|
+
cookie_jar.signed[:session_id] = Current.session.id
|
|
7
|
+
cookies["session_id"] = cookie_jar[:session_id]
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def sign_out
|
|
12
|
+
Current.session&.destroy!
|
|
13
|
+
cookies.delete("session_id")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
ActiveSupport.on_load(:action_dispatch_integration_test) do
|
|
18
|
+
include SessionTestHelper
|
|
19
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Installs Mission Control Jobs with HTTP authentication and engine mounting.
|
|
3
|
+
|
|
4
|
+
Generates an initializer, adds routes, and creates a BackstageController.
|
|
5
|
+
|
|
6
|
+
Authentication tries Rails credentials (backstage.username/password)
|
|
7
|
+
first, then falls back to environment variables.
|
|
8
|
+
|
|
9
|
+
Examples:
|
|
10
|
+
rails g maquina:mission_control_jobs --prefix /admin
|
|
11
|
+
|
|
12
|
+
rails g maquina:mission_control_jobs --prefix /backstage \
|
|
13
|
+
--user-env-var ADMIN_USER \
|
|
14
|
+
--password-env-var ADMIN_PASSWORD
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module Maquina
|
|
4
|
+
module Generators
|
|
5
|
+
class MissionControlJobsGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
|
7
|
+
|
|
8
|
+
class_option :prefix, type: :string, required: true,
|
|
9
|
+
desc: "Base path prefix (e.g. /admin)"
|
|
10
|
+
class_option :user_env_var, type: :string, default: "MISSION_CONTROL_JOBS_USER",
|
|
11
|
+
desc: "Environment variable for HTTP auth username"
|
|
12
|
+
class_option :password_env_var, type: :string, default: "MISSION_CONTROL_JOBS_PASSWORD",
|
|
13
|
+
desc: "Environment variable for HTTP auth password"
|
|
14
|
+
|
|
15
|
+
# 1. BackstageController
|
|
16
|
+
def create_backstage_controller
|
|
17
|
+
backstage_path = "app/controllers/backstage_controller.rb"
|
|
18
|
+
return if File.exist?(File.join(destination_root, backstage_path))
|
|
19
|
+
|
|
20
|
+
template "app/controllers/backstage_controller.rb.tt", backstage_path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# 2. Initializer
|
|
24
|
+
def create_initializer
|
|
25
|
+
template "config/initializers/mission_control.rb.tt",
|
|
26
|
+
"config/initializers/mission_control.rb"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# 3. Add gem to Gemfile
|
|
30
|
+
def add_gem
|
|
31
|
+
gemfile_path = File.join(destination_root, "Gemfile")
|
|
32
|
+
if File.exist?(gemfile_path)
|
|
33
|
+
content = File.read(gemfile_path)
|
|
34
|
+
unless content.include?('gem "mission_control-jobs"')
|
|
35
|
+
append_to_file "Gemfile", "\ngem \"mission_control-jobs\"\n"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# 4. Routes
|
|
41
|
+
def add_route
|
|
42
|
+
mount_path = "#{options[:prefix]}/mission_control_jobs"
|
|
43
|
+
|
|
44
|
+
route "mount MissionControl::Jobs::Engine, at: \"#{mount_path}\""
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# 5. Bundle install
|
|
48
|
+
def run_bundle_install
|
|
49
|
+
return unless rails_app?
|
|
50
|
+
|
|
51
|
+
run "bundle install", capture: true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# 6. Post-install message
|
|
55
|
+
def show_post_install
|
|
56
|
+
say ""
|
|
57
|
+
say "Mission Control Jobs has been installed!", :green
|
|
58
|
+
say ""
|
|
59
|
+
say "Configuration:", :yellow
|
|
60
|
+
say " - Set credentials: bin/rails credentials:edit"
|
|
61
|
+
say " backstage:"
|
|
62
|
+
say " username: your_user"
|
|
63
|
+
say " password: your_password"
|
|
64
|
+
say " - Or set ENV vars: #{options[:user_env_var]}, #{options[:password_env_var]}"
|
|
65
|
+
say ""
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def rails_app?
|
|
71
|
+
File.exist?(File.join(destination_root, "bin/rails"))
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
data/lib/generators/maquina/mission_control_jobs/templates/config/initializers/mission_control.rb.tt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Rails.application.configure do
|
|
4
|
+
config.mission_control.jobs.base_controller_class = "BackstageController"
|
|
5
|
+
|
|
6
|
+
backstage = Rails.application.credentials.backstage || {}
|
|
7
|
+
|
|
8
|
+
MissionControl::Jobs.http_basic_auth_user = backstage[:username] || ENV.fetch("<%= options[:user_env_var] %>", nil)
|
|
9
|
+
MissionControl::Jobs.http_basic_auth_password = backstage[:password] || ENV.fetch("<%= options[:password_env_var] %>", nil)
|
|
10
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Description:
|
|
2
|
+
Installs Solid Errors with HTTP authentication and engine mounting.
|
|
3
|
+
|
|
4
|
+
Generates an initializer, adds routes, creates a BackstageController,
|
|
5
|
+
and runs the solid_errors:install generator.
|
|
6
|
+
|
|
7
|
+
Authentication tries Rails credentials (backstage.username/password)
|
|
8
|
+
first, then falls back to environment variables.
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
rails g maquina:solid_errors --prefix /admin
|
|
12
|
+
|
|
13
|
+
rails g maquina:solid_errors --prefix /backstage \
|
|
14
|
+
--user-env-var ADMIN_USER \
|
|
15
|
+
--password-env-var ADMIN_PASSWORD
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module Maquina
|
|
4
|
+
module Generators
|
|
5
|
+
class SolidErrorsGenerator < Rails::Generators::Base
|
|
6
|
+
source_root File.expand_path("templates", __dir__)
|
|
7
|
+
|
|
8
|
+
class_option :prefix, type: :string, required: true,
|
|
9
|
+
desc: "Base path prefix (e.g. /admin)"
|
|
10
|
+
class_option :user_env_var, type: :string, default: "SOLID_ERRORS_USER",
|
|
11
|
+
desc: "Environment variable for HTTP auth username"
|
|
12
|
+
class_option :password_env_var, type: :string, default: "SOLID_ERRORS_PASSWORD",
|
|
13
|
+
desc: "Environment variable for HTTP auth password"
|
|
14
|
+
|
|
15
|
+
# 1. BackstageController
|
|
16
|
+
def create_backstage_controller
|
|
17
|
+
backstage_path = "app/controllers/backstage_controller.rb"
|
|
18
|
+
return if File.exist?(File.join(destination_root, backstage_path))
|
|
19
|
+
|
|
20
|
+
template "app/controllers/backstage_controller.rb.tt", backstage_path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# 2. Initializer
|
|
24
|
+
def create_initializer
|
|
25
|
+
template "config/initializers/solid_errors.rb.tt",
|
|
26
|
+
"config/initializers/solid_errors.rb"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# 3. Add gem to Gemfile
|
|
30
|
+
def add_gem
|
|
31
|
+
gemfile_path = File.join(destination_root, "Gemfile")
|
|
32
|
+
if File.exist?(gemfile_path)
|
|
33
|
+
content = File.read(gemfile_path)
|
|
34
|
+
unless content.include?('gem "solid_errors"')
|
|
35
|
+
append_to_file "Gemfile", "\ngem \"solid_errors\"\n"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# 4. Routes
|
|
41
|
+
def add_route
|
|
42
|
+
mount_path = "#{options[:prefix]}/solid_errors"
|
|
43
|
+
|
|
44
|
+
route "mount SolidErrors::Engine, at: \"#{mount_path}\""
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# 5. Bundle install
|
|
48
|
+
def run_bundle_install
|
|
49
|
+
return unless rails_app?
|
|
50
|
+
|
|
51
|
+
run "bundle install", capture: true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# 6. Run solid_errors:install
|
|
55
|
+
def run_gem_install
|
|
56
|
+
return unless rails_app?
|
|
57
|
+
|
|
58
|
+
run "bin/rails generate solid_errors:install", capture: true
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# 7. Post-install message
|
|
62
|
+
def show_post_install
|
|
63
|
+
say ""
|
|
64
|
+
say "Solid Errors has been installed!", :green
|
|
65
|
+
say ""
|
|
66
|
+
say "Next steps:", :yellow
|
|
67
|
+
say " 1. bin/rails db:migrate"
|
|
68
|
+
say ""
|
|
69
|
+
say "Configuration:", :yellow
|
|
70
|
+
say " - Set credentials: bin/rails credentials:edit"
|
|
71
|
+
say " backstage:"
|
|
72
|
+
say " username: your_user"
|
|
73
|
+
say " password: your_password"
|
|
74
|
+
say " - Or set ENV vars: #{options[:user_env_var]}, #{options[:password_env_var]}"
|
|
75
|
+
say ""
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def rails_app?
|
|
81
|
+
File.exist?(File.join(destination_root, "bin/rails"))
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Rails.application.configure do
|
|
4
|
+
config.solid_errors.connects_to = { database: { writing: :errors } }
|
|
5
|
+
|
|
6
|
+
backstage = Rails.application.credentials.backstage || {}
|
|
7
|
+
|
|
8
|
+
config.solid_errors.username = backstage[:username] || ENV.fetch("<%= options[:user_env_var] %>", nil)
|
|
9
|
+
config.solid_errors.password = backstage[:password] || ENV.fetch("<%= options[:password_env_var] %>", nil)
|
|
10
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require_relative "maquina_generators/version"
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
require "generators/maquina/clave/clave_generator"
|
|
3
|
+
|
|
4
|
+
class Maquina::Generators::ClaveGeneratorTest < Rails::Generators::TestCase
|
|
5
|
+
tests Maquina::Generators::ClaveGenerator
|
|
6
|
+
destination File.expand_path("../../tmp", __dir__)
|
|
7
|
+
|
|
8
|
+
setup do
|
|
9
|
+
prepare_destination
|
|
10
|
+
|
|
11
|
+
# Create a minimal Rails app structure
|
|
12
|
+
mkdir_p("app/controllers")
|
|
13
|
+
File.write(
|
|
14
|
+
File.join(destination_root, "app/controllers/application_controller.rb"),
|
|
15
|
+
"class ApplicationController < ActionController::Base\nend\n"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
mkdir_p("config")
|
|
19
|
+
File.write(
|
|
20
|
+
File.join(destination_root, "config/routes.rb"),
|
|
21
|
+
"Rails.application.routes.draw do\nend\n"
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
File.write(
|
|
25
|
+
File.join(destination_root, "Gemfile"),
|
|
26
|
+
"source \"https://rubygems.org\"\n# gem \"bcrypt\"\n"
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
test "generates model files" do
|
|
31
|
+
run_generator
|
|
32
|
+
|
|
33
|
+
assert_file "app/models/current.rb", /class Current < ActiveSupport::CurrentAttributes/
|
|
34
|
+
assert_file "app/models/session.rb", /class Session < ApplicationRecord/
|
|
35
|
+
assert_file "app/models/email_verification.rb", /class EmailVerification < ApplicationRecord/
|
|
36
|
+
assert_file "app/models/user.rb", /class User < ApplicationRecord/
|
|
37
|
+
assert_file "app/models/user.rb", /has_secure_password/
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "generates controller files" do
|
|
41
|
+
run_generator
|
|
42
|
+
|
|
43
|
+
assert_file "app/controllers/concerns/authentication.rb", /module Authentication/
|
|
44
|
+
assert_file "app/controllers/sessions_controller.rb", /class SessionsController/
|
|
45
|
+
assert_file "app/controllers/session/verifications_controller.rb"
|
|
46
|
+
assert_file "app/controllers/session/verification_resends_controller.rb"
|
|
47
|
+
assert_file "app/controllers/registrations_controller.rb"
|
|
48
|
+
assert_file "app/controllers/registration/verifications_controller.rb"
|
|
49
|
+
assert_file "app/controllers/registration/verification_resends_controller.rb"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "generates mailer" do
|
|
53
|
+
run_generator
|
|
54
|
+
|
|
55
|
+
assert_file "app/mailers/verification_mailer.rb", /class VerificationMailer/
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test "generates helper" do
|
|
59
|
+
run_generator
|
|
60
|
+
|
|
61
|
+
assert_file "app/helpers/authentication_helper.rb", /module AuthenticationHelper/
|
|
62
|
+
assert_file "app/helpers/authentication_helper.rb", /def mask_email/
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
test "generates job" do
|
|
66
|
+
run_generator
|
|
67
|
+
|
|
68
|
+
assert_file "app/jobs/authentication_cleanup_job.rb", /class AuthenticationCleanupJob/
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
test "generates views" do
|
|
72
|
+
run_generator
|
|
73
|
+
|
|
74
|
+
assert_file "app/views/sessions/new.html.erb"
|
|
75
|
+
assert_file "app/views/session/verifications/new.html.erb"
|
|
76
|
+
assert_file "app/views/registrations/new.html.erb"
|
|
77
|
+
assert_file "app/views/registration/verifications/new.html.erb"
|
|
78
|
+
assert_file "app/views/verification_mailer/verification_code.html.erb"
|
|
79
|
+
assert_file "app/views/verification_mailer/verification_code.text.erb"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
test "generates locale files" do
|
|
83
|
+
run_generator
|
|
84
|
+
|
|
85
|
+
assert_file "config/locales/clave.en.yml", /sessions/
|
|
86
|
+
assert_file "config/locales/clave.es.yml", /sessions/
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
test "generates test helper" do
|
|
90
|
+
run_generator
|
|
91
|
+
|
|
92
|
+
assert_file "test/test_helpers/session_test_helper.rb", /module SessionTestHelper/
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
test "injects authentication into application controller" do
|
|
96
|
+
run_generator
|
|
97
|
+
|
|
98
|
+
assert_file "app/controllers/application_controller.rb", /include Authentication/
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
test "adds routes" do
|
|
102
|
+
run_generator
|
|
103
|
+
|
|
104
|
+
assert_file "config/routes.rb", /resource :session/
|
|
105
|
+
assert_file "config/routes.rb", /resource :registration/
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
test "enables bcrypt" do
|
|
109
|
+
run_generator
|
|
110
|
+
|
|
111
|
+
assert_file "Gemfile", /^gem "bcrypt"/
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
test "generates migrations" do
|
|
115
|
+
run_generator
|
|
116
|
+
|
|
117
|
+
assert_migration "db/migrate/create_users.rb"
|
|
118
|
+
assert_migration "db/migrate/create_sessions.rb"
|
|
119
|
+
assert_migration "db/migrate/create_email_verifications.rb"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
test "skips views with --skip-views" do
|
|
123
|
+
run_generator %w[--skip-views]
|
|
124
|
+
|
|
125
|
+
assert_no_file "app/views/sessions/new.html.erb"
|
|
126
|
+
assert_no_file "app/views/registrations/new.html.erb"
|
|
127
|
+
# Models should still be generated
|
|
128
|
+
assert_file "app/models/user.rb"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
test "skips registration with --skip-registration" do
|
|
132
|
+
run_generator %w[--skip-registration]
|
|
133
|
+
|
|
134
|
+
assert_no_file "app/controllers/registrations_controller.rb"
|
|
135
|
+
assert_no_file "app/controllers/registration/verifications_controller.rb"
|
|
136
|
+
assert_no_file "app/controllers/registration/verification_resends_controller.rb"
|
|
137
|
+
assert_no_file "app/views/registrations/new.html.erb"
|
|
138
|
+
assert_no_file "app/views/registration/verifications/new.html.erb"
|
|
139
|
+
|
|
140
|
+
# Session should still be generated
|
|
141
|
+
assert_file "app/controllers/sessions_controller.rb"
|
|
142
|
+
assert_file "app/views/sessions/new.html.erb"
|
|
143
|
+
|
|
144
|
+
# Routes should not include registration
|
|
145
|
+
assert_file "config/routes.rb" do |routes|
|
|
146
|
+
assert_match(/resource :session/, routes)
|
|
147
|
+
assert_no_match(/resource :registration/, routes)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
test "authentication concern uses root_url" do
|
|
152
|
+
run_generator
|
|
153
|
+
|
|
154
|
+
assert_file "app/controllers/concerns/authentication.rb", /root_url/
|
|
155
|
+
assert_file "app/controllers/concerns/authentication.rb" do |content|
|
|
156
|
+
assert_no_match(/dashboard_url/, content)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
test "user model does not include resto-specific code" do
|
|
161
|
+
run_generator
|
|
162
|
+
|
|
163
|
+
assert_file "app/models/user.rb" do |content|
|
|
164
|
+
assert_no_match(/currency/, content)
|
|
165
|
+
assert_no_match(/timezone/, content)
|
|
166
|
+
assert_no_match(/settings/, content)
|
|
167
|
+
assert_no_match(/display_name/, content)
|
|
168
|
+
assert_no_match(/income_sources/, content)
|
|
169
|
+
assert_no_match(/transactions/, content)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
test "views use indigo instead of resto colors" do
|
|
174
|
+
run_generator
|
|
175
|
+
|
|
176
|
+
assert_file "app/views/sessions/new.html.erb" do |content|
|
|
177
|
+
assert_match(/indigo/, content)
|
|
178
|
+
assert_no_match(/resto/, content)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
def mkdir_p(path)
|
|
185
|
+
FileUtils.mkdir_p(File.join(destination_root, path))
|
|
186
|
+
end
|
|
187
|
+
end
|