develoz-rails 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/.github/workflows/ci.yml +31 -0
- data/.github/workflows/release.yml +459 -0
- data/.rubocop.yml +52 -0
- data/.sisyphus/notepads/develoz-rails-template/learnings.md +855 -0
- data/.tool-versions +2 -0
- data/CHANGELOG.md +28 -0
- data/CONTRIBUTING.md +120 -0
- data/README.md +76 -0
- data/Rakefile +18 -0
- data/config/generators.yml +105 -0
- data/docs/guide/installation.md +574 -0
- data/exe/develoz +6 -0
- data/install +98 -0
- data/lib/develoz/canonical_fetcher.rb +56 -0
- data/lib/develoz/cli.rb +84 -0
- data/lib/develoz/generators/base.rb +134 -0
- data/lib/develoz/manifest.rb +44 -0
- data/lib/develoz/options.rb +55 -0
- data/lib/develoz/version.rb +5 -0
- data/lib/develoz/version_resolver.rb +103 -0
- data/lib/develoz.rb +15 -0
- data/lib/generators/develoz/active_resource/active_resource_generator.rb +25 -0
- data/lib/generators/develoz/active_resource/templates/application_resource.rb.tt +7 -0
- data/lib/generators/develoz/active_resource/templates/example_resource.rb.tt +5 -0
- data/lib/generators/develoz/admin/admin_generator.rb +44 -0
- data/lib/generators/develoz/admin/templates/admin_base_controller.rb.tt +7 -0
- data/lib/generators/develoz/admin/templates/admin_layout.html.erb.tt +38 -0
- data/lib/generators/develoz/admin/templates/dashboard_controller.rb.tt +7 -0
- data/lib/generators/develoz/admin/templates/dashboard_index.html.erb.tt +2 -0
- data/lib/generators/develoz/admin/templates/routes.rb.tt +3 -0
- data/lib/generators/develoz/agents_docs/agents_docs_generator.rb +50 -0
- data/lib/generators/develoz/agents_docs/templates/.github/pull_request_template.md.tt +13 -0
- data/lib/generators/develoz/agents_docs/templates/AGENTS.md.tt +36 -0
- data/lib/generators/develoz/agents_docs/templates/docs/development.md.tt +121 -0
- data/lib/generators/develoz/agents_docs/templates/docs/performance.md.tt +46 -0
- data/lib/generators/develoz/agents_docs/templates/docs/testing.md.tt +92 -0
- data/lib/generators/develoz/agents_docs/templates/spec/cassettes/Example_API/fetches_data_from_an_external_API.yml.tt +23 -0
- data/lib/generators/develoz/agents_docs/templates/spec/requests/example_api_spec.rb.tt +14 -0
- data/lib/generators/develoz/agents_docs/templates/spec/support/faraday.rb.tt +19 -0
- data/lib/generators/develoz/agents_docs/templates/spec/support/vcr.rb.tt +11 -0
- data/lib/generators/develoz/api/api_generator.rb +55 -0
- data/lib/generators/develoz/api/templates/app/blueprints/example_blueprint.rb.tt +6 -0
- data/lib/generators/develoz/api/templates/app/controllers/api/v1/base_controller.rb.tt +96 -0
- data/lib/generators/develoz/api/templates/config/initializers/blueprinter.rb.tt +16 -0
- data/lib/generators/develoz/api/templates/config/initializers/rswag_api.rb.tt +15 -0
- data/lib/generators/develoz/api/templates/config/initializers/rswag_ui.rb.tt +17 -0
- data/lib/generators/develoz/api/templates/spec/requests/api/v1/examples_spec.rb.tt +25 -0
- data/lib/generators/develoz/auth/auth_generator.rb +82 -0
- data/lib/generators/develoz/auth/templates/app/controllers/concerns/authentication.rb.tt +53 -0
- data/lib/generators/develoz/auth/templates/app/controllers/passwords_controller.rb.tt +35 -0
- data/lib/generators/develoz/auth/templates/app/controllers/sessions_controller.rb.tt +22 -0
- data/lib/generators/develoz/auth/templates/app/mailers/passwords_mailer.rb.tt +8 -0
- data/lib/generators/develoz/auth/templates/app/models/current.rb.tt +5 -0
- data/lib/generators/develoz/auth/templates/app/models/user.rb.tt +7 -0
- data/lib/generators/develoz/auth/templates/app/views/passwords/edit.html.erb.tt +9 -0
- data/lib/generators/develoz/auth/templates/app/views/passwords_mailer/reset.html.erb.tt +6 -0
- data/lib/generators/develoz/auth/templates/app/views/sessions/new.html.erb.tt +11 -0
- data/lib/generators/develoz/auth/templates/db/migrate/create_users.rb.tt +13 -0
- data/lib/generators/develoz/auth/templates/spec/requests/passwords_spec.rb.tt +60 -0
- data/lib/generators/develoz/auth/templates/spec/requests/sessions_spec.rb.tt +37 -0
- data/lib/generators/develoz/ci/ci_generator.rb +66 -0
- data/lib/generators/develoz/ci/templates/.github/workflows/ci.yml.tt +18 -0
- data/lib/generators/develoz/ci/templates/.haml-lint.yml.tt +12 -0
- data/lib/generators/develoz/ci/templates/.markdownlint.json.tt +10 -0
- data/lib/generators/develoz/ci/templates/.reek.yml.tt +28 -0
- data/lib/generators/develoz/ci/templates/.rubocop.yml.tt +22 -0
- data/lib/generators/develoz/ci/templates/.stylelintrc.json.tt +4 -0
- data/lib/generators/develoz/ci/templates/.yamllint.tt +14 -0
- data/lib/generators/develoz/ci/templates/Rakefile.tt +73 -0
- data/lib/generators/develoz/ci/templates/bin/ci.tt +6 -0
- data/lib/generators/develoz/ci/templates/biome.json.tt +41 -0
- data/lib/generators/develoz/ci/templates/config/ci.rb.tt +23 -0
- data/lib/generators/develoz/concerns/concerns_generator.rb +48 -0
- data/lib/generators/develoz/concerns/templates/app/models/concerns/configurable.rb.tt +120 -0
- data/lib/generators/develoz/concerns/templates/app/models/concerns/optimized_finders.rb.tt +93 -0
- data/lib/generators/develoz/concerns/templates/app/models/concerns/searchable_concern.rb.tt +31 -0
- data/lib/generators/develoz/concerns/templates/app/models/concerns/transitionable.rb.tt +144 -0
- data/lib/generators/develoz/concerns/templates/app/models/configuration.rb.tt +104 -0
- data/lib/generators/develoz/concerns/templates/db/migrate/add_status_transitions.rb.tt +30 -0
- data/lib/generators/develoz/concerns/templates/db/migrate/create_configurations.rb.tt +25 -0
- data/lib/generators/develoz/concerns/templates/spec/models/concerns/configurable_spec.rb.tt +172 -0
- data/lib/generators/develoz/concerns/templates/spec/models/concerns/optimized_finders_spec.rb.tt +200 -0
- data/lib/generators/develoz/concerns/templates/spec/models/concerns/searchable_concern_spec.rb.tt +84 -0
- data/lib/generators/develoz/concerns/templates/spec/models/concerns/transitionable_spec.rb.tt +234 -0
- data/lib/generators/develoz/concerns/templates/spec/models/configuration_spec.rb.tt +223 -0
- data/lib/generators/develoz/database/database_generator.rb +44 -0
- data/lib/generators/develoz/database/templates/config/database.yml.tt +53 -0
- data/lib/generators/develoz/database/templates/config/initializers/pg_search.rb.tt +5 -0
- data/lib/generators/develoz/database/templates/db/migrate/create_pg_extensions.rb.tt +13 -0
- data/lib/generators/develoz/db_backup/db_backup_generator.rb +47 -0
- data/lib/generators/develoz/db_backup/templates/backup_rake.tt +48 -0
- data/lib/generators/develoz/db_backup/templates/bin_db_backup.tt +25 -0
- data/lib/generators/develoz/db_backup/templates/compose_service.tt +14 -0
- data/lib/generators/develoz/doc_specs/doc_specs_generator.rb +33 -0
- data/lib/generators/develoz/doc_specs/templates/bin/generate-docs.tt +392 -0
- data/lib/generators/develoz/doc_specs/templates/lib/tasks/docs_check.rake.tt +8 -0
- data/lib/generators/develoz/doc_specs/templates/spec/support/doc_screenshot_helper.rb.tt +17 -0
- data/lib/generators/develoz/doc_specs/templates/spec/system/example_doc_spec.rb.tt +38 -0
- data/lib/generators/develoz/docker/docker_generator.rb +54 -0
- data/lib/generators/develoz/docker/templates/bin_dev.tt +5 -0
- data/lib/generators/develoz/docker/templates/bin_docker_entrypoint.tt +8 -0
- data/lib/generators/develoz/docker/templates/bin_run.tt +152 -0
- data/lib/generators/develoz/docker/templates/bin_setup.tt +15 -0
- data/lib/generators/develoz/docker/templates/docker-compose.yml.tt +59 -0
- data/lib/generators/develoz/docker/templates/dockerfile_dev.tt +24 -0
- data/lib/generators/develoz/docs_render/docs_render_generator.rb +46 -0
- data/lib/generators/develoz/docs_render/templates/app/assets/stylesheets/documentation.scss.tt +145 -0
- data/lib/generators/develoz/docs_render/templates/app/controllers/docs_controller.rb.tt +7 -0
- data/lib/generators/develoz/docs_render/templates/app/javascript/docs.js.tt +15 -0
- data/lib/generators/develoz/docs_render/templates/app/models/document.rb.tt +189 -0
- data/lib/generators/develoz/docs_render/templates/app/views/docs/show.html.erb.tt +7 -0
- data/lib/generators/develoz/docs_render/templates/config/initializers/redcarpet_rouge.rb.tt +16 -0
- data/lib/generators/develoz/frontend_core/frontend_core_generator.rb +40 -0
- data/lib/generators/develoz/frontend_core/templates/.annotaterb.yml.tt +16 -0
- data/lib/generators/develoz/frontend_core/templates/config/importmap.rb.tt +12 -0
- data/lib/generators/develoz/frontend_core/templates/config/initializers/pagy.rb.tt +10 -0
- data/lib/generators/develoz/install/install_generator.rb +51 -0
- data/lib/generators/develoz/kamal/kamal_generator.rb +59 -0
- data/lib/generators/develoz/kamal/templates/accessories_postgres.yml.tt +14 -0
- data/lib/generators/develoz/kamal/templates/deploy.yml.tt +43 -0
- data/lib/generators/develoz/kamal/templates/dockerfile_prod.tt +54 -0
- data/lib/generators/develoz/kamal/templates/kamal_secrets.tt +22 -0
- data/lib/generators/develoz/maintenance/maintenance_generator.rb +29 -0
- data/lib/generators/develoz/maintenance/templates/app/tasks/maintenance/example_task.rb.tt +20 -0
- data/lib/generators/develoz/maintenance/templates/lib/tasks/maintenance_counters.rake.tt +27 -0
- data/lib/generators/develoz/push/push_generator.rb +61 -0
- data/lib/generators/develoz/push/templates/app/javascript/pwa/subscription.js.tt +57 -0
- data/lib/generators/develoz/push/templates/app/models/push_subscription.rb.tt +14 -0
- data/lib/generators/develoz/push/templates/app/services/push_notification_service.rb.tt +36 -0
- data/lib/generators/develoz/push/templates/app/views/pwa/sw_push_handlers.js.tt +49 -0
- data/lib/generators/develoz/push/templates/constants_env.tt +5 -0
- data/lib/generators/develoz/push/templates/db/migrate/create_push_subscriptions.rb.tt +15 -0
- data/lib/generators/develoz/pwa/pwa_generator.rb +46 -0
- data/lib/generators/develoz/pwa/templates/app/controllers/pwa_controller.rb.tt +17 -0
- data/lib/generators/develoz/pwa/templates/app/javascript/pwa/registration.js.tt +25 -0
- data/lib/generators/develoz/pwa/templates/app/views/pwa/manifest.json.erb.tt +24 -0
- data/lib/generators/develoz/pwa/templates/app/views/pwa/offline.html.erb.tt +51 -0
- data/lib/generators/develoz/pwa/templates/app/views/pwa/service-worker.js.tt +109 -0
- data/lib/generators/develoz/pwa/templates/routes.rb.tt +3 -0
- data/lib/generators/develoz/solid/solid_generator.rb +52 -0
- data/lib/generators/develoz/solid/templates/app/jobs/application_job.rb.tt +7 -0
- data/lib/generators/develoz/solid/templates/config/cable.yml.tt +10 -0
- data/lib/generators/develoz/solid/templates/config/cache.yml.tt +16 -0
- data/lib/generators/develoz/solid/templates/config/initializers/mission_control.rb.tt +8 -0
- data/lib/generators/develoz/solid/templates/config/initializers/solid.rb.tt +7 -0
- data/lib/generators/develoz/solid/templates/config/queue.yml.tt +18 -0
- data/lib/generators/develoz/solid/templates/config/recurring.yml.tt +20 -0
- data/lib/generators/develoz/strict_loading/strict_loading_generator.rb +17 -0
- data/lib/generators/develoz/strict_loading/templates/config/initializers/strict_loading.rb.tt +13 -0
- data/lib/generators/develoz/testing/templates/rspec.tt +2 -0
- data/lib/generators/develoz/testing/templates/rspec_parallel.tt +2 -0
- data/lib/generators/develoz/testing/templates/spec/rails_helper.rb.tt +32 -0
- data/lib/generators/develoz/testing/templates/spec/spec_helper.rb.tt +31 -0
- data/lib/generators/develoz/testing/testing_generator.rb +39 -0
- data/lib/generators/develoz/tooling/templates/constants.rb.tt +17 -0
- data/lib/generators/develoz/tooling/templates/env.example.tt +4 -0
- data/lib/generators/develoz/tooling/templates/vscode/extensions.json.tt +8 -0
- data/lib/generators/develoz/tooling/templates/vscode/settings.json.tt +26 -0
- data/lib/generators/develoz/tooling/templates/vscode/tasks.json.tt +26 -0
- data/lib/generators/develoz/tooling/tooling_generator.rb +33 -0
- data/lib/generators/develoz/ui/templates/bin/setup_develoz_ui.tt +20 -0
- data/lib/generators/develoz/ui/ui_generator.rb +57 -0
- data/lib/generators/develoz/versioning/templates/app/helpers/application_helper.rb.tt +7 -0
- data/lib/generators/develoz/versioning/templates/app/views/shared/_app_version.html.erb.tt +3 -0
- data/lib/generators/develoz/versioning/templates/spec/helpers/application_helper_spec.rb.tt +11 -0
- data/lib/generators/develoz/versioning/versioning_generator.rb +48 -0
- data/lib/tasks/canonical.rake +27 -0
- data/templates/.keep +0 -0
- data/templates/CANONICAL_SOURCES.md +93 -0
- data/templates/pull_request_template.md.tt +13 -0
- metadata +383 -0
data/.tool-versions
ADDED
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to
|
|
7
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [0.1.0] - 2026-07-15
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Initial `develoz` CLI with interactive and `--yes` application generation.
|
|
16
|
+
- Ruby and Rails version resolution for new Rails 8.1 applications.
|
|
17
|
+
- Core generators for tooling, testing, the Solid stack, CI, PostgreSQL,
|
|
18
|
+
shared concerns, strict loading, maintenance tasks, frontend conventions,
|
|
19
|
+
documentation, and application versioning.
|
|
20
|
+
- Opt-in generators for APIs, authentication, PWA support, push
|
|
21
|
+
notifications, Active Resource, admin interfaces, Develoz UI, Kamal,
|
|
22
|
+
Docker, and database backups.
|
|
23
|
+
- Pagy pagination by default with a `--skip-pagy` opt-out.
|
|
24
|
+
- Canonical fixture fidelity tests and a full RSpec, coverage, and RuboCop CI
|
|
25
|
+
workflow.
|
|
26
|
+
|
|
27
|
+
[Unreleased]: https://github.com/develoz-com/rails-template/compare/v0.1.0...HEAD
|
|
28
|
+
[0.1.0]: https://github.com/develoz-com/rails-template/releases/tag/v0.1.0
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions should preserve the generator's two main guarantees: a fresh
|
|
4
|
+
application is reproducible, and generated files remain faithful to their
|
|
5
|
+
canonical sources.
|
|
6
|
+
|
|
7
|
+
## Development setup
|
|
8
|
+
|
|
9
|
+
The repository uses [asdf](https://asdf-vm.com/) and pins Ruby 4.0.5 and
|
|
10
|
+
Node.js 24.15.0 in `.tool-versions`.
|
|
11
|
+
|
|
12
|
+
From the repository root:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
asdf install
|
|
16
|
+
ruby --version
|
|
17
|
+
bundle install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
The Ruby version output should start with `ruby 4.0.5`. `bin/setup` is also
|
|
21
|
+
available as a wrapper around `bundle install`.
|
|
22
|
+
|
|
23
|
+
Run a focused spec while developing, then run the complete checks before
|
|
24
|
+
submitting a change:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
bundle exec rspec spec/path/to/spec.rb
|
|
28
|
+
./bin/ci
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`./bin/ci` runs the full RSpec suite followed by RuboCop and exits on the first
|
|
32
|
+
failure. RSpec also enforces 100% line and branch coverage through SimpleCov,
|
|
33
|
+
so the coverage gate is part of every full CI run.
|
|
34
|
+
|
|
35
|
+
## Canonical fixtures
|
|
36
|
+
|
|
37
|
+
Canonical fixtures are byte-for-byte copies of files from source repositories.
|
|
38
|
+
Templates may adapt those files with documented substitutions, while fidelity
|
|
39
|
+
specs compare rendered output with the committed fixture using
|
|
40
|
+
`match_canonical`.
|
|
41
|
+
|
|
42
|
+
To refresh the configured sources:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
bundle exec rake develoz:fetch_canonical
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Private sources require authentication through `GH_TOKEN` or `gh auth token`.
|
|
49
|
+
The complete source-to-template map is in
|
|
50
|
+
`templates/CANONICAL_SOURCES.md`.
|
|
51
|
+
|
|
52
|
+
When adding or updating a canonical template:
|
|
53
|
+
|
|
54
|
+
1. Add or update its source mapping in `lib/tasks/canonical.rake`.
|
|
55
|
+
2. Run `bundle exec rake develoz:fetch_canonical` rather than editing the
|
|
56
|
+
downloaded fixture by hand.
|
|
57
|
+
3. Store the source under `spec/fixtures/canonical/<owner>-<repo>/`.
|
|
58
|
+
4. Add the `.tt` template and record any substitutions in
|
|
59
|
+
`templates/CANONICAL_SOURCES.md`.
|
|
60
|
+
5. Add or update a spec in `spec/fidelity/` that uses `match_canonical`.
|
|
61
|
+
6. Run `./bin/ci` and include the refreshed fixture with the change.
|
|
62
|
+
|
|
63
|
+
## Adding a generator
|
|
64
|
+
|
|
65
|
+
Use an existing generator with similar behavior as the starting point. A
|
|
66
|
+
generator named `example` follows this layout:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
lib/generators/develoz/example/
|
|
70
|
+
example_generator.rb
|
|
71
|
+
templates/
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The class must be named `Develoz::Generators::ExampleGenerator`, inherit from
|
|
75
|
+
`Develoz::Generators::Base`, and set its `source_root` to the adjacent
|
|
76
|
+
`templates` directory. Generator lifecycle methods are public; implementation
|
|
77
|
+
helpers are private. Use the base class helpers for idempotent Gemfile, route,
|
|
78
|
+
environment, and file changes.
|
|
79
|
+
|
|
80
|
+
To register and verify a new generator:
|
|
81
|
+
|
|
82
|
+
1. Add its implementation and `.tt` templates under
|
|
83
|
+
`lib/generators/develoz/<name>/`.
|
|
84
|
+
2. Register it in `config/generators.yml` with `always: true` for core behavior
|
|
85
|
+
or a `requires` list for opt-in behavior.
|
|
86
|
+
3. For an opt-in generator, add the option to `Develoz::CLI::OPT_IN_FLAGS`,
|
|
87
|
+
`Develoz::CLI::FLAG_LABELS`, the Thor options, and the install generator's
|
|
88
|
+
class options and `OPTION_FLAGS`.
|
|
89
|
+
4. Add a focused spec at
|
|
90
|
+
`spec/develoz/generators/<name>_generator_spec.rb`, including idempotency
|
|
91
|
+
coverage where the generator changes existing files.
|
|
92
|
+
5. Extend `spec/develoz/generators/install_generator_spec.rb` and
|
|
93
|
+
`spec/e2e/greenfield_spec.rb` when the manifest or public CLI behavior
|
|
94
|
+
changes.
|
|
95
|
+
6. Add canonical fixture and fidelity coverage when templates derive from an
|
|
96
|
+
external source.
|
|
97
|
+
7. Run `./bin/ci`.
|
|
98
|
+
|
|
99
|
+
## Release process
|
|
100
|
+
|
|
101
|
+
One-time setup uses RubyGems trusted publishing, so no token secret is needed:
|
|
102
|
+
|
|
103
|
+
1. Create a GitHub environment named `rubygems` with no secrets.
|
|
104
|
+
2. Add a pending trusted publisher for the `develoz-rails` gem on RubyGems with
|
|
105
|
+
owner `develoz-com`, repository `rails-template`, workflow `release.yml`, and
|
|
106
|
+
environment `rubygems`.
|
|
107
|
+
|
|
108
|
+
For each release:
|
|
109
|
+
|
|
110
|
+
1. Bump the version in `lib/develoz/version.rb` and add the user-facing changes
|
|
111
|
+
to the `Unreleased` section of `CHANGELOG.md`.
|
|
112
|
+
2. Merge the changes and ensure CI is green.
|
|
113
|
+
3. Publish a stable GitHub Release with tag `vX.Y.Z` at the current `main`
|
|
114
|
+
commit. Keep `main` unchanged until the release workflow finishes.
|
|
115
|
+
4. Let the workflow validate the release, publish the gem, and finalize and
|
|
116
|
+
commit `CHANGELOG.md` to `main`.
|
|
117
|
+
|
|
118
|
+
Prereleases aren't supported. Never move or recreate a published tag. If gem
|
|
119
|
+
publication succeeds but changelog finalization fails, rerun the same failed
|
|
120
|
+
workflow rather than creating another release.
|
data/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Develoz Rails
|
|
2
|
+
|
|
3
|
+
Develoz Rails is an opinionated application generator for Rails 8.1. It wraps
|
|
4
|
+
`rails new` with a tested Develoz baseline and lets each application opt into
|
|
5
|
+
product, deployment, and operations features as needed.
|
|
6
|
+
|
|
7
|
+
The generated baseline includes PostgreSQL, RSpec, the Solid stack, shared
|
|
8
|
+
model concerns, strict loading, maintenance tasks, frontend conventions,
|
|
9
|
+
documentation tooling, CI configuration, and application versioning.
|
|
10
|
+
|
|
11
|
+
## Quickstart
|
|
12
|
+
|
|
13
|
+
Generate a Rails app in one step:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
curl -fsSL https://raw.githubusercontent.com/develoz-com/rails-template/main/install | bash -s -- my_app
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install the gem and run interactively:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
gem install develoz-rails
|
|
23
|
+
develoz new my_app
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For an unattended run with specific features:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
curl -fsSL https://raw.githubusercontent.com/develoz-com/rails-template/main/install | bash -s -- my_app --yes --auth --ui --docker
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
develoz new my_app --yes --auth --ui --docker
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Use `--ruby=VERSION` or `--rails=VERSION` to select explicit toolchain
|
|
37
|
+
versions. Run `develoz help new` for the complete command reference.
|
|
38
|
+
|
|
39
|
+
For prerequisites and detailed setup, see the
|
|
40
|
+
[installation guide](docs/guide/installation.md).
|
|
41
|
+
|
|
42
|
+
## Feature matrix
|
|
43
|
+
|
|
44
|
+
Core features are installed in every generated application.
|
|
45
|
+
|
|
46
|
+
| Mode | Feature | Switch | What it adds |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| Core | Tooling | Always on | Editor settings, environment files, and shared application constants |
|
|
49
|
+
| Core | Testing | Always on | RSpec, FactoryBot, Capybara, Selenium, parallel tests, and coverage |
|
|
50
|
+
| Core | Solid stack | Always on | Solid Queue, Solid Cache, Solid Cable, and Mission Control Jobs |
|
|
51
|
+
| Core | CI and quality | Always on | CI workflow plus Ruby, security, frontend, and documentation checks |
|
|
52
|
+
| Core | Database | Always on | PostgreSQL configuration and `pg_search` |
|
|
53
|
+
| Core | Shared concerns | Always on | Search, optimized finder, transition, and configuration concerns |
|
|
54
|
+
| Core | Strict loading | Always on | Strict loading by default for Active Record models |
|
|
55
|
+
| Core | Maintenance | Always on | Maintenance Tasks integration and task examples |
|
|
56
|
+
| Core | Frontend | Always on | Importmap, Hotwire, AnnotateRb, and Pagy; use `--skip-pagy` to omit Pagy |
|
|
57
|
+
| Core | Documentation renderer | Always on | Markdown documentation model, controller, view, assets, and route |
|
|
58
|
+
| Core | Documentation specs | Always on | Documentation generation, checks, screenshots, and an example system spec |
|
|
59
|
+
| Core | Agent documentation | Always on | `AGENTS.md`, development guides, PR template, and external API test support |
|
|
60
|
+
| Core | Versioning | Always on | Application version constant, helper, and display partial |
|
|
61
|
+
| Opt-in | REST API | `--api` | Blueprinter, RSwag, API base controller, routes, and request spec |
|
|
62
|
+
| Opt-in | Authentication | `--auth` | Native Rails authentication models, controllers, views, routes, and specs |
|
|
63
|
+
| Opt-in | Progressive Web App | `--pwa` | Web manifest, service worker, offline page, registration, and routes |
|
|
64
|
+
| Opt-in | Push notifications | `--push` | Web Push subscriptions and notification support; also enables PWA support |
|
|
65
|
+
| Opt-in | Active Resource | `--active-resource` | Active Resource dependency and application resource classes |
|
|
66
|
+
| Opt-in | Admin | `--admin` | Admin base controller, layout, dashboard, and routes |
|
|
67
|
+
| Opt-in | Develoz UI | `--ui` | Develoz UI integration and controller pins |
|
|
68
|
+
| Opt-in | Kamal | `--kamal` | Kamal deployment configuration, secrets, and production Dockerfile |
|
|
69
|
+
| Opt-in | Docker | `--docker` | Local Docker Compose workflow, development image, and helper scripts |
|
|
70
|
+
| Opt-in | Database backups | `--db-backup` | Backup script, rake task, retention settings, and backup ignore rules |
|
|
71
|
+
|
|
72
|
+
## Project documentation
|
|
73
|
+
|
|
74
|
+
- [Installation guide](docs/guide/installation.md)
|
|
75
|
+
- [Changelog](CHANGELOG.md)
|
|
76
|
+
- [Contributing](CONTRIBUTING.md)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bundler/gem_tasks"
|
|
4
|
+
require "rspec/core/rake_task"
|
|
5
|
+
|
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
7
|
+
|
|
8
|
+
desc "Run RuboCop linter"
|
|
9
|
+
task :rubocop do
|
|
10
|
+
sh "bundle exec rubocop"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
desc "Run CI checks (rspec + rubocop + coverage gate)"
|
|
14
|
+
task :ci do
|
|
15
|
+
sh "bin/ci"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
task default: :spec
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
# Always-core generators (included regardless of flags)
|
|
3
|
+
tooling:
|
|
4
|
+
description: "Tooling setup (linting, formatting, CI)"
|
|
5
|
+
always: true
|
|
6
|
+
|
|
7
|
+
testing:
|
|
8
|
+
description: "Testing framework and helpers"
|
|
9
|
+
always: true
|
|
10
|
+
|
|
11
|
+
solid:
|
|
12
|
+
description: "Solid Stack integration (Stimulus, Turbo, Hotwire)"
|
|
13
|
+
always: true
|
|
14
|
+
|
|
15
|
+
ci:
|
|
16
|
+
description: "CI/CD pipeline configuration"
|
|
17
|
+
always: true
|
|
18
|
+
|
|
19
|
+
database:
|
|
20
|
+
description: "Database configuration and migrations"
|
|
21
|
+
always: true
|
|
22
|
+
|
|
23
|
+
concerns:
|
|
24
|
+
description: "Shared concerns and mixins"
|
|
25
|
+
always: true
|
|
26
|
+
|
|
27
|
+
strict_loading:
|
|
28
|
+
description: "Strict loading configuration"
|
|
29
|
+
always: true
|
|
30
|
+
|
|
31
|
+
maintenance:
|
|
32
|
+
description: "Maintenance tasks and utilities"
|
|
33
|
+
always: true
|
|
34
|
+
|
|
35
|
+
frontend_core:
|
|
36
|
+
description: "Core frontend setup (Tailwind, Importmap, Pagy)"
|
|
37
|
+
always: true
|
|
38
|
+
|
|
39
|
+
docs_render:
|
|
40
|
+
description: "Documentation rendering setup"
|
|
41
|
+
always: true
|
|
42
|
+
|
|
43
|
+
doc_specs:
|
|
44
|
+
description: "Documentation specs"
|
|
45
|
+
always: true
|
|
46
|
+
|
|
47
|
+
agents_docs:
|
|
48
|
+
description: "AGENTS.md documentation"
|
|
49
|
+
always: true
|
|
50
|
+
|
|
51
|
+
versioning:
|
|
52
|
+
description: "App versioning scheme"
|
|
53
|
+
always: true
|
|
54
|
+
|
|
55
|
+
# Opt-in generators (included only when flags are true)
|
|
56
|
+
api:
|
|
57
|
+
description: "REST API setup (Blueprinter, RSWAG)"
|
|
58
|
+
requires:
|
|
59
|
+
- api
|
|
60
|
+
|
|
61
|
+
auth:
|
|
62
|
+
description: "Authentication setup (Devise, JWT)"
|
|
63
|
+
requires:
|
|
64
|
+
- auth
|
|
65
|
+
|
|
66
|
+
ui:
|
|
67
|
+
description: "UI component library"
|
|
68
|
+
requires:
|
|
69
|
+
- ui
|
|
70
|
+
|
|
71
|
+
admin:
|
|
72
|
+
description: "Admin panel setup"
|
|
73
|
+
requires:
|
|
74
|
+
- admin
|
|
75
|
+
|
|
76
|
+
pwa:
|
|
77
|
+
description: "Progressive Web App setup"
|
|
78
|
+
requires:
|
|
79
|
+
- pwa
|
|
80
|
+
|
|
81
|
+
push:
|
|
82
|
+
description: "Push notifications setup"
|
|
83
|
+
requires:
|
|
84
|
+
- pwa
|
|
85
|
+
- push
|
|
86
|
+
|
|
87
|
+
active_resource:
|
|
88
|
+
description: "ActiveResource integration"
|
|
89
|
+
requires:
|
|
90
|
+
- active_resource
|
|
91
|
+
|
|
92
|
+
docker:
|
|
93
|
+
description: "Docker and Docker Compose setup"
|
|
94
|
+
requires:
|
|
95
|
+
- docker
|
|
96
|
+
|
|
97
|
+
kamal:
|
|
98
|
+
description: "Kamal deployment configuration"
|
|
99
|
+
requires:
|
|
100
|
+
- kamal
|
|
101
|
+
|
|
102
|
+
db_backup:
|
|
103
|
+
description: "Database backup utilities"
|
|
104
|
+
requires:
|
|
105
|
+
- db_backup
|