diff --git a/.rspec b/.rspec index a35c44f..6378586 100644 --- a/.rspec +++ b/.rspec @@ -1 +1,2 @@ --require rails_helper +--format documentation diff --git a/Gemfile b/Gemfile index 4736a45..85be87b 100644 --- a/Gemfile +++ b/Gemfile @@ -2,19 +2,31 @@ source 'https://rubygems.org' -if ENV["DEVEL"] == "1" - gem 'rails', '~> 7.1.0' +if ENV['DEVEL'] == '1' + # for Docker dev + rails_ver = ENV.fetch('RAILS_VERSION') + gem 'rails', rails_ver - gem 'activeadmin', '~> 3.3' + gem 'activeadmin', ENV.fetch('ACTIVEADMIN_VERSION') gem 'activeadmin_quill_editor', path: './' + + if rails_ver.start_with?('7.0') + gem 'concurrent-ruby', '1.3.4' + gem 'sqlite3', '~> 1.4' + else + gem 'sqlite3' + end else gemspec + + gem 'sqlite3' end +gem 'bigdecimal' +gem 'mutex_m' gem 'puma' gem 'sassc' gem 'sprockets-rails' -gem 'sqlite3' # Testing gem 'capybara' diff --git a/README.md b/README.md index ef501b4..6f69534 100644 --- a/README.md +++ b/README.md @@ -105,22 +105,50 @@ the editor will not destroy them, you'll need to implement a purge logic for tha Project created by [Mattia Roccoberton](http://blocknot.es), thanks also to the good guys that opened issues and pull requests from time to time. -A Docker dev setup is provided if you like to work with it: +There 3 ways to interact with this project: + +1) Using Docker: ```sh # Run rails server on the dummy app (=> http://localhost:3000 to access to ActiveAdmin): make up -# Enter in a console of the dummy app after it has been started: +# Enter in a Rails console (with the dummy app started): make console -# Enter in a shell of the dummy app after it has been started: +# Enter in a shell (with the dummy app started): make shell -# Run the linter on the project: +# Run the linter on the project (with the dummy app started): make lint -# Remove container and image after stopping the app: +# Run the test suite (with the dummy app started): +make specs +# Remove container and image: make cleanup +# To try different versions of Ruby/Rails/ActiveAdmin edit docker-compose.yml +# For more commands please check the Makefile ``` -For more commands please check the [Makefile](Makefile). +2) Using Appraisal: + +```sh +export RAILS_ENV=development +# Install dependencies +bin/appraisal +# Run server (or any command) +bin/appraisal rails s +# Or with specific versions +bin/appraisal rails71-activeadmin rails s +``` + +3) With a local setup: + +```sh +# Dev setup (set the required envs) +source extra/dev_setup.sh +# Install dependencies +bundle +# Run server (or any command) +bin/rails s +# To try different versions of Rails/ActiveAdmin edit extra/dev_setup.sh +``` ## Do you like it? Star it! diff --git a/docker-compose.yml b/docker-compose.yml index 8ed5f2c..b8a7c35 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,14 @@ services: build: context: . dockerfile: ./extra/Dockerfile + # dockerfile: ./extra/Dockerfile_alpine args: - RUBY_VERSION: 3.3.6 + # Debian-based Ruby image: + RUBY_IMAGE: ruby:3.4-slim UID: ${UID} + environment: + ACTIVEADMIN_VERSION: ~> 3.3 + RAILS_VERSION: ~> 8.0 user: "${UID}:${GID}" ports: - '3000:3000' diff --git a/extra/Dockerfile b/extra/Dockerfile index df3f850..ca9287b 100644 --- a/extra/Dockerfile +++ b/extra/Dockerfile @@ -1,5 +1,5 @@ -ARG RUBY_VERSION=3 -FROM ruby:${RUBY_VERSION} +ARG RUBY_IMAGE=ruby:3 +FROM ${RUBY_IMAGE} ARG UID @@ -8,19 +8,14 @@ ENV LANG=C.UTF-8 ENV RAILS_ENV=development RUN apt-get update -qq -RUN DEBIAN_FRONTEND=noninteractive apt-get install -yqq --no-install-recommends build-essential chromium libyaml-dev +RUN DEBIAN_FRONTEND=noninteractive apt-get install -yqq --no-install-recommends build-essential chromium libyaml-dev nano RUN gem install bundler RUN echo 'gem: --no-document' > /etc/gemrc -COPY . /app - -RUN mkdir -p /home/app RUN useradd -u ${UID} --shell /bin/bash app +RUN mkdir -p /home/app && chown -R app:app /home/app RUN chown -R app /usr/local/bundle -RUN chown -R app:app /home/app && chown -R app:app /app USER ${UID} - -WORKDIR /app -RUN bundle update +COPY . /app diff --git a/extra/Dockerfile_alpine b/extra/Dockerfile_alpine new file mode 100644 index 0000000..e960879 --- /dev/null +++ b/extra/Dockerfile_alpine @@ -0,0 +1,18 @@ +FROM ruby:3.3-alpine + +ARG UID + +ENV DEVEL=1 +ENV LANG=C.UTF-8 +ENV RAILS_ENV=development + +RUN apk update && apk add --no-cache build-base chromium tzdata yaml-dev + +RUN gem install bundler +RUN echo 'gem: --no-document' > /etc/gemrc + +RUN adduser -u ${UID} -D app +RUN mkdir -p /home/app && chown -R app:app /home/app +RUN chown -R app /usr/local/bundle + +COPY . /app diff --git a/extra/dev_setup.sh b/extra/dev_setup.sh new file mode 100755 index 0000000..adea0b4 --- /dev/null +++ b/extra/dev_setup.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +export DEVEL=1 + +export RAILS_VERSION=7.2.2.1 +export ACTIVEADMIN_VERSION=3.3.0 + +export RAILS_ENV=development diff --git a/extra/entrypoint.sh b/extra/entrypoint.sh index 35b6885..0c9b41c 100644 --- a/extra/entrypoint.sh +++ b/extra/entrypoint.sh @@ -1,2 +1,8 @@ +echo "> Install dependencies" +rm -f Gemfile.lock && bundle install + +echo "> Run pending migrations" cd spec/dummy && bundle exec rails db:migrate -cd - && rm -f spec/dummy/tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0 + +echo "> Start Rails server" +cd /app && rm -f spec/dummy/tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0 diff --git a/spec/dummy/config/environments/development.rb b/spec/dummy/config/environments/development.rb index 7a352dd..fb67c55 100644 --- a/spec/dummy/config/environments/development.rb +++ b/spec/dummy/config/environments/development.rb @@ -59,4 +59,8 @@ Rails.application.configure do # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. # config.file_watcher = ActiveSupport::EventedFileUpdateChecker + + ### + + config.active_support.to_time_preserves_timezone = :zone if Gem::Version.new(Rails.version) >= Gem::Version.new('8.0') end diff --git a/spec/dummy/config/environments/production.rb b/spec/dummy/config/environments/production.rb deleted file mode 100644 index 319166f..0000000 --- a/spec/dummy/config/environments/production.rb +++ /dev/null @@ -1,112 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). - # config.require_master_key = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - - # Compress CSS using a preprocessor. - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Mount Action Cable outside main process or domain. - # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug - - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Use a real queuing backend for Active Job (and separate queues per environment). - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "dummy_production" - - # config.action_mailer.perform_caching = false - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false - - # Inserts middleware to perform automatic connection switching. - # The `database_selector` hash is used to pass options to the DatabaseSelector - # middleware. The `delay` is used to determine how long to wait after a write - # to send a subsequent read to the primary. - # - # The `database_resolver` class is used by the middleware to determine which - # database is appropriate to use based on the time delay. - # - # The `database_resolver_context` class is used by the middleware to set - # timestamps for the last write to the primary. The resolver uses the context - # class timestamps to determine how long to wait before reading from the - # replica. - # - # By default Rails will store a last write timestamp in the session. The - # DatabaseSelector middleware is designed as such you can define your own - # strategy for connection switching and pass that into the middleware through - # these configuration options. - # config.active_record.database_selector = { delay: 2.seconds } - # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver - # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session -end diff --git a/spec/dummy/config/environments/test.rb b/spec/dummy/config/environments/test.rb index 8f83af4..25e8b26 100644 --- a/spec/dummy/config/environments/test.rb +++ b/spec/dummy/config/environments/test.rb @@ -46,4 +46,8 @@ Rails.application.configure do # Raises error for missing translations. # config.action_view.raise_on_missing_translations = true + + ### + + config.active_support.to_time_preserves_timezone = :zone if Gem::Version.new(Rails.version) >= Gem::Version.new('8.0') end diff --git a/spec/dummy/db/schema_development.rb b/spec/dummy/db/schema_development.rb index a96daa1..aa9216f 100644 --- a/spec/dummy/db/schema_development.rb +++ b/spec/dummy/db/schema_development.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2018_06_07_053739) do +ActiveRecord::Schema[8.0].define(version: 2018_06_07_053739) do create_table "active_admin_comments", force: :cascade do |t| t.string "namespace" t.text "body"