maquina-generators 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +31 -20
- data/lib/generators/maquina/app/app_generator.rb +85 -31
- data/lib/generators/maquina/app/templates/.rubocop.yml +5 -0
- data/lib/generators/maquina/app/templates/.standard.yml +1 -0
- data/lib/generators/maquina/app/templates/Procfile.dev.tt +1 -0
- data/lib/generators/maquina/app/templates/README.md.erb +74 -8
- data/lib/generators/maquina/app/templates/app/views/home/index.html.erb +267 -3
- data/lib/generators/maquina/app/templates/config/database.yml.tt +78 -0
- data/lib/generators/maquina/clave/clave_generator.rb +24 -22
- data/lib/generators/maquina/clave/templates/app/controllers/registration/verifications_controller.rb.tt +0 -1
- data/lib/generators/maquina/clave/templates/app/models/user.rb.tt +0 -5
- data/lib/generators/maquina/clave/templates/app/views/registration/verifications/new.html.erb.tt +10 -9
- data/lib/generators/maquina/clave/templates/app/views/registrations/new.html.erb.tt +10 -9
- data/lib/generators/maquina/clave/templates/app/views/session/verifications/new.html.erb.tt +10 -9
- data/lib/generators/maquina/clave/templates/app/views/sessions/new.html.erb.tt +10 -9
- data/lib/generators/maquina/clave/templates/app/views/verification_mailer/verification_code.html.erb.tt +8 -8
- data/lib/generators/maquina/clave/templates/config/locales/clave.en.yml +0 -1
- data/lib/generators/maquina/clave/templates/config/locales/clave.es.yml +0 -1
- data/lib/generators/maquina/clave/templates/migration_create_users.rb.tt +0 -1
- data/lib/generators/maquina/mission_control_jobs/mission_control_jobs_generator.rb +51 -5
- data/lib/generators/maquina/mission_control_jobs/templates/app/controllers/backstage_controller.rb.tt +4 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/helpers/mission_control_helper.rb +24 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/_admin_navigation.html.erb.tt +28 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/_application_selection.html.erb +8 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/_navigation.html.erb +11 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application.html.erb +33 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application_selection/_applications.html.erb +17 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/layouts/mission_control/jobs/application_selection/_servers.html.erb +10 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_error_information.html.erb +35 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_filters.html.erb +55 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_general_information.html.erb +83 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_job.html.erb +18 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_jobs_page.html.erb +13 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_raw_data.html.erb +9 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_title.html.erb +20 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/_toolbar.html.erb +22 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/blocked/_actions.html.erb +5 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/blocked/_job.html.erb +13 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_actions.html.erb +9 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_backtrace_toggle.html.erb +11 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/failed/_job.html.erb +10 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/finished/_job.html.erb +7 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/in_progress/_job.html.erb +17 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/index.html.erb +35 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/scheduled/_actions.html.erb +9 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/scheduled/_job.html.erb +17 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/jobs/show.html.erb +35 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_actions.html.erb +15 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_job.html.erb +18 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_queue.html.erb +19 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/_queue_title.html.erb +14 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/index.html.erb +24 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/queues/show.html.erb +52 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_actions.html.erb +8 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_general_information.html.erb +45 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_recurring_task.html.erb +32 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/_title.html.erb +6 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/index.html.erb +27 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/recurring_tasks/show.html.erb +51 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_job.html.erb +29 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_jobs.html.erb +12 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/shared/_pagination_toolbar.html.erb +25 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_configuration.html.erb +9 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_raw_data.html.erb +9 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_title.html.erb +10 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_worker.html.erb +26 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/_workers_page.html.erb +13 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/index.html.erb +13 -0
- data/lib/generators/maquina/mission_control_jobs/templates/app/views/mission_control/jobs/workers/show.html.erb +54 -0
- data/lib/generators/maquina/rack_attack/rack_attack_generator.rb +5 -0
- data/lib/generators/maquina/registration/registration_generator.rb +33 -4
- data/lib/generators/maquina/registration/templates/app/views/registrations/new.html.erb.tt +20 -15
- data/lib/generators/maquina/registration/templates/app/views/sessions/new.html.erb.tt +12 -10
- data/lib/generators/maquina/solid_errors/solid_errors_generator.rb +39 -7
- data/lib/generators/maquina/solid_errors/templates/app/controllers/backstage_controller.rb.tt +4 -0
- data/lib/generators/maquina/solid_errors/templates/app/helpers/solid_errors_helper.rb +9 -0
- data/lib/generators/maquina/solid_errors/templates/app/javascript/controllers/backtrace_filter_controller.js +27 -0
- data/lib/generators/maquina/solid_errors/templates/app/javascript/controllers/clipboard_controller.js +36 -0
- data/lib/generators/maquina/solid_errors/templates/app/views/layouts/_admin_navigation.html.erb.tt +28 -0
- data/lib/generators/maquina/solid_errors/templates/app/views/layouts/solid_errors/application.html.erb +23 -0
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_actions.html.erb +16 -33
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_delete_button.html.erb +4 -18
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_error_card.html.erb +12 -55
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/_resolve_button.html.erb +5 -17
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/index.html.erb +21 -58
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_actions.html.erb +26 -53
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_error_details.html.erb +60 -97
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_header.html.erb +3 -17
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show/_properties.html.erb +50 -62
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/errors/show.html.erb +6 -6
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_backtrace_line.html.erb +2 -2
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_collection.html.erb +22 -66
- data/lib/generators/maquina/solid_errors/templates/app/views/solid_errors/occurrences/_occurrence.html.erb +24 -70
- data/lib/generators/maquina/solid_errors/templates/config/initializers/solid_errors.rb.tt +2 -0
- data/lib/generators/maquina/solid_queue/solid_queue_generator.rb +6 -1
- data/lib/generators/maquina/solid_queue/templates/config/solid_queue.yml +4 -0
- data/lib/maquina_generators/version.rb +1 -1
- data/test/generators/maquina/app_generator_test.rb +103 -22
- data/test/generators/maquina/clave_generator_test.rb +2 -9
- data/test/generators/maquina/mission_control_jobs_generator_test.rb +76 -2
- data/test/generators/maquina/registration_generator_test.rb +11 -5
- data/test/generators/maquina/solid_errors_generator_test.rb +64 -4
- data/test/generators/maquina/solid_queue_generator_test.rb +4 -0
- data/test/tmp/Gemfile +1 -1
- data/test/tmp/Procfile.dev +3 -0
- data/test/tmp/config/application.rb +12 -0
- data/test/tmp/config/solid_queue.yml +21 -0
- metadata +60 -6
- data/lib/generators/maquina/app/templates/bin/ci +0 -16
- data/lib/generators/maquina/app/templates/bin/setup.tt +0 -22
- data/test/tmp/app/controllers/backstage_controller.rb +0 -4
- data/test/tmp/config/initializers/solid_errors.rb +0 -10
- data/test/tmp/config/routes.rb +0 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a581a9d09b983644b89ffae641f2fe08678a6a6d0f71125937f05354624a4887
|
|
4
|
+
data.tar.gz: 1b002af208c383174877f552055e64435099709fbfd997d228aca8ec15df39aa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a7319c61cce5ffcef0376b918f4ff706170c678309f79814379a2ef89ffa15a77c71e9e369fda32168842c514cd1303403acf1a8542194fbd1394c0937f2cd3d
|
|
7
|
+
data.tar.gz: 17634bc69f8cb7acb1eb0b1a2ec28e79461daeb480ad869c41731c6c6334fcf4840574711e8ce4c75da459419b30a70f020a8cd053fc940f562276fc5acb44cf
|
data/README.md
CHANGED
|
@@ -36,7 +36,6 @@ rails g maquina:clave
|
|
|
36
36
|
Then:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
bundle install # Install bcrypt
|
|
40
39
|
rails db:migrate # Run migrations
|
|
41
40
|
```
|
|
42
41
|
|
|
@@ -84,6 +83,7 @@ rails g maquina:registration
|
|
|
84
83
|
Then:
|
|
85
84
|
|
|
86
85
|
```bash
|
|
86
|
+
bundle install # Install bcrypt
|
|
87
87
|
rails db:migrate # Run migrations
|
|
88
88
|
```
|
|
89
89
|
|
|
@@ -115,13 +115,16 @@ All generated code lives in your app -- edit it directly:
|
|
|
115
115
|
- **BackstageController:** Inherits from `ActionController::Base` (bypasses app's ApplicationController concerns)
|
|
116
116
|
- **Initializer:** Credentials-first auth with ENV variable fallback, database connection config
|
|
117
117
|
- **Route:** Mounts `SolidErrors::Engine` under a configurable prefix
|
|
118
|
-
- **
|
|
118
|
+
- **Admin navigation:** Shared navigation bar linking Solid Errors and Mission Control Jobs dashboards
|
|
119
|
+
- **Custom layout:** Tailwind-styled layout with admin navigation and toast flash messages
|
|
120
|
+
- **Stimulus controllers:** `clipboard_controller.js` and `backtrace_filter_controller.js`
|
|
121
|
+
- **Custom views:** Tailwind-styled views to override the gem defaults (included by default, use `--no-copy-views` to skip)
|
|
119
122
|
|
|
120
123
|
#### Usage
|
|
121
124
|
|
|
122
125
|
```bash
|
|
123
126
|
rails g maquina:solid_errors --prefix /admin
|
|
124
|
-
rails g maquina:solid_errors --prefix /admin --copy-views #
|
|
127
|
+
rails g maquina:solid_errors --prefix /admin --no-copy-views # Skip custom views
|
|
125
128
|
```
|
|
126
129
|
|
|
127
130
|
The generator automatically runs `bundle install`. After running, execute `bin/rails generate solid_errors:install` (decline the initializer overwrite to keep your config), then `bin/rails db:migrate`.
|
|
@@ -129,8 +132,8 @@ The generator automatically runs `bundle install`. After running, execute `bin/r
|
|
|
129
132
|
#### Options
|
|
130
133
|
|
|
131
134
|
```bash
|
|
132
|
-
rails g maquina:solid_errors --prefix /admin # Default
|
|
133
|
-
rails g maquina:solid_errors --prefix /admin --copy-views
|
|
135
|
+
rails g maquina:solid_errors --prefix /admin # Default (with custom views)
|
|
136
|
+
rails g maquina:solid_errors --prefix /admin --no-copy-views # Without custom views
|
|
134
137
|
rails g maquina:solid_errors --prefix /backstage \
|
|
135
138
|
--user-env-var ADMIN_USER --password-env-var ADMIN_PASSWORD # Custom env vars
|
|
136
139
|
```
|
|
@@ -150,14 +153,19 @@ Credentials are resolved in order:
|
|
|
150
153
|
|
|
151
154
|
#### What it generates
|
|
152
155
|
|
|
153
|
-
- **BackstageController:** Inherits from `ActionController::Base` (bypasses app's ApplicationController concerns)
|
|
156
|
+
- **BackstageController:** Inherits from `ActionController::Base` with maquina_components helpers (bypasses app's ApplicationController concerns)
|
|
157
|
+
- **Helper:** `MissionControlHelper` with `job_status_badge_variant` and `nav_icon_for_section`
|
|
154
158
|
- **Initializer:** Sets base controller class, credentials-first auth with ENV variable fallback
|
|
155
159
|
- **Route:** Mounts `MissionControl::Jobs::Engine` under a configurable prefix
|
|
160
|
+
- **Admin navigation:** Shared navigation bar linking Solid Errors and Mission Control Jobs dashboards
|
|
161
|
+
- **Custom layout:** Tailwind-styled layout with admin navigation, toast flash messages, application/server selection, and tab navigation
|
|
162
|
+
- **Custom views:** Tailwind-styled views for jobs, queues, workers, and recurring tasks (included by default, use `--no-copy-views` to skip)
|
|
156
163
|
|
|
157
164
|
#### Usage
|
|
158
165
|
|
|
159
166
|
```bash
|
|
160
167
|
rails g maquina:mission_control_jobs --prefix /admin
|
|
168
|
+
rails g maquina:mission_control_jobs --prefix /admin --no-copy-views # Skip custom views
|
|
161
169
|
```
|
|
162
170
|
|
|
163
171
|
The generator automatically runs `bundle install`.
|
|
@@ -165,7 +173,8 @@ The generator automatically runs `bundle install`.
|
|
|
165
173
|
#### Options
|
|
166
174
|
|
|
167
175
|
```bash
|
|
168
|
-
rails g maquina:mission_control_jobs --prefix /admin # Default
|
|
176
|
+
rails g maquina:mission_control_jobs --prefix /admin # Default (with custom views)
|
|
177
|
+
rails g maquina:mission_control_jobs --prefix /admin --no-copy-views # Without custom views
|
|
169
178
|
rails g maquina:mission_control_jobs --prefix /backstage \
|
|
170
179
|
--user-env-var ADMIN_USER --password-env-var ADMIN_PASSWORD # Custom env vars
|
|
171
180
|
```
|
|
@@ -240,19 +249,23 @@ Customize rules in `config/initializers/rack_attack.rb`.
|
|
|
240
249
|
|
|
241
250
|
#### What it does
|
|
242
251
|
|
|
243
|
-
1. Adds development, runtime, and production gems (brakeman, standard, rails-i18n,
|
|
252
|
+
1. Adds development, runtime, and production gems (brakeman, standard, rails-i18n, maquina-components, aws-sdk-s3, etc.)
|
|
244
253
|
2. Creates `Procfile.dev`
|
|
245
254
|
3. Creates `.rubocop.yml`, `.standard.yml`, appends to `.gitignore`
|
|
246
|
-
4. Creates `
|
|
247
|
-
5.
|
|
248
|
-
6. Configures
|
|
249
|
-
7.
|
|
250
|
-
8.
|
|
251
|
-
9.
|
|
252
|
-
10.
|
|
253
|
-
11. Invokes sub-generators: `maquina:rack_attack`, `maquina:
|
|
254
|
-
12.
|
|
255
|
-
13.
|
|
255
|
+
4. Creates `config/initializers/generators.rb`
|
|
256
|
+
5. Configures development (letter_opener) and production (APPLICATION_HOST) environments
|
|
257
|
+
6. Configures `field_error_proc` and Solid Queue in `application.rb`
|
|
258
|
+
7. Installs Action Text and Active Storage
|
|
259
|
+
8. Sets up ActiveStorage JavaScript imports
|
|
260
|
+
9. Adds turbo morphing, `yield :head`, and simplifies `<main>` tag in layout
|
|
261
|
+
10. Optionally installs authentication (`maquina:clave` or `maquina:registration`)
|
|
262
|
+
11. Invokes sub-generators: `maquina:rack_attack`, `maquina:mission_control_jobs`, `maquina:solid_errors`
|
|
263
|
+
12. Runs external installers: `solid_queue:install`, `solid_errors:install`, `solid_cache:install`, `solid_cable:install`, `maquina_components:install`
|
|
264
|
+
13. Restores custom layouts overwritten by gem installers
|
|
265
|
+
14. Configures multi-database `database.yml` (primary, queue, cache, cable, errors)
|
|
266
|
+
15. Creates a HomeController with root route
|
|
267
|
+
16. Generates a README and `database.yml.example`
|
|
268
|
+
17. Runs `db:prepare`
|
|
256
269
|
|
|
257
270
|
#### Usage
|
|
258
271
|
|
|
@@ -271,8 +284,6 @@ rails g maquina:app --auth registration
|
|
|
271
284
|
#### After running
|
|
272
285
|
|
|
273
286
|
```bash
|
|
274
|
-
bin/rails generate solid_errors:install # decline initializer overwrite
|
|
275
|
-
bin/rails db:migrate
|
|
276
287
|
bin/rails credentials:edit # set backstage username/password
|
|
277
288
|
bin/dev
|
|
278
289
|
```
|
|
@@ -19,10 +19,15 @@ module Maquina
|
|
|
19
19
|
|
|
20
20
|
content = File.read(gemfile_path)
|
|
21
21
|
|
|
22
|
+
remove_gems = ["rubocop-rails-omakase"]
|
|
22
23
|
dev_gems = {"brakeman" => nil, "bundle-audit" => nil, "letter_opener" => nil, "standard" => nil}
|
|
23
|
-
runtime_gems = {"rails-i18n" => nil, "
|
|
24
|
+
runtime_gems = {"rails-i18n" => nil, "maquina-components" => nil}
|
|
24
25
|
production_gems = {"aws-sdk-s3" => nil}
|
|
25
26
|
|
|
27
|
+
remove_gems.each do |gem_name|
|
|
28
|
+
gsub_file "Gemfile", /^\s*gem\s+["']#{gem_name}["'].*\n/, ""
|
|
29
|
+
end
|
|
30
|
+
|
|
26
31
|
dev_gems.each do |gem_name, _|
|
|
27
32
|
unless content.include?("gem \"#{gem_name}\"")
|
|
28
33
|
append_to_file "Gemfile", "\ngem \"#{gem_name}\", group: :development\n"
|
|
@@ -67,15 +72,7 @@ module Maquina
|
|
|
67
72
|
end
|
|
68
73
|
end
|
|
69
74
|
|
|
70
|
-
# 4.
|
|
71
|
-
def create_scripts
|
|
72
|
-
template "bin/setup.tt", "bin/setup"
|
|
73
|
-
copy_file "bin/ci", "bin/ci"
|
|
74
|
-
chmod "bin/setup", 0o755
|
|
75
|
-
chmod "bin/ci", 0o755
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# 5. Initializers
|
|
75
|
+
# 4. Initializers
|
|
79
76
|
def create_initializers
|
|
80
77
|
copy_file "config/initializers/generators.rb",
|
|
81
78
|
"config/initializers/generators.rb"
|
|
@@ -104,6 +101,18 @@ module Maquina
|
|
|
104
101
|
RUBY
|
|
105
102
|
end
|
|
106
103
|
end
|
|
104
|
+
|
|
105
|
+
unless content.include?("solid_queue")
|
|
106
|
+
inject_into_file "config/application.rb",
|
|
107
|
+
after: /class Application < Rails::Application\n/ do
|
|
108
|
+
<<~RUBY.indent(4)
|
|
109
|
+
|
|
110
|
+
# Use Solid Queue as the Active Job backend in all environments except test
|
|
111
|
+
config.active_job.queue_adapter = :solid_queue unless Rails.env.test?
|
|
112
|
+
config.solid_queue.connects_to = {database: {writing: :queue}}
|
|
113
|
+
RUBY
|
|
114
|
+
end
|
|
115
|
+
end
|
|
107
116
|
end
|
|
108
117
|
|
|
109
118
|
# 8. Install Rails features
|
|
@@ -113,7 +122,6 @@ module Maquina
|
|
|
113
122
|
Bundler.with_unbundled_env do
|
|
114
123
|
system("bin/rails action_text:install", chdir: destination_root)
|
|
115
124
|
system("bin/rails active_storage:install", chdir: destination_root)
|
|
116
|
-
system("bin/rails db:migrate", chdir: destination_root)
|
|
117
125
|
end
|
|
118
126
|
end
|
|
119
127
|
|
|
@@ -161,6 +169,12 @@ module Maquina
|
|
|
161
169
|
"<body>",
|
|
162
170
|
'<body data-turbo-refresh-method="morph" data-turbo-refresh-scroll="preserve">'
|
|
163
171
|
end
|
|
172
|
+
|
|
173
|
+
if content.include?('class="container mx-auto mt-28 px-5 flex"')
|
|
174
|
+
gsub_file "app/views/layouts/application.html.erb",
|
|
175
|
+
'<main class="container mx-auto mt-28 px-5 flex">',
|
|
176
|
+
"<main>"
|
|
177
|
+
end
|
|
164
178
|
end
|
|
165
179
|
|
|
166
180
|
# 11. Install authentication
|
|
@@ -169,9 +183,9 @@ module Maquina
|
|
|
169
183
|
|
|
170
184
|
case options[:auth]
|
|
171
185
|
when "clave"
|
|
172
|
-
generate "maquina:clave"
|
|
186
|
+
generate "maquina:clave", "--quiet"
|
|
173
187
|
when "registration"
|
|
174
|
-
generate "maquina:registration"
|
|
188
|
+
generate "maquina:registration", "--quiet"
|
|
175
189
|
end
|
|
176
190
|
end
|
|
177
191
|
|
|
@@ -179,17 +193,40 @@ module Maquina
|
|
|
179
193
|
def install_maquina_generators
|
|
180
194
|
return unless rails_app?
|
|
181
195
|
|
|
182
|
-
generate "maquina:rack_attack"
|
|
183
|
-
generate "maquina:
|
|
184
|
-
generate "maquina:
|
|
185
|
-
generate "maquina:solid_errors", "--prefix", options[:prefix]
|
|
196
|
+
generate "maquina:rack_attack", "--quiet"
|
|
197
|
+
generate "maquina:mission_control_jobs", "--prefix", options[:prefix], "--quiet"
|
|
198
|
+
generate "maquina:solid_errors", "--prefix", options[:prefix], "--quiet"
|
|
186
199
|
|
|
187
200
|
Bundler.with_unbundled_env do
|
|
188
|
-
system("bin/rails
|
|
201
|
+
system("bin/rails generate solid_queue:install", chdir: destination_root)
|
|
202
|
+
system("bin/rails generate solid_errors:install", chdir: destination_root)
|
|
203
|
+
system("bin/rails generate solid_cache:install", chdir: destination_root)
|
|
204
|
+
system("bin/rails generate solid_cable:install", chdir: destination_root)
|
|
205
|
+
system("bin/rails generate maquina_components:install", chdir: destination_root)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
# 13. Restore custom layouts overwritten by gem installers
|
|
210
|
+
def restore_custom_layouts
|
|
211
|
+
return unless rails_app?
|
|
212
|
+
|
|
213
|
+
solid_errors_layout = File.expand_path(
|
|
214
|
+
"../solid_errors/templates/app/views/layouts/solid_errors/application.html.erb",
|
|
215
|
+
__dir__
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
if File.exist?(solid_errors_layout)
|
|
219
|
+
create_file "app/views/layouts/solid_errors/application.html.erb",
|
|
220
|
+
File.read(solid_errors_layout), force: true
|
|
189
221
|
end
|
|
190
222
|
end
|
|
191
223
|
|
|
192
|
-
#
|
|
224
|
+
# 14. Configure multiple databases (after installers so we overwrite their database.yml)
|
|
225
|
+
def configure_databases
|
|
226
|
+
template "config/database.yml.tt", "config/database.yml", force: true
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# 15. Create home page
|
|
193
230
|
def create_home_page
|
|
194
231
|
template "app/controllers/home_controller.rb",
|
|
195
232
|
"app/controllers/home_controller.rb"
|
|
@@ -199,18 +236,18 @@ module Maquina
|
|
|
199
236
|
route_file = File.join(destination_root, "config/routes.rb")
|
|
200
237
|
if File.exist?(route_file)
|
|
201
238
|
content = File.read(route_file)
|
|
202
|
-
unless content.
|
|
239
|
+
unless content.match?(/^\s*root\s/)
|
|
203
240
|
route 'root "home#index"'
|
|
204
241
|
end
|
|
205
242
|
end
|
|
206
243
|
end
|
|
207
244
|
|
|
208
|
-
#
|
|
245
|
+
# 16. Create README
|
|
209
246
|
def create_readme
|
|
210
247
|
template "README.md.erb", "README.md"
|
|
211
248
|
end
|
|
212
249
|
|
|
213
|
-
#
|
|
250
|
+
# 17. Create database.yml.example
|
|
214
251
|
def create_database_sample
|
|
215
252
|
db_config = File.join(destination_root, "config/database.yml")
|
|
216
253
|
if File.exist?(db_config)
|
|
@@ -218,26 +255,43 @@ module Maquina
|
|
|
218
255
|
end
|
|
219
256
|
end
|
|
220
257
|
|
|
221
|
-
#
|
|
258
|
+
# 18. Run all migrations
|
|
259
|
+
def run_migrations
|
|
260
|
+
return unless rails_app?
|
|
261
|
+
|
|
262
|
+
Bundler.with_unbundled_env do
|
|
263
|
+
system("bin/rails db:prepare", chdir: destination_root)
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# 19. Post-install message
|
|
222
268
|
def show_post_install
|
|
223
269
|
say ""
|
|
270
|
+
say "=" * 60, :green
|
|
224
271
|
say "Your Rails app is ready!", :green
|
|
272
|
+
say "=" * 60, :green
|
|
225
273
|
say ""
|
|
226
|
-
say "
|
|
227
|
-
say " 1. bin/rails
|
|
228
|
-
say " (decline initializer overwrite to keep your config)"
|
|
229
|
-
say " 2. bin/rails db:migrate"
|
|
230
|
-
say " 3. Set credentials: bin/rails credentials:edit"
|
|
274
|
+
say "Next steps:", :yellow
|
|
275
|
+
say " 1. Set credentials: bin/rails credentials:edit"
|
|
231
276
|
say " backstage:"
|
|
232
277
|
say " username: your_user"
|
|
233
278
|
say " password: your_password"
|
|
234
|
-
say "
|
|
279
|
+
say " 2. Start the app: bin/dev"
|
|
280
|
+
say ""
|
|
281
|
+
say "Installed components:", :yellow
|
|
282
|
+
say " - Rack::Attack: rate limiting and blocklists (config/initializers/rack_attack.rb)"
|
|
283
|
+
say " - Solid Queue: background jobs (config/solid_queue.yml)"
|
|
284
|
+
say " - Mission Control Jobs: job dashboard at #{options[:prefix]}/mission_control_jobs"
|
|
285
|
+
say " - Solid Errors: error tracking at #{options[:prefix]}/solid_errors"
|
|
286
|
+
say " - Maquina Components: UI components"
|
|
235
287
|
if options[:auth] != "none"
|
|
236
288
|
say ""
|
|
237
289
|
say "Authentication (#{options[:auth]}):", :yellow
|
|
238
|
-
say " - Run bin/rails db:migrate if you haven't already"
|
|
239
|
-
say " - Visit /registrations/new to sign up" if options[:auth] == "registration"
|
|
240
290
|
say " - Visit /session/new to sign in"
|
|
291
|
+
say " - Visit /registrations/new to sign up" if options[:auth] == "registration"
|
|
292
|
+
say " - Visit /registration/new to sign up" if options[:auth] == "clave"
|
|
293
|
+
say " - Customize: app/controllers/concerns/authentication.rb"
|
|
294
|
+
say " - Locales: config/locales/"
|
|
241
295
|
end
|
|
242
296
|
say ""
|
|
243
297
|
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruby_version: 3.2
|
|
@@ -1,32 +1,98 @@
|
|
|
1
1
|
# <%= File.basename(destination_root).titleize %>
|
|
2
2
|
|
|
3
|
+
Built with [maquina.app](https://maquina.app) — production-tested tools for developers who ship alone.
|
|
4
|
+
|
|
3
5
|
## Getting Started
|
|
4
6
|
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Ruby 3.2+
|
|
10
|
+
- Rails 8+
|
|
11
|
+
- PostgreSQL (or SQLite for development)
|
|
12
|
+
|
|
13
|
+
### Setup
|
|
14
|
+
|
|
5
15
|
```bash
|
|
6
|
-
bin/setup
|
|
7
|
-
bin/dev
|
|
16
|
+
bin/setup # Install dependencies and prepare databases
|
|
17
|
+
bin/dev # Start all processes (web, css, solid_queue)
|
|
8
18
|
```
|
|
9
19
|
|
|
10
|
-
|
|
20
|
+
Your app will be running at **http://localhost:<%= options[:port] %>**.
|
|
21
|
+
|
|
22
|
+
## What's Included
|
|
11
23
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
| Feature | Description |
|
|
25
|
+
|---------|-------------|
|
|
26
|
+
<% if options[:auth] != "none" -%>
|
|
27
|
+
| **Authentication** | <%= options[:auth] == "clave" ? "Clave passwordless email-code authentication" : "Registration-based email/password authentication" %> |
|
|
28
|
+
<% end -%>
|
|
29
|
+
| **Background Jobs** | Solid Queue with Mission Control Jobs dashboard |
|
|
30
|
+
| **Error Tracking** | Solid Errors with custom UI |
|
|
31
|
+
| **Rate Limiting** | Rack::Attack with sensible defaults |
|
|
32
|
+
| **UI Components** | Maquina Components (ERB partials + Tailwind + Stimulus) |
|
|
33
|
+
| **Caching** | Solid Cache |
|
|
34
|
+
| **WebSockets** | Solid Cable |
|
|
35
|
+
| **Rich Text** | Action Text |
|
|
36
|
+
| **File Storage** | Active Storage (S3-ready in production) |
|
|
37
|
+
| **Multi-database** | Separate databases for queue, cache, cable, and errors |
|
|
38
|
+
|
|
39
|
+
## Development URLs
|
|
40
|
+
|
|
41
|
+
| URL | Description |
|
|
42
|
+
|-----|-------------|
|
|
43
|
+
| http://localhost:<%= options[:port] %> | Application |
|
|
44
|
+
| http://localhost:<%= options[:port] %><%= options[:prefix] %>/mission_control_jobs | Jobs dashboard |
|
|
45
|
+
| http://localhost:<%= options[:port] %><%= options[:prefix] %>/solid_errors | Errors dashboard |
|
|
46
|
+
<% if options[:auth] != "none" -%>
|
|
47
|
+
| http://localhost:<%= options[:port] %>/session/new | Sign in |
|
|
48
|
+
<% if options[:auth] == "registration" -%>
|
|
49
|
+
| http://localhost:<%= options[:port] %>/registrations/new | Sign up |
|
|
50
|
+
<% elsif options[:auth] == "clave" -%>
|
|
51
|
+
| http://localhost:<%= options[:port] %>/registration/new | Sign up |
|
|
52
|
+
<% end -%>
|
|
53
|
+
<% end -%>
|
|
15
54
|
|
|
16
55
|
## Scripts
|
|
17
56
|
|
|
18
|
-
- `bin/setup` — Install dependencies and prepare
|
|
19
|
-
- `bin/ci` — Run full CI suite (lint, security, tests)
|
|
57
|
+
- `bin/setup` — Install dependencies and prepare databases
|
|
20
58
|
- `bin/dev` — Start all processes (web, css, solid_queue)
|
|
21
59
|
|
|
22
60
|
## Credentials
|
|
23
61
|
|
|
62
|
+
Edit credentials with:
|
|
63
|
+
|
|
24
64
|
```bash
|
|
25
65
|
bin/rails credentials:edit
|
|
26
66
|
```
|
|
27
67
|
|
|
68
|
+
Add backstage credentials for the jobs and errors dashboards:
|
|
69
|
+
|
|
28
70
|
```yaml
|
|
29
71
|
backstage:
|
|
30
72
|
username: your_user
|
|
31
73
|
password: your_password
|
|
32
74
|
```
|
|
75
|
+
|
|
76
|
+
## Maquina Ecosystem
|
|
77
|
+
|
|
78
|
+
### UI Components
|
|
79
|
+
|
|
80
|
+
[Maquina Components](https://maquina.app/documentation/components/) — a library of ERB partials, Tailwind CSS styles, and Stimulus controllers for building consistent, accessible UIs in Rails.
|
|
81
|
+
|
|
82
|
+
### AI Tools
|
|
83
|
+
|
|
84
|
+
Maquina provides a suite of AI-powered tools to accelerate your Rails development:
|
|
85
|
+
|
|
86
|
+
- **Rails MCP Server** — Model Context Protocol server for Rails applications
|
|
87
|
+
- **Rails Simplifier** — simplify and refine Rails code following 37signals patterns
|
|
88
|
+
- **Rails Upgrade Assistant** — comprehensive Rails upgrade reports and migration guides
|
|
89
|
+
- **Maquina UI Standards** — build consistent UIs using maquina_components
|
|
90
|
+
- **Neovim MCP Server** — MCP server for Neovim integration
|
|
91
|
+
|
|
92
|
+
Learn more at [maquina.app/documentation/ai-tools](https://maquina.app/documentation/ai-tools/).
|
|
93
|
+
|
|
94
|
+
## Learn More
|
|
95
|
+
|
|
96
|
+
Visit [maquina.app](https://maquina.app) for full documentation.
|
|
97
|
+
|
|
98
|
+
Maquina is built for the one-person framework philosophy: production-first, standard Rails, designed to scale with a small team.
|