commit df6b1275060cb18854e610cb6580e4ce55fd8a50 Author: Benjamin Bädorf Date: Mon Jun 26 15:15:19 2023 +0200 Initial commit diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..afcb08d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +result +*.qcow2 +.direnv diff --git a/README.md b/README.md new file mode 100644 index 0000000..7807600 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# OpenProject on NixOS + diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b1f996f --- /dev/null +++ b/flake.lock @@ -0,0 +1,67 @@ +{ + "nodes": { + "devshell": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "systems": [ + "systems" + ] + }, + "locked": { + "lastModified": 1687173957, + "narHash": "sha256-GOds2bAQcZ94fb9/Nl/aM+r+0wGSi4EKYuZYR8Dw4R8=", + "owner": "numtide", + "repo": "devshell", + "rev": "2cf83bb31720fcc29a999aee28d6da101173e66a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1687358386, + "narHash": "sha256-T3Qx0iL2BJmVgxqsaM3k6Y5n1XflYwLaYrzcFpdS7Yg=", + "owner": "pub-solar", + "repo": "nixpkgs", + "rev": "a22e59a4da3d22503ba6d804d0835e9977236576", + "type": "github" + }, + "original": { + "owner": "pub-solar", + "ref": "ruby-gemfile-relative-modules", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "devshell": "devshell", + "nixpkgs": "nixpkgs", + "systems": "systems" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..2b37849 --- /dev/null +++ b/flake.nix @@ -0,0 +1,75 @@ +{ + description = "OpenProject Nix"; + + # inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + inputs.nixpkgs.url = "github:pub-solar/nixpkgs/ruby-gemfile-relative-modules"; + + inputs.systems.url = "github:nix-systems/default"; + + inputs.devshell.url = "github:numtide/devshell"; + inputs.devshell.inputs.nixpkgs.follows = "nixpkgs"; + inputs.devshell.inputs.systems.follows = "systems"; + + outputs = {self, nixpkgs, systems, devshell }: + let + eachSystem = nixpkgs.lib.genAttrs (import systems); + # Nixpkgs instantiated for system types in nix-systems + nixpkgsFor = eachSystem (system: + import nixpkgs { + inherit system; + overlays = [ + self.overlays.default + devshell.overlays.default + ]; + } + ); + in + { + overlays = { + default = (import ./overlay.nix); + }; + devShells = eachSystem (system: + let + pkgs = nixpkgsFor.${system}; + in + { + default = pkgs.devshell.mkShell { + # Add additional packages you'd like to be available in your devshell + # PATH here + devshell.packages = with pkgs; [ + bundix + ruby_3_2 + ]; + commands = [ + { + help = pkgs.cachix.meta.description; + name = pkgs.cachix.pname; + package = pkgs.cachix; + } + ]; + bash.extra = '' + ''; + }; + }); + + packages = eachSystem (system: + let + pkgs = nixpkgsFor.${system}; + in + { + openproject = pkgs.openproject; + }); + + nixosConfigurations = + let + system = "x86_64-linux"; + pkgs = nixpkgsFor.${system}; + in + { + test-vm = nixpkgs.lib.nixosSystem { + inherit system pkgs; + modules = [./test-vm/configuration.nix]; + }; + }; + }; +} diff --git a/node/openproject-app.nix b/node/openproject-app.nix new file mode 100644 index 0000000..93affeb --- /dev/null +++ b/node/openproject-app.nix @@ -0,0 +1,29 @@ +{ fetchFromGitHub +, fetchNpmDeps +, runCommand +, nodejs +, yarn +, path +, nodePackages +}: +let + pinData = import ../srcs/pin.nix; + inherit (pinData) erpnextVersion; + inherit (pinData.hashes) erpnextSrcHash; + + src = fetchFromGitHub { + owner = "frappe"; + repo = "erpnext"; + rev = "v${erpnextVersion}"; + hash = erpnextSrcHash; + }; + + offlineCache = fetchNpmDeps { + yarnLock = "${src}/yarn.lock"; + sha256 = "sha256-Vho4BSbxcsVYExLvUaeoc3xIpbXoCUP/4jw4RwGnWGY="; + }; + + mkApp = import ./mk-app.nix { + inherit path runCommand nodejs yarn nodePackages; + }; +in mkApp "erpnext" src offlineCache diff --git a/node/openproject-frontend.nix b/node/openproject-frontend.nix new file mode 100644 index 0000000..0cce540 --- /dev/null +++ b/node/openproject-frontend.nix @@ -0,0 +1,32 @@ +{ runCommand +, yarn +}: +runCommand "openproject-frontend-build" {buildInputs = [yarn]; } '' + mkdir -p sites apps + + # Cannot symlink because the code which traverses path to find sites + # directory gets confused. + cp -r ${frappe-app}/share/apps/frappe apps/frappe + cp -r ${erpnext-app}/share/apps/erpnext apps/erpnext + + cat > sites/apps.txt < /dev/null + yarn --offline production + popd > /dev/null + + symlinkPublic() { + find $1/share/apps/$2/$2/public -type d -mindepth 1 -maxdepth 1 | xargs -I '{}' bash -c "ln -s {} sites/assets/$2/"'$(basename {})' + } + + symlinkPublic ${frappe-app} frappe + symlinkPublic ${erpnext-app} erpnext + + mkdir -p $out/share/sites + cp -r sites/assets $out/share/sites/assets + ln -s ${frappe-app}/share/apps/frappe/node_modules $out/share/sites/assets/frappe/node_modules + ln -s ${erpnext-app}/share/apps/erpnext/node_modules $out/share/sites/assets/erpnext/node_modules + '' diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..3e06c23 --- /dev/null +++ b/overlay.nix @@ -0,0 +1,3 @@ +final: prev: { + openproject = final.callPackage ./ruby/openproject.nix {}; +} diff --git a/ruby/Gemfile b/ruby/Gemfile new file mode 100644 index 0000000..06e119b --- /dev/null +++ b/ruby/Gemfile @@ -0,0 +1,403 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2023 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +source 'https://rubygems.org' + +ruby '~> 3.2.1' + +gem 'ox' +gem 'actionpack-xml_parser', '~> 2.0.0' +gem 'activemodel-serializers-xml', '~> 1.0.1' +gem 'activerecord-import', '~> 1.4.0' +gem 'activerecord-session_store', '~> 2.0.0' +gem 'rails', '~> 7.0', '>= 7.0.3.1' +gem 'responders', '~> 3.0' + +gem 'ffi', '~> 1.15' + +gem 'rdoc', '>= 2.4.2' + +gem 'doorkeeper', '~> 5.6.6' +# Maintain our own omniauth due to relative URL root issues +# see upstream PR: https://github.com/omniauth/omniauth/pull/903 +gem 'omniauth', git: 'https://github.com/opf/omniauth', ref: 'fe862f986b2e846e291784d2caa3d90a658c67f0' +gem 'request_store', '~> 1.5.0' + +gem 'warden', '~> 1.2' +gem 'warden-basic_auth', '~> 0.2.1' + +gem 'will_paginate', '~> 4.0.0' + +gem 'friendly_id', '~> 5.5.0' + +gem 'acts_as_list', '~> 1.1.0' +gem 'acts_as_tree', '~> 2.9.0' +gem 'awesome_nested_set', '~> 3.5.0' +gem 'closure_tree', '~> 7.4.0' +gem 'rubytree', '~> 2.0.0' +# Only used in down migrations now. +# Is to be removed once the referencing migrations have been squashed. +gem 'typed_dag', '~> 2.0.2', require: false + +gem 'addressable', '~> 2.8.0' + +# Remove whitespace from model input +gem "auto_strip_attributes", "~> 2.5" + +# Provide timezone info for TZInfo used by AR +gem 'tzinfo-data', '~> 1.2023.1' + +# to generate html-diffs (e.g. for wiki comparison) +gem 'htmldiff' + +# Generate url slugs with #to_url and other string niceties +gem 'stringex', '~> 2.8.5' + +# CommonMark markdown parser with GFM extension +gem 'commonmarker', '~> 0.23.9' + +# HTML pipeline for transformations on text formatter output +# such as sanitization or additional features +gem 'html-pipeline', '~> 2.14.0' +# Tasklist parsing and renderer +gem 'deckar01-task_list', '~> 2.3.1' +# Requires escape-utils for faster escaping +gem 'escape_utils', '~> 1.3' +# Syntax highlighting used in html-pipeline with rouge +gem 'rouge', '~> 4.1.0' +# HTML sanitization used for html-pipeline +gem 'sanitize', '~> 6.0.1' +# HTML autolinking for mails and urls (replaces autolink) +gem 'rinku', '~> 2.0.4' +# Version parsing with semver +gem 'semantic', '~> 1.6.1' + +# generates SVG Graphs +# used for statistics on svn repositories +gem 'svg-graph', '~> 2.2.0' + +gem 'date_validator', '~> 0.12.0' +gem 'email_validator', '~> 2.2.3' +gem 'json_schemer', '~> 1.0.1' +gem 'ruby-duration', '~> 3.2.0' + +# `config/initializers/mail_starttls_patch.rb` has also been patched to +# fix STARTTLS handling until https://github.com/mikel/mail/pull/1536 is +# released. +gem 'mail', '= 2.8.1' + +# provide compatible filesystem information for available storage +gem 'sys-filesystem', '~> 1.4.0', require: false + +# Faster posix-compliant spawns for 8.0. conversions with pandoc +gem 'posix-spawn', '~> 0.3.13', require: false + +gem 'bcrypt', '~> 3.1.6' + +gem 'multi_json', '~> 1.15.0' +gem 'oj', '~> 3.15.0' + +gem 'daemons' +gem 'delayed_cron_job', '~> 0.9.0' +gem 'delayed_job_active_record', '~> 4.1.5' + +gem 'rack-protection', '~> 3.0.0' + +# Rack::Attack is a rack middleware to protect your web app from bad clients. +# It allows whitelisting, blacklisting, throttling, and tracking based +# on arbitrary properties of the request. +# https://github.com/kickstarter/rack-attack +gem 'rack-attack', '~> 6.6.0' + +# CSP headers +gem 'secure_headers', '~> 6.5.0' + +# Browser detection for incompatibility checks +gem 'browser', '~> 5.3.0' + +# Providing health checks +gem 'okcomputer', '~> 1.18.1' + +gem 'gon', '~> 6.4.0' + +# Lograge to provide sane and non-verbose logging +gem 'lograge', '~> 0.12.0' + +# Structured warnings to selectively disable them in production +gem 'structured_warnings', '~> 0.4.0' + +# catch exceptions and send them to any airbrake compatible backend +# don't require by default, instead load on-demand when actually configured +gem 'airbrake', '~> 13.0.0', require: false + +gem 'prawn', '~> 2.2' +gem 'md_to_pdf', git: 'https://github.com/opf/md-to-pdf', tag: 'v0.0.18' +# prawn implicitly depends on matrix gem no longer in ruby core with 3.1 +gem 'matrix', '~> 0.4.2' + +gem 'meta-tags', '~> 2.18.0' + +gem "paper_trail", "~> 12.3" + +group :production do + # we use dalli as standard memcache client + # requires memcached 1.4+ + gem 'dalli', '~> 3.2.0' +end + +gem 'i18n-js', '~> 3.9.0' +gem 'rails-i18n', '~> 7.0.0' + +gem 'sprockets', '~> 3.7.2' # lock sprockets below 4.0 +gem 'sprockets-rails', '~> 3.4.2' + +gem 'puma', '~> 6.1' +gem 'puma-plugin-statsd', '~> 2.0' +gem 'rack-timeout', '~> 0.6.3', require: "rack/timeout/base" + +gem 'nokogiri', '~> 1.15.1' + +gem 'carrierwave', '~> 1.3.1' +gem 'carrierwave_direct', '~> 2.1.0' +gem 'fog-aws' + +gem 'aws-sdk-core', '~> 3.107' +# File upload via fog + screenshots on travis +gem 'aws-sdk-s3', '~> 1.91' + +gem 'openproject-token', '~> 3.0.1' + +gem 'plaintext', '~> 0.3.2' + +gem 'rest-client', '~> 2.0' + +gem 'ruby-progressbar', '~> 1.13.0', require: false + +gem 'mini_magick', '~> 4.12.0', require: false + +gem 'validate_url' + +# Appsignal integration +gem "appsignal", "~> 3.0", require: false + +gem 'view_component' + +gem 'turbo-rails', "~> 1.1" + +group :test do + gem 'launchy', '~> 2.5.0' + gem 'rack-test', '~> 2.1.0' + gem 'shoulda-context', '~> 2.0' + + # Test prof provides factories from code + # and other niceties + gem 'test-prof', '~> 1.2.0' + gem 'turbo_tests', github: "crohr/turbo_tests", ref: "fix/runtime-info" + + gem 'rack_session_access' + gem 'rspec', '~> 3.12.0' + # also add to development group, so "spec" rake task gets loaded + gem 'rspec-rails', '~> 6.0.0', group: :development + + # Retry failures within the same environment + gem 'retriable', '~> 3.1.1' + gem 'rspec-retry', '~> 0.6.1' + + # XML comparison tests + gem 'compare-xml', '~> 0.66', require: false + + # brings back testing for 'assigns' and 'assert_template' extracted in rails 5 + gem 'rails-controller-testing', '~> 1.0.2' + + gem 'capybara', '~> 3.39.0' + gem 'capybara-screenshot', '~> 1.0.17' + gem 'selenium-webdriver', '~> 4.0' + gem 'webdrivers', '~> 5.2.0' + + gem 'fuubar', '~> 2.5.0' + gem 'timecop', '~> 0.9.0' + + # Mock backend requests (for ruby tests) + gem 'webmock', '~> 3.12', require: false + + # Mock selenium requests through proxy (for feature tests) + gem 'puffing-billy', '~> 3.1.0' + gem 'table_print', '~> 1.5.6' + + gem 'equivalent-xml', '~> 0.6' + gem 'json_spec', '~> 1.1.4' + gem 'shoulda-matchers', '~> 5.0', require: nil + + gem 'parallel_tests', '~> 4.0' +end + +group :ldap do + gem 'net-ldap', '~> 0.18.0' +end + +group :development do + gem 'listen', '~> 3.8.0' # Use for event-based reloaders + + gem 'letter_opener' + + gem 'spring' + gem 'spring-commands-rspec' + + # Gems for living styleguide + gem 'livingstyleguide', '~> 2.1.0' + gem 'sassc-rails' + + gem 'colored2' + + # git hooks manager + gem 'lefthook', require: false +end + +group :development, :test do + gem 'dotenv-rails' + # Require factory_bot for usage with openproject plugins testing + gem 'factory_bot', '~> 6.2.0' + # require factory_bot_rails for convenience in core development + gem 'factory_bot_rails', '~> 6.2.0' + + # Tracing and profiling gems + gem 'flamegraph', require: false + gem 'rack-mini-profiler', require: false + gem 'ruby-prof', require: false + gem 'stackprof', require: false + + # REPL with debug commands + gem 'debug' + + gem 'pry-byebug', '~> 3.10.0', platforms: [:mri] + gem 'pry-rails', '~> 0.3.6' + gem 'pry-rescue', '~> 1.5.2' + + # ruby linting + gem 'rubocop', require: false + gem 'rubocop-rails', require: false + gem 'rubocop-rspec', require: false + + # Brakeman scanner + gem 'brakeman', '~> 6.0.0' +end + +gem 'bootsnap', '~> 1.16.0', require: false + +# API gems +gem 'grape', '~> 1.7.0' +gem 'grape_logging', '~> 1.8.4' +gem 'roar', '~> 1.2.0' + +# CORS for API +gem 'rack-cors', '~> 2.0.0' + +# Gmail API +gem 'google-apis-gmail_v1', require: false +gem 'googleauth', require: false + +# Required for contracts +gem 'disposable', '~> 0.6.2' + +platforms :mri, :mingw, :x64_mingw do + group :postgres do + gem 'pg', '~> 1.5.0' + end + + # Support application loading when no database exists yet. + gem 'activerecord-nulldb-adapter', '~> 0.9.0' + + # Have application level locks on the database to have a mutex shared between workers/hosts. + # We e.g. employ this to safeguard the creation of journals. + gem 'with_advisory_lock', '~> 4.6.0' +end + +### GEMFILE MODULES INCLUDE ### +## +# Defines OpenProject (CE) modules and their dependencies +# the dependencies from the gemspec from a git repo are ignored +# see also https://github.com/bundler/bundler/issues/1041 +gem 'omniauth-saml', '~> 1.10.1' + +group :development, :test do + gem 'ladle' +end + +gem 'omniauth-openid_connect-providers', + git: 'https://github.com/opf/omniauth-openid_connect-providers.git', + ref: 'a6c0c3ed78fac79cf4d007e40d4029e524ec7751' + +gem 'omniauth-openid-connect', + git: 'https://github.com/opf/omniauth-openid-connect.git', + ref: 'efddc061a72791db019259768a4656c0435709e8' + +group :opf_plugins do + # included so that engines can reference OpenProject::Version + $:.push File.expand_path("../lib", __FILE__) + + gem 'openproject-auth_plugins', path: 'modules/auth_plugins' + gem 'openproject-auth_saml', path: 'modules/auth_saml' + gem 'openproject-openid_connect', path: 'modules/openid_connect' + gem 'openproject-documents', path: 'modules/documents' + gem 'openproject-xls_export', path: 'modules/xls_export' + gem 'costs', path: 'modules/costs' + gem 'openproject-reporting', path: 'modules/reporting' + gem 'openproject-meeting', path: 'modules/meeting' + gem 'openproject-pdf_export', path: 'modules/pdf_export' + gem "openproject-backlogs", path: 'modules/backlogs' + gem 'openproject-avatars', path: 'modules/avatars' + gem 'openproject-two_factor_authentication', path: 'modules/two_factor_authentication' + gem 'openproject-webhooks', path: 'modules/webhooks' + gem 'openproject-github_integration', path: 'modules/github_integration' + gem 'openproject-ldap_groups', path: 'modules/ldap_groups' + gem 'openproject-recaptcha', path: 'modules/recaptcha' + gem 'openproject-job_status', path: 'modules/job_status' + + gem 'grids', path: 'modules/grids' + gem 'my_page', path: 'modules/my_page' + gem 'dashboards', path: 'modules/dashboards' + gem 'openproject-boards', path: 'modules/boards' + gem 'overviews', path: 'modules/overviews' + gem 'budgets', path: 'modules/budgets' + gem 'openproject-team_planner', path: 'modules/team_planner' + gem 'openproject-calendar', path: 'modules/calendar' + gem 'openproject-storages', path: 'modules/storages' + + gem 'openproject-bim', path: 'modules/bim' +end + +### + +# Load Gemfile.local, Gemfile.plugins and custom Gemfiles +gemfiles = Dir.glob File.expand_path('{Gemfile.plugins,Gemfile.local}', __dir__) +gemfiles << ENV['CUSTOM_PLUGIN_GEMFILE'] unless ENV['CUSTOM_PLUGIN_GEMFILE'].nil? +gemfiles.each do |file| + # We use send to allow dependabot to function + # don't use eval_gemfile(file) here as it will break dependabot! + send(:eval_gemfile, file) if File.readable?(file) +end diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock new file mode 100644 index 0000000..aaf4e4f --- /dev/null +++ b/ruby/Gemfile.lock @@ -0,0 +1,1166 @@ +GIT + remote: https://github.com/crohr/turbo_tests.git + revision: 3148ae6c34828e969e8005eaa592935bfc1afbf3 + ref: fix/runtime-info + specs: + turbo_tests (2.0.0) + bundler (>= 2.1) + parallel_tests (>= 3.3.0, < 5) + rspec (>= 3.10) + +GIT + remote: https://github.com/opf/md-to-pdf + revision: 10bbfbd6f4afdb36918ed9ea686c818144683738 + tag: v0.0.18 + specs: + md_to_pdf (0.0.18) + commonmarker (~> 0.23) + front_matter_parser (~> 1.0) + json-schema (~> 4.0) + matrix (~> 0.4) + nokogiri (~> 1.15) + prawn (~> 2.4) + prawn-table (~> 0.2) + text-hyphen (~> 1.5) + +GIT + remote: https://github.com/opf/omniauth + revision: fe862f986b2e846e291784d2caa3d90a658c67f0 + ref: fe862f986b2e846e291784d2caa3d90a658c67f0 + specs: + omniauth (1.9.0) + hashie (>= 3.4.6, < 3.7.0) + rack (>= 1.6.2, < 3) + +GIT + remote: https://github.com/opf/omniauth-openid-connect.git + revision: efddc061a72791db019259768a4656c0435709e8 + ref: efddc061a72791db019259768a4656c0435709e8 + specs: + omniauth-openid-connect (0.4.0) + addressable (~> 2.5) + omniauth (~> 1.6) + openid_connect (~> 2.2.0) + +GIT + remote: https://github.com/opf/omniauth-openid_connect-providers.git + revision: a6c0c3ed78fac79cf4d007e40d4029e524ec7751 + ref: a6c0c3ed78fac79cf4d007e40d4029e524ec7751 + specs: + omniauth-openid_connect-providers (0.2.0) + omniauth-openid-connect (>= 0.2.1) + +PATH + remote: modules/auth_plugins + specs: + openproject-auth_plugins (1.0.0) + omniauth (~> 1.0) + +PATH + remote: modules/auth_saml + specs: + openproject-auth_saml (1.0.0) + omniauth-saml (~> 1.10.1) + +PATH + remote: modules/avatars + specs: + openproject-avatars (1.0.0) + fastimage (~> 2.2.0) + gravatar_image_tag (~> 1.2.0) + +PATH + remote: modules/backlogs + specs: + openproject-backlogs (1.0.0) + acts_as_list (~> 1.1.0) + openproject-pdf_export + +PATH + remote: modules/bim + specs: + openproject-bim (1.0.0) + activerecord-import + rubyzip (~> 2.3.0) + +PATH + remote: modules/boards + specs: + openproject-boards (1.0.0) + +PATH + remote: modules/budgets + specs: + budgets (1.0.0) + +PATH + remote: modules/calendar + specs: + openproject-calendar (1.0.0) + icalendar (~> 2.8.0) + +PATH + remote: modules/costs + specs: + costs (1.0.0) + +PATH + remote: modules/dashboards + specs: + dashboards (1.0.0) + grids + +PATH + remote: modules/documents + specs: + openproject-documents (1.0.0) + +PATH + remote: modules/github_integration + specs: + openproject-github_integration (1.0.0) + openproject-webhooks + +PATH + remote: modules/grids + specs: + grids (1.0.0) + +PATH + remote: modules/job_status + specs: + openproject-job_status (1.0.0) + +PATH + remote: modules/ldap_groups + specs: + openproject-ldap_groups (1.0.0) + +PATH + remote: modules/meeting + specs: + openproject-meeting (1.0.0) + icalendar (~> 2.8.0) + +PATH + remote: modules/my_page + specs: + my_page (1.0.0) + grids + +PATH + remote: modules/openid_connect + specs: + openproject-openid_connect (1.0.0) + lobby_boy (~> 0.1.3) + omniauth-openid_connect-providers (~> 0.1) + openproject-auth_plugins + +PATH + remote: modules/overviews + specs: + overviews (1.0.0) + grids + +PATH + remote: modules/pdf_export + specs: + openproject-pdf_export (1.0.0) + pdf-inspector (~> 1.3.0) + prawn (~> 2.2) + +PATH + remote: modules/recaptcha + specs: + openproject-recaptcha (1.0.0) + recaptcha (~> 5.7) + +PATH + remote: modules/reporting + specs: + openproject-reporting (1.0.0) + costs + +PATH + remote: modules/storages + specs: + openproject-storages (1.0.0) + +PATH + remote: modules/team_planner + specs: + openproject-team_planner (1.0.0) + +PATH + remote: modules/two_factor_authentication + specs: + openproject-two_factor_authentication (1.0.0) + aws-sdk-sns (~> 1.61.0) + messagebird-rest (~> 1.4.2) + rotp (~> 6.1) + +PATH + remote: modules/webhooks + specs: + openproject-webhooks (1.0.0) + +PATH + remote: modules/xls_export + specs: + openproject-xls_export (1.0.0) + spreadsheet (~> 1.3.0) + +GEM + remote: https://rubygems.org/ + specs: + Ascii85 (1.1.0) + actioncable (7.0.5) + actionpack (= 7.0.5) + activesupport (= 7.0.5) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (7.0.5) + actionpack (= 7.0.5) + activejob (= 7.0.5) + activerecord (= 7.0.5) + activestorage (= 7.0.5) + activesupport (= 7.0.5) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.0.5) + actionpack (= 7.0.5) + actionview (= 7.0.5) + activejob (= 7.0.5) + activesupport (= 7.0.5) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.0) + actionpack (7.0.5) + actionview (= 7.0.5) + activesupport (= 7.0.5) + rack (~> 2.0, >= 2.2.4) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actionpack-xml_parser (2.0.1) + actionpack (>= 5.0) + railties (>= 5.0) + actiontext (7.0.5) + actionpack (= 7.0.5) + activerecord (= 7.0.5) + activestorage (= 7.0.5) + activesupport (= 7.0.5) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (7.0.5) + activesupport (= 7.0.5) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (7.0.5) + activesupport (= 7.0.5) + globalid (>= 0.3.6) + activemodel (7.0.5) + activesupport (= 7.0.5) + activemodel-serializers-xml (1.0.2) + activemodel (> 5.x) + activesupport (> 5.x) + builder (~> 3.1) + activerecord (7.0.5) + activemodel (= 7.0.5) + activesupport (= 7.0.5) + activerecord-import (1.4.1) + activerecord (>= 4.2) + activerecord-nulldb-adapter (0.9.0) + activerecord (>= 5.2.0, < 7.1) + activerecord-session_store (2.0.0) + actionpack (>= 5.2.4.1) + activerecord (>= 5.2.4.1) + multi_json (~> 1.11, >= 1.11.2) + rack (>= 2.0.8, < 3) + railties (>= 5.2.4.1) + activestorage (7.0.5) + actionpack (= 7.0.5) + activejob (= 7.0.5) + activerecord (= 7.0.5) + activesupport (= 7.0.5) + marcel (~> 1.0) + mini_mime (>= 1.1.0) + activesupport (7.0.5) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + acts_as_list (1.1.0) + activerecord (>= 4.2) + acts_as_tree (2.9.1) + activerecord (>= 3.0.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + aes_key_wrap (1.1.0) + afm (0.2.2) + airbrake (13.0.3) + airbrake-ruby (~> 6.0) + airbrake-ruby (6.2.1) + rbtree3 (~> 0.6) + appsignal (3.4.4) + rack + ast (2.4.2) + attr_required (1.0.1) + auto_strip_attributes (2.6.0) + activerecord (>= 4.0) + awesome_nested_set (3.5.0) + activerecord (>= 4.0.0, < 7.1) + aws-eventstream (1.2.0) + aws-partitions (1.780.0) + aws-sdk-core (3.175.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.67.0) + aws-sdk-core (~> 3, >= 3.174.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.126.0) + aws-sdk-core (~> 3, >= 3.174.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.4) + aws-sdk-sns (1.61.0) + aws-sdk-core (~> 3, >= 3.174.0) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.5.2) + aws-eventstream (~> 1, >= 1.0.2) + bcrypt (3.1.18) + bindata (2.4.15) + bootsnap (1.16.0) + msgpack (~> 1.2) + brakeman (6.0.0) + browser (5.3.1) + builder (3.2.4) + byebug (11.1.3) + capybara (3.39.2) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + capybara-screenshot (1.0.26) + capybara (>= 1.0, < 4) + launchy + carrierwave (1.3.2) + activemodel (>= 4.0.0) + activesupport (>= 4.0.0) + mime-types (>= 1.16) + ssrf_filter (~> 1.0) + carrierwave_direct (2.1.0) + carrierwave (>= 1.0.0) + fog-aws + closure_tree (7.4.0) + activerecord (>= 4.2.10) + with_advisory_lock (>= 4.0.0) + coderay (1.1.3) + colored2 (3.1.2) + commonmarker (0.23.9) + compare-xml (0.66) + nokogiri (~> 1.8) + concurrent-ruby (1.2.2) + cookiejar (0.3.3) + crack (0.4.5) + rexml + crass (1.0.6) + daemons (1.4.1) + dalli (3.2.5) + date (3.3.3) + date_validator (0.12.0) + activemodel (>= 3) + activesupport (>= 3) + debug (1.8.0) + irb (>= 1.5.0) + reline (>= 0.3.1) + deckar01-task_list (2.3.2) + html-pipeline + declarative (0.0.20) + delayed_cron_job (0.9.0) + fugit (>= 1.5) + delayed_job (4.1.11) + activesupport (>= 3.0, < 8.0) + delayed_job_active_record (4.1.7) + activerecord (>= 3.0, < 8.0) + delayed_job (>= 3.0, < 5) + diff-lcs (1.5.0) + disposable (0.6.3) + declarative (>= 0.0.9, < 1.0.0) + representable (>= 3.1.1, < 4) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + doorkeeper (5.6.6) + railties (>= 5) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) + dry-core (1.0.0) + concurrent-ruby (~> 1.0) + zeitwerk (~> 2.6) + dry-inflector (1.0.0) + dry-logic (1.5.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0, < 2) + zeitwerk (~> 2.6) + dry-types (1.7.1) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + em-http-request (1.1.7) + addressable (>= 2.3.4) + cookiejar (!= 0.3.1) + em-socksify (>= 0.3) + eventmachine (>= 1.0.3) + http_parser.rb (>= 0.6.0) + em-socksify (0.3.2) + eventmachine (>= 1.0.0.beta.4) + em-synchrony (1.0.6) + eventmachine (>= 1.0.0.beta.1) + email_validator (2.2.4) + activemodel + equivalent-xml (0.6.0) + nokogiri (>= 1.4.3) + erubi (1.12.0) + escape_utils (1.3.0) + et-orbi (1.2.7) + tzinfo + eventmachine (1.2.7) + eventmachine_httpserver (0.2.1) + excon (0.99.0) + factory_bot (6.2.1) + activesupport (>= 5.0.0) + factory_bot_rails (6.2.0) + factory_bot (~> 6.2.0) + railties (>= 5.0.0) + faraday (2.7.6) + faraday-net_http (>= 2.0, < 3.1) + ruby2_keywords (>= 0.0.4) + faraday-follow_redirects (0.3.0) + faraday (>= 1, < 3) + faraday-net_http (3.0.2) + fastimage (2.2.7) + ffi (1.15.5) + flamegraph (0.9.5) + fog-aws (3.19.0) + fog-core (~> 2.1) + fog-json (~> 1.1) + fog-xml (~> 0.1) + fog-core (2.3.0) + builder + excon (~> 0.71) + formatador (>= 0.2, < 2.0) + mime-types + fog-json (1.2.0) + fog-core + multi_json (~> 1.10) + fog-xml (0.1.4) + fog-core + nokogiri (>= 1.5.11, < 2.0.0) + formatador (1.1.0) + friendly_id (5.5.0) + activerecord (>= 4.0.0) + front_matter_parser (1.0.1) + fugit (1.8.1) + et-orbi (~> 1, >= 1.2.7) + raabro (~> 1.4) + fuubar (2.5.1) + rspec-core (~> 3.0) + ruby-progressbar (~> 1.4) + globalid (1.1.0) + activesupport (>= 5.0) + gon (6.4.0) + actionpack (>= 3.0.20) + i18n (>= 0.7) + multi_json + request_store (>= 1.0) + google-apis-core (0.11.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-gmail_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + googleauth (1.5.2) + faraday (>= 0.17.3, < 3.a) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + grape (1.7.1) + activesupport + builder + dry-types (>= 1.1) + mustermann-grape (~> 1.0.0) + rack (>= 1.3.0, < 3) + rack-accept + grape_logging (1.8.4) + grape + rack + gravatar_image_tag (1.2.0) + hana (1.3.7) + hashdiff (1.0.1) + hashery (2.1.2) + hashie (3.6.0) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + htmldiff (0.0.1) + http-accept (1.7.0) + http-cookie (1.0.5) + domain_name (~> 0.5) + http_parser.rb (0.6.0) + httpclient (2.8.3) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + i18n-js (3.9.2) + i18n (>= 0.6.6) + icalendar (2.8.0) + ice_cube (~> 0.16) + ice_cube (0.16.4) + interception (0.5) + io-console (0.6.0) + irb (1.7.0) + reline (>= 0.3.0) + iso8601 (0.13.0) + jmespath (1.6.2) + json (2.6.3) + json-jwt (1.16.3) + activesupport (>= 4.2) + aes_key_wrap + bindata + faraday (~> 2.0) + faraday-follow_redirects + json-schema (4.0.0) + addressable (>= 2.8) + json_schemer (1.0.3) + hana (~> 1.3) + regexp_parser (~> 2.0) + simpleidn (~> 0.2) + json_spec (1.1.5) + multi_json (~> 1.0) + rspec (>= 2.0, < 4.0) + jwt (2.7.1) + ladle (1.0.1) + open4 (~> 1.0) + launchy (2.5.2) + addressable (~> 2.8) + lefthook (1.4.3) + letter_opener (1.8.1) + launchy (>= 2.2, < 3) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + livingstyleguide (2.1.0) + minisyntax (>= 0.2.5) + redcarpet + sassc + thor + tilt + lobby_boy (0.1.3) + omniauth (~> 1.1) + omniauth-openid-connect (>= 0.2.1) + rails (>= 3.2.21) + lograge (0.12.0) + actionpack (>= 4) + activesupport (>= 4) + railties (>= 4) + request_store (~> 1.0) + loofah (2.21.3) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.8.1) + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.0.2) + matrix (0.4.2) + memoist (0.16.2) + messagebird-rest (1.4.2) + meta-tags (2.18.0) + actionpack (>= 3.2.0, < 7.1) + method_source (1.0.0) + mime-types (3.4.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2023.0218.1) + mini_magick (4.12.0) + mini_mime (1.1.2) + mini_portile2 (2.8.2) + minisyntax (0.2.5) + minitest (5.18.1) + msgpack (1.7.1) + multi_json (1.15.0) + mustermann (3.0.0) + ruby2_keywords (~> 0.0.1) + mustermann-grape (1.0.2) + mustermann (>= 1.0.0) + net-imap (0.3.4) + date + net-protocol + net-ldap (0.18.0) + net-pop (0.1.2) + net-protocol + net-protocol (0.2.1) + timeout + net-smtp (0.3.3) + net-protocol + netrc (0.11.0) + nio4r (2.5.9) + nokogiri (1.15.2) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + oj (3.15.0) + okcomputer (1.18.4) + omniauth-saml (1.10.3) + omniauth (~> 1.3, >= 1.3.2) + ruby-saml (~> 1.9) + open4 (1.3.4) + openid_connect (2.2.0) + activemodel + attr_required (>= 1.0.0) + faraday (~> 2.0) + faraday-follow_redirects + json-jwt (>= 1.16) + net-smtp + rack-oauth2 (~> 2.2) + swd (~> 2.0) + tzinfo + validate_email + validate_url + webfinger (~> 2.0) + openproject-token (3.0.1) + activemodel + os (1.1.4) + ox (2.14.16) + paper_trail (12.3.0) + activerecord (>= 5.2) + request_store (~> 1.1) + parallel (1.23.0) + parallel_tests (4.2.1) + parallel + parser (3.2.2.3) + ast (~> 2.4.1) + racc + pdf-core (0.9.0) + pdf-inspector (1.3.0) + pdf-reader (>= 1.0, < 3.0.a) + pdf-reader (2.11.0) + Ascii85 (~> 1.0) + afm (~> 0.2.1) + hashery (~> 2.0) + ruby-rc4 + ttfunk + pg (1.5.3) + plaintext (0.3.4) + activesupport (> 2.2.1) + nokogiri (~> 1.10, >= 1.10.4) + rubyzip (>= 1.2.0) + posix-spawn (0.3.15) + prawn (2.4.0) + pdf-core (~> 0.9.0) + ttfunk (~> 1.7) + prawn-table (0.2.2) + prawn (>= 1.3.0, < 3.0.0) + pry (0.14.2) + coderay (~> 1.1) + method_source (~> 1.0) + pry-byebug (3.10.1) + byebug (~> 11.0) + pry (>= 0.13, < 0.15) + pry-rails (0.3.9) + pry (>= 0.10.4) + pry-rescue (1.5.2) + interception (>= 0.5) + pry (>= 0.12.0) + psych (5.1.0) + stringio + public_suffix (5.0.1) + puffing-billy (3.1.0) + addressable (~> 2.5) + em-http-request (~> 1.1, >= 1.1.0) + em-synchrony + eventmachine (~> 1.2) + eventmachine_httpserver + http_parser.rb (~> 0.6.0) + multi_json + puma (6.3.0) + nio4r (~> 2.0) + puma-plugin-statsd (2.4.0) + puma (>= 5.0, < 7) + raabro (1.4.0) + racc (1.7.1) + rack (2.2.7) + rack-accept (0.4.5) + rack (>= 0.4) + rack-attack (6.6.1) + rack (>= 1.0, < 3) + rack-cors (2.0.1) + rack (>= 2.0.0) + rack-mini-profiler (3.1.0) + rack (>= 1.2.0) + rack-oauth2 (2.2.0) + activesupport + attr_required + faraday (~> 2.0) + faraday-follow_redirects + json-jwt (>= 1.11.0) + rack (>= 2.1.0) + rack-protection (3.0.6) + rack + rack-test (2.1.0) + rack (>= 1.3) + rack-timeout (0.6.3) + rack_session_access (0.2.0) + builder (>= 2.0.0) + rack (>= 1.0.0) + rails (7.0.5) + actioncable (= 7.0.5) + actionmailbox (= 7.0.5) + actionmailer (= 7.0.5) + actionpack (= 7.0.5) + actiontext (= 7.0.5) + actionview (= 7.0.5) + activejob (= 7.0.5) + activemodel (= 7.0.5) + activerecord (= 7.0.5) + activestorage (= 7.0.5) + activesupport (= 7.0.5) + bundler (>= 1.15.0) + railties (= 7.0.5) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + rails-i18n (7.0.7) + i18n (>= 0.7, < 2) + railties (>= 6.0.0, < 8) + railties (7.0.5) + actionpack (= 7.0.5) + activesupport (= 7.0.5) + method_source + rake (>= 12.2) + thor (~> 1.0) + zeitwerk (~> 2.5) + rainbow (3.1.1) + rake (13.0.6) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rbtree3 (0.7.1) + rdoc (6.5.0) + psych (>= 4.0.0) + recaptcha (5.14.0) + redcarpet (3.6.0) + regexp_parser (2.8.1) + reline (0.3.5) + io-console (~> 0.5) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + request_store (1.5.1) + rack (>= 1.4) + responders (3.1.0) + actionpack (>= 5.2) + railties (>= 5.2) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + retriable (3.1.2) + rexml (3.2.5) + rinku (2.0.6) + roar (1.2.0) + representable (~> 3.1) + rotp (6.2.2) + rouge (4.1.2) + rspec (3.12.0) + rspec-core (~> 3.12.0) + rspec-expectations (~> 3.12.0) + rspec-mocks (~> 3.12.0) + rspec-core (3.12.2) + rspec-support (~> 3.12.0) + rspec-expectations (3.12.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-mocks (3.12.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.12.0) + rspec-rails (6.0.3) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.12) + rspec-expectations (~> 3.12) + rspec-mocks (~> 3.12) + rspec-support (~> 3.12) + rspec-retry (0.6.2) + rspec-core (> 3.3) + rspec-support (3.12.0) + rubocop (1.52.1) + json (~> 2.3) + parallel (~> 1.10) + parser (>= 3.2.2.3) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.28.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.29.0) + parser (>= 3.2.1.0) + rubocop-capybara (2.18.0) + rubocop (~> 1.41) + rubocop-factory_bot (2.23.1) + rubocop (~> 1.33) + rubocop-rails (2.20.2) + activesupport (>= 4.2.0) + rack (>= 1.1) + rubocop (>= 1.33.0, < 2.0) + rubocop-rspec (2.22.0) + rubocop (~> 1.33) + rubocop-capybara (~> 2.17) + rubocop-factory_bot (~> 2.22) + ruby-duration (3.2.3) + activesupport (>= 3.0.0) + i18n + iso8601 + ruby-ole (1.2.12.2) + ruby-prof (1.6.3) + ruby-progressbar (1.13.0) + ruby-rc4 (0.1.5) + ruby-saml (1.15.0) + nokogiri (>= 1.13.10) + rexml + ruby2_keywords (0.0.5) + rubytree (2.0.1) + json (~> 2.0, > 2.3.1) + rubyzip (2.3.2) + sanitize (6.0.1) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + secure_headers (6.5.0) + selenium-webdriver (4.10.0) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + semantic (1.6.1) + shoulda-context (2.0.0) + shoulda-matchers (5.3.0) + activesupport (>= 5.2.0) + signet (0.17.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simpleidn (0.2.1) + unf (~> 0.1.4) + spreadsheet (1.3.0) + ruby-ole + spring (4.1.1) + spring-commands-rspec (1.0.4) + spring (>= 0.9.1) + sprockets (3.7.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + sprockets (>= 3.0.0) + ssrf_filter (1.1.1) + stackprof (0.2.25) + stringex (2.8.6) + stringio (3.0.7) + structured_warnings (0.4.0) + svg-graph (2.2.2) + swd (2.0.2) + activesupport (>= 3) + attr_required (>= 0.0.5) + faraday (~> 2.0) + faraday-follow_redirects + sys-filesystem (1.4.3) + ffi (~> 1.1) + table_print (1.5.7) + test-prof (1.2.1) + text-hyphen (1.5.0) + thor (1.2.2) + tilt (2.1.0) + timecop (0.9.6) + timeout (0.3.2) + trailblazer-option (0.1.2) + ttfunk (1.7.0) + turbo-rails (1.4.0) + actionpack (>= 6.0.0) + activejob (>= 6.0.0) + railties (>= 6.0.0) + typed_dag (2.0.2) + rails (>= 5.0.4) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2023.3) + tzinfo (>= 1.0.0) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (2.4.2) + validate_email (0.1.6) + activemodel (>= 3.0) + mail (>= 2.2.5) + validate_url (1.0.15) + activemodel (>= 3.0.0) + public_suffix + view_component (3.2.0) + activesupport (>= 5.2.0, < 8.0) + concurrent-ruby (~> 1.0) + method_source (~> 1.0) + warden (1.2.9) + rack (>= 2.0.9) + warden-basic_auth (0.2.1) + warden (~> 1.2) + webdrivers (5.2.0) + nokogiri (~> 1.6) + rubyzip (>= 1.3.0) + selenium-webdriver (~> 4.0) + webfinger (2.1.2) + activesupport + faraday (~> 2.0) + faraday-follow_redirects + webmock (3.18.1) + addressable (>= 2.8.0) + crack (>= 0.3.2) + hashdiff (>= 0.4.0, < 2.0.0) + webrick (1.8.1) + websocket (1.2.9) + websocket-driver (0.7.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + will_paginate (4.0.0) + with_advisory_lock (4.6.0) + activerecord (>= 4.2) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.6.8) + +PLATFORMS + ruby + +DEPENDENCIES + actionpack-xml_parser (~> 2.0.0) + activemodel-serializers-xml (~> 1.0.1) + activerecord-import (~> 1.4.0) + activerecord-nulldb-adapter (~> 0.9.0) + activerecord-session_store (~> 2.0.0) + acts_as_list (~> 1.1.0) + acts_as_tree (~> 2.9.0) + addressable (~> 2.8.0) + airbrake (~> 13.0.0) + appsignal (~> 3.0) + auto_strip_attributes (~> 2.5) + awesome_nested_set (~> 3.5.0) + aws-sdk-core (~> 3.107) + aws-sdk-s3 (~> 1.91) + bcrypt (~> 3.1.6) + bootsnap (~> 1.16.0) + brakeman (~> 6.0.0) + browser (~> 5.3.0) + budgets! + capybara (~> 3.39.0) + capybara-screenshot (~> 1.0.17) + carrierwave (~> 1.3.1) + carrierwave_direct (~> 2.1.0) + closure_tree (~> 7.4.0) + colored2 + commonmarker (~> 0.23.9) + compare-xml (~> 0.66) + costs! + daemons + dalli (~> 3.2.0) + dashboards! + date_validator (~> 0.12.0) + debug + deckar01-task_list (~> 2.3.1) + delayed_cron_job (~> 0.9.0) + delayed_job_active_record (~> 4.1.5) + disposable (~> 0.6.2) + doorkeeper (~> 5.6.6) + dotenv-rails + email_validator (~> 2.2.3) + equivalent-xml (~> 0.6) + escape_utils (~> 1.3) + factory_bot (~> 6.2.0) + factory_bot_rails (~> 6.2.0) + ffi (~> 1.15) + flamegraph + fog-aws + friendly_id (~> 5.5.0) + fuubar (~> 2.5.0) + gon (~> 6.4.0) + google-apis-gmail_v1 + googleauth + grape (~> 1.7.0) + grape_logging (~> 1.8.4) + grids! + html-pipeline (~> 2.14.0) + htmldiff + i18n-js (~> 3.9.0) + json_schemer (~> 1.0.1) + json_spec (~> 1.1.4) + ladle + launchy (~> 2.5.0) + lefthook + letter_opener + listen (~> 3.8.0) + livingstyleguide (~> 2.1.0) + lograge (~> 0.12.0) + mail (= 2.8.1) + matrix (~> 0.4.2) + md_to_pdf! + meta-tags (~> 2.18.0) + mini_magick (~> 4.12.0) + multi_json (~> 1.15.0) + my_page! + net-ldap (~> 0.18.0) + nokogiri (~> 1.15.1) + oj (~> 3.15.0) + okcomputer (~> 1.18.1) + omniauth! + omniauth-openid-connect! + omniauth-openid_connect-providers! + omniauth-saml (~> 1.10.1) + openproject-auth_plugins! + openproject-auth_saml! + openproject-avatars! + openproject-backlogs! + openproject-bim! + openproject-boards! + openproject-calendar! + openproject-documents! + openproject-github_integration! + openproject-job_status! + openproject-ldap_groups! + openproject-meeting! + openproject-openid_connect! + openproject-pdf_export! + openproject-recaptcha! + openproject-reporting! + openproject-storages! + openproject-team_planner! + openproject-token (~> 3.0.1) + openproject-two_factor_authentication! + openproject-webhooks! + openproject-xls_export! + overviews! + ox + paper_trail (~> 12.3) + parallel_tests (~> 4.0) + pg (~> 1.5.0) + plaintext (~> 0.3.2) + posix-spawn (~> 0.3.13) + prawn (~> 2.2) + pry-byebug (~> 3.10.0) + pry-rails (~> 0.3.6) + pry-rescue (~> 1.5.2) + puffing-billy (~> 3.1.0) + puma (~> 6.1) + puma-plugin-statsd (~> 2.0) + rack-attack (~> 6.6.0) + rack-cors (~> 2.0.0) + rack-mini-profiler + rack-protection (~> 3.0.0) + rack-test (~> 2.1.0) + rack-timeout (~> 0.6.3) + rack_session_access + rails (~> 7.0, >= 7.0.3.1) + rails-controller-testing (~> 1.0.2) + rails-i18n (~> 7.0.0) + rdoc (>= 2.4.2) + request_store (~> 1.5.0) + responders (~> 3.0) + rest-client (~> 2.0) + retriable (~> 3.1.1) + rinku (~> 2.0.4) + roar (~> 1.2.0) + rouge (~> 4.1.0) + rspec (~> 3.12.0) + rspec-rails (~> 6.0.0) + rspec-retry (~> 0.6.1) + rubocop + rubocop-rails + rubocop-rspec + ruby-duration (~> 3.2.0) + ruby-prof + ruby-progressbar (~> 1.13.0) + rubytree (~> 2.0.0) + sanitize (~> 6.0.1) + sassc-rails + secure_headers (~> 6.5.0) + selenium-webdriver (~> 4.0) + semantic (~> 1.6.1) + shoulda-context (~> 2.0) + shoulda-matchers (~> 5.0) + spring + spring-commands-rspec + sprockets (~> 3.7.2) + sprockets-rails (~> 3.4.2) + stackprof + stringex (~> 2.8.5) + structured_warnings (~> 0.4.0) + svg-graph (~> 2.2.0) + sys-filesystem (~> 1.4.0) + table_print (~> 1.5.6) + test-prof (~> 1.2.0) + timecop (~> 0.9.0) + turbo-rails (~> 1.1) + turbo_tests! + typed_dag (~> 2.0.2) + tzinfo-data (~> 1.2023.1) + validate_url + view_component + warden (~> 1.2) + warden-basic_auth (~> 0.2.1) + webdrivers (~> 5.2.0) + webmock (~> 3.12) + will_paginate (~> 4.0.0) + with_advisory_lock (~> 4.6.0) + +RUBY VERSION + ruby 3.2.1p31 + +BUNDLED WITH + 2.4.7 diff --git a/ruby/gemset.nix b/ruby/gemset.nix new file mode 100644 index 0000000..5cebc28 --- /dev/null +++ b/ruby/gemset.nix @@ -0,0 +1,3784 @@ +{ + actioncable = { + dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "001cwsb6496wp8g0nkyjqxgmii63aljydq132yb2ksdp8ml5zlgj"; + type = "gem"; + }; + version = "7.0.5"; + }; + actionmailbox = { + dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail" "net-imap" "net-pop" "net-smtp"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d990xy3jin8qa4l989r43kl5ykmi2kdlxqpnla10n5c7xp7xmci"; + type = "gem"; + }; + version = "7.0.5"; + }; + actionmailer = { + dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "net-imap" "net-pop" "net-smtp" "rails-dom-testing"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "033981lhbq0vl8ppfpamqpqj3sq15x759899hvwli2imp3yw49r5"; + type = "gem"; + }; + version = "7.0.5"; + }; + actionpack = { + dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0w717izq6k7wl2j6zn4516kg2iwg3zgdzja6b6gpk6y5nccr04hw"; + type = "gem"; + }; + version = "7.0.5"; + }; + actionpack-xml_parser = { + dependencies = ["actionpack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1rnm6jrw3mzcf2g3q498igmhsn0kfkxq79w0nm532iclx4g4djs0"; + type = "gem"; + }; + version = "2.0.1"; + }; + actiontext = { + dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "globalid" "nokogiri"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bcpjhhbq6gl4h7hq2fianfz8vpdxf53gsj1ng04bkh5bxxrmrc1"; + type = "gem"; + }; + version = "7.0.5"; + }; + actionview = { + dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1z0xvdal339w7jvk7a5py0c1q5xh588vqrilgxizkvzm3hwf48a2"; + type = "gem"; + }; + version = "7.0.5"; + }; + activejob = { + dependencies = ["activesupport" "globalid"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18gsxi7vlg8y8k2fbhq44zd0mivjpnn4nrlfj037c7wvq5h8367v"; + type = "gem"; + }; + version = "7.0.5"; + }; + activemodel = { + dependencies = ["activesupport"]; + groups = ["default" "opf_plugins"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cjbk1xl6jl2d6sczpxnr8da7zbmshmrghqhqdcwqqzl6chcy2si"; + type = "gem"; + }; + version = "7.0.5"; + }; + activemodel-serializers-xml = { + dependencies = ["activemodel" "activesupport" "builder"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pk5qrxxhgxlihim8qkdk805nq584ms71hmcg1766iwhx0v2x3r2"; + type = "gem"; + }; + version = "1.0.2"; + }; + activerecord = { + dependencies = ["activemodel" "activesupport"]; + groups = ["default" "opf_plugins"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04x0bz3051linhmi52cfg31nsm4sgg27m7wp9p0cxrxdwc7q0bjl"; + type = "gem"; + }; + version = "7.0.5"; + }; + activerecord-import = { + dependencies = ["activerecord"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cwm95795c6j5hk76csdkfg7ad228cmp086shkcmhnad4mycbh4m"; + type = "gem"; + }; + version = "1.4.1"; + }; + activerecord-nulldb-adapter = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07lx5l6dgippsywwfq1c9ykf5iza75520gam465kz9hsifp6xp7i"; + type = "gem"; + }; + version = "0.9.0"; + }; + activerecord-session_store = { + dependencies = ["actionpack" "activerecord" "multi_json" "rack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06ddhz1b2yg72iv09n48gcd3ix5da7hxlzi7vvj13nrps2qwlffg"; + type = "gem"; + }; + version = "2.0.0"; + }; + activestorage = { + dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0mg236x3rkmdargkk9y6j9gqhkajzbk852gwnp1crp0difk7a4r8"; + type = "gem"; + }; + version = "7.0.5"; + }; + activesupport = { + dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1c7k5i6531z5il4q1jnbrv7x7zcl3bgnxp5fzl71rzigk6zn53ym"; + type = "gem"; + }; + version = "7.0.5"; + }; + acts_as_list = { + dependencies = ["activerecord"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qdb3g1ha8ir198rw6a7wmmdz4vm3gsk5j5j1s5sa50hdbgc9m06"; + type = "gem"; + }; + version = "1.1.0"; + }; + acts_as_tree = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wx2m64knv57g1q0bi09d7hci69x5n49xkzzcimn2f6ym08fnsdq"; + type = "gem"; + }; + version = "2.9.1"; + }; + addressable = { + dependencies = ["public_suffix"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15s8van7r2ad3dq6i03l3z4hqnvxcq75a3h72kxvf9an53sqma20"; + type = "gem"; + }; + version = "2.8.4"; + }; + aes_key_wrap = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19bn0y70qm6mfj4y1m0j3s8ggh6dvxwrwrj5vfamhdrpddsz8ddr"; + type = "gem"; + }; + version = "1.1.0"; + }; + afm = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06kj9hgd0z8pj27bxp2diwqh6fv7qhwwm17z64rhdc4sfn76jgn8"; + type = "gem"; + }; + version = "0.2.2"; + }; + airbrake = { + dependencies = ["airbrake-ruby"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f44cd7kb6r2qb7b58snxflgxxy25ks96kdy2bdbsby1b086ch6y"; + type = "gem"; + }; + version = "13.0.3"; + }; + airbrake-ruby = { + dependencies = ["rbtree3"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10py77lkzlnsagb6j44pfp2ijjz22d1za5xbjv89ipkd5xp2npxs"; + type = "gem"; + }; + version = "6.2.1"; + }; + appsignal = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16cv5c2r9mzj1dxsml33dmlkrxm9hc8pd9qbv7mppgfihbc17s8v"; + type = "gem"; + }; + version = "3.4.4"; + }; + Ascii85 = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ds4v9xgsyvijnlflak4dzf1qwmda9yd5bv8jwsb56nngd399rlw"; + type = "gem"; + }; + version = "1.1.0"; + }; + ast = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y"; + type = "gem"; + }; + version = "2.4.2"; + }; + attr_required = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g22axmi2rhhy7w8c3x6gppsawxqavbrnxpnmphh22fk7cwi0kh2"; + type = "gem"; + }; + version = "1.0.1"; + }; + auto_strip_attributes = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1c1rmrm33xz6kk6w2x0jr24cqavh41102s7x8zcvrqjdfk7y1qm7"; + type = "gem"; + }; + version = "2.6.0"; + }; + awesome_nested_set = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n2wqs1zirngnaljd48j77qdp6737igzcpk2zi98igyd1rmrn276"; + type = "gem"; + }; + version = "3.5.0"; + }; + aws-eventstream = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pyis1nvnbjxk12a43xvgj2gv0mvp4cnkc1gzw0v1018r61399gz"; + type = "gem"; + }; + version = "1.2.0"; + }; + aws-partitions = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0plbj6d69j3vi8zwg9q8hkr77b7p7kg8bfqpvv9ghv2zay3igp3v"; + type = "gem"; + }; + version = "1.780.0"; + }; + aws-sdk-core = { + dependencies = ["aws-eventstream" "aws-partitions" "aws-sigv4" "jmespath"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fbbzcszpdjy2yzxfvl5fzgn0jgznkwxvqpb46nxv69gqhv3dpsg"; + type = "gem"; + }; + version = "3.175.0"; + }; + aws-sdk-kms = { + dependencies = ["aws-sdk-core" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dkgcgvif4hjlq5jhixd2hf17pm2pib7p3jxg9g92pybsff9rk7c"; + type = "gem"; + }; + version = "1.67.0"; + }; + aws-sdk-s3 = { + dependencies = ["aws-sdk-core" "aws-sdk-kms" "aws-sigv4"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ya49rwjzimqhzsj6vlc4xfvj2sixy04kr4b6ddg3r6y0jrsixi"; + type = "gem"; + }; + version = "1.126.0"; + }; + aws-sdk-sns = { + dependencies = ["aws-sdk-core" "aws-sigv4"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1xxaj1pl23cz6ixqq1glili2rsk667iid3kiqm7g8yfbbk2zmyz5"; + type = "gem"; + }; + version = "1.61.0"; + }; + aws-sigv4 = { + dependencies = ["aws-eventstream"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11hkna2av47bl0yprgp8k4ya70rc3m2ib5w10fn0piplgkkmhz7m"; + type = "gem"; + }; + version = "1.5.2"; + }; + bcrypt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "048z3fvcknqx7ikkhrcrykxlqmf9bzc7l0y5h1cnvrc9n2qf0k8m"; + type = "gem"; + }; + version = "3.1.18"; + }; + bindata = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04y4zgh4bbcb8wmkxwfqg4saky1d1f3xw8z6yk543q13h8ky8rz5"; + type = "gem"; + }; + version = "2.4.15"; + }; + bootsnap = { + dependencies = ["msgpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vcg52gwl64xhhal6kwk1pc01y1klzdlnv1awyk89kb91z010x7q"; + type = "gem"; + }; + version = "1.16.0"; + }; + brakeman = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l2584f7cm7lmwihm1l449rk6vl4wlx3s7x317cm2inapzjhiybg"; + type = "gem"; + }; + version = "6.0.0"; + }; + browser = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0g4bcpax07kqqr9cp7cjc7i0pcij4nqpn1rdsg2wdwhzf00m6x32"; + type = "gem"; + }; + version = "5.3.1"; + }; + budgets = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/budgets; + type = "path"; + }; + version = "1.0.0"; + }; + builder = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"; + type = "gem"; + }; + version = "3.2.4"; + }; + byebug = { + groups = ["default" "development" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nx3yjf4xzdgb8jkmk2344081gqr22pgjqnmjg2q64mj5d6r9194"; + type = "gem"; + }; + version = "11.1.3"; + }; + capybara = { + dependencies = ["addressable" "matrix" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "114qm5f5vhwaaw9rj1h2lcamh46zl13v1m18jiw68zl961gwmw6n"; + type = "gem"; + }; + version = "3.39.2"; + }; + capybara-screenshot = { + dependencies = ["capybara" "launchy"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xqc7hdiw1ql42mklpfvqd2pyfsxmy55cpx0h9y0jlkpl1q96sw1"; + type = "gem"; + }; + version = "1.0.26"; + }; + carrierwave = { + dependencies = ["activemodel" "activesupport" "mime-types" "ssrf_filter"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "055i3ybjv9n9hqaazxn3d9ibqhlwh93d4hdlwbpjjfy8qbrz6hiw"; + type = "gem"; + }; + version = "1.3.2"; + }; + carrierwave_direct = { + dependencies = ["carrierwave" "fog-aws"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gyxbl6akxj89cbv556lsqi6955jld2gdkw8wi05k80p3nfc3mdh"; + type = "gem"; + }; + version = "2.1.0"; + }; + closure_tree = { + dependencies = ["activerecord" "with_advisory_lock"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dfjq5jz2qqw7jhc33x7k8vjvflvjk9g5jn3k1lc1qsxwfxp34g3"; + type = "gem"; + }; + version = "7.4.0"; + }; + coderay = { + groups = ["default" "development" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jvxqxzply1lwp7ysn94zjhh57vc14mcshw1ygw14ib8lhc00lyw"; + type = "gem"; + }; + version = "1.1.3"; + }; + colored2 = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jlbqa9q4mvrm73aw9mxh23ygzbjiqwisl32d8szfb5fxvbjng5i"; + type = "gem"; + }; + version = "3.1.2"; + }; + commonmarker = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "074162raa8pc92q6833hgqdlfr3z5jgid9avdz5k25cnls2rqwrf"; + type = "gem"; + }; + version = "0.23.9"; + }; + compare-xml = { + dependencies = ["nokogiri"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06aks0fjxwvs4l9bd8bl9q48kyadzn4cd5yrrrz1gwcyyv0aa6p2"; + type = "gem"; + }; + version = "0.66"; + }; + concurrent-ruby = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0krcwb6mn0iklajwngwsg850nk8k9b35dhmc2qkbdqvmifdi2y9q"; + type = "gem"; + }; + version = "1.2.2"; + }; + cookiejar = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0q0kmbks9l3hl0wdq744hzy97ssq9dvlzywyqv9k9y1p3qc9va2a"; + type = "gem"; + }; + version = "0.3.3"; + }; + costs = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/costs; + type = "path"; + }; + version = "1.0.0"; + }; + crack = { + dependencies = ["rexml"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"; + type = "gem"; + }; + version = "0.4.5"; + }; + crass = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw"; + type = "gem"; + }; + version = "1.0.6"; + }; + daemons = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "07cszb0zl8mqmwhc8a2yfg36vi6lbgrp4pa5bvmryrpcz9v6viwg"; + type = "gem"; + }; + version = "1.4.1"; + }; + dalli = { + groups = ["production"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11ig4scb2h93j4z6rikfjd00wk2y4bhkikhia86a65gs4gl44kja"; + type = "gem"; + }; + version = "3.2.5"; + }; + dashboards = { + dependencies = ["grids"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/dashboards; + type = "path"; + }; + version = "1.0.0"; + }; + date = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03skfikihpx37rc27vr3hwrb057gxnmdzxhmzd4bf4jpkl0r55w1"; + type = "gem"; + }; + version = "3.3.3"; + }; + date_validator = { + dependencies = ["activemodel" "activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n1hrs9323q2430fiyzb2y350wim30x5a7242yf7nd20l96q7jb8"; + type = "gem"; + }; + version = "0.12.0"; + }; + debug = { + dependencies = ["irb" "reline"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nhkl066109cbldd3dc218wldish6v8iq63zalgvb95986nx2ash"; + type = "gem"; + }; + version = "1.8.0"; + }; + deckar01-task_list = { + dependencies = ["html-pipeline"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01c8vv0xwbhlyhiagj93b1hlm2n0rmj4sw62nbc0jhyj90jhj6as"; + type = "gem"; + }; + version = "2.3.2"; + }; + declarative = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yczgnqrbls7shrg63y88g7wand2yp9h6sf56c9bdcksn5nds8c0"; + type = "gem"; + }; + version = "0.0.20"; + }; + delayed_cron_job = { + dependencies = ["fugit"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vq865hbld0qinzflzknbxzh3mji2swzfvdwlmgr96pdw990qrgj"; + type = "gem"; + }; + version = "0.9.0"; + }; + delayed_job = { + dependencies = ["activesupport"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0s2xg72ljg4cwmr05zi67vcyz8zib46gvvf7rmrdhsyq387m2qcq"; + type = "gem"; + }; + version = "4.1.11"; + }; + delayed_job_active_record = { + dependencies = ["activerecord" "delayed_job"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wh1146hg0b85zv336dn00jx9mzw5ma0maj67is7bvz5l35hd6yk"; + type = "gem"; + }; + version = "4.1.7"; + }; + diff-lcs = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rwvjahnp7cpmracd8x732rjgnilqv2sx7d1gfrysslc3h039fa9"; + type = "gem"; + }; + version = "1.5.0"; + }; + disposable = { + dependencies = ["declarative" "representable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1k44sg1gk7ba8znndc2ikch32dgcsi1l05jvya1wvxmza6r3yakz"; + type = "gem"; + }; + version = "0.6.3"; + }; + domain_name = { + dependencies = ["unf"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lcqjsmixjp52bnlgzh4lg9ppsk52x9hpwdjd53k8jnbah2602h0"; + type = "gem"; + }; + version = "0.5.20190701"; + }; + doorkeeper = { + dependencies = ["railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q2pywgyn6cbnm0fh3dln5z1qgd1g8hvb4x8rppjc1bpfxnfhi13"; + type = "gem"; + }; + version = "5.6.6"; + }; + dotenv = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1n0pi8x8ql5h1mijvm8lgn6bhq4xjb5a500p5r1krq4s6j9lg565"; + type = "gem"; + }; + version = "2.8.1"; + }; + dotenv-rails = { + dependencies = ["dotenv" "railties"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0v0gcbxzypcvy6fqq4gp80jb310xvdwj5n8qw9ci67g5yjvq2nxh"; + type = "gem"; + }; + version = "2.8.1"; + }; + dry-core = { + dependencies = ["concurrent-ruby" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01gks2hrp7nl3pzb487azvd25dlbrc40d5cpk4n0szwnf2c0k4ks"; + type = "gem"; + }; + version = "1.0.0"; + }; + dry-inflector = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09hnvna3lg2x36li63988kv664d0zvy7y0z33803yvrdr9hj7lka"; + type = "gem"; + }; + version = "1.0.0"; + }; + dry-logic = { + dependencies = ["concurrent-ruby" "dry-core" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05nldkc154r0qzlhss7n5klfiyyz05x2fkq08y13s34py6023vcr"; + type = "gem"; + }; + version = "1.5.0"; + }; + dry-types = { + dependencies = ["concurrent-ruby" "dry-core" "dry-inflector" "dry-logic" "zeitwerk"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1f6dz0hm67rhybh6xq2s3vvr700cp43kf50z2lids62s2i0mh5hj"; + type = "gem"; + }; + version = "1.7.1"; + }; + em-http-request = { + dependencies = ["addressable" "cookiejar" "em-socksify" "eventmachine" "http_parser.rb"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1azx5rgm1zvx7391sfwcxzyccs46x495vb34ql2ch83f58mwgyqn"; + type = "gem"; + }; + version = "1.1.7"; + }; + em-socksify = { + dependencies = ["eventmachine"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rk43ywaanfrd8180d98287xv2pxyl7llj291cwy87g1s735d5nk"; + type = "gem"; + }; + version = "0.3.2"; + }; + em-synchrony = { + dependencies = ["eventmachine"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jh6ygbcvapmarqiap79i6yl05bicldr2lnmc46w1fyrhjk70x3f"; + type = "gem"; + }; + version = "1.0.6"; + }; + email_validator = { + dependencies = ["activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0106y8xakq6frv2xc68zz76q2l2cqvhfjc7ji69yyypcbc4kicjs"; + type = "gem"; + }; + version = "2.2.4"; + }; + equivalent-xml = { + dependencies = ["nokogiri"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11zlqc600acqn1kli339c587xca6yvhqpzv9cf2d12l4z8g7c6c9"; + type = "gem"; + }; + version = "0.6.0"; + }; + erubi = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08s75vs9cxlc4r1q2bjg4br8g9wc5lc5x5vl0vv4zq5ivxsdpgi7"; + type = "gem"; + }; + version = "1.12.0"; + }; + escape_utils = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "029c7kynhkxw8fgq9q171xi68ajfqrb22r7drvkar018j8871yyz"; + type = "gem"; + }; + version = "1.3.0"; + }; + et-orbi = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d2z4ky2v15dpcz672i2p7lb2nc793dasq3yq3660h2az53kss9v"; + type = "gem"; + }; + version = "1.2.7"; + }; + eventmachine = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wh9aqb0skz80fhfn66lbpr4f86ya2z5rx6gm5xlfhd05bj1ch4r"; + type = "gem"; + }; + version = "1.2.7"; + }; + eventmachine_httpserver = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02dq358cj7z6qh3n7gmsf345fz25c0hwqprfb51ls82l6yifidax"; + type = "gem"; + }; + version = "0.2.1"; + }; + excon = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0j826kfvzn7nc5pv950n270r0sx1702k988ad11cdlav3dcxxw09"; + type = "gem"; + }; + version = "0.99.0"; + }; + factory_bot = { + dependencies = ["activesupport"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pfk942d6qwhw151hxaz7n4knk6whyxqvvywdx2cdw9yhykyaqzq"; + type = "gem"; + }; + version = "6.2.1"; + }; + factory_bot_rails = { + dependencies = ["factory_bot" "railties"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18fhcihkc074gk62iwqgbdgc3ymim4fm0b4p3ipffy5hcsb9d2r7"; + type = "gem"; + }; + version = "6.2.0"; + }; + faraday = { + dependencies = ["faraday-net_http" "ruby2_keywords"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08rxibzssqv14sgdfh45pdm26nbk54xp84vb5pb1mlyalszz1mc3"; + type = "gem"; + }; + version = "2.7.6"; + }; + faraday-follow_redirects = { + dependencies = ["faraday"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y87p3yk15bjbk0z9mf01r50lzxvp7agr56lbm9gxiz26mb9fbfr"; + type = "gem"; + }; + version = "0.3.0"; + }; + faraday-net_http = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13byv3mp1gsjyv8k0ih4612y6vw5kqva6i03wcg4w2fqpsd950k8"; + type = "gem"; + }; + version = "3.0.2"; + }; + fastimage = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pd7pamzhdz2w0fbcvsfn2nyslznvphnwj16zw35g2b28zd2xyzx"; + type = "gem"; + }; + version = "2.2.7"; + }; + ffi = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1862ydmclzy1a0cjbvm8dz7847d9rch495ib0zb64y84d3xd4bkg"; + type = "gem"; + }; + version = "1.15.5"; + }; + flamegraph = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p785nmhdzbwj0qpxn5fzrmr4kgimcds83v4f95f387z6w3050x6"; + type = "gem"; + }; + version = "0.9.5"; + }; + fog-aws = { + dependencies = ["fog-core" "fog-json" "fog-xml"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0a38zdm26yj9rrf7mprjjs86zxd3j55bk0zb7pfbp1ykvwy0d8lj"; + type = "gem"; + }; + version = "3.19.0"; + }; + fog-core = { + dependencies = ["builder" "excon" "formatador" "mime-types"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06m6hxq8vspx9h9bgc2s19m56jzasvl45vblrfv1q5h1qg1k6amw"; + type = "gem"; + }; + version = "2.3.0"; + }; + fog-json = { + dependencies = ["fog-core" "multi_json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zj8llzc119zafbmfa4ai3z5s7c4vp9akfs0f9l2piyvcarmlkyx"; + type = "gem"; + }; + version = "1.2.0"; + }; + fog-xml = { + dependencies = ["fog-core" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vyyb2429xqzys39xyk2r3fal80qqn397aj2kqsjrgg2y6m59i41"; + type = "gem"; + }; + version = "0.1.4"; + }; + formatador = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l06bv4avphbdmr1y4g0rqlczr38k6r65b3zghrbj2ynyhm3xqjl"; + type = "gem"; + }; + version = "1.1.0"; + }; + friendly_id = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ih0akw9jb695w6c72q44qvagfbfm9q0cm7rjjns7c8wxz6vqvkr"; + type = "gem"; + }; + version = "5.5.0"; + }; + front_matter_parser = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0yvvxcym75csvckkg3bcf739ild3f0b2yifnlj45gf8xl2yriqms"; + type = "gem"; + }; + version = "1.0.1"; + }; + fugit = { + dependencies = ["et-orbi" "raabro"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cm2lrvhrpqq19hbdsxf4lq2nkb2qdldbdxh3gvi15l62dlb5zqq"; + type = "gem"; + }; + version = "1.8.1"; + }; + fuubar = { + dependencies = ["rspec-core" "ruby-progressbar"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1028vn7j3kc5qqwswrf3has3qm4j9xva70xmzb3n29i89f0afwmj"; + type = "gem"; + }; + version = "2.5.1"; + }; + globalid = { + dependencies = ["activesupport"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kqm5ndzaybpnpxqiqkc41k4ksyxl41ln8qqr6kb130cdxsf2dxk"; + type = "gem"; + }; + version = "1.1.0"; + }; + gon = { + dependencies = ["actionpack" "i18n" "multi_json" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1w6ji15jrl4p6q0gxy5mmqspvzbmgkqj1d3xmbqr0a1rb7b1i9p3"; + type = "gem"; + }; + version = "6.4.0"; + }; + google-apis-core = { + dependencies = ["addressable" "googleauth" "httpclient" "mini_mime" "representable" "retriable" "rexml" "webrick"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "184zkm5agi7r5fl79hgahjpydsc4d23nd2ynh2sr9z8gs2w4h82f"; + type = "gem"; + }; + version = "0.11.0"; + }; + google-apis-gmail_v1 = { + dependencies = ["google-apis-core"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19jr0734hbs2igpn9bs1lpz1yk0prsdn61x4w1wkw0q41i24b882"; + type = "gem"; + }; + version = "0.29.0"; + }; + googleauth = { + dependencies = ["faraday" "jwt" "memoist" "multi_json" "os" "signet"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lj5haarpn7rybbq9s031zcn9ji3rlz5bk64bwa2j34q5s1h5gis"; + type = "gem"; + }; + version = "1.5.2"; + }; + grape = { + dependencies = ["activesupport" "builder" "dry-types" "mustermann-grape" "rack" "rack-accept"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dnbb3gxwbmvhzvzb22prwaim9wmvilm0nm91ndw2ggf324rsrvb"; + type = "gem"; + }; + version = "1.7.1"; + }; + grape_logging = { + dependencies = ["grape" "rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lcjqwal3wc2r41wsi01d09cyhxhglxp6y7hd0564pdx5lr3xk7g"; + type = "gem"; + }; + version = "1.8.4"; + }; + gravatar_image_tag = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kzx81y56kdady6yv77byh15yy5riwbs0d5r2gki3ds6m3z30mpb"; + type = "gem"; + }; + version = "1.2.0"; + }; + grids = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/grids; + type = "path"; + }; + version = "1.0.0"; + }; + hana = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03cvrv2wl25j9n4n509hjvqnmwa60k92j741b64a1zjisr1dn9al"; + type = "gem"; + }; + version = "1.3.7"; + }; + hashdiff = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"; + type = "gem"; + }; + version = "1.0.1"; + }; + hashery = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qj8815bf7q6q7llm5rzdz279gzmpqmqqicxnzv066a020iwqffj"; + type = "gem"; + }; + version = "2.1.2"; + }; + hashie = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13bdzfp25c8k51ayzxqkbzag3wj5gc1jd8h7d985nsq6pn57g5xh"; + type = "gem"; + }; + version = "3.6.0"; + }; + html-pipeline = { + dependencies = ["activesupport" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "180kjksi0sdlqb0aq0bhal96ifwqm25hzb3w709ij55j51qls7ca"; + type = "gem"; + }; + version = "2.14.3"; + }; + htmldiff = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "188kw5694rhndd69dpzi8ygi50sx6s2ig9jl6756racfif60cvd9"; + type = "gem"; + }; + version = "0.0.1"; + }; + http-accept = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09m1facypsdjynfwrcv19xcb1mqg8z6kk31g8r33pfxzh838c9n6"; + type = "gem"; + }; + version = "1.7.0"; + }; + http-cookie = { + dependencies = ["domain_name"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13rilvlv8kwbzqfb644qp6hrbsj82cbqmnzcvqip1p6vqx36sxbk"; + type = "gem"; + }; + version = "1.0.5"; + }; + "http_parser.rb" = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15nidriy0v5yqfjsgsra51wmknxci2n2grliz78sf9pga3n0l7gi"; + type = "gem"; + }; + version = "0.6.0"; + }; + httpclient = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "19mxmvghp7ki3klsxwrlwr431li7hm1lczhhj8z4qihl2acy8l99"; + type = "gem"; + }; + version = "2.8.3"; + }; + i18n = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qaamqsh5f3szhcakkak8ikxlzxqnv49n2p7504hcz2l0f4nj0wx"; + type = "gem"; + }; + version = "1.14.1"; + }; + i18n-js = { + dependencies = ["i18n"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13kr7gmas0cvn7d4njimlpf77q4b4pb2lf3jldss9zis33rhphil"; + type = "gem"; + }; + version = "3.9.2"; + }; + icalendar = { + dependencies = ["ice_cube"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11zfs0l8y2a6gpf0krm91d0ap2mnf04qky89dyzxwaspqxqgj174"; + type = "gem"; + }; + version = "2.8.0"; + }; + ice_cube = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dri4mcya1fwzrr9nzic8hj1jr28a2szjag63f9k7p2bw9fpw4fs"; + type = "gem"; + }; + version = "0.16.4"; + }; + interception = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01vrkn28psdx1ysh5js3hn17nfp1nvvv46wc1pwqsakm6vb1hf55"; + type = "gem"; + }; + version = "0.5"; + }; + io-console = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dikardh14c72gd9ypwh8dim41wvqmzfzf35mincaj5yals9m7ff"; + type = "gem"; + }; + version = "0.6.0"; + }; + irb = { + dependencies = ["reline"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z7ksjik7phf6ygshg9bp6ldd38dfgxmgr73yipkpqq7b426hclq"; + type = "gem"; + }; + version = "1.7.0"; + }; + iso8601 = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18js898rhh6byp0znvchiv6mcxi5l8v3v0bj2ddajpxynwajp319"; + type = "gem"; + }; + version = "0.13.0"; + }; + jmespath = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cdw9vw2qly7q7r41s7phnac264rbsdqgj4l0h4nqgbjb157g393"; + type = "gem"; + }; + version = "1.6.2"; + }; + json = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nalhin1gda4v8ybk6lq8f407cgfrj6qzn234yra4ipkmlbfmal6"; + type = "gem"; + }; + version = "2.6.3"; + }; + json-jwt = { + dependencies = ["activesupport" "aes_key_wrap" "bindata" "faraday" "faraday-follow_redirects"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nb5c0dlwi4ps5z46hg9zdah8cmqm3fcdxxqi9185b8ki4j73jai"; + type = "gem"; + }; + version = "1.16.3"; + }; + json-schema = { + dependencies = ["addressable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "155rygs093i8i04i38a97hs5icmqk2jkkhx76w31yxyr3bxfbgx3"; + type = "gem"; + }; + version = "4.0.0"; + }; + json_schemer = { + dependencies = ["hana" "regexp_parser" "simpleidn"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mbf7v8bzmxyk413y16drnww68bgyzknlqmaqvj785iakja7in7x"; + type = "gem"; + }; + version = "1.0.3"; + }; + json_spec = { + dependencies = ["multi_json" "rspec"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "03yiravv6q8lp37rip2i25w2qd63mwwi4jmw7ymf51y7j9xbjxvs"; + type = "gem"; + }; + version = "1.1.5"; + }; + jwt = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16z11alz13vfc4zs5l3fk6n51n2jw9lskvc4h4prnww0y797qd87"; + type = "gem"; + }; + version = "2.7.1"; + }; + ladle = { + dependencies = ["open4"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p4hv85nrcqg59hbcxm14d98wbk0smdsdljppx48sycc21j6jn78"; + type = "gem"; + }; + version = "1.0.1"; + }; + launchy = { + dependencies = ["addressable"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06r43899384das2bkbrpsdxsafyyqa94il7111053idfalb4984a"; + type = "gem"; + }; + version = "2.5.2"; + }; + lefthook = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pq4m11i6a06lhrjsv5hpnl9nhirr6hgf5s4jffbwk60lgrf44ka"; + type = "gem"; + }; + version = "1.4.3"; + }; + letter_opener = { + dependencies = ["launchy"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y5d4ip4l12v58bgazadl45iv3a5j7jp2gwg96b6jy378zn42a1d"; + type = "gem"; + }; + version = "1.8.1"; + }; + listen = { + dependencies = ["rb-fsevent" "rb-inotify"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13rgkfar8pp31z1aamxf5y7cfq88wv6rxxcwy7cmm177qq508ycn"; + type = "gem"; + }; + version = "3.8.0"; + }; + livingstyleguide = { + dependencies = ["minisyntax" "redcarpet" "sassc" "thor" "tilt"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "17ykc7qjqp3cm9mb8kk5ppk1xpfihp2r6a4727ja6qxjnw10mqcf"; + type = "gem"; + }; + version = "2.1.0"; + }; + lobby_boy = { + dependencies = ["omniauth" "omniauth-openid-connect" "rails"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wl105faijn0pl6i8gcqwaw5d9wwczvvhdzinf71bvra0lybnq4l"; + type = "gem"; + }; + version = "0.1.3"; + }; + lograge = { + dependencies = ["actionpack" "activesupport" "railties" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15pjm9pa5m3mbv9xvfgfr16q4jyaznsg8y63jz9x4jqr8npw0vx3"; + type = "gem"; + }; + version = "0.12.0"; + }; + loofah = { + dependencies = ["crass" "nokogiri"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p744kjpb5zk2ihklbykzii77alycjc04vpnm2ch2f3cp65imlj3"; + type = "gem"; + }; + version = "2.21.3"; + }; + mail = { + dependencies = ["mini_mime" "net-imap" "net-pop" "net-smtp"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bf9pysw1jfgynv692hhaycfxa8ckay1gjw5hz3madrbrynryfzc"; + type = "gem"; + }; + version = "2.8.1"; + }; + marcel = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kky3yiwagsk8gfbzn3mvl2fxlh3b39v6nawzm4wpjs6xxvvc4x0"; + type = "gem"; + }; + version = "1.0.2"; + }; + matrix = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1h2cgkpzkh3dd0flnnwfq6f3nl2b1zff9lvqz8xs853ssv5kq23i"; + type = "gem"; + }; + version = "0.4.2"; + }; + md_to_pdf = { + dependencies = ["commonmarker" "front_matter_parser" "json-schema" "matrix" "nokogiri" "prawn" "prawn-table" "text-hyphen"]; + groups = ["default"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "10bbfbd6f4afdb36918ed9ea686c818144683738"; + sha256 = "0nnrawqy6n7bznbbv4fdzxg9fm1b8gj9js3vl3rrcavj2ggpc1l1"; + type = "git"; + url = "https://github.com/opf/md-to-pdf"; + }; + version = "0.0.18"; + }; + memoist = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i9wpzix3sjhf6d9zw60dm4371iq8kyz7ckh2qapan2vyaim6b55"; + type = "gem"; + }; + version = "0.16.2"; + }; + messagebird-rest = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00ak96dhw13b0pw8njxl96rqgx85knrnrcpk427mb1vcsxmf208m"; + type = "gem"; + }; + version = "1.4.2"; + }; + meta-tags = { + dependencies = ["actionpack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16v9m18hby2dmmcjw5ch8kryq6wafcx9v09xgxabr17cxv9752qf"; + type = "gem"; + }; + version = "2.18.0"; + }; + method_source = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"; + type = "gem"; + }; + version = "1.0.0"; + }; + mime-types = { + dependencies = ["mime-types-data"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ipw892jbksbxxcrlx9g5ljq60qx47pm24ywgfbyjskbcl78pkvb"; + type = "gem"; + }; + version = "3.4.1"; + }; + mime-types-data = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pky3vzaxlgm9gw5wlqwwi7wsw3jrglrfflrppvvnsrlaiz043z9"; + type = "gem"; + }; + version = "3.2023.0218.1"; + }; + mini_magick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0slh78f9z6n0l1i2km7m48yz7l4fjrk88sj1f4mh1wb39sl2yc37"; + type = "gem"; + }; + version = "4.12.0"; + }; + mini_mime = { + groups = ["default" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lbim375gw2dk6383qirz13hgdmxlan0vc5da2l072j3qw6fqjm5"; + type = "gem"; + }; + version = "1.1.2"; + }; + mini_portile2 = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z7f38iq37h376n9xbl4gajdrnwzq284c9v1py4imw3gri2d5cj6"; + type = "gem"; + }; + version = "2.8.2"; + }; + minisyntax = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bicicgkylhb82j74ii5q6wdvl75ynq45b2rs24l2d00hc66b9w9"; + type = "gem"; + }; + version = "0.2.5"; + }; + minitest = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kg9wh7jlc9zsr3hkhpzkbn0ynf4np5ap9m2d8xdrb8shy0y6pmb"; + type = "gem"; + }; + version = "5.18.1"; + }; + msgpack = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06n7556vxr3awh92xy1k5bli98bvq4pjm08mnl68ay4fzln7lcsg"; + type = "gem"; + }; + version = "1.7.1"; + }; + multi_json = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pb1g1y3dsiahavspyzkdy39j4q377009f6ix0bh1ag4nqw43l0z"; + type = "gem"; + }; + version = "1.15.0"; + }; + mustermann = { + dependencies = ["ruby2_keywords"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0rwbq20s2gdh8dljjsgj5s6wqqfmnbclhvv2c2608brv7jm6jdbd"; + type = "gem"; + }; + version = "3.0.0"; + }; + mustermann-grape = { + dependencies = ["mustermann"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zpmc099rcpxmlfxb71zd6l7f9fcsg1fhi6627r03y1qlgb0jlvg"; + type = "gem"; + }; + version = "1.0.2"; + }; + my_page = { + dependencies = ["grids"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/my_page; + type = "path"; + }; + version = "1.0.0"; + }; + net-imap = { + dependencies = ["date" "net-protocol"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d996zf3g8xz244791b0qsl9vr7zg4lqnnmf9k2kshr9lki5jam8"; + type = "gem"; + }; + version = "0.3.4"; + }; + net-ldap = { + groups = ["ldap"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xqcffn3c1564c4fizp10dzw2v5g2pabdzrcn25hq05bqhsckbar"; + type = "gem"; + }; + version = "0.18.0"; + }; + net-pop = { + dependencies = ["net-protocol"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wyz41jd4zpjn0v1xsf9j778qx1vfrl24yc20cpmph8k42c4x2w4"; + type = "gem"; + }; + version = "0.1.2"; + }; + net-protocol = { + dependencies = ["timeout"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dxckrlw4q1lcn3qg4mimmjazmg9bma5gllv72f8js3p36fb3b91"; + type = "gem"; + }; + version = "0.2.1"; + }; + net-smtp = { + dependencies = ["net-protocol"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1c6md06hm5bf6rv53sk54dl2vg038pg8kglwv3rayx0vk2mdql9x"; + type = "gem"; + }; + version = "0.3.3"; + }; + netrc = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gzfmcywp1da8nzfqsql2zqi648mfnx6qwkig3cv36n9m0yy676y"; + type = "gem"; + }; + version = "0.11.0"; + }; + nio4r = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0w9978zwjf1qhy3amkivab0f9syz6a7k0xgydjidaf7xc831d78f"; + type = "gem"; + }; + version = "2.5.9"; + }; + nokogiri = { + dependencies = ["mini_portile2" "racc"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1mr2ibfk874ncv0qbdkynay738w2mfinlkhnbd5lyk5yiw5q1p10"; + type = "gem"; + }; + version = "1.15.2"; + }; + oj = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1s6ipcar6sgwipnc577d4x80ypq2s35k9142jn3l89lh53888mmg"; + type = "gem"; + }; + version = "3.15.0"; + }; + okcomputer = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "031hslwhf8fznsgkzfcmxabrpf5klakwvhiwa90bqvrlrcb4yi1w"; + type = "gem"; + }; + version = "1.18.4"; + }; + omniauth = { + dependencies = ["hashie" "rack"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "fe862f986b2e846e291784d2caa3d90a658c67f0"; + sha256 = "1108xlnihnyn512b8pwz3gjppbxfab60nyg1ymcz58hkrag335d0"; + type = "git"; + url = "https://github.com/opf/omniauth"; + }; + version = "1.9.0"; + }; + omniauth-openid-connect = { + dependencies = ["addressable" "omniauth" "openid_connect"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "efddc061a72791db019259768a4656c0435709e8"; + sha256 = "1c3v49hjajbg739r5nkawzw9m0r01vw7zlw6bwzmzvwkymrkjzcq"; + type = "git"; + url = "https://github.com/opf/omniauth-openid-connect.git"; + }; + version = "0.4.0"; + }; + omniauth-openid_connect-providers = { + dependencies = ["omniauth-openid-connect"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "a6c0c3ed78fac79cf4d007e40d4029e524ec7751"; + sha256 = "1wj5hn1pkikcd59cd78336wjnjxb6lshgfphzdnb7wzcj37lhlbx"; + type = "git"; + url = "https://github.com/opf/omniauth-openid_connect-providers.git"; + }; + version = "0.2.0"; + }; + omniauth-saml = { + dependencies = ["omniauth" "ruby-saml"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gxl14lbksnjkl8dfn23lsjkk63md77icm5racrh6fsp5n4ni9d4"; + type = "gem"; + }; + version = "1.10.3"; + }; + open4 = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cgls3f9dlrpil846q0w7h66vsc33jqn84nql4gcqkk221rh7px1"; + type = "gem"; + }; + version = "1.3.4"; + }; + openid_connect = { + dependencies = ["activemodel" "attr_required" "faraday" "faraday-follow_redirects" "json-jwt" "net-smtp" "rack-oauth2" "swd" "tzinfo" "validate_email" "validate_url" "webfinger"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1j19w1vw762skcykysqz6zv077b3qa3qbs5x7aywh4p53dicgd25"; + type = "gem"; + }; + version = "2.2.0"; + }; + openproject-auth_plugins = { + dependencies = ["omniauth"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/auth_plugins; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-auth_saml = { + dependencies = ["omniauth-saml"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/auth_saml; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-avatars = { + dependencies = ["fastimage" "gravatar_image_tag"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/avatars; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-backlogs = { + dependencies = ["acts_as_list" "openproject-pdf_export"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/backlogs; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-bim = { + dependencies = ["activerecord-import" "rubyzip"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/bim; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-boards = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/boards; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-calendar = { + dependencies = ["icalendar"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/calendar; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-documents = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/documents; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-github_integration = { + dependencies = ["openproject-webhooks"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/github_integration; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-job_status = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/job_status; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-ldap_groups = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/ldap_groups; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-meeting = { + dependencies = ["icalendar"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/meeting; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-openid_connect = { + dependencies = ["lobby_boy" "omniauth-openid_connect-providers" "openproject-auth_plugins"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/openid_connect; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-pdf_export = { + dependencies = ["pdf-inspector" "prawn"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/pdf_export; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-recaptcha = { + dependencies = ["recaptcha"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/recaptcha; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-reporting = { + dependencies = ["costs"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/reporting; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-storages = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/storages; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-team_planner = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/team_planner; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-token = { + dependencies = ["activemodel"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0iijslh119v6a3incnk2v04aklqmpf4x64sl0rvgc3yia2vaadv6"; + type = "gem"; + }; + version = "3.0.1"; + }; + openproject-two_factor_authentication = { + dependencies = ["aws-sdk-sns" "messagebird-rest" "rotp"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/two_factor_authentication; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-webhooks = { + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/webhooks; + type = "path"; + }; + version = "1.0.0"; + }; + openproject-xls_export = { + dependencies = ["spreadsheet"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/xls_export; + type = "path"; + }; + version = "1.0.0"; + }; + os = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gwd20smyhxbm687vdikfh1gpi96h8qb1x28s2pdcysf6dm6v0ap"; + type = "gem"; + }; + version = "1.1.4"; + }; + overviews = { + dependencies = ["grids"]; + groups = ["opf_plugins"]; + platforms = []; + source = { + path = modules/overviews; + type = "path"; + }; + version = "1.0.0"; + }; + ox = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0i1qq88cwh9pccg59whg50rpkgdfrijn4q6k5p3clwrjqgm56lrd"; + type = "gem"; + }; + version = "2.14.16"; + }; + paper_trail = { + dependencies = ["activerecord" "request_store"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zbgqzjix2j283vb3x0z6fvw7sdvwgpmywl6c79vdv0a0da581nz"; + type = "gem"; + }; + version = "12.3.0"; + }; + parallel = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0jcc512l38c0c163ni3jgskvq1vc3mr8ly5pvjijzwvfml9lf597"; + type = "gem"; + }; + version = "1.23.0"; + }; + parallel_tests = { + dependencies = ["parallel"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "04y02j0kyhfww41dnnjawn2gpp24smq0x21dvaa5z6pnq0fvmahv"; + type = "gem"; + }; + version = "4.2.1"; + }; + parser = { + dependencies = ["ast" "racc"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1swigds85jddb5gshll1g8lkmbcgbcp9bi1d4nigwvxki8smys0h"; + type = "gem"; + }; + version = "3.2.2.3"; + }; + pdf-core = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fz0yj4zrlii2j08kaw11j769s373ayz8jrdhxwwjzmm28pqndjg"; + type = "gem"; + }; + version = "0.9.0"; + }; + pdf-inspector = { + dependencies = ["pdf-reader"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g853az4xzgqxr5xiwhb76g4sqmjg4s79mm35mp676zjsrwpa47w"; + type = "gem"; + }; + version = "1.3.0"; + }; + pdf-reader = { + dependencies = ["Ascii85" "afm" "hashery" "ruby-rc4" "ttfunk"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09sx25jpnip2sp6wh5sn5ad7za78rfi95qp5iiczfh43z4jqa8q3"; + type = "gem"; + }; + version = "2.11.0"; + }; + pg = { + groups = ["postgres"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zcvxmfa8hxkhpp59fhxyxy1arp70f11zi1jh9c7bsdfspifb7kb"; + type = "gem"; + }; + version = "1.5.3"; + }; + plaintext = { + dependencies = ["activesupport" "nokogiri" "rubyzip"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0wiphf65vvrgq9zg6h7nymxdqfav3xqyvang89v11wybr59hhg7g"; + type = "gem"; + }; + version = "0.3.4"; + }; + posix-spawn = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cmb0svalqcxfzlzc5fvrci12b79x7bakasr8gkl3q5rz6di1q52"; + type = "gem"; + }; + version = "0.3.15"; + }; + prawn = { + dependencies = ["pdf-core" "ttfunk"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1g9avv2rprsjisdk137s9ljr05r7ajhm78hxa1vjsv0jyx22f1l2"; + type = "gem"; + }; + version = "2.4.0"; + }; + prawn-table = { + dependencies = ["prawn"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1nxd6qmxqwl850icp18wjh5k0s3amxcajdrkjyzpfgq0kvilcv9k"; + type = "gem"; + }; + version = "0.2.2"; + }; + pry = { + dependencies = ["coderay" "method_source"]; + groups = ["default" "development" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k9kqkd9nps1w1r1rb7wjr31hqzkka2bhi8b518x78dcxppm9zn4"; + type = "gem"; + }; + version = "0.14.2"; + }; + pry-byebug = { + dependencies = ["byebug" "pry"]; + groups = ["development" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1y41al94ks07166qbp2200yzyr5y60hm7xaiw4lxpgsm4b1pbyf8"; + type = "gem"; + }; + version = "3.10.1"; + }; + pry-rails = { + dependencies = ["pry"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cf4ii53w2hdh7fn8vhqpzkymmchjbwij4l3m7s6fsxvb9bn51j6"; + type = "gem"; + }; + version = "0.3.9"; + }; + pry-rescue = { + dependencies = ["interception" "pry"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wn72y8y3d3g0ng350ld92nyjln012432q2z2iy9lhwzjc4dwi65"; + type = "gem"; + }; + version = "1.5.2"; + }; + psych = { + dependencies = ["stringio"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1msambb54r3d1sg6smyj4k2pj9h9lz8jq4jamip7ivcyv32a85vz"; + type = "gem"; + }; + version = "5.1.0"; + }; + public_suffix = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hz0bx2qs2pwb0bwazzsah03ilpf3aai8b7lk7s35jsfzwbkjq35"; + type = "gem"; + }; + version = "5.0.1"; + }; + puffing-billy = { + dependencies = ["addressable" "em-http-request" "em-synchrony" "eventmachine" "eventmachine_httpserver" "http_parser.rb" "multi_json"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hfra3c7x8hr2c669f15h2gnyhp5317xp8k77z38l3xapp12g2y9"; + type = "gem"; + }; + version = "3.1.0"; + }; + puma = { + dependencies = ["nio4r"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1v7fmv0n4bhdcwh60dgza44iqai5pg34f5pzm4vh4i5fwx7mpqxh"; + type = "gem"; + }; + version = "6.3.0"; + }; + puma-plugin-statsd = { + dependencies = ["puma"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "14l3ldaqh5x93avspknq3c8hgb9ss0k7fj2h7xq53mkwzn0b7dc7"; + type = "gem"; + }; + version = "2.4.0"; + }; + raabro = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10m8bln9d00dwzjil1k42i5r7l82x25ysbi45fwyv4932zsrzynl"; + type = "gem"; + }; + version = "1.4.0"; + }; + racc = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11v3l46mwnlzlc371wr3x6yylpgafgwdf0q7hc7c1lzx6r414r5g"; + type = "gem"; + }; + version = "1.7.1"; + }; + rack = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16w217k9z02c4hqizym8dkj6bqmmzx4qdvqpnskgzf174a5pwdxk"; + type = "gem"; + }; + version = "2.2.7"; + }; + rack-accept = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18jdipx17b4ki33cfqvliapd31sbfvs4mv727awynr6v95a7n936"; + type = "gem"; + }; + version = "0.4.5"; + }; + rack-attack = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "049s3y3dpl6dn478g912y6f9nzclnnkl30psrbc2w5kaihj5szhq"; + type = "gem"; + }; + version = "6.6.1"; + }; + rack-cors = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "02lvkg1nb4z3zc2nry545dap7a64bb9h2k8waxfz0jkabkgnpimw"; + type = "gem"; + }; + version = "2.0.1"; + }; + rack-mini-profiler = { + dependencies = ["rack"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13dhpp1iljhqp9c8akmp6gjhx47qf83w12ns4bif26ldkignpam1"; + type = "gem"; + }; + version = "3.1.0"; + }; + rack-oauth2 = { + dependencies = ["activesupport" "attr_required" "faraday" "faraday-follow_redirects" "json-jwt" "rack"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dq7yxj5hi3nvvafk6b77hcw9b8mxijynrlgx6nb0a8b6n86fgx0"; + type = "gem"; + }; + version = "2.2.0"; + }; + rack-protection = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kpm67az1wxlg76h620in2r7agfyhv177ps268j5ggsanzddzih8"; + type = "gem"; + }; + version = "3.0.6"; + }; + rack-test = { + dependencies = ["rack"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ysx29gk9k14a14zsp5a8czys140wacvp91fja8xcja0j1hzqq8c"; + type = "gem"; + }; + version = "2.1.0"; + }; + rack-timeout = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1cqa9lh2rdqqvhfxbrdys7mj2x4vxhqmf57iww2x8961mhp8jm0p"; + type = "gem"; + }; + version = "0.6.3"; + }; + rack_session_access = { + dependencies = ["builder" "rack"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0swd35lg7qmqhc3pglvsanq2indnvw360m8qxfxwqabl0br9isq3"; + type = "gem"; + }; + version = "0.2.0"; + }; + rails = { + dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zip0qhk7pp6cvrir77p6v76wj68zaqik875qr5rapqz9am2pvsp"; + type = "gem"; + }; + version = "7.0.5"; + }; + rails-controller-testing = { + dependencies = ["actionpack" "actionview" "activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "151f303jcvs8s149mhx2g5mn67487x0blrf9dzl76q1nb7dlh53l"; + type = "gem"; + }; + version = "1.0.5"; + }; + rails-dom-testing = { + dependencies = ["activesupport" "nokogiri"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lfq2a7kp2x64dzzi5p4cjcbiv62vxh9lyqk2f0rqq3fkzrw8h5i"; + type = "gem"; + }; + version = "2.0.3"; + }; + rails-html-sanitizer = { + dependencies = ["loofah" "nokogiri"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pm4z853nyz1bhhqr7fzl44alnx4bjachcr6rh6qjj375sfz3sc6"; + type = "gem"; + }; + version = "1.6.0"; + }; + rails-i18n = { + dependencies = ["i18n" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bbh5gsw46djmrgddwaq3wsjmj9rsh5dk13wkclwxf1rg9jpkn3g"; + type = "gem"; + }; + version = "7.0.7"; + }; + railties = { + dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor" "zeitwerk"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kn3cx00jnb7bjnh1k2q0dxk0r7nl1a0krgyk5ykxw1wcac81wyw"; + type = "gem"; + }; + version = "7.0.5"; + }; + rainbow = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0smwg4mii0fm38pyb5fddbmrdpifwv22zv3d3px2xx497am93503"; + type = "gem"; + }; + version = "3.1.1"; + }; + rake = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15whn7p9nrkxangbs9hh75q585yfn66lv0v2mhj6q6dl6x8bzr2w"; + type = "gem"; + }; + version = "13.0.6"; + }; + rb-fsevent = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1zmf31rnpm8553lqwibvv3kkx0v7majm1f341xbxc0bk5sbhp423"; + type = "gem"; + }; + version = "0.11.2"; + }; + rb-inotify = { + dependencies = ["ffi"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005"; + type = "gem"; + }; + version = "0.10.1"; + }; + rbtree3 = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1fnq4rpr1pgmvghpr0cz66svm3dih3hnah2gvxq1njd553bylq5b"; + type = "gem"; + }; + version = "0.7.1"; + }; + rdoc = { + dependencies = ["psych"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05r2cxscapr9saqjw8dlp89as7jvc2mlz1h5kssrmkbz105qmfcm"; + type = "gem"; + }; + version = "6.5.0"; + }; + recaptcha = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16424c26gqlq6wm70l557mdilmp1xa18x18xy63izlsgb8hb8kpa"; + type = "gem"; + }; + version = "5.14.0"; + }; + redcarpet = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1sg9sbf9pm91l7lac7fs4silabyn0vflxwaa2x3lrzsm0ff8ilca"; + type = "gem"; + }; + version = "3.6.0"; + }; + regexp_parser = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "136br91alxdwh1s85z912dwz23qlhm212vy6i3wkinz3z8mkxxl3"; + type = "gem"; + }; + version = "2.8.1"; + }; + reline = { + dependencies = ["io-console"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k5rqi4b7qnwxslc54k0nnfg97842i6hmjnyy79pqyydwwcjhj0i"; + type = "gem"; + }; + version = "0.3.5"; + }; + representable = { + dependencies = ["declarative" "trailblazer-option" "uber"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1kms3r6w6pnryysnaqqa9fsn0v73zx1ilds9d1c565n3xdzbyafc"; + type = "gem"; + }; + version = "3.2.0"; + }; + request_store = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13ppgmsbrqah08j06bybd3cddv6dml79yzyjn7r8j1src78h98h7"; + type = "gem"; + }; + version = "1.5.1"; + }; + responders = { + dependencies = ["actionpack" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m9s0mkkprrz02gxhq0ijlwjy0nx1j5yrjf8ssjnhyagnx03lyrx"; + type = "gem"; + }; + version = "3.1.0"; + }; + rest-client = { + dependencies = ["http-accept" "http-cookie" "mime-types" "netrc"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qs74yzl58agzx9dgjhcpgmzfn61fqkk33k1js2y5yhlvc5l19im"; + type = "gem"; + }; + version = "2.1.0"; + }; + retriable = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1q48hqws2dy1vws9schc0kmina40gy7sn5qsndpsfqdslh65snha"; + type = "gem"; + }; + version = "3.1.2"; + }; + rexml = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53"; + type = "gem"; + }; + version = "3.2.5"; + }; + rinku = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zcdha17s1wzxyc5814j6319wqg33jbn58pg6wmxpws36476fq4b"; + type = "gem"; + }; + version = "2.0.6"; + }; + roar = { + dependencies = ["representable"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "024xjaidpll8d80xqlwm7pgf1hypc5b0sv618svmyyn5g75d3d4d"; + type = "gem"; + }; + version = "1.2.0"; + }; + rotp = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "10mmzc85y7andsich586ndykw678qn1ns2wpjxrg0sc0gr4w3pig"; + type = "gem"; + }; + version = "6.2.2"; + }; + rouge = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0pym2zjwl6dwdfvbn7rbvmds32r70jx9qddhvvi6pqy6987ack1v"; + type = "gem"; + }; + version = "4.1.2"; + }; + rspec = { + dependencies = ["rspec-core" "rspec-expectations" "rspec-mocks"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "171rc90vcgjl8p1bdrqa92ymrj8a87qf6w20x05xq29mljcigi6c"; + type = "gem"; + }; + version = "3.12.0"; + }; + rspec-core = { + dependencies = ["rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0l95bnjxdabrn79hwdhn2q1n7mn26pj7y1w5660v5qi81x458nqm"; + type = "gem"; + }; + version = "3.12.2"; + }; + rspec-expectations = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05j44jfqlv7j2rpxb5vqzf9hfv7w8ba46wwgxwcwd8p0wzi1hg89"; + type = "gem"; + }; + version = "3.12.3"; + }; + rspec-mocks = { + dependencies = ["diff-lcs" "rspec-support"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1hfm17xakfvwya236graj6c2arr4sb9zasp35q5fykhyz8mhs0w2"; + type = "gem"; + }; + version = "3.12.5"; + }; + rspec-rails = { + dependencies = ["actionpack" "activesupport" "railties" "rspec-core" "rspec-expectations" "rspec-mocks" "rspec-support"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "086qdyz7c4s5dslm6j06mq7j4jmj958whc3yinhabnqqmz7i463d"; + type = "gem"; + }; + version = "6.0.3"; + }; + rspec-retry = { + dependencies = ["rspec-core"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0n6qc0d16h6bgh1xarmc8vc58728mgjcsjj8wcd822c8lcivl0b1"; + type = "gem"; + }; + version = "0.6.2"; + }; + rspec-support = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "12y52zwwb3xr7h91dy9k3ndmyyhr3mjcayk0nnarnrzz8yr48kfx"; + type = "gem"; + }; + version = "3.12.0"; + }; + rubocop = { + dependencies = ["json" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bxc1p7bwh8dlmcvh6ns239sp9v8j46vw4h450ag8wa7bh1ii1wh"; + type = "gem"; + }; + version = "1.52.1"; + }; + rubocop-ast = { + dependencies = ["parser"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "188bs225kkhrb17dsf3likdahs2p1i1sqn0pr3pvlx50g6r2mnni"; + type = "gem"; + }; + version = "1.29.0"; + }; + rubocop-capybara = { + dependencies = ["rubocop"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01fn05a87g009ch1sh00abdmgjab87i995msap26vxq1a5smdck6"; + type = "gem"; + }; + version = "2.18.0"; + }; + rubocop-factory_bot = { + dependencies = ["rubocop"]; + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0kqchl8f67k2g56sq2h1sm2wb6br5gi47s877hlz94g5086f77n1"; + type = "gem"; + }; + version = "2.23.1"; + }; + rubocop-rails = { + dependencies = ["activesupport" "rack" "rubocop"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "05r46ds0dm44fb4p67hbz721zck8mdwblzssz2y25yh075hvs36j"; + type = "gem"; + }; + version = "2.20.2"; + }; + rubocop-rspec = { + dependencies = ["rubocop" "rubocop-capybara" "rubocop-factory_bot"]; + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00rsflhijcr0q838fgbdmk7knm5kcjpimn6x0k9qmiw15hi96x1d"; + type = "gem"; + }; + version = "2.22.0"; + }; + ruby-duration = { + dependencies = ["activesupport" "i18n" "iso8601"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "114p0rbg7lklznvcjiqyf8xjm17c3s7yvclgb80pl1l5vyqi6ggb"; + type = "gem"; + }; + version = "3.2.3"; + }; + ruby-ole = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0zhaq66csdingjw34acnq3j56s0s1vhxvb1cnglw9vca958g0rvx"; + type = "gem"; + }; + version = "1.2.12.2"; + }; + ruby-prof = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13fsfw43zx9pcix1fzxb95g09yadqjvc8971k74krrjz81vbyh51"; + type = "gem"; + }; + version = "1.6.3"; + }; + ruby-progressbar = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0cwvyb7j47m7wihpfaq7rc47zwwx9k4v7iqd9s1xch5nm53rrz40"; + type = "gem"; + }; + version = "1.13.0"; + }; + ruby-rc4 = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "00vci475258mmbvsdqkmqadlwn6gj9m01sp7b5a3zd90knil1k00"; + type = "gem"; + }; + version = "0.1.5"; + }; + ruby-saml = { + dependencies = ["nokogiri" "rexml"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18vnbzin5ypxrgcs9lllg7x311b69dyrdw2w1pwz84438hmxm79s"; + type = "gem"; + }; + version = "1.15.0"; + }; + ruby2_keywords = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz"; + type = "gem"; + }; + version = "0.0.5"; + }; + rubytree = { + dependencies = ["json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0xl0v0adrfx3pyxkf96mp615jz4kbj4mnhbywhwnsvjkic35waxp"; + type = "gem"; + }; + version = "2.0.1"; + }; + rubyzip = { + groups = ["default" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz"; + type = "gem"; + }; + version = "2.3.2"; + }; + sanitize = { + dependencies = ["crass" "nokogiri"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1ga8yzc9zj45m92ycwnzhzahkwvc3dp3lym5m3f3880hs4jhh7l3"; + type = "gem"; + }; + version = "6.0.1"; + }; + sassc = { + dependencies = ["ffi"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0gpqv48xhl8mb8qqhcifcp0pixn206a7imc07g48armklfqa4q2c"; + type = "gem"; + }; + version = "2.4.0"; + }; + sassc-rails = { + dependencies = ["railties" "sassc" "sprockets" "sprockets-rails" "tilt"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1d9djmwn36a5m8a83bpycs48g8kh1n2xkyvghn7dr6zwh4wdyksz"; + type = "gem"; + }; + version = "2.1.2"; + }; + secure_headers = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0j39xb4rwhv7141qwfd6gxicj20505kas77xjvrm88nx7qpm415m"; + type = "gem"; + }; + version = "6.5.0"; + }; + selenium-webdriver = { + dependencies = ["rexml" "rubyzip" "websocket"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hwxxvx6j95ln82pjmrgyzg6qmf511dkcp5q79n6m5m8z4way8m3"; + type = "gem"; + }; + version = "4.10.0"; + }; + semantic = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0qy1s2kpf9z2p99v23b126ij424yamxviprz59wbp3hrb67v9nrw"; + type = "gem"; + }; + version = "1.6.1"; + }; + shoulda-context = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0d1clcp92jv8756h09kbc55qiqncn666alx0s83za06q5hs4bpvs"; + type = "gem"; + }; + version = "2.0.0"; + }; + shoulda-matchers = { + dependencies = ["activesupport"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "11igjgh16dl5pwqizdmclzlzpv7mbmnh8fx7m9b5kfsjhwxqdfpn"; + type = "gem"; + }; + version = "5.3.0"; + }; + signet = { + dependencies = ["addressable" "faraday" "jwt" "multi_json"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0100rclkhagf032rg3r0gf3f4znrvvvqrimy6hpa73f21n9k2a0x"; + type = "gem"; + }; + version = "0.17.0"; + }; + simpleidn = { + dependencies = ["unf"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "06f7w6ph3bzzqk212yylfp4jfx275shgp9zg3xszbpv1ny2skp9m"; + type = "gem"; + }; + version = "0.2.1"; + }; + spreadsheet = { + dependencies = ["ruby-ole"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1dlhfp69wk0ryffia8cw9ygzq73m7b21g046cma208k422bxfg79"; + type = "gem"; + }; + version = "1.3.0"; + }; + spring = { + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1wvdvwp395cc9srjy0fak5sy0531x7yh358cvmwlkbz0zlb0290x"; + type = "gem"; + }; + version = "4.1.1"; + }; + spring-commands-rspec = { + dependencies = ["spring"]; + groups = ["development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0b0svpq3md1pjz5drpa5pxwg8nk48wrshq8lckim4x3nli7ya0k2"; + type = "gem"; + }; + version = "1.0.4"; + }; + sprockets = { + dependencies = ["concurrent-ruby" "rack"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "182jw5a0fbqah5w9jancvfmjbk88h8bxdbwnl4d3q809rpxdg8ay"; + type = "gem"; + }; + version = "3.7.2"; + }; + sprockets-rails = { + dependencies = ["actionpack" "activesupport" "sprockets"]; + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1b9i14qb27zs56hlcc2hf139l0ghbqnjpmfi0054dxycaxvk5min"; + type = "gem"; + }; + version = "3.4.2"; + }; + ssrf_filter = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09avhkwsh20dz7v1iyxb0gq406ljcszn2lwgx3bagzky3wq97503"; + type = "gem"; + }; + version = "1.1.1"; + }; + stackprof = { + groups = ["development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bhdgfb0pmw9mav1kw9fn0ka012sa0i3h5ppvqssw5xq48nhxnr8"; + type = "gem"; + }; + version = "0.2.25"; + }; + stringex = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1i19x7snfbw0fsfjifvg57b8gm283hhdympj8qb1wym4nb985cy7"; + type = "gem"; + }; + version = "2.8.6"; + }; + stringio = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0557v4z7996cgqw7i9197848mymv02krads93dn9lyqa5d7xd0dn"; + type = "gem"; + }; + version = "3.0.7"; + }; + structured_warnings = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1bc36glh0sfpyw7kr6f7a9pg2x739iv7nrrffj7x3n1siqkmk6pz"; + type = "gem"; + }; + version = "0.4.0"; + }; + svg-graph = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0fji14c525hvql7jw04zphm8n44d4vvbbnnzmwwnaph50dj8ca7r"; + type = "gem"; + }; + version = "2.2.2"; + }; + swd = { + dependencies = ["activesupport" "attr_required" "faraday" "faraday-follow_redirects"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0sr1vz64kcxq148vnhp5jq8bzmhplhlc19zbihw76ya7nkh02qpa"; + type = "gem"; + }; + version = "2.0.2"; + }; + sys-filesystem = { + dependencies = ["ffi"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08bln6c3qmylakgpmpswv4zdis8bf96nkbrxpb9xcal2i7g1j29r"; + type = "gem"; + }; + version = "1.4.3"; + }; + table_print = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1jxmd1yg3h0g27wzfpvq1jnkkf7frwb5wy9m4f47nf4k3wl68rj3"; + type = "gem"; + }; + version = "1.5.7"; + }; + test-prof = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "09phq7jxfgamv03kjcgibw0f6w3g3mlb9yapji3bxh7cbjvwk2pa"; + type = "gem"; + }; + version = "1.2.1"; + }; + text-hyphen = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "01js0wxz84cc5hzxgqbcqnsa0y6crhdi6plmgkzyfm55p0rlajn4"; + type = "gem"; + }; + version = "1.5.0"; + }; + thor = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0k7j2wn14h1pl4smibasw0bp66kg626drxb59z7rzflch99cd4rg"; + type = "gem"; + }; + version = "1.2.2"; + }; + tilt = { + groups = ["default" "development"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1qmhi6d9przjzhsyk9g5pq2j75c656msh6xzprqd2mxgphf23jxs"; + type = "gem"; + }; + version = "2.1.0"; + }; + timecop = { + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dlx4gx0zh836i7nzna03xdl7fc233s5z6plnr6k3kw46ah8d1fc"; + type = "gem"; + }; + version = "0.9.6"; + }; + timeout = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1pfddf51n5fnj4f9ggwj3wbf23ynj0nbxlxqpz12y1gvl9g7d6r6"; + type = "gem"; + }; + version = "0.3.2"; + }; + trailblazer-option = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "18s48fndi2kfvrfzmq6rxvjfwad347548yby0341ixz1lhpg3r10"; + type = "gem"; + }; + version = "0.1.2"; + }; + ttfunk = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "15iaxz9iak5643bq2bc0jkbjv8w2zn649lxgvh5wg48q9d4blw13"; + type = "gem"; + }; + version = "1.7.0"; + }; + turbo-rails = { + dependencies = ["actionpack" "activejob" "railties"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0vm3iqgr3kxyyz5i09lhvfszp4pw1gw5j5rhhv1gmasv4kq2p3qh"; + type = "gem"; + }; + version = "1.4.0"; + }; + turbo_tests = { + dependencies = ["parallel_tests" "rspec"]; + groups = ["test"]; + platforms = []; + source = { + fetchSubmodules = false; + rev = "3148ae6c34828e969e8005eaa592935bfc1afbf3"; + sha256 = "0hlvb9mwssgi3hyk3br91wimklgq4g21bh7ssn5kkvq328a79xqz"; + type = "git"; + url = "https://github.com/crohr/turbo_tests.git"; + }; + version = "2.0.0"; + }; + typed_dag = { + dependencies = ["rails"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1342acsc95iqm5a4bngx57ppa87wjry0nrb4m8aifimmijznbp5q"; + type = "gem"; + }; + version = "2.0.2"; + }; + tzinfo = { + dependencies = ["concurrent-ruby"]; + groups = ["default" "development" "opf_plugins" "test"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd"; + type = "gem"; + }; + version = "2.0.6"; + }; + tzinfo-data = { + dependencies = ["tzinfo"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0m2d0gpsgqnv29j5h2d6g57g0rayvd460b8s2vjr8sn46bqf89m5"; + type = "gem"; + }; + version = "1.2023.3"; + }; + uber = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1p1mm7mngg40x05z52md3mbamkng0zpajbzqjjwmsyw0zw3v9vjv"; + type = "gem"; + }; + version = "0.1.0"; + }; + unf = { + dependencies = ["unf_ext"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh2cf73i2ffh4fcpdn9ir4mhq8zi50ik0zqa1braahzadx536a9"; + type = "gem"; + }; + version = "0.1.4"; + }; + unf_ext = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1yj2nz2l101vr1x9w2k83a0fag1xgnmjwp8w8rw4ik2rwcz65fch"; + type = "gem"; + }; + version = "0.0.8.2"; + }; + unicode-display_width = { + groups = ["default" "development" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1gi82k102q7bkmfi7ggn9ciypn897ylln1jk9q67kjhr39fj043a"; + type = "gem"; + }; + version = "2.4.2"; + }; + validate_email = { + dependencies = ["activemodel" "mail"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1r1fz29l699arka177c9xw7409d1a3ff95bf7a6pmc97slb91zlx"; + type = "gem"; + }; + version = "0.1.6"; + }; + validate_url = { + dependencies = ["activemodel" "public_suffix"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0lblym140w5n88ijyfgcvkxvpfj8m6z00rxxf2ckmmhk0x61dzkj"; + type = "gem"; + }; + version = "1.0.15"; + }; + view_component = { + dependencies = ["activesupport" "concurrent-ruby" "method_source"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "08jc9k4qqazbf5frhdril5084adm90rs1lqbnqq3yfdm2dgaiyhx"; + type = "gem"; + }; + version = "3.2.0"; + }; + warden = { + dependencies = ["rack"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1l7gl7vms023w4clg02pm4ky9j12la2vzsixi2xrv9imbn44ys26"; + type = "gem"; + }; + version = "1.2.9"; + }; + warden-basic_auth = { + dependencies = ["warden"]; + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0viw3wwx3shlb4mynjim99xixs71qn2054wywv1q40cw23h55ixz"; + type = "gem"; + }; + version = "0.2.1"; + }; + webdrivers = { + dependencies = ["nokogiri" "rubyzip" "selenium-webdriver"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0nxk9719nyk7vsc15mz2hxc8whciihcs40skpn2rncnzsppbv1w3"; + type = "gem"; + }; + version = "5.2.0"; + }; + webfinger = { + dependencies = ["activesupport" "faraday" "faraday-follow_redirects"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0z31li2iss9r9pxslmmqa76kixlfl4q58ss9lkds7ci7yck9fm6j"; + type = "gem"; + }; + version = "2.1.2"; + }; + webmock = { + dependencies = ["addressable" "crack" "hashdiff"]; + groups = ["test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1myj44wvbbqvv18ragv3ihl0h61acgnfwrnj3lccdgp49bgmbjal"; + type = "gem"; + }; + version = "3.18.1"; + }; + webrick = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "13qm7s0gr2pmfcl7dxrmq38asaza4w0i2n9my4yzs499j731wh8r"; + type = "gem"; + }; + version = "1.8.1"; + }; + websocket = { + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0dib6p55sl606qb4vpwrvj5wh881kk4aqn2zpfapf8ckx7g14jw8"; + type = "gem"; + }; + version = "1.2.9"; + }; + websocket-driver = { + dependencies = ["websocket-extensions"]; + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052"; + type = "gem"; + }; + version = "0.7.5"; + }; + websocket-extensions = { + groups = ["default" "opf_plugins"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw"; + type = "gem"; + }; + version = "0.1.5"; + }; + will_paginate = { + groups = ["default"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "1lb3fzz3hll47hixgz9k901nji9cav43ndf2pvhn3a1pz2c2v6pc"; + type = "gem"; + }; + version = "4.0.0"; + }; + with_advisory_lock = { + dependencies = ["activerecord"]; + groups = ["default"]; + platforms = [{ + engine = "maglev"; + } { + engine = "mingw"; + } { + engine = "mingw"; + } { + engine = "ruby"; + }]; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0s5y6cwl6ikkywhaxm6pb2295dv0gk1xmpwbz49qzn6y5wyv63xw"; + type = "gem"; + }; + version = "4.6.0"; + }; + xpath = { + dependencies = ["nokogiri"]; + groups = ["default" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd"; + type = "gem"; + }; + version = "3.2.0"; + }; + zeitwerk = { + groups = ["default" "development" "opf_plugins" "test"]; + platforms = []; + source = { + remotes = ["https://rubygems.org"]; + sha256 = "0ck6bj7wa73dkdh13735jl06k6cfny98glxjkas82aivlmyzqqbk"; + type = "gem"; + }; + version = "2.6.8"; + }; +} diff --git a/ruby/openproject.nix b/ruby/openproject.nix new file mode 100644 index 0000000..22d8195 --- /dev/null +++ b/ruby/openproject.nix @@ -0,0 +1,76 @@ +{ lib +, stdenv +, fetchFromGitHub +, bundlerEnv +, fetchNpmDeps +, ruby_3_2 +, defaultGemConfig +, makeWrapper +, which +, nixosTests +}: + +let + version = "12.5.7"; + + rubyEnv = bundlerEnv { + name = "openproject-env-${version}"; + + ruby = ruby_3_2; + gemdir = ./.; + groups = [ "development" "ldap" "markdown" "common_mark" "minimagick" "test" ]; + }; + + src = fetchFromGitHub { + owner = "opf"; + repo = "openproject"; + rev = "53b19adcd5e6feffec0d0daa47f5ff480f3ab04b"; + hash = "sha256-3YniGdLmOh71cqJ5EzT+tpwN1Ru9NiC/2CL8aDEEmNA="; + }; + + offlineNpmCache = fetchNpmDeps { + src = src + "/frontend"; + hash = "sha256-cGrgMwhh/WfahMd8TbzHZ6PruU+4V7cogWJp8gMCIlI="; + }; +in + stdenv.mkDerivation rec { + pname = "openproject"; + inherit version; + inherit src; + + nativeBuildInputs = [ makeWrapper which ]; + buildInputs = [ rubyEnv rubyEnv.wrappedRuby rubyEnv.bundler ]; + + buildPhase = '' + echo 'link node_modules' + ln -s ${offlineNpmCache}/node_modules ./frontend/node_modules + export PATH="${offlineNpmCache}/bin:$PATH" + + echo 'wrap ruby' + export BUNDLE_GEMFILE=./Gemfile + + ruby -e 'puts ENV["BUNDLE_GEMFILE"]' + + echo 'rake assets:prepare_op' + bundle exec rake assets:prepare_op + echo 'rake openproject:plugins:register_frontend' + bundle exec rake openproject:plugins:register_frontend + echo 'npm build:ci' + (cd frontend && npm run build:ci) + echo 'rake assets:rebuild_manifest' + bundle exec rake assets:rebuild_manifest + ''; + + installPhase = '' + echo "installPhase!" + + makeWrapper ${rubyEnv.wrappedRuby}/bin/ruby $out/bin/rdm-mailhandler.rb --add-flags $out/share/redmine/extra/mail_handler/rdm-mailhandler.rb + ''; + + meta = with lib; { + homepage = "https://www.openproject.org/"; + platforms = platforms.linux; + maintainers = with maintainers; [ ]; + license = licenses.gpl3; + }; + } diff --git a/test-vm/configuration.nix b/test-vm/configuration.nix new file mode 100644 index 0000000..30a388c --- /dev/null +++ b/test-vm/configuration.nix @@ -0,0 +1,111 @@ +{ pkgs, lib, config, modulesPath, ... }: +{ + imports = [ + "${modulesPath}/profiles/minimal.nix" + "${modulesPath}/profiles/qemu-guest.nix" + "${modulesPath}/virtualisation/qemu-vm.nix" + ]; + + config = { + services.qemuGuest.enable = true; + system.stateVersion = "23.05"; + + fileSystems."/" = { + device = "/dev/disk/by-label/nixos"; + fsType = "ext4"; + autoResize = true; + }; + + boot = { + growPartition = true; + loader.timeout = 5; + }; + + virtualisation = { + diskSize = 8000; # MB + memorySize = 2048; # MB + + # We don't want to use tmpfs, otherwise the nix store's size will be bounded + # by a fraction of available RAM. + writableStoreUseTmpfs = false; + + forwardPorts = [{ + guest.port = 22; + host.port = 2222; + } { + guest.port = 9090; + host.port = 9090; + } { + guest.port = 8081; + host.port = 8081; + }]; + }; + + # So that we can ssh into the VM, see e.g. + # http://blog.patapon.info/nixos-local-vm/#accessing-the-vm-with-ssh + services.openssh.enable = true; + services.openssh.settings.PermitRootLogin = "yes"; + # Give root an empty password to ssh in. + users.extraUsers.root.password = ""; + users.users.root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMNeQYLFauAbzDyIbKC86NUh9yZfiyBm/BtIdkcpZnSU" + ]; + users.mutableUsers = false; + networking.firewall.enable = false; + + environment.systemPackages = with pkgs; [ + git + htop + neovim + ]; + + services.redis.servers = { + # Queue, naming it "" makes it use default values. + "".enable = true; + + socketio = { + enable = true; + port = 12311; + }; + }; + + users.users.openproject = { + description = "User to run openproject"; + group = "openproject"; + isSystemUser = true; + home = "/var/lib/openproject"; + createHome = true; + }; + + systemd.services.openproject = { + enable = true; + wantedBy = [ "multi-user.target" ]; + after = [ "mysql.service" "redis.service" "redis-socketio.service" ]; + description = "ERPNext"; + confinement = { + enable = true; + packages = [ pkgs.mariadb-client pkgs.nodejs penv ]; + }; + script = '' + export PYTHON_PATH=${penv}/${pkgs.python3.sitePackages} + export PATH="${pkgs.mariadb-client}/bin:${pkgs.nodejs}/bin:${penv}/bin:$PATH" + + # Initialize the DB + # Start the server + + ''; + serviceConfig = { + User = "erpnext"; + NoNewPrivileges = true; + Type = "simple"; + BindReadOnlyPaths = [ + "/etc/hosts:/etc/hosts" + "${pkgs.openproject}:${pkgs.openproject}" + ]; + BindPaths = [ + "/var/lib/openproject:/var/libopenproject" + ]; + }; + }; + }; +}