Compare commits

..

No commits in common. "main" and "optimize-docker-build" have entirely different histories.

151 changed files with 556 additions and 502 deletions

View File

@ -0,0 +1,43 @@
name: Build Nginx-based docker image
on:
push:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
build-static-assets:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to the private Docker registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.PRIVATE_REGISTRY_HOST }}
username: ${{ secrets.PRIVATE_REGISTRY_USERNAME }}
password: ${{ secrets.PRIVATE_REGISTRY_TOKEN }}
- name: Build and push intermediate stages (build)
uses: docker/build-push-action@v6
with:
context: .
target: build
push: ${{ github.ref == 'refs/heads/main' }}
tags: ${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:build
cache-from: type=registry,ref=${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:build
cache-to: type=inline
- name: Build and push (final)
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.ref == 'refs/heads/main' }}
tags: ${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:latest
cache-from: type=registry,ref=${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:latest
cache-to: type=inline

View File

@ -0,0 +1,39 @@
name: Add copyright notice
on:
pull_request:
permissions:
contents: write
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
copyright_notice:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.ACTIONS_TOKEN }}
ref: ${{ github.head_ref }}
- uses: VinnyBabuManjaly/copyright-action@v1.0.0
with:
CopyrightString: '# Copyright (C) 2024 Manuel Bustillo\n\n'
FileType: '.rb'
Path: 'app/, config/, db/, spec/'
- uses: VinnyBabuManjaly/copyright-action@v1.0.0
with:
CopyrightString: '<%# Copyright (C) 2024 Manuel Bustillo %>\n\n'
FileType: '.erb'
Path: 'app/'
- name: Commit changes
run: |
git config --local user.email "bustikiller@bustikiller.com"
git config --local user.name "Manuel Bustillo"
git add .
if [ -n "$(git status --porcelain)" ]; then
echo "there are changes";
git commit -m "Add copyright notice"
git push
else
echo "no changes";
fi

View File

@ -0,0 +1,23 @@
name: Check usage of free licenses
on:
push:
branches:
- main
pull_request:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
check-licenses:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: ruby/setup-ruby@v1.202.0
with:
ruby-version: '3.3.6'
- name: Install project dependencies
run: bundle install --jobs `getconf _NPROCESSORS_ONLN`
- name: Run license finder
run: license_finder

View File

