diff --git a/.github/workflows/test_generated_app.yml b/.github/workflows/test_generated_app.yml index 567d045ad..718995876 100644 --- a/.github/workflows/test_generated_app.yml +++ b/.github/workflows/test_generated_app.yml @@ -4,7 +4,7 @@ on: push env: COMPOSE_FILE: docker-compose.test.yml - APP_NAME: rails_templates + APP_NAME: rails-templates DOCKER_IMAGE: ${{ github.repository }} DOCKER_REGISTRY_HOST: ${{ secrets.DOCKER_REGISTRY_HOST }} DOCKER_REGISTRY_USERNAME: ${{ github.repository_owner }} @@ -86,7 +86,7 @@ jobs: run: | export BRANCH_TAG=${{ env.BRANCH_TAG }}-${{ matrix.variant }} cd $APP_NAME - docker-compose pull test || true + docker compose pull test || true - name: Build docker image run: | @@ -97,7 +97,7 @@ jobs: run: | export BRANCH_TAG=${{ env.BRANCH_TAG }}-${{ matrix.variant }} cd $APP_NAME - docker-compose push test + docker compose push test - name: Test the structure that is generated by the template run: | diff --git a/.github/workflows/test_production_build.yml b/.github/workflows/test_production_build.yml index b24ae93a7..362c9655d 100644 --- a/.github/workflows/test_production_build.yml +++ b/.github/workflows/test_production_build.yml @@ -3,7 +3,7 @@ name: Test Production Docker Build on: push env: - APP_NAME: rails_templates + APP_NAME: rails-templates DOCKER_IMAGE: ${{ github.repository }} DOCKER_REGISTRY_HOST: ${{ secrets.DOCKER_REGISTRY_HOST }} RUBY_VERSION: 3.2.2 diff --git a/.template/addons/crud/lib/templates/slim/scaffold/_form.html.slim.tt b/.template/addons/crud/lib/templates/slim/scaffold/_form.html.slim.tt new file mode 100644 index 000000000..a87356e60 --- /dev/null +++ b/.template/addons/crud/lib/templates/slim/scaffold/_form.html.slim.tt @@ -0,0 +1,28 @@ += form_with(model: <%= model_resource_name %>) do |form| + - if <%= singular_table_name %>.errors.any? + div style="color: red" + h2 = "#{pluralize(<%= singular_table_name %>.errors.count, "error")} prohibited this <%= singular_table_name %> from being saved:" + ul + - <%= singular_table_name %>.errors.each do |error| + li = error.full_message + +<% attributes.each do |attribute| -%> + .mb-3 +<% if attribute.password_digest? -%> + = form.label :password, class: 'form-label' + = form.password_field :password, class: 'form-control' + + .mb-3 + = form.label :password_confirmation, class: 'form-label' + = form.password_field :password_confirmation, class: 'form-control' +<% elsif attribute.attachments? -%> + = form.label :<%= attribute.column_name %>, class: 'form-label' + = form.<%= attribute.field_type %> :<%= attribute.column_name %>, multiple: true, class: 'form-control' +<% else -%> + = form.label :<%= attribute.column_name %>, class: 'form-label' + = form.<%= attribute.field_type %> :<%= attribute.column_name %>, class: 'form-control' +<% end -%> + +<% end -%> + div + = form.submit 'Submit', class: 'btn btn-primary' diff --git a/.template/addons/crud/lib/templates/slim/scaffold/edit.html.slim.tt b/.template/addons/crud/lib/templates/slim/scaffold/edit.html.slim.tt new file mode 100644 index 000000000..a92dbb9b1 --- /dev/null +++ b/.template/addons/crud/lib/templates/slim/scaffold/edit.html.slim.tt @@ -0,0 +1,8 @@ +h1 Editing <%= human_name.downcase %> + +== render "form", <%= singular_table_name %>: @<%= singular_table_name %> + +br + +div + =< link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %>, class: 'btn btn-secondary' diff --git a/.template/addons/crud/lib/templates/slim/scaffold/new.html.slim.tt b/.template/addons/crud/lib/templates/slim/scaffold/new.html.slim.tt new file mode 100644 index 000000000..fb11e144a --- /dev/null +++ b/.template/addons/crud/lib/templates/slim/scaffold/new.html.slim.tt @@ -0,0 +1,10 @@ +content_for :title, "New <%= human_name.downcase %>" + +h1 New <%= human_name.downcase %> + +== render 'form', <%= singular_table_name %>: @<%= singular_table_name %> + +br + +div + = link_to "Back to <%= human_name.pluralize.downcase %>", <%= index_helper(type: :path) %> diff --git a/.template/addons/docker/docker-compose.dev.yml.tt b/.template/addons/docker/docker-compose.dev.yml.tt index 35a3e06c7..d6096c458 100644 --- a/.template/addons/docker/docker-compose.dev.yml.tt +++ b/.template/addons/docker/docker-compose.dev.yml.tt @@ -3,7 +3,7 @@ version: '3.2' services: db: image: postgres:<%= POSTGRES_VERSION %> - container_name: <%= APP_NAME %>_db + container_name: <%= CONTAINERIZED_APP_NAME %>-db environment: - POSTGRES_DB=<%= APP_NAME %>_development - POSTGRES_PASSWORD=postgres @@ -12,6 +12,6 @@ services: redis: image: redis:<%= REDIS_VERSION %> - container_name: <%= APP_NAME %>_redis + container_name: <%= CONTAINERIZED_APP_NAME %>-redis ports: - "6379:6379" diff --git a/.template/addons/docker/docker-compose.test.yml.tt b/.template/addons/docker/docker-compose.test.yml.tt index aa8746fd0..cb83d3f42 100644 --- a/.template/addons/docker/docker-compose.test.yml.tt +++ b/.template/addons/docker/docker-compose.test.yml.tt @@ -3,7 +3,7 @@ version: '3.2' services: db: image: postgres:<%= POSTGRES_VERSION %> - container_name: <%= APP_NAME %>_db + container_name: <%= CONTAINERIZED_APP_NAME %>-db environment: - POSTGRES_DB=<%= APP_NAME %>_test - POSTGRES_PASSWORD=postgres @@ -12,7 +12,7 @@ services: redis: image: redis:<%= REDIS_VERSION %> - container_name: <%= APP_NAME %>_redis + container_name: <%= CONTAINERIZED_APP_NAME %>-redis ports: - "6379" @@ -28,7 +28,7 @@ services: - NODE_ENV=test <%- end -%> image: ${DOCKER_REGISTRY_HOST}/${DOCKER_IMAGE}:${BRANCH_TAG}-test - container_name: <%= APP_NAME %>_test + container_name: <%= CONTAINERIZED_APP_NAME %>-test command: bin/test.sh stdin_open: true tty: true diff --git a/.template/addons/docker/docker-compose.yml.tt b/.template/addons/docker/docker-compose.yml.tt index 3aa0211a9..0957e9334 100644 --- a/.template/addons/docker/docker-compose.yml.tt +++ b/.template/addons/docker/docker-compose.yml.tt @@ -3,7 +3,7 @@ version: '3.2' services: db: image: postgres:<%= POSTGRES_VERSION %> - container_name: <%= APP_NAME %>_db + container_name: <%= CONTAINERIZED_APP_NAME %>-db environment: - POSTGRES_DB=<%= APP_NAME %>_production ports: @@ -11,7 +11,7 @@ services: redis: image: redis:<%= REDIS_VERSION %> - container_name: <%= APP_NAME %>_redis + container_name: <%= CONTAINERIZED_APP_NAME %>-redis ports: - "6379:6379" @@ -28,7 +28,7 @@ services: - ASSET_HOST <%- end -%> image: ${DOCKER_REGISTRY_HOST}/${DOCKER_IMAGE}:${BRANCH_TAG} - container_name: <%= APP_NAME %>_web + container_name: <%= CONTAINERIZED_APP_NAME %>-web command: bin/start.sh ports: - "${PORT}:${PORT}" diff --git a/.template/addons/github/.github/workflows/test.yml.tt b/.template/addons/github/.github/workflows/test.yml.tt index 35c95e2ba..57fb4d546 100644 --- a/.template/addons/github/.github/workflows/test.yml.tt +++ b/.template/addons/github/.github/workflows/test.yml.tt @@ -17,7 +17,7 @@ env: NODE_VERSION: 18 <%- end -%> - # Set the default docker-compose file + # Set the default docker compose file COMPOSE_FILE: docker-compose.test.yml # Set the default CI value despite the Github Action default value @@ -46,13 +46,13 @@ jobs: - name: Pull Docker image if: ${{ env.BRANCH_TAG != 'latest' && env.BRANCH_TAG != 'develop' }} - run: docker-compose pull test || true + run: docker compose pull test || true - name: Build Docker image - run: bin/docker-prepare && docker-compose build + run: bin/docker-prepare && docker compose build - name: Push Docker image - run: docker-compose push test + run: docker compose push test linting: name: Linting @@ -73,10 +73,10 @@ jobs: password: ${{ env.DOCKER_REGISTRY_TOKEN }} - name: Pull Docker image - run: docker-compose pull test || true + run: docker compose pull test || true - name: Run codebase test - run: docker-compose run test -e DISABLE_SPRING=1 bundle exec rspec spec/codebase/codebase_spec.rb --format progress + run: docker compose run test -e DISABLE_SPRING=1 bundle exec rspec spec/codebase/codebase_spec.rb --format progress unit_tests: name: Unit tests @@ -97,10 +97,10 @@ jobs: password: ${{ env.DOCKER_REGISTRY_TOKEN }} - name: Pull Docker image - run: docker-compose pull test || true + run: docker compose pull test || true - name: Run unit tests - run: docker-compose run test -e DISABLE_SPRING=1 bundle exec rspec --exclude-pattern "spec/systems/**/*_spec.rb, spec/codebase/codebase_spec.rb" --profile --format progress + run: docker compose run test -e DISABLE_SPRING=1 bundle exec rspec --exclude-pattern "spec/systems/**/*_spec.rb, spec/codebase/codebase_spec.rb" --profile --format progress - name: Upload tests coverage artifact uses: actions/upload-artifact@v3 @@ -130,10 +130,10 @@ jobs: password: ${{ env.DOCKER_REGISTRY_TOKEN }} - name: Pull Docker image - run: docker-compose pull test || true + run: docker compose pull test || true - name: Run system tests - run: docker-compose run test bundle exec rspec spec/systems --profile --format progress + run: docker compose run test bundle exec rspec spec/systems --profile --format progress - name: Upload system tests screenshots artifact uses: actions/upload-artifact@v2 diff --git a/.template/addons/heroku/Dockerfile.web.tt b/.template/addons/heroku/Dockerfile.web.tt index 05876d577..c9b5869f2 100644 --- a/.template/addons/heroku/Dockerfile.web.tt +++ b/.template/addons/heroku/Dockerfile.web.tt @@ -1,5 +1,5 @@ ARG DOCKER_REGISTRY_HOST=<%= DOCKER_REGISTRY_HOST %> -ARG DOCKER_IMAGE=<%= DOCKER_IMAGE %> +ARG DOCKER_IMAGE=<%= CONTAINERIZED_APP_NAME %> ARG BRANCH_TAG=latest FROM ${DOCKER_REGISTRY_HOST}/${DOCKER_IMAGE}:${BRANCH_TAG} diff --git a/.template/addons/heroku/Dockerfile.worker.tt b/.template/addons/heroku/Dockerfile.worker.tt index 31cb5804c..c4149d476 100644 --- a/.template/addons/heroku/Dockerfile.worker.tt +++ b/.template/addons/heroku/Dockerfile.worker.tt @@ -1,5 +1,5 @@ ARG DOCKER_REGISTRY_HOST=<%= DOCKER_REGISTRY_HOST %> -ARG DOCKER_IMAGE=<%= DOCKER_IMAGE %> +ARG DOCKER_IMAGE=<%= CONTAINERIZED_APP_NAME %> ARG BRANCH_TAG=latest FROM ${DOCKER_REGISTRY_HOST}/${DOCKER_IMAGE}:${BRANCH_TAG} diff --git a/.template/addons/openapi/package.json.rb b/.template/addons/openapi/package.json.rb index 8b380d2a6..61113d9b5 100644 --- a/.template/addons/openapi/package.json.rb +++ b/.template/addons/openapi/package.json.rb @@ -12,7 +12,7 @@ end run 'yarn add --dev eslint' -run 'yarn add --dev @nimblehq/eslint-config-nimble@2.2.1' +run 'yarn add --dev @nimblehq/eslint-config-nimble-core@2.8.1' run 'yarn add --dev @apidevtools/swagger-cli@4.0' run 'yarn add --dev @stoplight/spectral-cli@6.8' run 'yarn add --dev eslint-plugin-yml@1.8' diff --git a/.template/spec/addons/base/openapi/template_spec.rb b/.template/spec/addons/base/openapi/template_spec.rb index 234d4ef72..a4f70aaf2 100644 --- a/.template/spec/addons/base/openapi/template_spec.rb +++ b/.template/spec/addons/base/openapi/template_spec.rb @@ -26,7 +26,7 @@ file_content = JSON.parse(file('package.json').content)['devDependencies'] expect(file_content).to include('eslint') - expect(file_content).to include('@nimblehq/eslint-config-nimble') + expect(file_content).to include('@nimblehq/eslint-config-nimble-core') expect(file_content).to include('@apidevtools/swagger-cli') expect(file_content).to include('@stoplight/spectral-cli') expect(file_content).to include('eslint-plugin-yml') diff --git a/.template/spec/support/serverspec.rb b/.template/spec/support/serverspec.rb index 03527d6e3..ea7752a8f 100644 --- a/.template/spec/support/serverspec.rb +++ b/.template/spec/support/serverspec.rb @@ -7,7 +7,8 @@ module ServerSpecHelpers # Prebuild and run docker image before running the test # Because the docker api does not support docker compose def self.test_container - container_id = `docker ps -qf "name=#{ENV.fetch('APP_NAME')}_test"` + container_name = "#{ENV.fetch('APP_NAME')}-test" + container_id = `docker ps -qf "name=#{container_name}"` Docker::Container.get(container_id.strip) end diff --git a/.template/spec/variants/web/package_json_spec.rb b/.template/spec/variants/web/package_json_spec.rb index fb4d2d45a..1fad10698 100644 --- a/.template/spec/variants/web/package_json_spec.rb +++ b/.template/spec/variants/web/package_json_spec.rb @@ -61,7 +61,7 @@ describe 'Development Dependencies' do it 'adds Nimble eslint config dependency' do - expect(subject['devDependencies']).to include('@nimblehq/eslint-config-nimble') + expect(subject['devDependencies']).to include('@nimblehq/eslint-config-nimble-core') end it 'adds stylelint dependencies' do diff --git a/.template/spec/variants/web/template_spec.rb b/.template/spec/variants/web/template_spec.rb index 235fda24a..0d5fdcb05 100644 --- a/.template/spec/variants/web/template_spec.rb +++ b/.template/spec/variants/web/template_spec.rb @@ -3,7 +3,7 @@ describe 'Web variant - template' do it 'creates the eslint configuration files' do expect(file('.eslintrc')).to exist - expect(file('.eslintignore')).to exist + expect(file('eslint.config.mjs')).to exist end it 'creates the stylelint configuration files' do diff --git a/.template/variants/web/.eslintignore b/.template/variants/web/.eslintignore index 1b858e01e..e69de29bb 100644 --- a/.template/variants/web/.eslintignore +++ b/.template/variants/web/.eslintignore @@ -1,18 +0,0 @@ -/node_modules/** -/config/** -/coverage/** -/public/** -/tmp/** -/vendor/** - -/app/assets/builds/** - -/app/javascript/channels/** -/app/javascript/translations/translations.js - -/engines/*/node_modules/** -/engines/*/vendor/** -/engines/*/app/javascript/*/translations/translations.js - -/docker-compose.yml -/docker-compose.test.yml diff --git a/.template/variants/web/.eslintrc.tt b/.template/variants/web/.eslintrc.tt index b0111e15c..af3ac3317 100644 --- a/.template/variants/web/.eslintrc.tt +++ b/.template/variants/web/.eslintrc.tt @@ -1,10 +1,10 @@ { "extends": [ <%- if @install_openapi -%> - "@nimblehq/eslint-config-nimble", + "@nimblehq/eslint-config-nimble-core", "plugin:yml/recommended" <%- else -%> - "@nimblehq/eslint-config-nimble" + "@nimblehq/eslint-config-nimble-core" <%- end -%> ], "globals": { diff --git a/.template/variants/web/eslint.config.mjs b/.template/variants/web/eslint.config.mjs new file mode 100644 index 000000000..7af5a79eb --- /dev/null +++ b/.template/variants/web/eslint.config.mjs @@ -0,0 +1,18 @@ +export default { + ignores: [ + "/node_modules/", + "/config/", + "/coverage/", + "/public/", + "/tmp/", + "/vendor/", + "/app/assets/builds/", + "/app/javascript/channels/", + "/app/javascript/translations/translations.js", + "/engines/*/node_modules/", + "/engines/*/vendor/", + "/engines/*/app/javascript/*/translations/translations.js", + "/docker-compose.yml", + "/docker-compose.test.yml" + ] +} diff --git a/.template/variants/web/package.json.rb b/.template/variants/web/package.json.rb index a2be8da36..838ec432e 100644 --- a/.template/variants/web/package.json.rb +++ b/.template/variants/web/package.json.rb @@ -30,7 +30,7 @@ run 'yarn add --dev eslint' run 'yarn add --dev stylelint@^15' -run 'yarn add --dev @nimblehq/eslint-config-nimble@2.2.1' +run 'yarn add --dev @nimblehq/eslint-config-nimble-core@2.8.1' run 'yarn add --dev @nimblehq/stylelint-config-nimble@1.1.0' # Setup scripts diff --git a/.template/variants/web/template.rb b/.template/variants/web/template.rb index c42844cad..961219b08 100644 --- a/.template/variants/web/template.rb +++ b/.template/variants/web/template.rb @@ -4,7 +4,7 @@ def apply_web_variant! use_source_path __dir__ template '.eslintrc.tt' - copy_file '.eslintignore' + copy_file 'eslint.config.mjs' copy_file '.stylelintrc' copy_file '.stylelintignore' diff --git a/Makefile b/Makefile index ac7f31d9e..d2d9b763a 100644 --- a/Makefile +++ b/Makefile @@ -27,16 +27,16 @@ create_api: build: cd $(APP_NAME) && \ bin/docker-prepare && \ - docker-compose -f docker-compose.test.yml build + docker compose -f docker-compose.test.yml build build_production: cd $(APP_NAME) && \ bin/docker-prepare && \ - docker-compose build + docker compose build test_variant_app: cd $(APP_NAME) && \ - docker-compose -f docker-compose.test.yml run test + docker compose -f docker-compose.test.yml run test base_addon_spec = spec/addons/base/**/*_spec.rb web_addon_spec = spec/addons/variants/web/**/*_spec.rb @@ -48,9 +48,9 @@ api_spec = spec/variants/api/**/*_spec.rb test_template: cd $(APP_NAME) && \ - docker-compose -f docker-compose.test.yml up --detach db redis && \ - docker-compose -f docker-compose.test.yml run test bash -c "./bin/inject_port_into_nginx.sh && nginx -c /etc/nginx/conf.d/default.conf -t" && \ - docker-compose -f docker-compose.test.yml run --detach test bin/start.sh && \ + docker compose -f docker-compose.test.yml up --detach db redis && \ + docker compose -f docker-compose.test.yml run test bash -c "./bin/inject_port_into_nginx.sh && nginx -c /etc/nginx/conf.d/default.conf -t" && \ + docker compose -f docker-compose.test.yml run --detach test bin/start.sh && \ cd ../.template && \ bundle install; \ if [ $(VARIANT) = web ]; then \ diff --git a/template.rb b/template.rb index 7660c1194..0b6690c5a 100644 --- a/template.rb +++ b/template.rb @@ -4,10 +4,11 @@ # Variables APP_NAME = app_name +CONTAINERIZED_APP_NAME = app_name.tr('_', '-').downcase # Transform the app name from slug to human-readable name e.g. nimble-web -> Nimble APP_NAME_HUMANIZED = app_name.split(/[-_]/).map(&:capitalize).join(' ').gsub(/ Web$/, '') DOCKER_REGISTRY_HOST = 'docker.io' -DOCKER_IMAGE = "nimblehq/#{APP_NAME}".freeze +DOCKER_IMAGE = "nimblehq/#{CONTAINERIZED_APP_NAME}".freeze RUBY_VERSION = '3.2.2' POSTGRES_VERSION = '15.2' REDIS_VERSION = '6.2.7'