@ -10,7 +10,7 @@ concurrency:
jobs: jobs:
unit_tests: unit_tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
services: &services services:
postgres: postgres:
image: postgres image: postgres
env: env:
@ -22,11 +22,10 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
ref: ${{ github.head_ref }} # Checkout the actual branch, not the result if merged into the base - uses: ruby/setup-ruby@v1.202.0
- uses: ruby/setup-ruby@v1.220.0
- run: bundle install - run: bundle install
- &postgres_wait - run: bundle exec rubocop --force-exclusion --parallel
name: Wait until Postgres is ready to accept connections - name: Wait until Postgres is ready to accept connections
run: | run: |
apt-get update && apt-get install -f -y postgresql-client apt-get update && apt-get install -f -y postgresql-client
until pg_isready -h postgres -U postgres -d postgres until pg_isready -h postgres -U postgres -d postgres
@ -34,126 +33,12 @@ jobs:
sleep 1 sleep 1
echo "Trying again" echo "Trying again"
done done
- name: Load schema and run unit tests - run: |
run: |
bundle exec rake db:schema:load bundle exec rake db:schema:load
bundle exec rspec bundle exec rspec
env: env:
RAILS_ENV: test RAILS_ENV: test
DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
- name: Get all migrations added
id: changed-migration-files
uses: tj-actions/changed-files@v45
with:
files: |
db/migrate/**.rb
- name: Redo all migrations and check there are no schema changes
if: steps.changed-migration-files.outputs.any_changed == 'true'
env:
ALL_CHANGED_FILES: ${{ steps.changed-migration-files.outputs.all_changed_files }}
RAILS_ENV: test
DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres
run: |
echo ${#ALL_CHANGED_FILES[@]} migrations changed:
for file in ${ALL_CHANGED_FILES}; do
echo "$file"
done
bundle exec rake db:migrate:redo STEP=${#ALL_CHANGED_FILES[@]}
git diff --exit-code db/schema.rb
- name: Clean up containers generated by this flow - name: Clean up containers generated by this flow
if: failure() if: failure()
run: docker ps --filter network=$JOB_CONTAINER_NAME-$GITHUB_JOB-network --filter name=$JOB_CONTAINER_NAME-* --format "{{.ID}}" | xargs docker rm -f run: docker ps --filter network=$JOB_CONTAINER_NAME-$GITHUB_JOB-network --filter name=$JOB_CONTAINER_NAME-* --format "{{.ID}}" | xargs docker rm -f
rubocop:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: ruby/setup-ruby@v1.220.0
- run: bundle install
- run: bundle exec rubocop --force-exclusion --parallel
check-licenses:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- uses: ruby/setup-ruby@v1.220.0
- name: Install project dependencies
run: bundle install --jobs `getconf _NPROCESSORS_ONLN`
- name: Run license finder
run: license_finder
copyright_notice:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.ACTIONS_TOKEN }}
ref: ${{ github.head_ref }}
- uses: VinnyBabuManjaly/copyright-action@v1.0.0
with:
CopyrightString: '# Copyright (C) 2024-2025 LibreWeddingPlanner contributors\n\n'
FileType: '.rb'
Path: 'app/, config/, db/, spec/'
IgnorePath: 'db'
- uses: VinnyBabuManjaly/copyright-action@v1.0.0
with:
CopyrightString: '<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %>\n\n'
FileType: '.erb'
Path: 'app/'
- name: Commit changes
run: |
git config --local user.email "bustikiller@bustikiller.com"
git config --local user.name "Manuel Bustillo"
git add .
if [ -n "$(git status --porcelain)" ]; then
echo "there are changes";
git commit -m "Add copyright notice"
git push
else
echo "no changes";
fi
build-static-assets:
runs-on: ubuntu-latest
timeout-minutes: 30
needs:
- unit_tests
- rubocop
- check-licenses
- copyright_notice
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to the private Docker registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.PRIVATE_REGISTRY_HOST }}
username: ${{ secrets.PRIVATE_REGISTRY_USERNAME }}
password: ${{ secrets.PRIVATE_REGISTRY_TOKEN }}
- name: Build and push intermediate stages (build)
uses: docker/build-push-action@v6
with:
context: .
target: build
push: ${{ github.ref == 'refs/heads/main' }}
tags: ${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:build
cache-from: type=registry,ref=${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:build
cache-to: type=inline
- name: Build and push (final)
uses: docker/build-push-action@v6
with:
context: .
push: ${{ github.ref == 'refs/heads/main' }}
tags: ${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:latest
cache-from: type=registry,ref=${{ secrets.PRIVATE_REGISTRY_HOST }}/${{ env.GITHUB_REPOSITORY }}:latest
cache-to: type=inline

View File

@ -1 +1 @@
ruby-3.4.2 ruby-3.3.6

View File

@ -1,8 +1,8 @@
# syntax = docker/dockerfile:1 # syntax = docker/dockerfile:1
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile # Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.4.2 ARG RUBY_VERSION=3.3.6
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim AS base FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
# Rails app lives here # Rails app lives here
WORKDIR /rails WORKDIR /rails
@ -16,11 +16,11 @@ ENV RAILS_ENV="production" \
RUN apt-get update && apt-get install -y nodejs RUN apt-get update && apt-get install -y nodejs
# Throw-away build stage to reduce size of final image # Throw-away build stage to reduce size of final image
FROM base AS build FROM base as build
# Install packages needed to build gems # Install packages needed to build gems
RUN apt-get update -qq && \ RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git libpq-dev libvips pkg-config libyaml-dev apt-get install --no-install-recommends -y build-essential git libpq-dev libvips pkg-config
# Install application gems # Install application gems
COPY Gemfile Gemfile.lock ./ COPY Gemfile Gemfile.lock ./

View File

@ -1,7 +1,7 @@
# syntax = docker/dockerfile:1 # syntax = docker/dockerfile:1
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile # Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.4.2 ARG RUBY_VERSION=3.3.6
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
# Rails app lives here # Rails app lives here
@ -13,7 +13,7 @@ FROM base as build
# Install packages needed to build gems # Install packages needed to build gems
RUN apt-get update -qq && \ RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git libpq-dev libvips pkg-config libyaml-dev apt-get install --no-install-recommends -y build-essential git libpq-dev libvips pkg-config
# Install application gems # Install application gems
COPY Gemfile Gemfile.lock ./ COPY Gemfile Gemfile.lock ./

View File

@ -2,7 +2,7 @@
source 'https://rubygems.org' source 'https://rubygems.org'
ruby '3.4.2' ruby '3.3.6'
gem 'bootsnap', require: false gem 'bootsnap', require: false
gem 'csv' gem 'csv'
gem 'importmap-rails' gem 'importmap-rails'

View File

@ -76,7 +76,7 @@ GEM
rails (>= 6.0) rails (>= 6.0)
addressable (2.8.7) addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0) public_suffix (>= 2.0.2, < 7.0)
annotaterb (4.14.0) annotaterb (4.13.0)
ast (2.4.2) ast (2.4.2)
babel-source (5.8.35) babel-source (5.8.35)
babel-transpiler (0.7.0) babel-transpiler (0.7.0)
@ -94,8 +94,8 @@ GEM
logger (~> 1.5) logger (~> 1.5)
chroma (0.2.0) chroma (0.2.0)
coderay (1.1.3) coderay (1.1.3)
concurrent-ruby (1.3.5) concurrent-ruby (1.3.4)
connection_pool (2.5.0) connection_pool (2.4.1)
crass (1.0.6) crass (1.0.6)
csv (3.3.2) csv (3.3.2)
date (3.4.1) date (3.4.1)
@ -130,7 +130,7 @@ GEM
csv csv
mini_mime (>= 1.0.0) mini_mime (>= 1.0.0)
multi_xml (>= 0.5.2) multi_xml (>= 0.5.2)
i18n (1.14.7) i18n (1.14.6)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
importmap-rails (2.1.0) importmap-rails (2.1.0)
actionpack (>= 6.0.0) actionpack (>= 6.0.0)
@ -143,7 +143,7 @@ GEM
jbuilder (2.13.0) jbuilder (2.13.0)
actionview (>= 5.0.0) actionview (>= 5.0.0)
activesupport (>= 5.0.0) activesupport (>= 5.0.0)
json (2.10.1) json (2.8.2)
json-schema (5.0.1) json-schema (5.0.1)
addressable (~> 2.8) addressable (~> 2.8)
jsonapi-deserializable (0.2.0) jsonapi-deserializable (0.2.0)
@ -157,7 +157,7 @@ GEM
jsonapi-renderer (0.2.2) jsonapi-renderer (0.2.2)
jsonapi-serializable (0.3.1) jsonapi-serializable (0.3.1)
jsonapi-renderer (~> 0.2.0) jsonapi-renderer (~> 0.2.0)
language_server-protocol (3.17.0.4) language_server-protocol (3.17.0.3)
launchy (3.0.1) launchy (3.0.1)
addressable (~> 2.8) addressable (~> 2.8)
childprocess (~> 5.0) childprocess (~> 5.0)
@ -176,8 +176,7 @@ GEM
tomlrb (>= 1.3, < 2.1) tomlrb (>= 1.3, < 2.1)
with_env (= 1.1.0) with_env (= 1.1.0)
xml-simple (~> 1.1.9) xml-simple (~> 1.1.9)
lint_roller (1.1.0) logger (1.6.4)
logger (1.6.6)
loofah (2.23.1) loofah (2.23.1)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.12.0) nokogiri (>= 1.12.0)
@ -189,7 +188,6 @@ GEM
marcel (1.0.4) marcel (1.0.4)
method_source (1.1.0) method_source (1.1.0)
mini_mime (1.1.5) mini_mime (1.1.5)
mini_portile2 (2.8.8)
minitest (5.25.4) minitest (5.25.4)
money (6.19.0) money (6.19.0)
i18n (>= 0.6.4, <= 2) i18n (>= 0.6.4, <= 2)
@ -206,22 +204,21 @@ GEM
net-smtp (0.5.0) net-smtp (0.5.0)
net-protocol net-protocol
nio4r (2.7.4) nio4r (2.7.4)
nokogiri (1.18.2) nokogiri (1.17.2-aarch64-linux)
mini_portile2 (~> 2.8.2)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.2-aarch64-linux-gnu) nokogiri (1.17.2-arm-linux)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.2-arm-linux-gnu) nokogiri (1.17.2-arm64-darwin)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.2-arm64-darwin) nokogiri (1.17.2-x86-linux)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.2-x86_64-darwin) nokogiri (1.17.2-x86_64-darwin)
racc (~> 1.4) racc (~> 1.4)
nokogiri (1.18.2-x86_64-linux-gnu) nokogiri (1.17.2-x86_64-linux)
racc (~> 1.4) racc (~> 1.4)
orm_adapter (0.5.0) orm_adapter (0.5.0)
parallel (1.26.3) parallel (1.26.3)
parser (3.3.7.1) parser (3.3.6.0)
ast (~> 2.4.1) ast (~> 2.4.1)
racc racc
pg (1.5.9) pg (1.5.9)
@ -231,15 +228,15 @@ GEM
pry (0.15.2) pry (0.15.2)
coderay (~> 1.1) coderay (~> 1.1)
method_source (~> 1.0) method_source (~> 1.0)
psych (5.2.3) psych (5.2.2)
date date
stringio stringio
public_suffix (6.0.1) public_suffix (6.0.1)
puma (6.6.0) puma (6.5.0)
nio4r (~> 2.0) nio4r (~> 2.0)
raabro (1.4.0) raabro (1.4.0)
racc (1.8.1) racc (1.8.1)
rack (3.1.10) rack (3.1.8)
rack-cors (2.0.2) rack-cors (2.0.2)
rack (>= 2.0.0) rack (>= 2.0.0)
rack-session (2.0.0) rack-session (2.0.0)
@ -287,18 +284,18 @@ GEM
execjs execjs
railties (>= 3.2) railties (>= 3.2)
tilt tilt
redis (5.4.0) redis (5.3.0)
redis-client (>= 0.22.0) redis-client (>= 0.22.0)
redis-client (0.23.2) redis-client (0.22.2)
connection_pool connection_pool
regexp_parser (2.10.0) regexp_parser (2.9.3)
reline (0.6.0) reline (0.6.0)
io-console (~> 0.5) io-console (~> 0.5)
responders (3.1.1) responders (3.1.1)
actionpack (>= 5.2) actionpack (>= 5.2)
railties (>= 5.2) railties (>= 5.2)
rexml (3.3.9) rexml (3.3.9)
rspec-core (3.13.3) rspec-core (3.13.2)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-expectations (3.13.3) rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
@ -306,7 +303,7 @@ GEM
rspec-mocks (3.13.2) rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.13.0) rspec-support (~> 3.13.0)
rspec-rails (7.1.1) rspec-rails (7.1.0)
actionpack (>= 7.0) actionpack (>= 7.0)
activesupport (>= 7.0) activesupport (>= 7.0)
railties (>= 7.0) railties (>= 7.0)
@ -314,7 +311,7 @@ GEM
rspec-expectations (~> 3.13) rspec-expectations (~> 3.13)
rspec-mocks (~> 3.13) rspec-mocks (~> 3.13)
rspec-support (~> 3.13) rspec-support (~> 3.13)
rspec-support (3.13.2) rspec-support (3.13.1)
rswag (2.16.0) rswag (2.16.0)
rswag-api (= 2.16.0) rswag-api (= 2.16.0)
rswag-specs (= 2.16.0) rswag-specs (= 2.16.0)
@ -330,41 +327,38 @@ GEM
rswag-ui (2.16.0) rswag-ui (2.16.0)
actionpack (>= 5.2, < 8.1) actionpack (>= 5.2, < 8.1)
railties (>= 5.2, < 8.1) railties (>= 5.2, < 8.1)
rubocop (1.73.2) rubocop (1.69.2)
json (~> 2.3) json (~> 2.3)
language_server-protocol (~> 3.17.0.2) language_server-protocol (>= 3.17.0)
lint_roller (~> 1.1.0)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.3.0.2) parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0) regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.38.0, < 2.0) rubocop-ast (>= 1.36.2, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0) unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.38.1) rubocop-ast (1.36.2)
parser (>= 3.3.1.0) parser (>= 3.3.1.0)
rubocop-factory_bot (2.27.0) rubocop-factory_bot (2.26.1)
lint_roller (~> 1.1) rubocop (~> 1.61)
rubocop (~> 1.72, >= 1.72.1) rubocop-rails (2.28.0)
rubocop-rails (2.30.3)
activesupport (>= 4.2.0) activesupport (>= 4.2.0)
lint_roller (~> 1.1)
rack (>= 1.1) rack (>= 1.1)
rubocop (>= 1.72.1, < 2.0) rubocop (>= 1.52.0, < 2.0)
rubocop-ast (>= 1.38.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0)
rubocop-rspec (3.4.0) rubocop-rspec (3.3.0)
rubocop (~> 1.61) rubocop (~> 1.61)
rubocop-rspec_rails (2.30.0) rubocop-rspec_rails (2.30.0)
rubocop (~> 1.61) rubocop (~> 1.61)
rubocop-rspec (~> 3, >= 3.0.1) rubocop-rspec (~> 3, >= 3.0.1)
ruby-progressbar (1.13.0) ruby-progressbar (1.13.0)
rubytree (2.1.1) rubytree (2.1.0)
json (~> 2.0, > 2.9) json (~> 2.0, > 2.3.1)
rubyzip (2.3.2) rubyzip (2.3.2)
securerandom (0.4.1) securerandom (0.4.1)
shoulda-matchers (6.4.0) shoulda-matchers (6.4.0)
activesupport (>= 5.2.0) activesupport (>= 5.2.0)
solid_queue (1.1.3) solid_queue (1.1.2)
activejob (>= 7.1) activejob (>= 7.1)
activerecord (>= 7.1) activerecord (>= 7.1)
concurrent-ruby (>= 1.3.1) concurrent-ruby (>= 1.3.1)
@ -391,7 +385,7 @@ GEM
tzinfo (2.0.6) tzinfo (2.0.6)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
unicode-display_width (2.6.0) unicode-display_width (2.6.0)
uri (1.0.3) uri (1.0.2)
useragent (0.16.11) useragent (0.16.11)
warden (1.2.9) warden (1.2.9)
rack (>= 2.0.9) rack (>= 2.0.9)
@ -471,7 +465,7 @@ CHECKSUMS
activesupport (8.0.1) sha256=fd5bc74641c24ac3541055c2879789198ff42adee3e39c2933289ba008912e37 activesupport (8.0.1) sha256=fd5bc74641c24ac3541055c2879789198ff42adee3e39c2933289ba008912e37
acts_as_tenant (1.0.1) sha256=6944e4d64533337938a8817a6b4ff9b11189c9dcc0b1333bb89f3821a4c14c53 acts_as_tenant (1.0.1) sha256=6944e4d64533337938a8817a6b4ff9b11189c9dcc0b1333bb89f3821a4c14c53
addressable (2.8.7) sha256=462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232 addressable (2.8.7) sha256=462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232
annotaterb (4.14.0) sha256=466cf28443416a19754c807cb2acb9370c75a6a2bc3b92d3c4bbc02a38d00975 annotaterb (4.13.0) sha256=6f472912002fefa735665b4132de47d0134ebf1efb76a7ef05f579cc4a6b2ff1
ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12 ast (2.4.2) sha256=1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12
babel-source (5.8.35) sha256=79ef222a9dcb867ac2efa3b0da35b4bcb15a4bfa67b6b2dcbf1e9a29104498d9 babel-source (5.8.35) sha256=79ef222a9dcb867ac2efa3b0da35b4bcb15a4bfa67b6b2dcbf1e9a29104498d9
babel-transpiler (0.7.0) sha256=4c06f4ad9e8e1cabe94f99e11df2f140bb72aca9ba067dbb49dc14d9b98d1570 babel-transpiler (0.7.0) sha256=4c06f4ad9e8e1cabe94f99e11df2f140bb72aca9ba067dbb49dc14d9b98d1570
@ -485,8 +479,8 @@ CHECKSUMS
childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec
chroma (0.2.0) sha256=64bdcd36a4765fbcd45adc64960cc153101300b4918f90ffdd89f4e2eb954b54 chroma (0.2.0) sha256=64bdcd36a4765fbcd45adc64960cc153101300b4918f90ffdd89f4e2eb954b54
coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6 concurrent-ruby (1.3.4) sha256=d4aa926339b0a86b5b5054a0a8c580163e6f5dcbdfd0f4bb916b1a2570731c32
connection_pool (2.5.0) sha256=233b92f8d38e038c1349ccea65dd3772727d669d6d2e71f9897c8bf5cd53ebfc connection_pool (2.4.1) sha256=0f40cf997091f1f04ff66da67eabd61a9fe0d4928b9a3645228532512fab62f4
crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
csv (3.3.2) sha256=6ff0c135e65e485d1864dde6c1703b60d34cc9e19bed8452834a0b28a519bd4e csv (3.3.2) sha256=6ff0c135e65e485d1864dde6c1703b60d34cc9e19bed8452834a0b28a519bd4e
date (3.4.1) sha256=bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f date (3.4.1) sha256=bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f
@ -503,12 +497,12 @@ CHECKSUMS
fugit (1.11.1) sha256=e89485e7be22226d8e9c6da411664d0660284b4b1c08cacb540f505907869868 fugit (1.11.1) sha256=e89485e7be22226d8e9c6da411664d0660284b4b1c08cacb540f505907869868
globalid (1.2.1) sha256=70bf76711871f843dbba72beb8613229a49429d1866828476f9c9d6ccc327ce9 globalid (1.2.1) sha256=70bf76711871f843dbba72beb8613229a49429d1866828476f9c9d6ccc327ce9
httparty (0.22.0) sha256=78652a5c9471cf0093d3b2083c2295c9c8f12b44c65112f1846af2b71430fa6c httparty (0.22.0) sha256=78652a5c9471cf0093d3b2083c2295c9c8f12b44c65112f1846af2b71430fa6c
i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f i18n (1.14.6) sha256=dc229a74f5d181f09942dd60ab5d6e667f7392c4ee826f35096db36d1fe3614c
importmap-rails (2.1.0) sha256=9f10c67d60651a547579f448100d033df311c5d5db578301374aeb774faae741 importmap-rails (2.1.0) sha256=9f10c67d60651a547579f448100d033df311c5d5db578301374aeb774faae741
io-console (0.8.0) sha256=cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2 io-console (0.8.0) sha256=cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2
irb (1.14.3) sha256=c457f1f2f1438ae9ce5c5be3981ae2138dec7fb894c7d73777eeeb0a6c0d0752 irb (1.14.3) sha256=c457f1f2f1438ae9ce5c5be3981ae2138dec7fb894c7d73777eeeb0a6c0d0752
jbuilder (2.13.0) sha256=7200a38a1c0081aa81b7a9757e7a299db75bc58cf1fd45ca7919a91627d227d6 jbuilder (2.13.0) sha256=7200a38a1c0081aa81b7a9757e7a299db75bc58cf1fd45ca7919a91627d227d6
json (2.10.1) sha256=ddc88ad91a1baf3f0038c174f253af3b086d30dc74db17ca4259bbde982f94dc json (2.8.2) sha256=dd4fa6c9c81daecf72b86ea36e56ed8955fdbb4d4dc379c93d313a59344486cf
json-schema (5.0.1) sha256=bef71a82c600a42594911553522e143f7634affc198ed507ef3ded2f920a74a9 json-schema (5.0.1) sha256=bef71a82c600a42594911553522e143f7634affc198ed507ef3ded2f920a74a9
jsonapi-deserializable (0.2.0) sha256=5f0ca2d3f8404cce1584a314e8a3753be32a56054c942adfe997b87e92bce147 jsonapi-deserializable (0.2.0) sha256=5f0ca2d3f8404cce1584a314e8a3753be32a56054c942adfe997b87e92bce147
jsonapi-parser (0.1.1) sha256=9ee0dc031e88fc7548d56fab66f9716d1e1c06f972b529b8c4617bc42a097020 jsonapi-parser (0.1.1) sha256=9ee0dc031e88fc7548d56fab66f9716d1e1c06f972b529b8c4617bc42a097020
@ -516,19 +510,17 @@ CHECKSUMS
jsonapi-rb (0.5.0) sha256=7922a164278f506c43d56277f6bd0800a0b603cc985f7f63fe7241b2628bd105 jsonapi-rb (0.5.0) sha256=7922a164278f506c43d56277f6bd0800a0b603cc985f7f63fe7241b2628bd105
jsonapi-renderer (0.2.2) sha256=b5c44b033d61b4abdb6500fa4ab84807ca0b36ea0e59e47a2c3ca7095a6e447b jsonapi-renderer (0.2.2) sha256=b5c44b033d61b4abdb6500fa4ab84807ca0b36ea0e59e47a2c3ca7095a6e447b
jsonapi-serializable (0.3.1) sha256=221e657677659d798e268a33ec97a83ec5ea0e4233f931358db84e88056552e9 jsonapi-serializable (0.3.1) sha256=221e657677659d798e268a33ec97a83ec5ea0e4233f931358db84e88056552e9
language_server-protocol (3.17.0.4) sha256=c484626478664fd13482d8180947c50a8590484b1258b99b7aedb3b69df89669 language_server-protocol (3.17.0.3) sha256=3d5c58c02f44a20d972957a9febe386d7e7468ab3900ce6bd2b563dd910c6b3f
launchy (3.0.1) sha256=b7fa60bda0197cf57614e271a250a8ca1f6a34ab889a3c73f67ec5d57c8a7f2c launchy (3.0.1) sha256=b7fa60bda0197cf57614e271a250a8ca1f6a34ab889a3c73f67ec5d57c8a7f2c
letter_opener (1.10.0) sha256=2ff33f2e3b5c3c26d1959be54b395c086ca6d44826e8bf41a14ff96fdf1bdbb2 letter_opener (1.10.0) sha256=2ff33f2e3b5c3c26d1959be54b395c086ca6d44826e8bf41a14ff96fdf1bdbb2
letter_opener_web (3.0.0) sha256=3f391efe0e8b9b24becfab5537dfb17a5cf5eb532038f947daab58cb4b749860 letter_opener_web (3.0.0) sha256=3f391efe0e8b9b24becfab5537dfb17a5cf5eb532038f947daab58cb4b749860
license_finder (7.2.1) sha256=179ead19b64b170638b72fd16024233813673ac9d20d5ba75ae0b4444887ef14 license_finder (7.2.1) sha256=179ead19b64b170638b72fd16024233813673ac9d20d5ba75ae0b4444887ef14
lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.6.4) sha256=b627b91c922231050932e7bf8ee886fe54790ba2238a468ead52ba21911f2ee7
logger (1.6.6) sha256=dd618d24e637715472732e7eed02e33cfbdf56deaad225edd0f1f89d38024017
loofah (2.23.1) sha256=d0a07422cb3b69272e124afa914ef6d517e30d5496b7f1c1fc5b95481f13f75e loofah (2.23.1) sha256=d0a07422cb3b69272e124afa914ef6d517e30d5496b7f1c1fc5b95481f13f75e
mail (2.8.1) sha256=ec3b9fadcf2b3755c78785cb17bc9a0ca9ee9857108a64b6f5cfc9c0b5bfc9ad mail (2.8.1) sha256=ec3b9fadcf2b3755c78785cb17bc9a0ca9ee9857108a64b6f5cfc9c0b5bfc9ad
marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4 marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4
method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5 method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
mini_portile2 (2.8.8) sha256=8e47136cdac04ce81750bb6c09733b37895bf06962554e4b4056d78168d70a75
minitest (5.25.4) sha256=9cf2cae25ac4dfc90c988ebc3b917f53c054978b673273da1bd20bcb0778f947 minitest (5.25.4) sha256=9cf2cae25ac4dfc90c988ebc3b917f53c054978b673273da1bd20bcb0778f947
money (6.19.0) sha256=ec936fa1e42f2783719241ed9fd52725d0efa628f928feea1eb5c37d5de7daf3 money (6.19.0) sha256=ec936fa1e42f2783719241ed9fd52725d0efa628f928feea1eb5c37d5de7daf3
msgpack (1.7.2) sha256=59ab62fd8a4d0dfbde45009f87eb6f158ab2628a7c48886b0256f175166baaa8 msgpack (1.7.2) sha256=59ab62fd8a4d0dfbde45009f87eb6f158ab2628a7c48886b0256f175166baaa8
@ -538,24 +530,24 @@ CHECKSUMS
net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
net-smtp (0.5.0) sha256=5fc0415e6ea1cc0b3dfea7270438ec22b278ca8d524986a3ae4e5ae8d087b42a net-smtp (0.5.0) sha256=5fc0415e6ea1cc0b3dfea7270438ec22b278ca8d524986a3ae4e5ae8d087b42a
nio4r (2.7.4) sha256=d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9 nio4r (2.7.4) sha256=d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9
nokogiri (1.18.2) sha256=93791cfb33186fe077eb9e1b8a6855b5621e328f81f565334572fa398366f8bf nokogiri (1.17.2-aarch64-linux) sha256=585c8cac6380848b7973bacfd0584628d116810e5f209db25e22d0c32313e681
nokogiri (1.18.2-aarch64-linux-gnu) sha256=74e0f9a7487a30a2957f46c5113d58f836436b033c9906e0bc6fee9d8cdafabf nokogiri (1.17.2-arm-linux) sha256=3d033ad9b09d5b8a203f0f2156053e93a9327a9c7887c0ceb9fa78c71d27280d
nokogiri (1.18.2-arm-linux-gnu) sha256=6fb0246b69f2c589a69254e82bc2a40aa238c4f977fd7903e283341a92935729 nokogiri (1.17.2-arm64-darwin) sha256=0c5eb06ba1c112d33c2bb29973b07e2f21c4ddb66c67c9386fd97ff1c5d84686
nokogiri (1.18.2-arm64-darwin) sha256=8288ec7a296e2510ca9bd053c0c5989f11260f8c07bc3e9afbafa536f7077281 nokogiri (1.17.2-x86-linux) sha256=8c4dd75e35810bdeb7c74943f383ca665baf6aed8fc2b78c1d305094a72794aa
nokogiri (1.18.2-x86_64-darwin) sha256=7fca165e5ee87e9b6b3f1377180376afc0c8652ed2a3d761f472f0e3d3a1c651 nokogiri (1.17.2-x86_64-darwin) sha256=dc5977eb3416e1d501b22b0ed4737bf7604121491405865b887975eacfb3e896
nokogiri (1.18.2-x86_64-linux-gnu) sha256=9330ced4a976604865c2a76ce158e2bc608fa83999552e85a32ec06f85f427db nokogiri (1.17.2-x86_64-linux) sha256=e8614ae8d776bd9adb535ca814375e7ae05d7cfa6aa01909e561484f6d70be0b
orm_adapter (0.5.0) sha256=aa5d0be5d540cbb46d3a93e88061f4ece6a25f6e97d6a47122beb84fe595e9b9 orm_adapter (0.5.0) sha256=aa5d0be5d540cbb46d3a93e88061f4ece6a25f6e97d6a47122beb84fe595e9b9
parallel (1.26.3) sha256=d86babb7a2b814be9f4b81587bf0b6ce2da7d45969fab24d8ae4bf2bb4d4c7ef parallel (1.26.3) sha256=d86babb7a2b814be9f4b81587bf0b6ce2da7d45969fab24d8ae4bf2bb4d4c7ef
parser (3.3.7.1) sha256=7dbe61618025519024ac72402a6677ead02099587a5538e84371b76659e6aca1 parser (3.3.6.0) sha256=25d4e67cc4f0f7cab9a2ae1f38e2005b6904d2ea13c34734511d0faad038bc3b
pg (1.5.9) sha256=761efbdf73b66516f0c26fcbe6515dc7500c3f0aa1a1b853feae245433c64fdc pg (1.5.9) sha256=761efbdf73b66516f0c26fcbe6515dc7500c3f0aa1a1b853feae245433c64fdc
pluck_to_hash (1.0.2) sha256=1599906239716f98262a41493dd7d4cb72e8d83ad3d76d666deacfc5de50a47e pluck_to_hash (1.0.2) sha256=1599906239716f98262a41493dd7d4cb72e8d83ad3d76d666deacfc5de50a47e
pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b pry (0.15.2) sha256=12d54b8640d3fa29c9211dd4ffb08f3fd8bf7a4fd9b5a73ce5b59c8709385b6b
psych (5.2.3) sha256=84a54bb952d14604fea22d99938348814678782f58b12648fcdfa4d2fce859ee psych (5.2.2) sha256=a4a9477c85d3e858086c38cf64e7096abe40d1b1eed248b01020dec0ff9906ab
public_suffix (6.0.1) sha256=61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f public_suffix (6.0.1) sha256=61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f
puma (6.6.0) sha256=f25c06873eb3d5de5f0a4ebc783acc81a4ccfe580c760cfe323497798018ad87 puma (6.5.0) sha256=94d1b75cab7f356d52e4f1b17b9040a090889b341dbeee6ee3703f441dc189f2
raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rack (3.1.10) sha256=5e873127d04704c8121528b1ce04c551b5493a78291cace896b059a2a44bcb12 rack (3.1.8) sha256=d3fbcbca43dc2b43c9c6d7dfbac01667ae58643c42cea10013d0da970218a1b1
rack-cors (2.0.2) sha256=415d4e1599891760c5dc9ef0349c7fecdf94f7c6a03e75b2e7c2b54b82adda1b rack-cors (2.0.2) sha256=415d4e1599891760c5dc9ef0349c7fecdf94f7c6a03e75b2e7c2b54b82adda1b
rack-session (2.0.0) sha256=db04b2063e180369192a9046b4559af311990af38c6a93d4c600cee4eb6d4e81 rack-session (2.0.0) sha256=db04b2063e180369192a9046b4559af311990af38c6a93d4c600cee4eb6d4e81
rack-test (2.1.0) sha256=0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb rack-test (2.1.0) sha256=0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb
@ -568,33 +560,33 @@ CHECKSUMS
rake (13.2.1) sha256=46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d rake (13.2.1) sha256=46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d
rdoc (6.10.0) sha256=db665021883ac9df3ba29cdf71aece960749888db1bf9615b4a584cfa3fa3eda rdoc (6.10.0) sha256=db665021883ac9df3ba29cdf71aece960749888db1bf9615b4a584cfa3fa3eda
react-rails (3.2.1) sha256=2235db0b240517596b1cb3e26177ab5bc64d3a56579b0415ee242b1691f81f64 react-rails (3.2.1) sha256=2235db0b240517596b1cb3e26177ab5bc64d3a56579b0415ee242b1691f81f64
redis (5.4.0) sha256=798900d869418a9fc3977f916578375b45c38247a556b61d58cba6bb02f7d06b redis (5.3.0) sha256=6bf810c5ae889187f0c45f77db503310980310afa57cf1640d57f419ccda72b1
redis-client (0.23.2) sha256=e33bab6682c8155cfef95e6dd296936bb9c2981a89fb578ace27a076fa2836fa redis-client (0.22.2) sha256=31fee4b7cf04109b227327fabeaaf1fc5b652cf48a186a03bc607e40767bacc0
regexp_parser (2.10.0) sha256=cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61 regexp_parser (2.9.3) sha256=4b620657ed8349d82e1331a076415c79b9dd714a5546162ddd790ea9988f6379
reline (0.6.0) sha256=57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2 reline (0.6.0) sha256=57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2
responders (3.1.1) sha256=92f2a87e09028347368639cfb468f5fefa745cb0dc2377ef060db1cdd79a341a responders (3.1.1) sha256=92f2a87e09028347368639cfb468f5fefa745cb0dc2377ef060db1cdd79a341a
rexml (3.3.9) sha256=d71875b85299f341edf47d44df0212e7658cbdf35aeb69cefdb63f57af3137c9 rexml (3.3.9) sha256=d71875b85299f341edf47d44df0212e7658cbdf35aeb69cefdb63f57af3137c9
rspec-core (3.13.3) sha256=25136507f4f9cf2e8977a2851e64e438b4331646054e345998714108745cdfe4 rspec-core (3.13.2) sha256=94fbda6e4738e478f1c7532b7cc241272fcdc8b9eac03a97338b1122e4573300
rspec-expectations (3.13.3) sha256=0e6b5af59b900147698ea0ff80456c4f2e69cac4394fbd392fbd1ca561f66c58 rspec-expectations (3.13.3) sha256=0e6b5af59b900147698ea0ff80456c4f2e69cac4394fbd392fbd1ca561f66c58
rspec-mocks (3.13.2) sha256=2327335def0e1665325a9b617e3af9ae20272741d80ac550336309a7c59abdef rspec-mocks (3.13.2) sha256=2327335def0e1665325a9b617e3af9ae20272741d80ac550336309a7c59abdef
rspec-rails (7.1.1) sha256=e15dccabed211e2fd92f21330c819adcbeb1591c1d66c580d8f2d8288557e331 rspec-rails (7.1.0) sha256=94585b69c4086ca79afae5cc8d2c5e314f6ad32a88c927f9c065b99596e3ee47
rspec-support (3.13.2) sha256=cea3a2463fd9b84b9dcc9685efd80ea701aa8f7b3decb3b3ce795ed67737dbec rspec-support (3.13.1) sha256=48877d4f15b772b7538f3693c22225f2eda490ba65a0515c4e7cf6f2f17de70f
rswag (2.16.0) sha256=f07ce41548b9bb51464c38bc7b95af22fee84b90f2d1197a515a623906353086 rswag (2.16.0) sha256=f07ce41548b9bb51464c38bc7b95af22fee84b90f2d1197a515a623906353086
rswag-api (2.16.0) sha256=b653f7bd92e98be18b01ab4525d88950d7b0960e293a99f856b9efcee3ae6074 rswag-api (2.16.0) sha256=b653f7bd92e98be18b01ab4525d88950d7b0960e293a99f856b9efcee3ae6074
rswag-specs (2.16.0) sha256=8ba26085c408b0bd2ed21dc8015c80f417c7d34c63720ab7133c2549b5bd2a91 rswag-specs (2.16.0) sha256=8ba26085c408b0bd2ed21dc8015c80f417c7d34c63720ab7133c2549b5bd2a91
rswag-ui (2.16.0) sha256=a1f49e927dceda92e6e6e7c1000f1e217ee66c565f69e28131dc98b33cd3a04f rswag-ui (2.16.0) sha256=a1f49e927dceda92e6e6e7c1000f1e217ee66c565f69e28131dc98b33cd3a04f
rubocop (1.73.2) sha256=35cd1b1365ba97234323fe771abcecd09c9b77098464cd726c76aa7d9bc12b5d rubocop (1.69.2) sha256=762fb0f30a379bf6054588d39f1815a2a1df8f067bc0337d3fe500e346924bb8
rubocop-ast (1.38.1) sha256=80ecbe2ac9bb26693cab9405bf72b41b85a1f909f20f021b983c32c2e7d857fe rubocop-ast (1.36.2) sha256=566405b7f983eb9aa3b91d28aca6bc6566e356a97f59e89851dd910aef1dd1ca
rubocop-factory_bot (2.27.0) sha256=de9918bc4e1406b3025da87c5c34c91dd6c3e802cd59339790631f963a5652ba rubocop-factory_bot (2.26.1) sha256=8de13cd4edcee5ca800f255188167ecef8dbfc3d1fae9f15734e9d2e755392aa
rubocop-rails (2.30.3) sha256=fc5a6506daa916d15e282cc806943afa64a020bf592b93a94025d89a2a78a715 rubocop-rails (2.28.0) sha256=4967bed9ea13e6dcab566fea4265a6dd0381db739b305e48930aba1282da2715
rubocop-rspec (3.4.0) sha256=8721c13b6a8c9530a7ac481cea9423022f946fcf72428bda8289f8b57e4d4885 rubocop-rspec (3.3.0) sha256=79e1b281a689044d1516fefbc52e2e6c06cd367c25ebeaf06a7a198e9071cd7d
rubocop-rspec_rails (2.30.0) sha256=888112e83f9d7ef7ad2397e9d69a0b9614a4bae24f072c399804a180f80c4c46 rubocop-rspec_rails (2.30.0) sha256=888112e83f9d7ef7ad2397e9d69a0b9614a4bae24f072c399804a180f80c4c46
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
rubytree (2.1.1) sha256=4925016356a81730e982f1f8c3b5f8da461f18906c77d238bad4c4ba896abd41 rubytree (2.1.0) sha256=30e8759ba060dff0dabf7e40cbaaa4df892fa34cbe9f1b3fbb00e83a3f321e4b
rubyzip (2.3.2) sha256=3f57e3935dc2255c414484fbf8d673b4909d8a6a57007ed754dde39342d2373f rubyzip (2.3.2) sha256=3f57e3935dc2255c414484fbf8d673b4909d8a6a57007ed754dde39342d2373f
securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
shoulda-matchers (6.4.0) sha256=9055bb7f4bb342125fb860809798855c630e05ef5e75837b3168b8e6ee1608b0 shoulda-matchers (6.4.0) sha256=9055bb7f4bb342125fb860809798855c630e05ef5e75837b3168b8e6ee1608b0
solid_queue (1.1.3) sha256=c7b4a84819eca6a61250aa8d7e48b8ded6882026e78ee21d3701d372ca741aa2 solid_queue (1.1.2) sha256=178c9396d1cf0dac595c7508da90ddb397d25848ca007b5c5ed48e6ac6fc360c
sprockets (4.2.1) sha256=951b13dd2f2fcae840a7184722689a803e0ff9d2702d902bd844b196da773f97 sprockets (4.2.1) sha256=951b13dd2f2fcae840a7184722689a803e0ff9d2702d902bd844b196da773f97
sprockets-rails (3.5.2) sha256=a9e88e6ce9f8c912d349aa5401509165ec42326baf9e942a85de4b76dbc4119e sprockets-rails (3.5.2) sha256=a9e88e6ce9f8c912d349aa5401509165ec42326baf9e942a85de4b76dbc4119e
stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06 stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06
@ -606,7 +598,7 @@ CHECKSUMS
turbo-rails (2.0.11) sha256=fc47674736372780abd2a4dc0d84bef242f5ca156a457cd7fa6308291e397fcf turbo-rails (2.0.11) sha256=fc47674736372780abd2a4dc0d84bef242f5ca156a457cd7fa6308291e397fcf
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a
uri (1.0.3) sha256=e9f2244608eea2f7bc357d954c65c910ce0399ca5e18a7a29207ac22d8767011 uri (1.0.2) sha256=b303504ceb7e5905771fa7fa14b649652fa949df18b5880d69cfb12494791e27
useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844 useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0 warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0
web-console (4.2.1) sha256=e7bcf37a10ea2b4ec4281649d1cee461b32232d0a447e82c786e6841fd22fe20 web-console (4.2.1) sha256=e7bcf37a10ea2b4ec4281649d1cee461b32232d0a447e82c786e6841fd22fe20
@ -617,7 +609,7 @@ CHECKSUMS
zeitwerk (2.7.1) sha256=0945986050e4907140895378e74df1fe882a2271ed087cc6c6d6b00d415a2756 zeitwerk (2.7.1) sha256=0945986050e4907140895378e74df1fe882a2271ed087cc6c6d6b00d415a2756
RUBY VERSION RUBY VERSION
ruby 3.4.2p28 ruby 3.3.6p108
BUNDLED WITH BUNDLED WITH
2.6.1 2.6.1

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,18 +1,18 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
class AffinitiesController < ApplicationController class AffinitiesController < ApplicationController
before_action :set_group, except: :reset before_action :set_group
def index def index
overridden = @group.affinities.each_with_object({}) do |affinity, acc| overridden = @group.affinities.each_with_object({}) do |affinity, acc|
acc[affinity.another_group(@group).id] = affinity.discomfort acc[affinity.another_group(@group).id] = affinity.discomfort
end end
Group.where.not(id: @group.id)
for_each_group do |group_id| .pluck(:id)
overridden[group_id] || GroupAffinity::NEUTRAL .index_with { |group_id| GroupAffinity::MAX_DISCOMFORT - (overridden[group_id] || GroupAffinity::NEUTRAL) }
end .then { |affinities| render json: affinities }
end end
def bulk_update def bulk_update
@ -24,7 +24,7 @@ class AffinitiesController < ApplicationController
} }
end end
GroupAffinity.upsert_all(affinities, unique_by: :uindex_group_pair) GroupAffinity.upsert_all(affinities)
render json: {}, status: :ok render json: {}, status: :ok
rescue ActiveRecord::InvalidForeignKey rescue ActiveRecord::InvalidForeignKey
@ -33,39 +33,8 @@ class AffinitiesController < ApplicationController
render json: { error: 'Invalid group ID or discomfort provided.' }, status: :bad_request render json: { error: 'Invalid group ID or discomfort provided.' }, status: :bad_request
end end
def default
hierarchy = AffinityGroupsHierarchy.new
for_each_group do |group_id|
hierarchy.default_discomfort(@group.id, group_id).to_f
end
end
def reset
hierarchy = AffinityGroupsHierarchy.new
affinities = Group.pluck(:id).combination(2).map do |(group_a_id, group_b_id)|
{
group_a_id:,
group_b_id:,
discomfort: hierarchy.default_discomfort(group_a_id, group_b_id).to_f
}
end
GroupAffinity.upsert_all(affinities, unique_by: :uindex_group_pair)
render json: {}, status: :ok
end
private private
def for_each_group
Group.where.not(id: @group.id)
.pluck(:id)
.index_with { |group_id| GroupAffinity::MAX_DISCOMFORT - yield(group_id) }
.then { |affinities| render json: affinities }
end
def set_group def set_group
@group = Group.find(params[:group_id]) @group = Group.find(params[:group_id])
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -29,6 +29,6 @@ class ExpensesController < ApplicationController
private private
def expense_params def expense_params
params.expect(expense: %i[name amount pricing_type]) params.require(:expense).permit(:name, :amount, :pricing_type)
end end
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -30,6 +30,6 @@ class GuestsController < ApplicationController
private private
def guest_params def guest_params
params.expect(guest: %i[name group_id status]) params.require(:guest).permit(:name, :group_id, :status)
end end
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,18 +1,10 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
class TablesArrangementsController < ApplicationController class TablesArrangementsController < ApplicationController
def index def index
current_digest = Tables::Distribution.digest(current_tenant) render json: TablesArrangement.order(discomfort: :asc).limit(3).as_json(only: %i[id name discomfort])
render json: TablesArrangement
.order(valid: :desc)
.order(discomfort: :asc)
.select(:id, :name, :discomfort)
.select("digest = '#{current_digest}'::uuid as valid")
.limit(20)
.as_json(only: %i[id name discomfort valid])
end end
def show def show
@ -24,12 +16,6 @@ class TablesArrangementsController < ApplicationController
.then { |result| render json: { id: params[:id], tables: result } } .then { |result| render json: { id: params[:id], tables: result } }
end end
def create
TableSimulatorJob.perform_later(current_tenant.id)
render json: {}, status: :created
end
private private
def format(number:, guests:) def format(number:, guests:)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -41,5 +41,16 @@ class Guest < ApplicationRecord
scope :potential, -> { where.not(status: %i[declined considered]) } scope :potential, -> { where.not(status: %i[declined considered]) }
after_destroy :recalculate_simulations
after_save :recalculate_simulations, if: :saved_change_to_status?
has_many :seats, dependent: :delete_all has_many :seats, dependent: :delete_all
private
def recalculate_simulations
TablesArrangement.delete_all
ActiveJob.perform_all_later(50.times.map { TableSimulatorJob.new(wedding_id) })
end
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -7,7 +7,6 @@
# Table name: tables_arrangements # Table name: tables_arrangements
# #
# id :uuid not null, primary key # id :uuid not null, primary key
# digest :uuid not null
# discomfort :integer # discomfort :integer
# name :string not null # name :string not null
# created_at :datetime not null # created_at :datetime not null

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -19,6 +19,4 @@ class Wedding < ApplicationRecord
SLUG_REGEX = /[a-z\d-]+/ SLUG_REGEX = /[a-z\d-]+/
validates :slug, presence: true, uniqueness: true, format: { with: /\A#{SLUG_REGEX}\z/ } validates :slug, presence: true, uniqueness: true, format: { with: /\A#{SLUG_REGEX}\z/ }
has_many :guests, dependent: :delete_all
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,9 +1,9 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
class AffinityGroupsHierarchy < Array class AffinityGroupsHierarchy < Array
DEFAULT_DISCOMFORT = 1 include Singleton
def initialize def initialize
super super
@ -14,9 +14,6 @@ class AffinityGroupsHierarchy < Array
hydrate(group) hydrate(group)
end end
discomforts
freeze
end end
def find(id) def find(id)
@ -38,35 +35,8 @@ class AffinityGroupsHierarchy < Array
@references[id_a].distance_to_common_ancestor(@references[id_b]) @references[id_a].distance_to_common_ancestor(@references[id_b])
end end
def discomfort(id_a, id_b)
return 0 if id_a == id_b
@discomforts[uuid_to_int(id_a) + uuid_to_int(id_b)] || DEFAULT_DISCOMFORT
end
def default_discomfort(id_a, id_b)
return 0 if id_a == id_b
dist = distance(id_a, id_b)
return DEFAULT_DISCOMFORT if dist.nil?
Rational(dist, dist + 1)
end
private private
def discomforts
@discomforts ||= GroupAffinity.pluck(:group_a_id, :group_b_id,
:discomfort).each_with_object({}) do |(id_a, id_b, discomfort), acc|
acc[uuid_to_int(id_a) + uuid_to_int(id_b)] = discomfort
end
end
def uuid_to_int(uuid)
uuid.gsub('-', '').hex
end
def hydrate(group) def hydrate(group)
group.children.each do |child| group.children.each do |child|
register_child(group.id, child.id) register_child(group.id, child.id)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,13 +1,22 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
module Tables module Tables
class DiscomfortCalculator class DiscomfortCalculator
private attr_reader :table, :hierarchy class << self
def initialize(table:, hierarchy: AffinityGroupsHierarchy.new) def cohesion_discomfort(id_a:, id_b:)
distance = AffinityGroupsHierarchy.instance.distance(id_a, id_b)
return 1 if distance.nil?
Rational(distance, distance + 1)
end
end
private attr_reader :table
def initialize(table:)
@table = table @table = table
@hierarchy = hierarchy
end end
def calculate def calculate
@ -48,7 +57,7 @@ module Tables
# #
def cohesion_discomfort def cohesion_discomfort
table.map(&:group_id).tally.to_a.combination(2).sum do |(a, count_a), (b, count_b)| table.map(&:group_id).tally.to_a.combination(2).sum do |(a, count_a), (b, count_b)|
count_a * count_b * hierarchy.discomfort(a, b) count_a * count_b * self.class.cohesion_discomfort(id_a: a, id_b: b)
end end
end end
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true
@ -6,18 +6,11 @@ require_relative '../../extensions/tree_node_extension'
module Tables module Tables
class Distribution class Distribution
class << self attr_accessor :tables, :min_per_table, :max_per_table
def digest(wedding)
Digest::UUID.uuid_v5(wedding.id, wedding.guests.potential.order(:id).pluck(:id).join)
end
end
attr_accessor :tables, :min_per_table, :max_per_table, :hierarchy
def initialize(min_per_table:, max_per_table:) def initialize(min_per_table:, max_per_table:)
@min_per_table = min_per_table @min_per_table = min_per_table
@max_per_table = max_per_table @max_per_table = max_per_table
@hierarchy = AffinityGroupsHierarchy.new
@tables = [] @tables = []
end end
@ -40,6 +33,12 @@ module Tables
"#{@tables.count} tables, discomfort: #{discomfort}" "#{@tables.count} tables, discomfort: #{discomfort}"
end end
def pretty_print
@tables.map.with_index do |table, i|
"Table #{i + 1} (#{table.count} ppl): (#{local_discomfort(table)}) #{table.map(&:name).join(', ')}"
end.join("\n")
end
def deep_dup def deep_dup
self.class.new(min_per_table: @min_per_table, max_per_table: @max_per_table).tap do |new_distribution| self.class.new(min_per_table: @min_per_table, max_per_table: @max_per_table).tap do |new_distribution|
new_distribution.tables = @tables.map(&:dup) new_distribution.tables = @tables.map(&:dup)
@ -60,17 +59,14 @@ module Tables
Seat.insert_all!(records_to_store) Seat.insert_all!(records_to_store)
arrangement.update!( arrangement.update!(discomfort:)
discomfort:,
digest: self.class.digest(tables.first.first.wedding)
)
end end
end end
private private
def local_discomfort(table) def local_discomfort(table)
table.discomfort ||= DiscomfortCalculator.new(table:, hierarchy:).calculate table.discomfort ||= DiscomfortCalculator.new(table:).calculate
end end
end end
end end

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>

View File

@ -1,3 +1,3 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<%= yield %> <%= yield %>

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<p>Welcome <%= @email %>!</p> <p>Welcome <%= @email %>!</p>

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<p>Hello <%= @email %>!</p> <p>Hello <%= @email %>!</p>

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<p>Hello <%= @resource.email %>!</p> <p>Hello <%= @resource.email %>!</p>

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<p>Hello <%= @resource.email %>!</p> <p>Hello <%= @resource.email %>!</p>

View File

@ -1,4 +1,4 @@
<%# Copyright (C) 2024-2025 LibreWeddingPlanner contributors %> <%# Copyright (C) 2024 Manuel Bustillo %>
<p>Hello <%= @resource.email %>!</p> <p>Hello <%= @resource.email %>!</p>

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
require_relative 'boot' require_relative 'boot'

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Load the Rails application. # Load the Rails application.
require_relative "application" require_relative "application"

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
require "active_support/core_ext/integer/time" require "active_support/core_ext/integer/time"

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
require "active_support/core_ext/integer/time" require "active_support/core_ext/integer/time"

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
require "active_support/core_ext/integer/time" require "active_support/core_ext/integer/time"

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Pin npm packages by running ./bin/importmap # Pin npm packages by running ./bin/importmap

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
ActsAsTenant.configure do |config| ActsAsTenant.configure do |config|
config.require_tenant = !Rails.env.test? config.require_tenant = !Rails.env.test?

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
Chroma.define_palette :decreasing_saturation do Chroma.define_palette :decreasing_saturation do
spin(20).desaturate(40) spin(20).desaturate(40)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# config/initializers/cors.rb # config/initializers/cors.rb

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# Be sure to restart your server when you modify this file. # Be sure to restart your server when you modify this file.

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
Rswag::Api.configure do |c| Rswag::Api.configure do |c|

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
Rswag::Ui.configure do |c| Rswag::Ui.configure do |c|

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class Numeric class Numeric
def to_currency def to_currency

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# This configuration file will be evaluated by Puma. The top-level methods that # This configuration file will be evaluated by Puma. The top-level methods that
# are invoked here are part of Puma's configuration DSL. For more information # are invoked here are part of Puma's configuration DSL. For more information

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
Rails.application.routes.draw do Rails.application.routes.draw do
mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development? mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
@ -24,10 +24,8 @@ Rails.application.routes.draw do
end end
resources :groups, only: %i[index create update destroy] do resources :groups, only: %i[index create update destroy] do
post 'affinities/reset', to: 'affinities#reset', on: :collection
resources :affinities, only: %i[index] do resources :affinities, only: %i[index] do
put :bulk_update, on: :collection put :bulk_update, on: :collection
get :default, on: :collection
end end
end end
@ -37,7 +35,7 @@ Rails.application.routes.draw do
resources :expenses, only: %i[index create update destroy] do resources :expenses, only: %i[index create update destroy] do
get :summary, on: :collection get :summary, on: :collection
end end
resources :tables_arrangements, only: %i[index show create] resources :tables_arrangements, only: %i[index show]
resources :summary, only: :index resources :summary, only: :index
root to: redirect("/%{slug}") root to: redirect("/%{slug}")

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class CreateExpenses < ActiveRecord::Migration[7.1] class CreateExpenses < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class CreateGuests < ActiveRecord::Migration[7.1] class CreateGuests < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
# frozen_string_literal: true # frozen_string_literal: true

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class CreateTablesArrangements < ActiveRecord::Migration[7.1] class CreateTablesArrangements < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class CreateSeats < ActiveRecord::Migration[7.1] class CreateSeats < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class CreateGroups < ActiveRecord::Migration[7.1] class CreateGroups < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class AddParentToGroup < ActiveRecord::Migration[7.1] class AddParentToGroup < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class AddGroupToGuest < ActiveRecord::Migration[7.1] class AddGroupToGuest < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class AddStatusToGuest < ActiveRecord::Migration[7.1] class AddStatusToGuest < ActiveRecord::Migration[7.1]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class DropTaggableTables < ActiveRecord::Migration[7.2] class DropTaggableTables < ActiveRecord::Migration[7.2]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class AddNameToTablesArrangements < ActiveRecord::Migration[7.2] class AddNameToTablesArrangements < ActiveRecord::Migration[7.2]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class SolidQueueInstall < ActiveRecord::Migration[7.2] class SolidQueueInstall < ActiveRecord::Migration[7.2]
def change def change

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024-2025 LibreWeddingPlanner contributors # Copyright (C) 2024 Manuel Bustillo
class RemoveEmailFromGuests < ActiveRecord::Migration[7.2] class RemoveEmailFromGuests < ActiveRecord::Migration[7.2]
def change def change

Some files were not shown because too many files have changed in this diff Show More