diff --git a/.env-example b/.env-example new file mode 100644 index 000000000..71928c405 --- /dev/null +++ b/.env-example @@ -0,0 +1,5 @@ +# .env +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_REGION=us-east-1 +RAILS_ENV=development diff --git a/.github/workflows/build-production.yml b/.github/workflows/build-production.yml new file mode 100644 index 000000000..9ddcba672 --- /dev/null +++ b/.github/workflows/build-production.yml @@ -0,0 +1,46 @@ +name: Deploy Production +on: + workflow_run: + workflows: ["CI"] + types: + - completed + +permissions: + id-token: write + contents: read + +jobs: + deploy_production: + if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'production' }} + name: Deploy Production + runs-on: ubuntu-latest + environment: production + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: Configure AWS credentials for Production environment account + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::946183545209:role/GithubActionsDeployerRole + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push image to Amazon ECR + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: my-library-nyc-app + IMAGE_TAG: ${{ github.sha }} + run: | + DOCKER_BUILDKIT=1 docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:production-latest + docker push $ECR_REGISTRY/$ECR_REPOSITORY:production-latest + + - name: Force ECS Update + run: | + aws ecs update-service --cluster mylibrarynycapp-production --service mylibrarynycapp-production --force-new-deployment + aws ecs update-service --cluster mylibrarynycapp-production --service mylibrarynycapp-production-delayed-job --force-new-deployment diff --git a/.github/workflows/build-qa.yml b/.github/workflows/build-qa.yml new file mode 100644 index 000000000..9e14bb35f --- /dev/null +++ b/.github/workflows/build-qa.yml @@ -0,0 +1,50 @@ +name: Deploy QA + #on: + # workflow_run: + # workflows: ["CI"] + # types: + # - completed +on: + push: + branches: + - tiger-team-feature + +permissions: + id-token: write + contents: read + +jobs: + deploy_qa: + # if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'tiger-team-feature' }} + name: Deploy QA + runs-on: ubuntu-latest + environment: qa + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: Configure AWS credentials for QA environment account + uses: aws-actions/configure-aws-credentials@v2 + with: + role-to-assume: arn:aws:iam::946183545209:role/GithubActionsDeployerRole + aws-region: us-east-1 + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push image to Amazon ECR + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: my-library-nyc-app + IMAGE_TAG: ${{ github.sha }} + run: | + DOCKER_BUILDKIT=1 docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:qa-latest + docker push $ECR_REGISTRY/$ECR_REPOSITORY:qa-latest + + - name: Force ECS Update + run: | + aws ecs update-service --cluster mylibrarynycapp-qa --service mylibrarynycapp-qa --force-new-deployment + aws ecs update-service --cluster mylibrarynycapp-qa --service mylibrarynycapp-qa-delayed-job --force-new-deployment diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..d98f0c144 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,35 @@ +name: CI + +on: + push: + branches: + - qa + - production + pull_request: + branches: + - qa + - production + +jobs: + build_and_test: + runs-on: ubuntu-latest + steps: + - name: check out code + uses: actions/checkout@v2 + + - name: set up docker + uses: docker/setup-buildx-action@v2 + + - name: install docker compose + run: | + sudo apt-get update + sudo apt-get install -y docker-compose + + - name: build application + run: | + docker-compose build + + - name: Run tests + run: | + docker-compose up -d + docker-compose run webapp sh -c 'RAILS_ENV=test bundle exec rake db:create db:schema:load && RAILS_ENV=test bundle exec rails test' diff --git a/.gitignore b/.gitignore index 31118b498..35f7ab5f7 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ # Ignore files in the data/private subdirectory /data/private +# Ignore postgresql data from the local environment +/data/postgres-my-library-nyc-app + # Elastic Beanstalk Files .elasticbeanstalk/* !.elasticbeanstalk/*.cfg.yml @@ -46,3 +49,7 @@ yarn-debug.log* /app/assets/builds/* !/app/assets/builds/.keep + +# Ignore VIM swapfiles +*.swo +*.swp diff --git a/.rspec b/.rspec new file mode 100644 index 000000000..5be63fcb0 --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +--require spec_helper +--format documentation diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a6e37c0d3..000000000 --- a/.travis.yml +++ /dev/null @@ -1,79 +0,0 @@ -dist: focal -language: ruby - -services: -- docker - -branches: - only: - - qa - - production - -jobs: - include: - - stage: docker build - if: (branch = qa or branch = production) - before_install: - - if [[ $TRAVIS_BRANCH == "qa" ]]; - then - export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID_QA}; - export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY_QA}; - export ENV="qa"; - fi - - if [[ "$TRAVIS_BRANCH" == "production" ]]; - then - export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID_PRODUCTION}; - export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY_PRODUCTION}; - export ENV="production"; - fi - env: - - ECR_URL=946183545209.dkr.ecr.us-east-1.amazonaws.com/my-library-nyc-app - - AWS_DEFAULT_REGION=us-east-1 - - AWS_REGION=us-east-1 - install: - - pip install --user awscli - - export LOCAL_TAG_NAME="${ENV}-latest" - script: - - eval $(aws ecr get-login --no-include-email --region us-east-1) - - DOCKER_BUILDKIT=1 docker build -t "$LOCAL_TAG_NAME" --secret id=AWS_ACCESS_KEY_ID --secret id=AWS_SECRET_ACCESS_KEY --build-arg RAILS_ENV="${ENV}" . - - docker tag "$LOCAL_TAG_NAME" "$ECR_URL:$LOCAL_TAG_NAME" - # Re-tag last latest image just in case - - | - MANIFEST=$(aws ecr batch-get-image --repository-name my-library-nyc-app --image-ids imageTag="$ENV-latest" --output json | jq --raw-output --join-output '.images[0].imageManifest') - aws ecr batch-delete-image --repository-name my-library-nyc-app --image-ids imageTag="$ENV-previous" || true - aws ecr put-image --repository-name my-library-nyc-app --image-tag "$ENV-previous" --image-manifest "$MANIFEST" - - docker push "$ECR_URL:$LOCAL_TAG_NAME" - - - stage: deploy qa - if: branch IN (qa) AND type != pull_request - env: - - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID_QA - - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_QA - - AWS_DEFAULT_REGION=us-east-1 - - AWS_REGION=us-east-1 - - CLUSTER_NAME=mylibrarynycapp-qa - - DELAYED_JOB_NAME=mylibrarynycapp-qa-delayed-job - install: - - pip install --user awscli - script: - - aws ecs update-service --cluster $CLUSTER_NAME --service $CLUSTER_NAME --force-new-deployment - - aws ecs update-service --cluster $CLUSTER_NAME --service $DELAYED_JOB_NAME --force-new-deployment - - - stage: deploy production - if: branch IN (production) AND type != pull_request - env: - - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_PRODUCTION - - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID_PRODUCTION - - AWS_DEFAULT_REGION=us-east-1 - - AWS_REGION=us-east-1 - - CLUSTER_NAME=mylibrarynycapp-production - - DELAYED_JOB_NAME=mylibrarynycapp-production-delayed-job - install: - - pip install --user awscli - script: - - aws ecs update-service --cluster $CLUSTER_NAME --service $CLUSTER_NAME --force-new-deployment - - aws ecs update-service --cluster $CLUSTER_NAME --service $DELAYED_JOB_NAME --force-new-deployment - -env: - global: - - secure: gLvQY4s1wSXf5hb51e3BH9dlAJBcG55IR4AUlhtIpiQPf/jj4N9oS5tZbmpQnDeT/IJAceL+4sQcL13LRCCArCxlEHow1TdaYFVVix1ABbMH3ge6ZZrQ/ckVaWMv3AIJej8IF0c4skO90fFBz32KAdC2wUmB3/p38WwMHc72KyQa8LwwfhKRx5i14IRF4/IgW7wlZV6zlxJTXyVR1wXB3ghI+8YcuuKdT8PVMwxsBZ6qQjhthg0ez3F0X/Ccd2xqw4X5HfohDpl0HmDeoqJrJt58hGq7p6qx++gHGHn2ByoIeqRNYsTD07MbczQjvvyHHdKNhu2Qv4cwEw6Uhgmx4m/8YbdimFjVB83tLgAfswLEvMtsAOz0gZ7OiED2gvpzfIHy6z5lgzGJ1KmJH9RodcHuP0gV+txhTBfCbn3anBQoF4gYxXxloYI3Aiptl5EU3HSeduxs2TLhk0Vs6Mmzw4thMyyyBRDPdPl8AJR/vcJB7nw1ZTBfxFU4ShvcanqgZsrUh6BsvcbPRJOBmj8Xc0vJwRn7VpvUTvDe3gBNgN06uxyuLMFRdt5u7Ed1DFCRLLBKX1nID04+51HAJtmS4oT5WYtxZzR0n9rlr0bT4sxHHtEdXN8V09d+2OZHQERHh/ekBdJj0N1BChGm4DOW4GDw3p/Tx7gymiB0vxEHrGU= diff --git a/Dockerfile b/Dockerfile index 724686cea..0263776d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,56 +1,49 @@ -# syntax = docker/dockerfile:1.3 -FROM ruby:2.7.4 AS builder - -# set env vars -ENV APP_HOME /home/app/MyLibraryNYCApp -ENV AWS_DEFAULT_REGION=us-east-1 - -ARG RAILS_ENV -ENV RAILS_ENV=${RAILS_ENV} - +# Set base image and working directory +FROM ruby:3.3 + +# Install necessary packages, including curl and PostgreSQL client +RUN apt-get update -qq && apt-get install -y \ + curl \ + postgresql-client \ + && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install Yarn globally +RUN npm install -g yarn + +# Set environment variables +ENV RAILS_ENV=development +ENV APP_HOME=/app +RUN mkdir $APP_HOME WORKDIR $APP_HOME -# install packages -RUN apt-get update -qq \ - && apt-get install -y \ - curl \ - postgresql-client \ - git - -RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \ - && apt-get -y install nodejs \ - && npm install --global yarn - -# Install esbuild +# Install esbuild globally RUN npm install -g esbuild -# set up app files -COPY . $APP_HOME -COPY Gemfile $APP_HOME -COPY Gemfile.lock $APP_HOME -WORKDIR $APP_HOME +# Copy Gemfile and Gemfile.lock first +COPY Gemfile Gemfile.lock $APP_HOME/ -## bundle -ENV BUNDLER_VERSION=2.4.22 -RUN gem install bundler -v $BUNDLER_VERSION -RUN bundle config --global github.https true \ - && bundle install --jobs 30 +# Install bundler and Ruby dependencies +RUN gem install bundler -v 2.5.20 +RUN bundle install --jobs 30 -COPY package.json $APP_HOME/package.json -COPY package-lock.json $APP_HOME/package-lock.json +# Copy package.json and package-lock.json before running yarn install +COPY package.json $APP_HOME/ + +# Install JS dependencies RUN yarn install -# build +# Now copy the rest of the application +COPY . $APP_HOME/ + +# Precompile assets RUN yarn build RUN yarn build:css -RUN --mount=type=secret,id=AWS_ACCESS_KEY_ID \ - --mount=type=secret,id=AWS_SECRET_ACCESS_KEY \ - AWS_ACCESS_KEY_ID=$(cat /run/secrets/AWS_ACCESS_KEY_ID) \ - && export AWS_ACCESS_KEY_ID \ - AWS_SECRET_ACCESS_KEY=$(cat /run/secrets/AWS_SECRET_ACCESS_KEY) \ - && export AWS_SECRET_ACCESS_KEY \ - && bundle exe rails assets:precompile +# Expose the app port EXPOSE 3000 -CMD ["bundle", "exec", "rails", "server", "-p", "3000", "-b", "0.0.0.0"] +# Start the server +CMD ["bash", "-c", "rm -f /app/tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0"] diff --git a/Gemfile b/Gemfile index bba2f06bd..dee939584 100644 --- a/Gemfile +++ b/Gemfile @@ -1,104 +1,103 @@ # frozen_string_literal: true -ruby '2.7.4' - source 'https://rubygems.org' -# force pre-2.0 Bundler to use https on github -git_source(:github) do |repo_name| - repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") - "https://github.com/#{repo_name}.git" -end - -gem 'delayed_job' -gem 'delayed_job_active_record' -gem 'daemons' +gem 'delayed_job', '~> 4.1' +gem 'delayed_job_active_record', '~> 4.1' +gem 'daemons', '~> 1.4' -gem "minitest-stub_any_instance" -gem 'rails', '7.0.2.2' -gem 'actionpack', '7.0.2.2' -gem 'actioncable', '7.0.2.2' -gem 'activeadmin', '~> 2.14' -gem 'actionmailer', '7.0.2.2' -gem 'activeadmin_reorderable' -gem 'activemodel', '7.0.2.2' -gem 'activejob', '7.0.2.2' -gem 'activerecord', '7.0.2.2' -gem 'activestorage', '7.0.2.2' -gem 'activesupport', '7.0.2.2' +gem 'minitest-stub_any_instance', '~> 1.0' +gem 'rails', '~> 7.2' +gem 'actionpack', '~> 7.2' +gem 'actioncable', '~> 7.2' +gem 'activeadmin', '~> 3.2' +gem 'actionmailer', '~> 7.2' +gem 'activeadmin_reorderable', '~> 0.3' +gem 'activemodel', '~> 7.2' +gem 'activejob', '~> 7.2' +gem 'activerecord', '~> 7.2' +gem 'activestorage', '~> 7.2' +gem 'activesupport', '~> 7.2' gem 'active_model_serializers', '~> 0.8.1' -gem 'acts_as_list' -gem 'addressable' -gem 'auto-session-timeout' -gem 'actionview', '7.0.2.2' -gem 'aws-sdk', '~> 3' -gem 'client_side_validations', '22.1.1' -gem 'cranky' -gem 'devise', '4.8.1' -gem 'elasticsearch', '6.8' -gem 'email_validator' -gem 'faker' -gem 'figaro' -gem 'font-awesome-rails' -gem 'railties', '~> 7.0.2.2' -gem 'google-api-client' -gem 'google_drive' -gem 'httparty' -gem 'json' -gem 'lograge', '~> 0.11.2' -gem 'logstash-event', github: 'elastic/logstash', tag: 'v1.5.4' -gem 'nokogiri', '1.15.6' -gem 'open_uri_redirections' -gem 'paper_trail', '~> 11.1' -gem 'pg', '~> 1.2' -gem 'rack-cors' -gem 'rails-controller-testing' -gem 'rubocop','~> 1.48', require: false -gem 'test-unit' -gem 'travis' -gem 'will_paginate', '~> 3.0' -gem 'webmock' -gem 'yaml_db' -gem 'rexml', '~> 3.2.5' -gem 'rubocop-performance', '~> 1.16' -gem 'thread_safe', '~> 0.3.6' -gem "react_on_rails", "13.4" -gem "breakpoint", "~>2.4.0" -gem 'execjs' -gem 'mini_racer' -gem 'bcrypt' -gem 'puma', '~> 5.5' -gem 'activeadmin_addons', '~> 1.9' -gem 'turbolinks', '~> 5.2.0' -gem 'rack', '~> 2.2.4' -gem 'jsonapi-serializer' -gem 'auto_increment', '~> 1.5', '>= 1.5.2' -gem 'luhn' -gem 'sprockets-rails' -gem "turbo-rails" -gem "stimulus-rails" -gem "jsbundling-rails" -gem "cssbundling-rails" -gem "jquery-rails", "~> 4.2" -gem "importmap-rails" +gem 'acts_as_list', '~> 1.2' +gem 'addressable', '~> 2.8' +gem 'auto-session-timeout', '~> 1.2' +gem 'actionview', '~> 7.2' +gem 'aws-sdk', '~> 3.2' +gem 'client_side_validations', '~> 22.2' +gem 'cranky', '~> 1.1' +gem 'devise', '~> 4.9' +gem 'elasticsearch', '7.10' +gem 'email_validator', '~> 2.2' +gem 'faker', '~> 3.4' +gem 'figaro', '~> 1.2' +gem 'font-awesome-rails', '~> 4.7' +gem 'railties', '~> 7.2' +gem 'google-api-client', '~> 0.53' +gem 'google_drive', '~> 3.0' +gem 'httparty', '~> 0.22' +gem 'json', '~> 2.7' +gem 'lograge', '~> 0.14' +gem 'mutex_m', '~> 0.2' +gem 'nokogiri', '~> 1.16' +gem 'open_uri_redirections', '~> 0.2' +gem 'ostruct', '~> 0.6' +gem 'paper_trail', '~> 15.2' +gem 'pg', '~> 1.5' +gem 'rack-cors', '~> 2.0' +gem 'rails-controller-testing', '~> 1.0' +gem 'rubocop', '~> 1.66' +gem 'test-unit', '~> 3.6' +gem 'will_paginate', '~> 4.0' +gem 'webmock', '~> 3.24' +gem 'yaml_db', '~> 0.7' +gem 'rexml', '~> 3.3' +gem 'rubocop-performance', '~> 1.22' +gem 'thread_safe', '~> 0.3' +gem 'react_on_rails', '~> 14.0' +gem 'breakpoint', '~> 2.7' +gem 'execjs', '~> 2.9' +gem 'mini_racer', '~> 0.16' +gem 'bcrypt', '~> 3.1' +gem 'puma', '~> 6.4' +gem 'activeadmin_addons', '~> 1.10' +gem 'turbolinks', '~> 5.2' +gem 'rack', '~> 3.1' +gem 'jsonapi-serializer', '~> 2.2' +gem 'auto_increment', '~> 1.6' +gem 'luhn', '~> 1.0' +gem 'sprockets-rails', '~> 3.5' +gem 'turbo-rails', '~> 2.0' +gem 'stimulus-rails', '~> 1.3' +gem 'jsbundling-rails', '~> 1.3' +gem 'cssbundling-rails', '~> 1.4' +gem 'jquery-rails', '~> 4.6' +gem 'importmap-rails', '~> 2.0' group :assets do # Gems used only for assets and not required in production environments by default. - gem 'sass-rails' - gem 'coffee-rails' - gem 'uglifier', '>= 1.0.3' + gem 'sass-rails', '~> 6.0' + gem 'coffee-rails', '~> 5.0' + gem 'uglifier', '~> 4.2' end -group :development, :local do - gem 'pry', '>= 0.10.0' - gem 'pry-rails' - gem 'pry-remote' - gem 'pry-nav', '>= 0.2.4' - gem 'pry-rescue' - gem 'pry-stack_explorer' +group :development do + gem 'pry', '~> 0.14' + gem 'pry-rails', '~> 0.3' + gem 'pry-remote', '~> 0.1' + gem 'pry-nav', '~> 1.0' + gem 'pry-rescue', '~> 1.6' + gem 'pry-stack_explorer', '~> 0.6' end group :test do - gem 'minitest', '~> 5.14.2' - gem 'simplecov', '~> 0.17.1' - gem 'database_cleaner' + gem 'factory_bot_rails', '~> 6.4' + gem 'minitest', '~> 5.25' + gem 'minitest-reporters', '~> 1.7' + gem 'mocha', '~> 2.4' + gem 'simplecov', '~> 0.22' + gem 'database_cleaner', '~> 2.0' + gem 'rails-perftest', '~> 0.0' + gem 'rspec-rails', '~> 7.0' + gem 'spring', '~> 4.2' + gem 'spring-commands-rspec', '~> 1.0' end diff --git a/Gemfile.lock b/Gemfile.lock index 7574663f2..988fea6ca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,72 +1,63 @@ -GIT - remote: https://github.com/elastic/logstash.git - revision: a32bf2c2e0238d9411e0efdf163bd76fc537ad77 - tag: v1.5.4 - specs: - logstash-event (1.3.0) - cabin - oj - GEM remote: https://rubygems.org/ specs: - actioncable (7.0.2.2) - actionpack (= 7.0.2.2) - activesupport (= 7.0.2.2) + actioncable (7.2.1) + actionpack (= 7.2.1) + activesupport (= 7.2.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (7.0.2.2) - actionpack (= 7.0.2.2) - activejob (= 7.0.2.2) - activerecord (= 7.0.2.2) - activestorage (= 7.0.2.2) - activesupport (= 7.0.2.2) - mail (>= 2.7.1) - net-imap - net-pop - net-smtp - actionmailer (7.0.2.2) - actionpack (= 7.0.2.2) - actionview (= 7.0.2.2) - activejob (= 7.0.2.2) - activesupport (= 7.0.2.2) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp - rails-dom-testing (~> 2.0) - actionpack (7.0.2.2) - actionview (= 7.0.2.2) - activesupport (= 7.0.2.2) - rack (~> 2.0, >= 2.2.0) + zeitwerk (~> 2.6) + actionmailbox (7.2.1) + actionpack (= 7.2.1) + activejob (= 7.2.1) + activerecord (= 7.2.1) + activestorage (= 7.2.1) + activesupport (= 7.2.1) + mail (>= 2.8.0) + actionmailer (7.2.1) + actionpack (= 7.2.1) + actionview (= 7.2.1) + activejob (= 7.2.1) + activesupport (= 7.2.1) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (7.2.1) + actionview (= 7.2.1) + activesupport (= 7.2.1) + nokogiri (>= 1.8.5) + racc + rack (>= 2.2.4, < 3.2) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (7.0.2.2) - actionpack (= 7.0.2.2) - activerecord (= 7.0.2.2) - activestorage (= 7.0.2.2) - activesupport (= 7.0.2.2) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + useragent (~> 0.16) + actiontext (7.2.1) + actionpack (= 7.2.1) + activerecord (= 7.2.1) + activestorage (= 7.2.1) + activesupport (= 7.2.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.0.2.2) - activesupport (= 7.0.2.2) + actionview (7.2.1) + activesupport (= 7.2.1) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_material (1.5.2) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + active_material (2.1.2) active_model_serializers (0.8.4) activemodel (>= 3.0) - activeadmin (2.14.0) + activeadmin (3.2.5) arbre (~> 1.2, >= 1.2.1) - formtastic (>= 3.1, < 5.0) - formtastic_i18n (~> 0.4) + csv + formtastic (>= 3.1) + formtastic_i18n (>= 0.4) inherited_resources (~> 1.7) - jquery-rails (~> 4.2) - kaminari (~> 1.0, >= 1.2.1) - railties (>= 6.1, < 7.1) - ransack (>= 2.1.1, < 4) + jquery-rails (>= 4.2) + kaminari (>= 1.2.1) + railties (>= 6.1) + ransack (>= 4.0) activeadmin_addons (1.10.1) active_material railties @@ -75,966 +66,982 @@ GEM sassc sassc-rails xdan-datetimepicker-rails (~> 2.5.1) - activeadmin_reorderable (0.2.1) - activejob (7.0.2.2) - activesupport (= 7.0.2.2) + activeadmin_reorderable (0.3.3) + activejob (7.2.1) + activesupport (= 7.2.1) globalid (>= 0.3.6) - activemodel (7.0.2.2) - activesupport (= 7.0.2.2) - activerecord (7.0.2.2) - activemodel (= 7.0.2.2) - activesupport (= 7.0.2.2) - activestorage (7.0.2.2) - actionpack (= 7.0.2.2) - activejob (= 7.0.2.2) - activerecord (= 7.0.2.2) - activesupport (= 7.0.2.2) + activemodel (7.2.1) + activesupport (= 7.2.1) + activerecord (7.2.1) + activemodel (= 7.2.1) + activesupport (= 7.2.1) + timeout (>= 0.4.0) + activestorage (7.2.1) + actionpack (= 7.2.1) + activejob (= 7.2.1) + activerecord (= 7.2.1) + activesupport (= 7.2.1) marcel (~> 1.0) - mini_mime (>= 1.1.0) - activesupport (7.0.2.2) - concurrent-ruby (~> 1.0, >= 1.0.2) + activesupport (7.2.1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - tzinfo (~> 2.0) - acts_as_list (1.1.0) - activerecord (>= 4.2) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + acts_as_list (1.2.2) + activerecord (>= 6.1) + activesupport (>= 6.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + ansi (1.5.0) arbre (1.7.0) activesupport (>= 3.0.0) ruby2_keywords (>= 0.0.2) ast (2.4.2) - auto-session-timeout (1.1) - actionpack (>= 3.2, < 7.2) - auto_increment (1.6.1) + auto-session-timeout (1.2) + actionpack (>= 3.2, < 7.3) + auto_increment (1.6.2) activerecord (>= 6.0) activesupport (>= 6.0) aws-eventstream (1.3.0) - aws-partitions (1.896.0) + aws-partitions (1.981.0) aws-sdk (3.2.0) aws-sdk-resources (~> 3) - aws-sdk-accessanalyzer (1.46.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-account (1.21.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-acm (1.65.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-acmpca (1.65.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-alexaforbusiness (1.68.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplify (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplifybackend (1.30.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplifyuibuilder (1.24.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigateway (1.93.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigatewaymanagementapi (1.42.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigatewayv2 (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appconfig (1.44.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appconfigdata (1.19.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appfabric (1.8.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appflow (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appintegrationsservice (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationautoscaling (1.80.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationcostprofiler (1.21.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationdiscoveryservice (1.62.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationinsights (1.44.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appmesh (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appregistry (1.32.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-apprunner (1.36.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appstream (1.85.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-appsync (1.74.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-arczonalshift (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-artifact (1.0.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-athena (1.81.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-auditmanager (1.42.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-augmentedairuntime (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-autoscaling (1.105.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-autoscalingplans (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-b2bi (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-backup (1.65.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-backupgateway (1.18.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-backupstorage (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-batch (1.83.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-bcmdataexports (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrock (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrockagent (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrockagentruntime (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrockruntime (1.5.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-billingconductor (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-braket (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-budgets (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chatbot (1.1.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chime (1.81.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkidentity (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmediapipelines (1.18.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmeetings (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmessaging (1.28.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkvoice (1.17.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cleanrooms (1.16.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cleanroomsml (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloud9 (1.67.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudcontrolapi (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-clouddirectory (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudformation (1.101.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudfront (1.87.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudfrontkeyvaluestore (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudhsm (1.51.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudhsmv2 (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudsearch (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudsearchdomain (1.40.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudtrail (1.77.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudtraildata (1.10.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatch (1.86.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchevents (1.70.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchevidently (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchlogs (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchrum (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codeartifact (1.38.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codebuild (1.104.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codecatalyst (1.16.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sdk-codecommit (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codedeploy (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codeguruprofiler (1.36.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codegurureviewer (1.45.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codegurusecurity (1.10.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codepipeline (1.69.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestar (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestarconnections (1.41.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestarnotifications (1.32.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitoidentity (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitoidentityprovider (1.88.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitosync (1.48.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-comprehend (1.80.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-comprehendmedical (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-computeoptimizer (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-configservice (1.105.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connect (1.151.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcampaignservice (1.14.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcases (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcontactlens (1.23.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectparticipant (1.41.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectwisdomservice (1.27.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-controltower (1.18.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-core (3.191.3) + aws-sdk-accessanalyzer (1.60.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-account (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-acm (1.80.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-acmpca (1.82.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-amplify (1.73.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-amplifybackend (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-amplifyuibuilder (1.36.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigateway (1.107.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-apigatewaymanagementapi (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigatewayv2 (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-appconfig (1.58.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-appconfigdata (1.31.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-appfabric (1.20.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-appflow (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-appintegrationsservice (1.43.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationautoscaling (1.96.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationcostprofiler (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationdiscoveryservice (1.77.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationinsights (1.57.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationsignals (1.11.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-appmesh (1.72.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-appregistry (1.45.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-apprunner (1.50.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-appstream (1.100.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-appsync (1.89.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-apptest (1.9.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-arczonalshift (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-artifact (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-athena (1.95.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-auditmanager (1.57.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-augmentedairuntime (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-autoscaling (1.121.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-autoscalingplans (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-b2bi (1.20.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-backup (1.80.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-backupgateway (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-batch (1.101.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-bcmdataexports (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-bedrock (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-bedrockagent (1.27.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-bedrockagentruntime (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-bedrockruntime (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-billingconductor (1.33.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-braket (1.46.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-budgets (1.77.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chatbot (1.17.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chime (1.95.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkidentity (1.36.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmediapipelines (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmeetings (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmessaging (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkvoice (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cleanrooms (1.33.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cleanroomsml (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloud9 (1.80.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudcontrolapi (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-clouddirectory (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudformation (1.120.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudfront (1.102.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudfrontkeyvaluestore (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudhsm (1.64.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudhsmv2 (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudsearch (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudsearchdomain (1.53.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudtrail (1.92.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudtraildata (1.22.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatch (1.103.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchevents (1.83.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchevidently (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchlogs (1.96.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchrum (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-codeartifact (1.53.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codebuild (1.132.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codecatalyst (1.29.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-codecommit (1.78.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codeconnections (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codedeploy (1.78.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codeguruprofiler (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-codegurureviewer (1.58.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codegurusecurity (1.23.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-codepipeline (1.85.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codestarconnections (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-codestarnotifications (1.45.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitoidentity (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitoidentityprovider (1.107.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitosync (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-comprehend (1.93.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-comprehendmedical (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-computeoptimizer (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-configservice (1.120.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-connect (1.179.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectcampaignservice (1.27.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcases (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcontactlens (1.37.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectparticipant (1.55.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectwisdomservice (1.40.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-controlcatalog (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-controltower (1.33.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-core (3.209.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-costandusagereportservice (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-costexplorer (1.96.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-costoptimizationhub (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-customerprofiles (1.41.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-databasemigrationservice (1.92.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-dataexchange (1.46.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-datapipeline (1.48.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-datasync (1.73.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-datazone (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-dax (1.51.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-detective (1.46.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-devicefarm (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-devopsguru (1.40.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-directconnect (1.69.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-directoryservice (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-dlm (1.68.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-docdb (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-docdbelastic (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-drs (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-dynamodb (1.105.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-dynamodbstreams (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ebs (1.38.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ec2 (1.442.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ec2instanceconnect (1.37.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecr (1.69.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecrpublic (1.26.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecs (1.142.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-efs (1.72.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-eks (1.99.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-eksauth (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticache (1.97.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticbeanstalk (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticinference (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticloadbalancing (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticloadbalancingv2 (1.98.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticsearchservice (1.82.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-elastictranscoder (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-emr (1.84.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-emrcontainers (1.30.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-emrserverless (1.19.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-entityresolution (1.6.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-eventbridge (1.57.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-finspace (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-finspacedata (1.31.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-firehose (1.65.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-fis (1.27.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-fms (1.67.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-forecastqueryservice (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-forecastservice (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-frauddetector (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-freetier (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-fsx (1.85.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-gamelift (1.76.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-glacier (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-globalaccelerator (1.56.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-glue (1.168.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-gluedatabrew (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-greengrass (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-greengrassv2 (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-groundstation (1.44.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-guardduty (1.88.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-health (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-healthlake (1.25.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-honeycode (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iam (1.94.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-identitystore (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-imagebuilder (1.58.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-importexport (1.43.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-costandusagereportservice (1.67.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-costexplorer (1.112.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-costoptimizationhub (1.17.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-customerprofiles (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-databasemigrationservice (1.106.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-dataexchange (1.58.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-datapipeline (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-datasync (1.89.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-datazone (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-dax (1.64.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-deadline (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-detective (1.59.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-devicefarm (1.79.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-devopsguru (1.53.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-directconnect (1.83.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-directoryservice (1.77.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-directoryservicedata (1.3.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-dlm (1.81.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-docdb (1.77.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-docdbelastic (1.24.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-drs (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-dynamodb (1.125.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-dynamodbstreams (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ebs (1.52.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ec2 (1.478.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ec2instanceconnect (1.51.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecr (1.87.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecrpublic (1.39.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecs (1.161.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-efs (1.85.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-eks (1.118.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-eksauth (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticache (1.115.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticbeanstalk (1.79.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticinference (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticloadbalancing (1.67.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticloadbalancingv2 (1.117.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticsearchservice (1.95.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-elastictranscoder (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-emr (1.99.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-emrcontainers (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-emrserverless (1.36.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-entityresolution (1.22.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-eventbridge (1.71.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-finspace (1.45.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-finspacedata (1.44.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-firehose (1.82.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-fis (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-fms (1.82.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-forecastqueryservice (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-forecastservice (1.64.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-frauddetector (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-freetier (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-fsx (1.101.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-gamelift (1.92.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-glacier (1.72.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-globalaccelerator (1.70.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-glue (1.198.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-gluedatabrew (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-greengrass (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-greengrassv2 (1.49.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-groundstation (1.59.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-guardduty (1.103.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-health (1.73.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-healthlake (1.39.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iam (1.111.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-identitystore (1.46.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-imagebuilder (1.71.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-importexport (1.55.0) + aws-sdk-core (~> 3, >= 3.207.0) aws-sigv2 (~> 1.0) - aws-sdk-inspector (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-inspector2 (1.26.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-inspectorscan (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-internetmonitor (1.15.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot (1.121.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot1clickdevicesservice (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot1clickprojects (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotanalytics (1.61.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotdataplane (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotdeviceadvisor (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotevents (1.46.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ioteventsdata (1.39.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotfleethub (1.23.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotfleetwise (1.21.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotjobsdataplane (1.48.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotroborunner (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotsecuretunneling (1.33.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotsitewise (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotthingsgraph (1.36.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iottwinmaker (1.21.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotwireless (1.43.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ivs (1.45.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ivschat (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ivsrealtime (1.16.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafka (1.69.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafkaconnect (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kendra (1.77.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kendraranking (1.11.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-keyspaces (1.18.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesis (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisanalytics (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisanalyticsv2 (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideo (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideoarchivedmedia (1.57.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideomedia (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideosignalingchannels (1.31.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideowebrtcstorage (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-kms (1.77.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lakeformation (1.47.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lambda (1.117.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lambdapreview (1.43.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-launchwizard (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lex (1.57.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexmodelbuildingservice (1.69.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexmodelsv2 (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexruntimev2 (1.30.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanager (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanagerlinuxsubscriptions (1.11.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanagerusersubscriptions (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lightsail (1.88.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-locationservice (1.47.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutequipment (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutforvision (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutmetrics (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-machinelearning (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-macie2 (1.66.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mainframemodernization (1.15.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedblockchain (1.49.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedblockchainquery (1.8.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedgrafana (1.26.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplaceagreement (1.1.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacecatalog (1.40.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacecommerceanalytics (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacedeployment (1.1.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplaceentitlementservice (1.48.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacemetering (1.56.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediaconnect (1.58.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediaconvert (1.125.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-medialive (1.116.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackage (1.70.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackagev2 (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackagevod (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediastore (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediastoredata (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediatailor (1.76.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-medicalimaging (1.6.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-memorydb (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mgn (1.30.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhub (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubconfig (1.33.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhuborchestrator (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubrefactorspaces (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubstrategyrecommendations (1.20.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mobile (1.47.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mq (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mturk (1.52.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-mwaa (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptune (1.62.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptunedata (1.8.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptunegraph (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-networkfirewall (1.40.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-networkmanager (1.41.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-networkmonitor (1.1.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-nimblestudio (1.28.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-oam (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-omics (1.23.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-opensearchserverless (1.15.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-opensearchservice (1.38.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-opsworks (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-opsworkscm (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-organizations (1.87.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-osis (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-outposts (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-panorama (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-paymentcryptography (1.11.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-paymentcryptographydata (1.10.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pcaconnectorad (1.4.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalize (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalizeevents (1.41.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalizeruntime (1.47.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pi (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpoint (1.86.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointemail (1.47.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointsmsvoice (1.44.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointsmsvoicev2 (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pipes (1.15.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-polly (1.82.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-pricing (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-privatenetworks (1.14.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-prometheusservice (1.30.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-proton (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-qbusiness (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-qconnect (1.5.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-qldb (1.38.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-qldbsession (1.34.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-quicksight (1.105.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ram (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-rds (1.221.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-rdsdataservice (1.51.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-recyclebin (1.19.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshift (1.110.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshiftdataapiservice (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshiftserverless (1.25.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-rekognition (1.93.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-repostspace (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-resiliencehub (1.25.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourceexplorer2 (1.16.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourcegroups (1.58.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourcegroupstaggingapi (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-resources (3.187.0) + aws-sdk-inspector (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-inspector2 (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-inspectorscan (1.15.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-internetmonitor (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iot (1.135.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iot1clickdevicesservice (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot1clickprojects (1.62.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotanalytics (1.74.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotdataplane (1.67.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotdeviceadvisor (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotevents (1.59.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ioteventsdata (1.52.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotfleethub (1.37.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotfleetwise (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotjobsdataplane (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotsecuretunneling (1.46.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotsitewise (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotthingsgraph (1.49.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-iottwinmaker (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotwireless (1.59.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivs (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivschat (1.36.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivsrealtime (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-kafka (1.84.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kafkaconnect (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-kendra (1.91.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kendraranking (1.24.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-keyspaces (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesis (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisanalytics (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisanalyticsv2 (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideo (1.73.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideoarchivedmedia (1.70.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideomedia (1.62.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideosignalingchannels (1.44.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideowebrtcstorage (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-kms (1.94.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lakeformation (1.62.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lambda (1.136.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-launchwizard (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-lex (1.71.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexmodelbuildingservice (1.82.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexmodelsv2 (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexruntimev2 (1.44.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-licensemanager (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-licensemanagerlinuxsubscriptions (1.24.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-licensemanagerusersubscriptions (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-lightsail (1.102.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-locationservice (1.61.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-lookoutequipment (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lookoutforvision (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-lookoutmetrics (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-machinelearning (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-macie2 (1.79.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mailmanager (1.12.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mainframemodernization (1.28.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedblockchain (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-managedblockchainquery (1.22.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedgrafana (1.39.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplaceagreement (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplacecatalog (1.53.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacecommerceanalytics (1.67.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacedeployment (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplaceentitlementservice (1.62.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacemetering (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediaconnect (1.71.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediaconvert (1.142.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-medialive (1.136.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediapackage (1.82.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackagev2 (1.28.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackagevod (1.64.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediastore (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediastoredata (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediatailor (1.90.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-medicalimaging (1.21.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-memorydb (1.37.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mgn (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhub (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-migrationhubconfig (1.46.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-migrationhuborchestrator (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubrefactorspaces (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubstrategyrecommendations (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-mq (1.72.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mturk (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-mwaa (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-neptune (1.76.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-neptunedata (1.20.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-neptunegraph (1.21.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkfirewall (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkmanager (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkmonitor (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-nimblestudio (1.40.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-oam (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-omics (1.38.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-opensearchserverless (1.28.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-opensearchservice (1.56.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-opsworks (1.67.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-opsworkscm (1.77.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-organizations (1.104.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-osis (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-outposts (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-panorama (1.35.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-paymentcryptography (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-paymentcryptographydata (1.24.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pcaconnectorad (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-pcaconnectorscep (1.10.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pcs (1.7.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-personalize (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-personalizeevents (1.55.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-personalizeruntime (1.62.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pi (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpoint (1.101.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpointemail (1.60.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpointsmsvoice (1.56.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpointsmsvoicev2 (1.27.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pipes (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-polly (1.97.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-pricing (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-privatenetworks (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-prometheusservice (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-proton (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-qapps (1.7.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-qbusiness (1.18.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-qconnect (1.20.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-qldb (1.51.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-qldbsession (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-quicksight (1.130.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ram (1.66.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-rds (1.251.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-rdsdataservice (1.64.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-recyclebin (1.32.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-redshift (1.125.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-redshiftdataapiservice (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-redshiftserverless (1.39.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-rekognition (1.108.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-repostspace (1.14.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-resiliencehub (1.39.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-resourceexplorer2 (1.28.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-resourcegroups (1.73.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-resourcegroupstaggingapi (1.72.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-resources (3.207.0) aws-sdk-accessanalyzer (~> 1) aws-sdk-account (~> 1) aws-sdk-acm (~> 1) aws-sdk-acmpca (~> 1) - aws-sdk-alexaforbusiness (~> 1) aws-sdk-amplify (~> 1) aws-sdk-amplifybackend (~> 1) aws-sdk-amplifyuibuilder (~> 1) @@ -1050,11 +1057,13 @@ GEM aws-sdk-applicationcostprofiler (~> 1) aws-sdk-applicationdiscoveryservice (~> 1) aws-sdk-applicationinsights (~> 1) + aws-sdk-applicationsignals (~> 1) aws-sdk-appmesh (~> 1) aws-sdk-appregistry (~> 1) aws-sdk-apprunner (~> 1) aws-sdk-appstream (~> 1) aws-sdk-appsync (~> 1) + aws-sdk-apptest (~> 1) aws-sdk-arczonalshift (~> 1) aws-sdk-artifact (~> 1) aws-sdk-athena (~> 1) @@ -1065,7 +1074,6 @@ GEM aws-sdk-b2bi (~> 1) aws-sdk-backup (~> 1) aws-sdk-backupgateway (~> 1) - aws-sdk-backupstorage (~> 1) aws-sdk-batch (~> 1) aws-sdk-bcmdataexports (~> 1) aws-sdk-bedrock (~> 1) @@ -1105,12 +1113,12 @@ GEM aws-sdk-codebuild (~> 1) aws-sdk-codecatalyst (~> 1) aws-sdk-codecommit (~> 1) + aws-sdk-codeconnections (~> 1) aws-sdk-codedeploy (~> 1) aws-sdk-codeguruprofiler (~> 1) aws-sdk-codegurureviewer (~> 1) aws-sdk-codegurusecurity (~> 1) aws-sdk-codepipeline (~> 1) - aws-sdk-codestar (~> 1) aws-sdk-codestarconnections (~> 1) aws-sdk-codestarnotifications (~> 1) aws-sdk-cognitoidentity (~> 1) @@ -1126,6 +1134,7 @@ GEM aws-sdk-connectcontactlens (~> 1) aws-sdk-connectparticipant (~> 1) aws-sdk-connectwisdomservice (~> 1) + aws-sdk-controlcatalog (~> 1) aws-sdk-controltower (~> 1) aws-sdk-costandusagereportservice (~> 1) aws-sdk-costexplorer (~> 1) @@ -1137,11 +1146,13 @@ GEM aws-sdk-datasync (~> 1) aws-sdk-datazone (~> 1) aws-sdk-dax (~> 1) + aws-sdk-deadline (~> 1) aws-sdk-detective (~> 1) aws-sdk-devicefarm (~> 1) aws-sdk-devopsguru (~> 1) aws-sdk-directconnect (~> 1) aws-sdk-directoryservice (~> 1) + aws-sdk-directoryservicedata (~> 1) aws-sdk-dlm (~> 1) aws-sdk-docdb (~> 1) aws-sdk-docdbelastic (~> 1) @@ -1190,7 +1201,6 @@ GEM aws-sdk-guardduty (~> 1) aws-sdk-health (~> 1) aws-sdk-healthlake (~> 1) - aws-sdk-honeycode (~> 1) aws-sdk-iam (~> 1) aws-sdk-identitystore (~> 1) aws-sdk-imagebuilder (~> 1) @@ -1210,7 +1220,6 @@ GEM aws-sdk-iotfleethub (~> 1) aws-sdk-iotfleetwise (~> 1) aws-sdk-iotjobsdataplane (~> 1) - aws-sdk-iotroborunner (~> 1) aws-sdk-iotsecuretunneling (~> 1) aws-sdk-iotsitewise (~> 1) aws-sdk-iotthingsgraph (~> 1) @@ -1235,7 +1244,6 @@ GEM aws-sdk-kms (~> 1) aws-sdk-lakeformation (~> 1) aws-sdk-lambda (~> 1) - aws-sdk-lambdapreview (~> 1) aws-sdk-launchwizard (~> 1) aws-sdk-lex (~> 1) aws-sdk-lexmodelbuildingservice (~> 1) @@ -1251,6 +1259,7 @@ GEM aws-sdk-lookoutmetrics (~> 1) aws-sdk-machinelearning (~> 1) aws-sdk-macie2 (~> 1) + aws-sdk-mailmanager (~> 1) aws-sdk-mainframemodernization (~> 1) aws-sdk-managedblockchain (~> 1) aws-sdk-managedblockchainquery (~> 1) @@ -1278,7 +1287,6 @@ GEM aws-sdk-migrationhuborchestrator (~> 1) aws-sdk-migrationhubrefactorspaces (~> 1) aws-sdk-migrationhubstrategyrecommendations (~> 1) - aws-sdk-mobile (~> 1) aws-sdk-mq (~> 1) aws-sdk-mturk (~> 1) aws-sdk-mwaa (~> 1) @@ -1302,6 +1310,8 @@ GEM aws-sdk-paymentcryptography (~> 1) aws-sdk-paymentcryptographydata (~> 1) aws-sdk-pcaconnectorad (~> 1) + aws-sdk-pcaconnectorscep (~> 1) + aws-sdk-pcs (~> 1) aws-sdk-personalize (~> 1) aws-sdk-personalizeevents (~> 1) aws-sdk-personalizeruntime (~> 1) @@ -1316,6 +1326,7 @@ GEM aws-sdk-privatenetworks (~> 1) aws-sdk-prometheusservice (~> 1) aws-sdk-proton (~> 1) + aws-sdk-qapps (~> 1) aws-sdk-qbusiness (~> 1) aws-sdk-qconnect (~> 1) aws-sdk-qldb (~> 1) @@ -1338,6 +1349,7 @@ GEM aws-sdk-rolesanywhere (~> 1) aws-sdk-route53 (~> 1) aws-sdk-route53domains (~> 1) + aws-sdk-route53profiles (~> 1) aws-sdk-route53recoverycluster (~> 1) aws-sdk-route53recoverycontrolconfig (~> 1) aws-sdk-route53recoveryreadiness (~> 1) @@ -1375,6 +1387,7 @@ GEM aws-sdk-ssm (~> 1) aws-sdk-ssmcontacts (~> 1) aws-sdk-ssmincidents (~> 1) + aws-sdk-ssmquicksetup (~> 1) aws-sdk-ssmsap (~> 1) aws-sdk-ssoadmin (~> 1) aws-sdk-states (~> 1) @@ -1384,7 +1397,9 @@ GEM aws-sdk-supportapp (~> 1) aws-sdk-swf (~> 1) aws-sdk-synthetics (~> 1) + aws-sdk-taxsettings (~> 1) aws-sdk-textract (~> 1) + aws-sdk-timestreaminfluxdb (~> 1) aws-sdk-timestreamquery (~> 1) aws-sdk-timestreamwrite (~> 1) aws-sdk-tnb (~> 1) @@ -1401,253 +1416,260 @@ GEM aws-sdk-wafv2 (~> 1) aws-sdk-wellarchitected (~> 1) aws-sdk-workdocs (~> 1) - aws-sdk-worklink (~> 1) aws-sdk-workmail (~> 1) aws-sdk-workmailmessageflow (~> 1) aws-sdk-workspaces (~> 1) aws-sdk-workspacesthinclient (~> 1) aws-sdk-workspacesweb (~> 1) aws-sdk-xray (~> 1) - aws-sdk-robomaker (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-rolesanywhere (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53 (1.87.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53domains (1.56.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoverycluster (1.24.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoverycontrolconfig (1.24.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoveryreadiness (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53resolver (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.144.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sdk-robomaker (1.76.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-rolesanywhere (1.29.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53 (1.102.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53domains (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53profiles (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoverycluster (1.37.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53recoverycontrolconfig (1.36.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoveryreadiness (1.34.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53resolver (1.70.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.166.0) + aws-sdk-core (~> 3, >= 3.207.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sdk-s3control (1.78.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sdk-s3outposts (1.28.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemaker (1.232.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakeredgemanager (1.24.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakerfeaturestoreruntime (1.29.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakergeospatial (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakermetrics (1.12.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakerruntime (1.61.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-savingsplans (1.38.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-scheduler (1.13.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-schemas (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-secretsmanager (1.90.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-securityhub (1.101.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-securitylake (1.17.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-serverlessapplicationrepository (1.56.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicecatalog (1.92.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicediscovery (1.62.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicequotas (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ses (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sesv2 (1.45.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-shield (1.61.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-signer (1.51.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-simpledb (1.43.0) - aws-sdk-core (~> 3, >= 3.191.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3control (1.94.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3outposts (1.41.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemaker (1.267.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakeredgemanager (1.37.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakerfeaturestoreruntime (1.42.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakergeospatial (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemakermetrics (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakerruntime (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-savingsplans (1.52.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-scheduler (1.25.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-schemas (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-secretsmanager (1.108.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-securityhub (1.121.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-securitylake (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-serverlessapplicationrepository (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-servicecatalog (1.105.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-servicediscovery (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-servicequotas (1.48.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ses (1.75.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sesv2 (1.63.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-shield (1.74.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-signer (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-simpledb (1.57.0) + aws-sdk-core (~> 3, >= 3.207.0) aws-sigv2 (~> 1.0) - aws-sdk-simspaceweaver (1.14.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sms (1.53.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-snowball (1.66.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-snowdevicemanagement (1.19.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sns (1.72.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-sqs (1.70.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssm (1.166.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmcontacts (1.27.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmincidents (1.33.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmsap (1.16.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssoadmin (1.35.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-states (1.64.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-storagegateway (1.82.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-supplychain (1.1.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-support (1.55.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-supportapp (1.14.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-swf (1.50.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-synthetics (1.40.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-textract (1.56.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-timestreamquery (1.28.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-timestreamwrite (1.28.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-tnb (1.11.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-transcribeservice (1.95.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-transcribestreamingservice (1.57.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-transfer (1.89.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-translate (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-trustedadvisor (1.3.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-verifiedpermissions (1.17.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-voiceid (1.22.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-vpclattice (1.11.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-waf (1.59.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-wafregional (1.60.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-wafv2 (1.78.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-wellarchitected (1.33.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workdocs (1.54.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-worklink (1.45.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workmail (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workmailmessageflow (1.33.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workspaces (1.100.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workspacesthinclient (1.2.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-workspacesweb (1.18.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-xray (1.63.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) + aws-sdk-simspaceweaver (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-sms (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-snowball (1.79.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-snowdevicemanagement (1.31.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-sns (1.88.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-sqs (1.86.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssm (1.182.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmcontacts (1.40.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmincidents (1.45.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssmquicksetup (1.6.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmsap (1.30.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssoadmin (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-states (1.80.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-storagegateway (1.98.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-supplychain (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-support (1.70.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-supportapp (1.26.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-swf (1.65.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-synthetics (1.54.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-taxsettings (1.11.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-textract (1.69.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-timestreaminfluxdb (1.13.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-timestreamquery (1.44.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-timestreamwrite (1.40.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-tnb (1.24.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-transcribeservice (1.109.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-transcribestreamingservice (1.70.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-transfer (1.104.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-translate (1.76.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-trustedadvisor (1.16.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-verifiedpermissions (1.35.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-voiceid (1.35.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-vpclattice (1.23.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.1) + aws-sdk-waf (1.72.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-wafregional (1.74.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-wafv2 (1.95.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-wellarchitected (1.47.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workdocs (1.68.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workmail (1.76.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workmailmessageflow (1.46.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspaces (1.120.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspacesthinclient (1.17.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspacesweb (1.33.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) + aws-sdk-xray (1.76.0) + aws-sdk-core (~> 3, >= 3.207.0) + aws-sigv4 (~> 1.5) aws-sigv2 (1.2.0) - aws-sigv4 (1.8.0) + aws-sigv4 (1.10.0) aws-eventstream (~> 1, >= 1.0.2) - backports (3.25.0) base64 (0.2.0) bcrypt (3.1.20) - bigdecimal (3.1.6) + bigdecimal (3.1.8) binding_of_caller (1.0.1) debug_inspector (>= 1.2.0) - breakpoint (2.4.6) - sass (~> 3.3.0) + breakpoint (2.7.1) + sass (~> 3.3) sassy-maps (< 1.0.0) - builder (3.2.4) - cabin (0.9.0) + builder (3.3.0) character_set (1.8.0) - client_side_validations (22.1.1) + client_side_validations (22.2.0) js_regex (~> 3.7) - rails (>= 6.1, < 7.2) + rails (>= 6.1, < 8.0) coderay (1.1.3) coffee-rails (5.0.0) coffee-script (>= 2.2.0) @@ -1656,73 +1678,92 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.2.3) + concurrent-ruby (1.3.4) connection_pool (2.4.1) crack (1.0.0) bigdecimal rexml cranky (1.1.0) crass (1.0.6) - cssbundling-rails (1.4.0) + cssbundling-rails (1.4.1) railties (>= 6.0.0) + csv (3.3.0) daemons (1.4.1) database_cleaner (2.0.2) database_cleaner-active_record (>= 2, < 3) - database_cleaner-active_record (2.1.0) + database_cleaner-active_record (2.2.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) date (3.3.4) debug_inspector (1.2.0) declarative (0.0.20) - delayed_job (4.1.11) + delayed_job (4.1.12) activesupport (>= 3.0, < 8.0) - delayed_job_active_record (4.1.8) + delayed_job_active_record (4.1.10) activerecord (>= 3.0, < 8.0) delayed_job (>= 3.0, < 5) - devise (4.8.1) + devise (4.9.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - docile (1.4.0) - elasticsearch (6.8.0) - elasticsearch-api (= 6.8.0) - elasticsearch-transport (= 6.8.0) - elasticsearch-api (6.8.0) + diff-lcs (1.5.1) + docile (1.4.1) + drb (2.2.1) + elasticsearch (7.10.0) + elasticsearch-api (= 7.10.0) + elasticsearch-transport (= 7.10.0) + elasticsearch-api (7.10.0) multi_json - elasticsearch-transport (6.8.0) - faraday + elasticsearch-transport (7.10.0) + faraday (~> 1) multi_json email_validator (2.2.4) activemodel - erubi (1.12.0) - ethon (0.16.0) - ffi (>= 1.15.0) + erubi (1.13.0) execjs (2.9.1) - faker (3.2.3) + factory_bot (6.5.0) + activesupport (>= 5.0.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faker (3.4.2) i18n (>= 1.8.11, < 2) - faraday (0.17.6) - multipart-post (>= 1.2, < 3) - faraday_middleware (0.14.0) - faraday (>= 0.7.4, < 1.0) - ffi (1.16.3) + faraday (1.10.4) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + ffi (1.17.0-aarch64-linux-gnu) + ffi (1.17.0-x86_64-darwin) figaro (1.2.0) thor (>= 0.14.0, < 2) font-awesome-rails (4.7.0.8) railties (>= 3.2, < 8.0) - formtastic (4.0.0) - actionpack (>= 5.2.0) + formtastic (5.0.0) + actionpack (>= 6.0.0) formtastic_i18n (0.7.0) gems (1.2.0) - gh (0.14.0) - addressable - backports - faraday (~> 0.8) - multi_json (~> 1.0) - net-http-persistent (>= 2.7) - net-http-pipeline globalid (1.2.1) activesupport (>= 6.1) google-api-client (0.53.0) @@ -1763,13 +1804,13 @@ GEM has_scope (0.8.2) actionpack (>= 5.2) activesupport (>= 5.2) - hashdiff (1.1.0) - highline (1.7.10) - httparty (0.21.0) + hashdiff (1.1.1) + httparty (0.22.0) + csv mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) httpclient (2.8.3) - i18n (1.14.4) + i18n (1.14.6) concurrent-ruby (~> 1.0) importmap-rails (2.0.1) actionpack (>= 6.0.0) @@ -1781,6 +1822,10 @@ GEM railties (>= 6.0) responders (>= 2) interception (0.5) + io-console (0.7.2) + irb (1.14.1) + rdoc (>= 4.0.0) + reline (>= 0.4.2) jmespath (1.6.2) jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) @@ -1790,12 +1835,12 @@ GEM character_set (~> 1.4) regexp_parser (>= 2.6.2, < 3.0.0) regexp_property_values (~> 1.0) - jsbundling-rails (1.3.0) + jsbundling-rails (1.3.1) railties (>= 6.0.0) - json (2.7.1) + json (2.7.2) jsonapi-serializer (2.2.0) activesupport (>= 4.2) - jwt (2.8.1) + jwt (2.9.1) base64 kaminari (1.2.2) activesupport (>= 4.1.0) @@ -1810,10 +1855,10 @@ GEM kaminari-core (= 1.2.2) kaminari-core (1.2.2) language_server-protocol (3.17.0.3) - launchy (2.5.2) - addressable (~> 2.8) - libv8-node (16.19.0.1) - lograge (0.11.2) + libv8-node (18.19.0.0-aarch64-linux) + libv8-node (18.19.0.0-x86_64-darwin) + logger (1.6.1) + lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) railties (>= 4) @@ -1829,53 +1874,58 @@ GEM net-smtp marcel (1.0.4) memoist (0.16.2) - method_source (1.0.0) + method_source (1.1.0) mini_mime (1.1.5) - mini_portile2 (2.8.7) - mini_racer (0.6.4) - libv8-node (~> 16.19.0.0) - minitest (5.14.4) + mini_racer (0.16.0) + libv8-node (~> 18.19.0.0) + minitest (5.25.1) + minitest-reporters (1.7.1) + ansi + builder + minitest (>= 5.0) + ruby-progressbar minitest-stub_any_instance (1.0.3) + mocha (2.4.5) + ruby2_keywords (>= 0.0.5) multi_json (1.15.0) - multi_xml (0.6.0) - multipart-post (2.4.0) - net-http-persistent (4.0.2) - connection_pool (~> 2.2) - net-http-pipeline (1.0.1) - net-imap (0.4.10) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + multipart-post (2.4.1) + mutex_m (0.2.0) + net-imap (0.4.16) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0.1) + net-smtp (0.5.0) net-protocol - nio4r (2.7.0) - nokogiri (1.15.6) - mini_portile2 (~> 2.8.2) + nio4r (2.7.3) + nokogiri (1.16.7-aarch64-linux) + racc (~> 1.4) + nokogiri (1.16.7-x86_64-darwin) racc (~> 1.4) - oj (3.16.3) - bigdecimal (>= 3.0) open_uri_redirections (0.2.1) orm_adapter (0.5.0) os (1.1.4) - paper_trail (11.1.0) - activerecord (>= 5.2) - request_store (~> 1.1) - parallel (1.24.0) - parser (3.3.0.5) + ostruct (0.6.0) + paper_trail (15.2.0) + activerecord (>= 6.1) + request_store (~> 1.4) + parallel (1.26.3) + parser (3.3.5.0) ast (~> 2.4.1) racc - pg (1.5.6) + pg (1.5.8) power_assert (2.0.3) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) pry-nav (1.0.0) pry (>= 0.9.10, < 0.15) - pry-rails (0.3.9) - pry (>= 0.10.4) + pry-rails (0.3.11) + pry (>= 0.13.0) pry-remote (0.1.8) pry (~> 0.9) slop (~> 3.0) @@ -1885,32 +1935,36 @@ GEM pry-stack_explorer (0.6.1) binding_of_caller (~> 1.0) pry (~> 0.13) - public_suffix (5.0.4) - puma (5.6.8) + psych (5.1.2) + stringio + public_suffix (6.0.1) + puma (6.4.3) nio4r (~> 2.0) - pusher-client (0.6.2) - json - websocket (~> 1.0) - racc (1.7.3) - rack (2.2.8.1) + racc (1.8.1) + rack (3.1.7) rack-cors (2.0.2) rack (>= 2.0.0) + rack-session (2.0.0) + rack (>= 3.0.0) rack-test (2.1.0) rack (>= 1.3) - rails (7.0.2.2) - actioncable (= 7.0.2.2) - actionmailbox (= 7.0.2.2) - actionmailer (= 7.0.2.2) - actionpack (= 7.0.2.2) - actiontext (= 7.0.2.2) - actionview (= 7.0.2.2) - activejob (= 7.0.2.2) - activemodel (= 7.0.2.2) - activerecord (= 7.0.2.2) - activestorage (= 7.0.2.2) - activesupport (= 7.0.2.2) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) + rails (7.2.1) + actioncable (= 7.2.1) + actionmailbox (= 7.2.1) + actionmailer (= 7.2.1) + actionpack (= 7.2.1) + actiontext (= 7.2.1) + actionview (= 7.2.1) + activejob (= 7.2.1) + activemodel (= 7.2.1) + activerecord (= 7.2.1) + activestorage (= 7.2.1) + activesupport (= 7.2.1) bundler (>= 1.15.0) - railties (= 7.0.2.2) + railties (= 7.2.1) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -1922,59 +1976,88 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.0.2.2) - actionpack (= 7.0.2.2) - activesupport (= 7.0.2.2) - method_source + rails-perftest (0.0.7) + railties (7.2.1) + actionpack (= 7.2.1) + activesupport (= 7.2.1) + irb (~> 1.13) + rackup (>= 1.0.0) rake (>= 12.2) - thor (~> 1.0) - zeitwerk (~> 2.5) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.1.0) - ransack (3.2.1) + rake (13.2.1) + ransack (4.2.1) activerecord (>= 6.1.5) activesupport (>= 6.1.5) i18n - react_on_rails (13.4.0) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rdoc (6.7.0) + psych (>= 4.0.0) + react_on_rails (14.0.5) addressable connection_pool execjs (~> 2.5) rails (>= 5.2) rainbow (~> 3.0) redcarpet (3.6.0) - regexp_parser (2.9.0) - regexp_property_values (1.5.1) + regexp_parser (2.9.2) + regexp_property_values (1.5.2) + reline (0.5.10) + 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.6.0) + request_store (1.7.0) rack (>= 1.4) require_all (3.0.0) responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) retriable (3.1.2) - rexml (3.2.6) - rubocop (1.62.1) + rexml (3.3.8) + rspec-core (3.13.1) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-rails (7.0.1) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) + rspec-support (3.13.1) + rubocop (1.66.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.31.1, < 2.0) + regexp_parser (>= 2.4, < 3.0) + rubocop-ast (>= 1.32.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.31.2) - parser (>= 3.3.0.4) - rubocop-performance (1.20.2) + rubocop-ast (1.32.3) + parser (>= 3.3.1.0) + rubocop-performance (1.22.1) rubocop (>= 1.48.1, < 2.0) - rubocop-ast (>= 1.30.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) - sass (3.3.14) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) sass-rails (6.0.0) sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) @@ -1987,165 +2070,165 @@ GEM tilt sassy-maps (0.4.0) sass (~> 3.3) + securerandom (0.3.1) signet (0.19.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simplecov (0.17.1) + simplecov (0.22.0) docile (~> 1.1) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - simplecov-html (0.10.2) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.13.1) + simplecov_json_formatter (0.1.4) slop (3.6.0) + spring (4.2.1) + spring-commands-rspec (1.0.4) + spring (>= 0.9.1) sprockets (4.2.1) concurrent-ruby (~> 1.0) rack (>= 2.2.4, < 4) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) - stimulus-rails (1.3.3) + stimulus-rails (1.3.4) railties (>= 6.0.0) + stringio (3.1.1) test-unit (3.6.2) power_assert - thor (1.3.1) + thor (1.3.2) thread_safe (0.3.6) - tilt (2.3.0) + tilt (2.4.0) timeout (0.4.1) trailblazer-option (0.1.2) - travis (1.8.13) - backports - faraday (~> 0.9) - faraday_middleware (~> 0.9, >= 0.9.1) - gh (~> 0.13) - highline (~> 1.6) - launchy (~> 2.1) - pusher-client (~> 0.4) - typhoeus (~> 0.6, >= 0.6.8) - turbo-rails (2.0.5) + turbo-rails (2.0.10) actionpack (>= 6.0.0) - activejob (>= 6.0.0) railties (>= 6.0.0) turbolinks (5.2.1) turbolinks-source (~> 5.2) turbolinks-source (5.2.0) - typhoeus (0.8.0) - ethon (>= 0.8.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - uglifier (4.2.0) + uglifier (4.2.1) execjs (>= 0.3.0, < 3) - unicode-display_width (2.5.0) + unicode-display_width (2.6.0) + useragent (0.16.10) warden (1.2.9) rack (>= 2.0.9) - webmock (3.23.0) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - websocket (1.2.10) + webrick (1.8.2) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - will_paginate (3.3.1) + will_paginate (4.0.1) xdan-datetimepicker-rails (2.5.4) jquery-rails rails (>= 3.2.16) yaml_db (0.7.0) rails (>= 3.0) rake (>= 0.8.7) - zeitwerk (2.6.13) + zeitwerk (2.6.18) PLATFORMS - ruby + aarch64-linux-gnu + x86_64-darwin-23 DEPENDENCIES - actioncable (= 7.0.2.2) - actionmailer (= 7.0.2.2) - actionpack (= 7.0.2.2) - actionview (= 7.0.2.2) + actioncable (~> 7.2) + actionmailer (~> 7.2) + actionpack (~> 7.2) + actionview (~> 7.2) active_model_serializers (~> 0.8.1) - activeadmin (~> 2.14) - activeadmin_addons (~> 1.9) - activeadmin_reorderable - activejob (= 7.0.2.2) - activemodel (= 7.0.2.2) - activerecord (= 7.0.2.2) - activestorage (= 7.0.2.2) - activesupport (= 7.0.2.2) - acts_as_list - addressable - auto-session-timeout - auto_increment (~> 1.5, >= 1.5.2) - aws-sdk (~> 3) - bcrypt - breakpoint (~> 2.4.0) - client_side_validations (= 22.1.1) - coffee-rails - cranky - cssbundling-rails - daemons - database_cleaner - delayed_job - delayed_job_active_record - devise (= 4.8.1) - elasticsearch (= 6.8) - email_validator - execjs - faker - figaro - font-awesome-rails - google-api-client - google_drive - httparty - importmap-rails - jquery-rails (~> 4.2) - jsbundling-rails - json - jsonapi-serializer - lograge (~> 0.11.2) - logstash-event! - luhn - mini_racer - minitest (~> 5.14.2) - minitest-stub_any_instance - nokogiri (= 1.15.6) - open_uri_redirections - paper_trail (~> 11.1) - pg (~> 1.2) - pry (>= 0.10.0) - pry-nav (>= 0.2.4) - pry-rails - pry-remote - pry-rescue - pry-stack_explorer - puma (~> 5.5) - rack (~> 2.2.4) - rack-cors - rails (= 7.0.2.2) - rails-controller-testing - railties (~> 7.0.2.2) - react_on_rails (= 13.4) - rexml (~> 3.2.5) - rubocop (~> 1.48) - rubocop-performance (~> 1.16) - sass-rails - simplecov (~> 0.17.1) - sprockets-rails - stimulus-rails - test-unit - thread_safe (~> 0.3.6) - travis - turbo-rails - turbolinks (~> 5.2.0) - uglifier (>= 1.0.3) - webmock - will_paginate (~> 3.0) - yaml_db - -RUBY VERSION - ruby 2.7.4p191 + activeadmin (~> 3.2) + activeadmin_addons (~> 1.10) + activeadmin_reorderable (~> 0.3) + activejob (~> 7.2) + activemodel (~> 7.2) + activerecord (~> 7.2) + activestorage (~> 7.2) + activesupport (~> 7.2) + acts_as_list (~> 1.2) + addressable (~> 2.8) + auto-session-timeout (~> 1.2) + auto_increment (~> 1.6) + aws-sdk (~> 3.2) + bcrypt (~> 3.1) + breakpoint (~> 2.7) + client_side_validations (~> 22.2) + coffee-rails (~> 5.0) + cranky (~> 1.1) + cssbundling-rails (~> 1.4) + daemons (~> 1.4) + database_cleaner (~> 2.0) + delayed_job (~> 4.1) + delayed_job_active_record (~> 4.1) + devise (~> 4.9) + elasticsearch (= 7.10) + email_validator (~> 2.2) + execjs (~> 2.9) + factory_bot_rails (~> 6.4) + faker (~> 3.4) + figaro (~> 1.2) + font-awesome-rails (~> 4.7) + google-api-client (~> 0.53) + google_drive (~> 3.0) + httparty (~> 0.22) + importmap-rails (~> 2.0) + jquery-rails (~> 4.6) + jsbundling-rails (~> 1.3) + json (~> 2.7) + jsonapi-serializer (~> 2.2) + lograge (~> 0.14) + luhn (~> 1.0) + mini_racer (~> 0.16) + minitest (~> 5.25) + minitest-reporters (~> 1.7) + minitest-stub_any_instance (~> 1.0) + mocha (~> 2.4) + mutex_m (~> 0.2) + nokogiri (~> 1.16) + open_uri_redirections (~> 0.2) + ostruct (~> 0.6) + paper_trail (~> 15.2) + pg (~> 1.5) + pry (~> 0.14) + pry-nav (~> 1.0) + pry-rails (~> 0.3) + pry-remote (~> 0.1) + pry-rescue (~> 1.6) + pry-stack_explorer (~> 0.6) + puma (~> 6.4) + rack (~> 3.1) + rack-cors (~> 2.0) + rails (~> 7.2) + rails-controller-testing (~> 1.0) + rails-perftest (~> 0.0) + railties (~> 7.2) + react_on_rails (~> 14.0) + rexml (~> 3.3) + rspec-rails (~> 7.0) + rubocop (~> 1.66) + rubocop-performance (~> 1.22) + sass-rails (~> 6.0) + simplecov (~> 0.22) + spring (~> 4.2) + spring-commands-rspec (~> 1.0) + sprockets-rails (~> 3.5) + stimulus-rails (~> 1.3) + test-unit (~> 3.6) + thread_safe (~> 0.3) + turbo-rails (~> 2.0) + turbolinks (~> 5.2) + uglifier (~> 4.2) + webmock (~> 3.24) + will_paginate (~> 4.0) + yaml_db (~> 0.7) BUNDLED WITH - 2.4.22 + 2.5.20 diff --git a/README.md b/README.md index 4e3ccb653..8719a810c 100644 --- a/README.md +++ b/README.md @@ -6,25 +6,25 @@ My Library NYC Mobile Pilot For a description, check the [wiki](https://confluence.nypl.org/display/WT/My+Library+NYC). -Data -==== +Local Development +================= -To create and seed the database: +To build and run the app locally: +1. `docker-compose build` +2. `docker-compose up` -1. Create postgres db and create `config/database.yml` with your creds. Don't add this file to git. +The app will be available at `http://localhost:3000`. -2. Load schema and data: -``` -rake db:create -rake db:migrate -rake db:seed -``` +Data +==== + +Locally, the development and test Postgres databases should be created and set up automatically. To dump data to seed-data dump file (i.e. for use by other devs): ``` -pg_dump -U_postgres mylibrarynyc -f db/seed-data.sql --data-only --exclude-table="schema_migrations|holds|users" --inserts --column-inserts +pg_dump -U postgres mylibrarynyc -f db/seed-data.sql --data-only --exclude-table="schema_migrations|holds|users" --inserts --column-inserts ``` To Import New NYC Schools: @@ -39,171 +39,39 @@ Assuming your CSV is public data, upload it under root/data/public. Here are th 'PRINCIPAL_PHONE_NUMBER' (ie '212-000-0000') ``` -Run this command from the console locally and on AWS (replace the filename in the command): `rake ingest:import_all_nyc_schools['data/public/2016_-_2017_School_Locations.csv']` +Run this command from the local webapp container or in the ECS webapp container in AWS (replace the filename in the command): `rake ingest:import_all_nyc_schools['data/public/2016_-_2017_School_Locations.csv']` If the school is not found by zcode, the rake task will create a new record. If the school is found by zcode, it will overwrite school's name, address_line_1, state, address_line_2, borough, postal_code, and phone_number with the data in the CSV. -Development Server -================== -The development server currently lives at http://my-library-nyc-app-development.us-east-1.elasticbeanstalk.com/. - -This server uses the 'development' branch from this repository, to share current features that are being developed. - -Setting up the development server (and how to set up other servers, e.g. a staging server): - -1. Create app in AWS Elastic Beanstalk. To do so, run "eb init" in the root directory of your repo. This will prompt a list of questions you need to answer.(if "eb" command is not installed, run "pip install awsebcli") - -2. Next run the following command. Please add the appropriate substitutions where you see [key]. The purpose of this command is to the deploy the environment on Elastic Beanstalk. You will be prompted a list of questions you need to answer. - -``` -eb create [environment_name] --single --instance_profile cloudwatchable-beanstalk --instance_type t2.micro --cname [cname_name] --vpc.ec2subnets subnet-9ef736b3 --vpc.id vpc-dbc4f7bc --profile nypl-sandbox --keyname dgdvteam --tags Project=MyLibraryNyc,Environment=development -``` - -Make sure the following environment variables are set in your EB environment configuration: -BUNDLE_WITHOUT=test:development -LOGGING=debug -RACK_ENV=development -RAILS_ENV=development -RAILS_SKIP_ASSET_COMPILATION=false -RAILS_SKIP_MIGRATIONS=false - - -How to deploy to this server: - -1. Make sure you deploy the development branch. - -``` -eb deploy [branch_name] -``` - -Travis-CI -================== - -Important to note, MyLibraryNYC on the current development is integrated with Travis-CI. - -It means the following: - -When a developer, commits a change on the development branch or merges another branch on to development, it will trigger a deployment with travis. If the build is is successful, Travis will deploy the development code to our development server on AWS Elastic Beanstalk. - -More documentation can be found here: [travis-confluence-page](https://confluence.nypl.org/display/WT/Travis-CI+Integration+with+MyLibraryNYC+to+AWS+Elastic+Beanstalk) - - -Environment Variables -======================== - -Once the application is deployed on AWS Elastic Beanstalk, you need to set environment variables within the environment. - -Specifically, setting the `ENV['DATABASE_URL']` is critical in order for the application to function properly and also to not throw you any errors. - -In order to do so, follow the current steps. - -1. In AWS, go to the Elastic Beanstalk section. -2. Find your application/environment. -3. Click on Configuration and then Software. -4. Scroll down to Environment properties, and please set your variables accordingly. - -Most of the environment variables get set in the .ebextensions files. The .ebextensions files get executed in alphabetic order, -e.g. "00_environment.config" will execute before "01_cloudwatch_agent_config.config". - -Most .ebextensions settings will override whatever you set in the console. The 07_https-nypl-digital-dev.config is an exception. -If you add it after the EB project is set up in AWS, then 07_https-nypl-digital-dev.config will be ignored. - - -Server -======================== -In many rails projects when you run the server with `rails s` Rails sets RAILS_ENV to "development". If you do that with this app, you will connect to the development database on AWS (if you have permission to decrypt the value). Instead, run `RAILS_ENV=local rails s` to start the server and `RAILS_ENV=local rails c` to run the console. - - Testing ======================== -First, set up a test database: -bundle exec rake db:drop RAILS_ENV=test -bundle exec rake db:create RAILS_ENV=test -bundle exec rake db:schema:load RAILS_ENV=test - -For the unit tests and integration tests, please run the following commands while in the root directory. - -``` -ruby -Itest test/unit/user_test.rb -ruby -Itest test/unit/book_test.rb -ruby -Itest test/unit/teacher_set_test.rb -ruby -Itest test/unit/ingest_rake_task_test.rb -ruby -Itest test/integration/user_flow_test.rb -ruby -Itest test/functional/exceptions_controller_test.rb -ruby -Itest test/functional/api/v01/bibs_controller_test.rb -``` - -NOTE: You might want to pre-pend each command with some environment setup, s.a.: -`RAILS_ENV=local bundle exec rake db:schema:load RAILS_ENV=test` -and -`RAILS_ENV=local ruby -Itest test/unit/user_test.rb` +For the unit tests and integration tests, please run the following command inside a webapp container while in the root directory. -Order Multiple Teacher Sets Configuration -======================== ``` -MAXIMUM_COPIES_REQUESTABLE :5 - This is a configuration value in AWS ElasticBeanstalk. In future if anyone want to change the value of maximum teacherset orders, we can update in AWS ElasticBeanstalk Configuration. +RAILS_ENV=test bundle exec rails test ``` Show Maintenance Banner Configuration ======================== -```SHOW_MAINTENANCE_BANNER: TRUE``` -This parameter can be set in the ElasticBeanstalk environment's Software config console area. +```ENV['SHOW_MAINTENANCE_BANNER'] = 'TRUE'``` The parameter should be set to the string `TRUE` to turn on the banner, which is coded in app/views/layouts/angular.html.erb and app/views/layouts/application.html.erb. -```MAINTENANCE_BANNER_TEXT: 'Maintenance banner text'``` +```ENV['MAINTENANCE_BANNER_TEXT'] = 'Maintenance banner text'``` It should be set to the string message that is to appear on the maintenance banner. It will only appear if the `SHOW_MAINTENANCE_BANNER` parameter above is set to `TRUE`. -Configure localhost for sets and info site -========================================== -``` -As of February 2020, the MyLibraryNYC Information site (www.mylibrarynyc.org) has been merged into the Sets application. The Info site was a Rails app, but was created as a lightweight CMS, so the content was stored in the DB in document-oriented models. In merging into the Sets app, we moved away from that model, instead storing the content in regular HTML templates, and having that handled by a single InfoSiteController, as we didn't need the fuller functionality of a CMS. -Additionally, we wanted the two different hostnames to continue working as before — so URLs starting www.mylibrarynyc.org should continue to work as before, as should those starting sets.mylibrarynyc.org. This is achieved by having the routes.rb file check the HOST request header and directing to the appropriate controller accordingly. That further means that to develop both parts of the app, you need to set up special hostnames locally (typically using the /etc/hosts file on Mac OS and other un*x like OSes). Instructions below. -``` - -``` -MacOS X 10.6 through 10.12 -Use the following instructions if you’re running MacOS X 10.6 through 10.12: - -On your computer, select Applications > Utilities > Terminal to open a Terminal window. -Enter the following command in the Terminal window to open the hosts file: - -sudo nano /private/etc/hosts -When you are prompted, enter your domain user password. -Edit the hosts file. - -The file contains comments (lines that begin with the # symbol) and some default host name mappings (for example, 127.0.0.1 – local host). Add below new mappings after the default mappings. - -127.0.0.1 dev-www.mylibrarynyc.local -127.0.0.1 dev-sets.mylibrarynyc.local - -To save the hosts file, press Control+X. -When you are asked if you want to save your changes, enter y. - -``` - -InfoSite code (https://www.mylibrarynyc.org/) into Sets. -======================================================== -``` -Created info-site files in sets code base(https://sets.mylibrarynyc.org/) - -All required javascripts, stylessheets, images files created into sets code -- (assets/javascripts/info-site, assets/stylesheets/info-site, assets/images) - -All required info-site-controllers-views-layouts files created(controllers/info_site_controller.rb, views/info-site/**.html.erb, views/layouts/info-site/**.html.erb) - -``` Rubocop ======================== ``` Running rubocop with no arguments will check all Ruby source files in the current directory: -rubocop +bundle exec rubocop Alternatively you can pass rubocop a list of files and directories to check: -rubocop folder_name/file_name.rb +bundle exec rubocop folder_name/file_name.rb ``` @@ -213,85 +81,45 @@ Emails Emailing notifications out of MyLibraryNYC is done through the AWS Simple Email Service. We turn emails off on the development and local servers by setting config.action_mailer.perform_deliveries = false -in config/environments/development.rb and local.rb +in config/environments/development.rb So if you want to test mailing locally, turn the perform_deliveries back on. ``` -Configure ElasticSearch in local +Setting Up ElasticSearch locally ================================= ``` -MylibraryNyc project using elastic-search-6.8 version. -Download elastic-search-6.8 version based on OS. - -Download elastic-search: -https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-0 - -Go to terminal/commandline -cd elasticsearch-6.8.0 -Command to start elastic search: ./bin/elasticsearch - -Use below command to create a elastic search cluster. -sh script/elastic_search/create_es_index_mappings.sh -Enter elastic search URL (get elastic search url from elasticsearch.yml or MLN confluence page ) -Once ES cluster is created run below method in rails console to update teacherset docs into elastic search cluster. - -def create_teacherset_document_in_es - TeacherSet.find_each do |ts| - arr = [] - created_at = ts.created_at.present? ? ts.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - updated_at = ts.updated_at.present? ? ts.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - availability = ts.availability.present? ? ts.availability.downcase : nil - begin - subjects_arr = [] - if ts.subjects.present? - ts.subjects.uniq.each do |subject| - subjects_hash = {} - s_created_at = subject.created_at.present? ? subject.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - s_updated_at = subject.updated_at.present? ? subject.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - subjects_hash[:id] = subject.id - subjects_hash[:title] = subject.title - subjects_hash[:created_at] = s_created_at - subjects_hash[:updated_at] = s_updated_at - subjects_arr << subjects_hash - end - end - body = {title: ts.title, description: ts.description, contents: ts.contents, - id: ts.id.to_i, details_url: ts.details_url, grade_end: ts.grade_end, - grade_begin: ts.grade_begin, availability: availability, total_copies: ts.total_copies, - call_number: ts.call_number, language: ts.language, physical_description: ts.physical_description, - primary_language: ts.primary_language, created_at: created_at, updated_at: updated_at, - available_copies: ts.available_copies, bnumber: ts.bnumber, set_type: ts.set_type, - area_of_study: ts.area_of_study, subjects: subjects_arr} - ElasticSearch.new.create_document(ts.id, body) - puts "updating elastic search" - rescue Elasticsearch::Transport::Transport::Errors::Conflict => e - puts "Error in elastic search" - arr << ts.id - end - arr - end -end +The MylibraryNyc project uses elastic-search-7.10 -``` +Make sure the elasticsearch container is running. Then, enter into a webapp container. + +Do 'sh script/elastic_search/create_es_index_mappings.sh' + +If that doesn't work, you can try 'sh script.elastic_search/delete_es_mappings.sh' first. + +Enter the local elasticsearch URL (currently http://elasticsearch:9200) +Do `bundle exec rake seeds:teacher_sets` to seed the teacher set data in the development elasticsearch instance. ``` -Commands to copy database from one environmnet to another + + +Commands to copy database from one environment to another ========================================================= -Dump the database which ever your interested in. +``` +Dump the database you're interested in. 'pg_dump' dumps a database as a text file or to other formats. Run database dump commands: Command: pg_dump --host={host_name} --username mylibrarynyc --file file_name.out {database_name} -Before restoring database -1) It is recommended to have a back up by talking snapshots of database. -2) Stop all services wherever database being used. +Before restoring the database +1) It is recommended to have a backup by taking a snapshot of the existing database. +2) Stop all services using the database. -Run below commands in terminal/commandline. +Run the commands below in a terminal or at the command line. psql postgres; DROP database {database_name}; @@ -308,129 +136,4 @@ Command: pg_restore --verbose --host {host_name} --username {user_name} --dbname Example1: pg_restore --verbose --host localhost --dbname qa_new_name1 qa-new_name1.text Example2: psql --host localhost --dbname latest_qa1 -f qa-new_name.out - - -``` - -MylibaryNYC application local setup -=================================== - -``` -Note: Rails, Ruby and Node installation is required to run project in local. - Check Ruby and Rails versions in Gemfile. - - Step1: Rails & Ruby installation: - Install RVM with Rails (stable version): - \curl -sSL https://get.rvm.io | bash -s stable --rails - Install RVM (if not installed with Rails): - \curl -sSL https://get.rvm.io | bash - Install Ruby 2.7.4: - rvm install ruby-2.7.4 - Use Ruby 2.7.4: - rvm use ruby-2.7.4 - Install Rails 7.0.2.2: - gem install rails -v 7.0.2.2 - bundle install - Node Installation: - Install homebrew - brew install nvm - nvm install 16 - After installation please check the versions - Rails version: rails -v - Ruby version: ruby -v - Node version: node -v - - Please check Gemfile for reference - https://github.com/NYPL/MyLibraryNYCApp/blob/development/Gemfile - - Step2: Clone git project https://github.com/NYPL/MyLibraryNYCApp.git - - Step3: Go to project path then run "bundle install" - - Step4: Configure aws credentials on local - Enter a command on terminal: aws configure - (get your aws credentials from devops team and enter on terminal) - - [default] - aws_access_key_id = **** - aws_secret_access_key = **** - - [sandbox-user] - aws_access_key_id = *** - aws_secret_access_key = *** - - [nypl-digital-dev] - aws_access_key_id = *** - aws_secret_access_key = *** - - Step5: Install Postgresql - Postgresql commands to create database on local: - - psql -l - psql -d mylibnyc_local - \c mylibnyc_local; - - Rub below command in project path to create database tables - - RAILS_ENV=local rake db:create - RAILS_ENV=local rake db:schema:load - RAILS_ENV=local rake db:migrate - RAILS_ENV=local rake db:seed - - Step6: Configure elastic search - MylibraryNyc project using elastic-search-6.8 version. - Download elastic-search-6.8 version based on OS. - - Download elastic-search: - https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-0 - - Go to terminal/commandline - cd elasticsearch-6.8.0 - Command to start elastic search: ./bin/elasticsearch - - # Run below method to create a teacher-sets in Elastic Search - def create_teacherset_document_in_es - TeacherSet.find_each do |ts| - arr = [] - created_at = ts.created_at.present? ? ts.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - updated_at = ts.updated_at.present? ? ts.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - availability = ts.availability.present? ? ts.availability.downcase : nil - begin - subjects_arr = [] - if ts.subjects.present? - ts.subjects.uniq.each do |subject| - subjects_hash = {} - s_created_at = subject.created_at.present? ? subject.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - s_updated_at = subject.updated_at.present? ? subject.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil - subjects_hash[:id] = subject.id - subjects_hash[:title] = subject.title - subjects_hash[:created_at] = s_created_at - subjects_hash[:updated_at] = s_updated_at - subjects_arr << subjects_hash - end - end - body = {title: ts.title, description: ts.description, contents: ts.contents, - id: ts.id.to_i, details_url: ts.details_url, grade_end: ts.grade_end, - grade_begin: ts.grade_begin, availability: availability, total_copies: ts.total_copies, - call_number: ts.call_number, language: ts.language, physical_description: ts.physical_description, - primary_language: ts.primary_language, created_at: created_at, updated_at: updated_at, - available_copies: ts.available_copies, bnumber: ts.bnumber, set_type: ts.set_type, - area_of_study: ts.area_of_study, subjects: subjects_arr} - ElasticSearch.new.create_document(ts.id, body) - puts "updating elastic search" - rescue Elasticsearch::Transport::Transport::Errors::Conflict => e - puts "Error in elastic search" - arr << ts.id - end - arr - end - end - - create_teacherset_document_in_es - -Setp7: Run below commands to start server - - yarn install - yarn build - RAILS_ENV=local rails s ``` diff --git a/app/admin/holds.rb b/app/admin/holds.rb index 85d0ce62a..fb4bbaed2 100644 --- a/app/admin/holds.rb +++ b/app/admin/holds.rb @@ -16,8 +16,9 @@ # Tell ActiveAdmin to search teacher sets on the title attribute. filter :teacher_set_title, as: :string - # Tell ActiveAdmin to search holds on the user_email attribute. - filter :user_email, as: :string, filters: [:contains, :equals, :starts_with, :ends_with, :not_cont] + # Tell ActiveAdmin to search holds on the user_email attribute. + filter :user_email, as: :string, filters: [:cont, :eq, :start, :end, :not_cont] + # Make it easier to specify the status, by listing it as a checkbox, rather than a text input field. filter :status, as: :check_boxes, collection: [["new", "new"], ["pending", "pending"], ["cancelled", "cancelled"], ["closed", "closed"]] diff --git a/app/admin/user.rb b/app/admin/user.rb index f213c38ad..6397046b8 100644 --- a/app/admin/user.rb +++ b/app/admin/user.rb @@ -110,12 +110,12 @@ controller do def edit # the edit page title has to be handled this way, source: https://github.com/activeadmin/activeadmin/wiki/Set-page-title @page_title = resource.name(true) - end + end # Setting up Strong Parameters # You must specify permitted_params within your users ActiveAdmin resource which reflects a users's expected params. def permitted_params - params.permit user: [:email, :password, :password_confirmation, :remember_me, :barcode, :alt_barcodes, :first_name, + params.permit user: [:email, :password, :password_confirmation, :remember_me, :barcode, :alt_barcodes, :first_name, :last_name, :alt_email, :school_id] end end diff --git a/app/controllers/api/v01/general_controller.rb b/app/controllers/api/v01/general_controller.rb index 2464955a2..d443e2f4e 100644 --- a/app/controllers/api/v01/general_controller.rb +++ b/app/controllers/api/v01/general_controller.rb @@ -18,7 +18,7 @@ def set_request_body @parsing_error = e end end - + # this validates that the request is in the correct format def validate_request if @parsing_error @@ -29,20 +29,20 @@ def validate_request return [] end - + # Requests to the MLN teacher set-updating api must come from our verified lambdas, # unless are being tested or developed. def validate_source_of_request LogWrapper.log('DEBUG', { 'message' => "Request sent to #{params['controller']}Controller#validate_source_of_request", 'method' => 'validate_source_of_request', - 'status' => "start, Rails.env=#{Rails.env}, (Rails.env.test? || Rails.env.local?)=#{Rails.env.test? || Rails.env.local?}", + 'status' => "start, Rails.env=#{Rails.env}, (Rails.env.test? || Rails.env.development?)=#{Rails.env.test? || Rails.env.development?}", 'dataSent' => "request.headers['X-API-Key']:#{request.headers['X-API-Key']}" }) - redirect_to '/api/unauthorized' unless Rails.env.test? || Rails.env.local? || request.headers['X-API-Key'] == ENV['API_GATEWAY_HEADER_KEY'] + redirect_to '/api/unauthorized' unless Rails.env.test? || Rails.env.development? || request.headers['X-API-Key'] == ENV['API_GATEWAY_HEADER_KEY'] end - + # log the error and render it back to the lambda def render_error(error_code_and_message) LogWrapper.log('ERROR', { @@ -50,9 +50,9 @@ def render_error(error_code_and_message) 'method' => "#{controller_name}##{action_name}", 'status' => error_code_and_message[0] }) - return api_response_builder(error_code_and_message[0], {message: error_code_and_message[1]}.to_json) + return api_response_builder(error_code_and_message[0], { message: error_code_and_message[1] }.to_json) end - + # Prepare and write an error message to the application log. def log_error(method, exception) if method.blank? @@ -66,7 +66,7 @@ def log_error(method, exception) 'method' => method }) end - + def api_response_builder(http_status, http_response=nil) render status: http_status, json: http_response end diff --git a/app/controllers/books_controller.rb b/app/controllers/books_controller.rb index 59c551513..4dfdeeb5a 100644 --- a/app/controllers/books_controller.rb +++ b/app/controllers/books_controller.rb @@ -2,10 +2,16 @@ class BooksController < ApplicationController + # looks like this endpoint has no template (@JC 2024-10-03) def index @books = Book.paginate(:page => params[:page]) + +# respond_to do |format| +# format.html # Render the default HTML view +# format.json { render json: @books } # Optionally, support JSON +# end end - + def show if storable_location? store_user_location! diff --git a/app/controllers/holds_controller.rb b/app/controllers/holds_controller.rb index 08dfc1f80..adf75afc3 100644 --- a/app/controllers/holds_controller.rb +++ b/app/controllers/holds_controller.rb @@ -52,11 +52,11 @@ def holds_cancel_details; end def ordered_holds_details return if logged_in? - if storable_location? - store_user_location! - end - redirect_to "/signin" - + if storable_location? + store_user_location! + end + + redirect_to "/signin" end ## @@ -88,19 +88,19 @@ def create if @hold.save teacher_set = @hold.teacher_set - LogWrapper.log('INFO', {message: 'Teacher-set hold is created', method: __method__, + LogWrapper.log('INFO', {message: 'Teacher-set hold is created', method: __method__, teacher_set_id: @hold.teacher_set_id, hold_id: @hold.id, bnumber: teacher_set.bnumber }) - - + + # Update teacher-set availability in DB teacher_set.update_teacher_set_availability_in_db('create', quantity.to_i) - + # Update teacher-set availability in elastic search document teacher_set.update_teacher_set_availability_in_elastic_search LogWrapper.log('DEBUG', {'message' => 'create: a pre-existing hold was saved', 'method' => 'app/controllers/holds_controller.rb.create'}) # format.html { redirect_to hold_url(@hold.access_key), notice: # 'Your order has been received by our system and will soon be delivered to your school.\ - #

Check your email inbox for a message with further details.' + #

Check your email inbox for a message with further details.' # } render json: { hold: @hold.as_json, status: :created, location: @hold.as_json, message: "successfully" } else @@ -117,15 +117,15 @@ def create end def error_message(exception); end - + # Here calculate the teacher-set available_copies based on the current-user holds then saves in teacher-set table and cancel the current-user holds. def update @hold = Hold.find_by_access_key(params[:id]) Hold.transaction do if !(c = params[:hold_change]).nil? && (c[:status] == 'cancelled') teacher_set = @hold.teacher_set - - LogWrapper.log('INFO', {message: 'Teacher-set hold is cancelled', method: __method__, + + LogWrapper.log('INFO', {message: 'Teacher-set hold is cancelled', method: __method__, teacher_set_id: @hold.teacher_set_id, hold_id: @hold.id, bnumber: teacher_set.bnumber }) # Update teacher-set availability in DB teacher_set.update_teacher_set_availability_in_db('cancelled', nil, current_user, @hold.id) @@ -133,9 +133,9 @@ def update end params.permit! - if @hold.update!(params[:hold]) + if @hold.update(params[:hold]) # Update teacher-set availability in elastic search document - teacher_set.update_teacher_set_availability_in_elastic_search + teacher_set&.update_teacher_set_availability_in_elastic_search render json: { hold: @hold.as_json, teacher_set: @hold.teacher_set.as_json, diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index c7e29989e..abfad06dc 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -5,9 +5,7 @@ class HomeController < ApplicationController layout 'empty', :only => [ :extend_session_iframe ] - def index - - end + def index; end def mln_file_names calendar_event = Document.calendar_of_events @@ -16,57 +14,33 @@ def mln_file_names end def swagger_docs - render :json => File.read("app/controllers/api/swagger/swaggerDoc.json") - end - - def secondary_menu + render :json => File.read("app/controllers/api/swagger/swaggerDoc.json") end - + + # I'm not sure this is still needed (@JC 2024-10-03) + def secondary_menu; end + # for timing out sessions, this method reloads a hidden iframe so that the user's session["warden.user.user.session"]["last_request_at"] updates def extend_session_iframe user_signed_in? end - # Display's mylibrarynyc information - def about; end - - - # Display's mylibrarynyc contact's information - def contacts; end - - - # Display's mylibrarynyc school's information - def participating_schools; end - - def digital_resources; end def help store_location_for(:user, "contact") end - def faq - faqs = FaqsController.new.frequently_asked_questions - render json: { faqs: faqs } - end - - def faq_data - - end + def faq_data; end # Create news-letter confirmation email in google sheets - def newsletter_confirmation - - end + def newsletter_confirmation; end def newsletter_confirmation_msg is_success = NewsLetterController.new.create_news_letter_email_in_google_sheets(params) render json: { success: is_success } end - def calendar_event_error - end - def calendar_event render json: { calendar_event: Document.calendar_of_events } end @@ -91,7 +65,7 @@ def menu_of_services respond_to do |format| file = URI.open(File.join(Rails.root, 'app/javascript/pdf/2021_2022_MyLibraryNYC_Menu_of_Services_for_Educators.pdf')) menu_of_services_pdf = file.read - format.pdf do + format.pdf do send_data(menu_of_services_pdf, type: "application/pdf", disposition: :inline) end end diff --git a/app/controllers/mln_configuration_controller.rb b/app/controllers/mln_configuration_controller.rb index 50a4369fd..906a21dae 100644 --- a/app/controllers/mln_configuration_controller.rb +++ b/app/controllers/mln_configuration_controller.rb @@ -9,7 +9,7 @@ def initialize super @feature_flag_config = nil @elasticsearch_config = nil - @app_env = ENV['RACK_ENV'].nil? ? 'local' : ENV['RACK_ENV'] + @app_env = ENV['RACK_ENV'].nil? ? 'development' : ENV['RACK_ENV'] load_all_configs end @@ -17,7 +17,7 @@ def initialize def feature_flag_config(key) @feature_flag_config[@app_env][key] end - + # Load elastic search configurations based on environment def elasticsearch_config(key) @elasticsearch_config[@app_env][key] @@ -33,16 +33,16 @@ def load_config_for_local def load_config # Load feature_flag configurations from s3 bucket. - @feature_flag_config = YAML.safe_load(S3Controller.new.get_s3_file("my-library-nyc-config-#{ENV.fetch('RAILS_ENV', nil)}", + @feature_flag_config = YAML.safe_load(S3Controller.new.get_s3_file("my-library-nyc-config-#{ENV.fetch('RAILS_ENV', nil)}", "feature_flag.yml")) - + # Load elastic search configurations for all environments @elasticsearch_config = YAML.load_file('config/elastic_search.yml') end def load_all_configs # Load local configurations - if ['local', 'test', nil].include?(@app_env) + if ['development', 'test', nil].include?(@app_env) load_config_for_local else # Load dev, qa, prod, test configurations diff --git a/app/controllers/news_letter_controller.rb b/app/controllers/news_letter_controller.rb index 4b5b4106f..4a41951c4 100644 --- a/app/controllers/news_letter_controller.rb +++ b/app/controllers/news_letter_controller.rb @@ -10,9 +10,10 @@ class NewsLetterController < ApplicationController def index flash[:error] = nil email = params['email'] - + # Checking input email is valid format or not. validate_news_letter_email + # Connect's to google sheets and get's google sheet emails. emails_arr = news_letter_google_spread_sheet_emails @@ -26,11 +27,11 @@ def index 'method' => 'index'}) render json: { status: "error", message: e.message[0..75]} end - + # Validate news-letter email from user-signup page. def validate_news_letter_email_from_user_sign_up_page email = params['email'] - + # Checking input email is valid format or not. validate_news_letter_email # Connect's to google sheets and get's google sheet emails. @@ -71,7 +72,7 @@ def email_already_in_google_sheets?(emails_arr, email) 'method' => 'email_already_in_google_sheets'}) raise 'That email is already subscribed to the MyLibraryNYC newsletter.' end - + # Connect's to google client and get all news-letter emails def news_letter_google_spread_sheet_emails service = GoogleApiClient.sheets_client @@ -97,11 +98,11 @@ def create_news_letter_email_in_google_sheets(params) decrypt_email = EncryptDecryptString.decrypt_string(params["key"]) # Email is already in google sheets return true. Do not overwrite to google sheets. return true if emails_arr.include?(decrypt_email) - + # Append news letter emails to google sheeets response = write_news_letter_emails_to_google_sheets(decrypt_email) is_saved_in_google_sheets = true - LogWrapper.log('INFO', {'message' => "Saved in google sheets #{is_saved_in_google_sheets}, params: #{params}, + LogWrapper.log('INFO', {'message' => "Saved in google sheets #{is_saved_in_google_sheets}, params: #{params}, tableRange: #{response.table_range}", 'method' => 'create_news_letter_email_in_google_sheets'}) is_saved_in_google_sheets rescue StandardError => e diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index 0c2e689fe..139518077 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -19,7 +19,6 @@ def mln_banner_message end render json: { bannerText: ENV['MAINTENANCE_BANNER_TEXT'].html_safe, bannerTextFound: true } - end def page_not_found; end @@ -55,7 +54,6 @@ def index # session[:redirect_after_login] = "/users/edit" store_location_for(:user, "/signin") render json: { accountdetails: {}, ordersNotPresentMsg: "", errorMessage: "You must be logged in to access this page" } - redirect_to new_user_session_path return end diff --git a/app/controllers/teacher_sets_controller.rb b/app/controllers/teacher_sets_controller.rb index c64123da8..47c59e545 100644 --- a/app/controllers/teacher_sets_controller.rb +++ b/app/controllers/teacher_sets_controller.rb @@ -16,7 +16,7 @@ def index if storable_location? store_user_location! end - LogWrapper.log('INFO', {'message' => "Calling elastic search to get teacher-sets", + LogWrapper.log('INFO', {'message' => "Calling elastic search to get teacher-sets", 'method' => 'app/controllers/teacher_sets_controller.rb.index'}) # Get teachersets and facets from elastic search @@ -59,6 +59,9 @@ def index # Attach custom :q param to each facet with query params to be applied to that link per_page = 10 + + # Account for differences in ES 7.10 vs 6.8 + total_count = total_count['value'] if total_count.is_a?(Hash) total_pages = (total_count / per_page.to_f).ceil no_results_found_msg = @teacher_sets.length <= 0 ? "No results found." : "" @@ -66,11 +69,9 @@ def index render json: { teacher_sets: @teacher_sets, facets: facets, total_count: total_count, total_pages: total_pages, no_results_found_msg: no_results_found_msg, tsSubjectsHash: subjects_hash, resetPageNumber: reset_page_number, errrorMessage: "" } rescue ElasticsearchException => e - render json: { errrorMessage: "We are having trouble retrieving Teacher Set data right now. Please try again later", teacher_sets: {}, - facets: {} } + render json: { errrorMessage: "We are having trouble retrieving Teacher Set data right now. Please try again later", teacher_sets: {}, facets: {} } rescue StandardError => e - LogWrapper.log('ERROR', {'message' => "Error occured in teacherset controller. Error: #{e.message}, backtrace: #{e.backtrace}", - 'method' => 'app/controllers/teacher_sets_controller.rb.index'}) + LogWrapper.log('ERROR', {'message' => "Error occured in teacherset controller. Error: #{e.message}, backtrace: #{e.backtrace}", 'method' => 'app/controllers/teacher_sets_controller.rb.index'}) render json: { errrorMessage: "We've encountered an error. Please try again later or email help@mylibrarynyc.org for assistance.", teacher_sets: {}, facets: {}} end @@ -138,7 +139,7 @@ def show # Stores the current location in session, so if an un-authenticated user # tries to order this teacher set, we can ask the user to sign in, and # then redirect back to this teacher_set detail page. - + if storable_location? store_user_location! end diff --git a/app/helpers/teacher_sets_es_helper.rb b/app/helpers/teacher_sets_es_helper.rb index c4129f0b6..9a7717753 100644 --- a/app/helpers/teacher_sets_es_helper.rb +++ b/app/helpers/teacher_sets_es_helper.rb @@ -7,7 +7,7 @@ def teacher_sets_from_elastic_search_doc(es_doc) if es_doc[:hits].present? es_doc[:hits].each do |ts| next if ts["_source"]['mappings'].present? - + teacher_set = TeacherSet.new teacher_set.title = ts["_source"]['title'] teacher_set.description = ts["_source"]['description'] diff --git a/app/javascript/components/NewsLetter/NewsLetter.jsx b/app/javascript/components/NewsLetter/NewsLetter.jsx index 732166db4..aa5c105bf 100644 --- a/app/javascript/components/NewsLetter/NewsLetter.jsx +++ b/app/javascript/components/NewsLetter/NewsLetter.jsx @@ -67,7 +67,7 @@ export default function NewsLetter() { const newLetterSignup = () => { if (successFullySignedUp) { - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { { adobeAnalyticsForNewsLetter(); } diff --git a/app/javascript/components/TeacherSetBooks/TeacherSetBooks.jsx b/app/javascript/components/TeacherSetBooks/TeacherSetBooks.jsx index 1b1463019..6b273e7ae 100644 --- a/app/javascript/components/TeacherSetBooks/TeacherSetBooks.jsx +++ b/app/javascript/components/TeacherSetBooks/TeacherSetBooks.jsx @@ -94,7 +94,7 @@ export default function TeacherSetBooks() { .then((res) => { setTeacherSets(res.data.teacher_sets); setBook(res.data.book); - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { adobeAnalyticsForTeacherSetBooks(res.data.book) } if (res.data.book.title !== null) { diff --git a/app/javascript/components/TeacherSetDetails/TeacherSetDetails.jsx b/app/javascript/components/TeacherSetDetails/TeacherSetDetails.jsx index a3ab0caba..beac227ac 100644 --- a/app/javascript/components/TeacherSetDetails/TeacherSetDetails.jsx +++ b/app/javascript/components/TeacherSetDetails/TeacherSetDetails.jsx @@ -107,7 +107,7 @@ export default function TeacherSetDetails(props) { setTeacherSetNotes(res.data.teacher_set_notes); let userStatus = res.data.user ? res.data.user.status : ""; setCurrentUserStatus(userStatus); - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { adobeAnalyticsForTeacherSet(res.data.teacher_set); } if (res.data.teacher_set.title !== null) { @@ -162,7 +162,7 @@ export default function TeacherSetDetails(props) { return false; } else { if (res.data.status === "created") { - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { { adobeAnalyticsForOrder(); } diff --git a/app/javascript/components/TeacherSetOrderDetails.jsx b/app/javascript/components/TeacherSetOrderDetails.jsx index 32b8c6304..247e8bf94 100644 --- a/app/javascript/components/TeacherSetOrderDetails.jsx +++ b/app/javascript/components/TeacherSetOrderDetails.jsx @@ -92,7 +92,7 @@ export default function TeacherSetOrderDetails(props) { "dddd, mmmm d, yyyy" ); showCancelledDate = "display_block"; - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { { adobeAnalyticsForCancelOrder(); } diff --git a/app/javascript/components/TeacherSetOrderDetails/TeacherSetOrderDetails.jsx b/app/javascript/components/TeacherSetOrderDetails/TeacherSetOrderDetails.jsx index 1d5229533..ab758e8cb 100644 --- a/app/javascript/components/TeacherSetOrderDetails/TeacherSetOrderDetails.jsx +++ b/app/javascript/components/TeacherSetOrderDetails/TeacherSetOrderDetails.jsx @@ -92,7 +92,7 @@ export default function TeacherSetOrderDetails(props) { "dddd, mmmm d, yyyy" ); showCancelledDate = "display_block"; - if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "local") { + if (env.RAILS_ENV !== "test" && env.RAILS_ENV !== "development") { { adobeAnalyticsForCancelOrder(); } diff --git a/app/models/admin_user.rb b/app/models/admin_user.rb index a7a911285..eec632379 100644 --- a/app/models/admin_user.rb +++ b/app/models/admin_user.rb @@ -9,6 +9,10 @@ class AdminUser < ActiveRecord::Base # Setup accessible (or protected) attributes for your model # attr_accessible :email, :password, :password_confirmation, :email_notifications, :remember_me + def self.ransackable_attributes(auth_object = nil) + ["created_at", "current_sign_in_at", "current_sign_in_ip", "email", "email_notifications", "encrypted_password", "id", "id_value", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "sign_in_count", "updated_at"] + end + def name email end diff --git a/app/models/book.rb b/app/models/book.rb index 9d8ad3c3a..47f293fb4 100644 --- a/app/models/book.rb +++ b/app/models/book.rb @@ -31,6 +31,14 @@ class Book < ActiveRecord::Base validates_uniqueness_of :bnumber, allow_blank: true + def self.ransackable_associations(auth_object = nil) + ["teacher_set_books", "teacher_sets", "versions"] + end + + def self.ransackable_attributes(auth_object = nil) + ["bib_code_3", "bnumber", "call_number", "cover_uri", "created_at", "description", "details_url", "format", "id", "id_value", "isbn", "notes", "physical_description", "primary_language", "publication_date", "statement_of_responsibility", "sub_title", "title", "updated_at"] + end + # Unused method # def populate_missing_data # if self.details_url.nil? diff --git a/app/models/document.rb b/app/models/document.rb index da4e0d489..9c02e086a 100644 --- a/app/models/document.rb +++ b/app/models/document.rb @@ -13,6 +13,10 @@ class Document < ActiveRecord::Base validate :google_document, :on => [:create, :update] + def self.ransackable_attributes(auth_object = nil) + ["created_at", "event_type", "file", "file_name", "id", "id_value", "updated_at", "url"] + end + def validate_event_type errors.add(:event_type, 'Please select event_type') if event_type.to_s == "0" end diff --git a/app/models/elastic_search.rb b/app/models/elastic_search.rb index 2ad2f7b64..970cbe4ae 100644 --- a/app/models/elastic_search.rb +++ b/app/models/elastic_search.rb @@ -14,6 +14,7 @@ class ElasticSearch def initialize(_index = nil) # Load elastic search configs from 'config/elastic_search.yml'. @es_config = MlnConfigurationController.new.elasticsearch_config('teachersets') + arguments = { host: es_host(@es_config), transport_options: { @@ -24,23 +25,23 @@ def initialize(_index = nil) @client = Elasticsearch::Client.new(arguments) @current_file = File.basename(__FILE__) @index = @es_config['index'] || 'teacherset' - @type = @es_config['type'] || 'teacherset' + @type = @es_config['type'] || '_doc' @teachersets_per_page = @es_config['teachersets_per_page'] || 10 @size = @es_config['size'] || 10000 end - + # Decode aws elastic-search url def es_host(config) return if !config['host'].present? || ENV['RAILS_ENV'] == "test" - return config['host'] if ENV['RAILS_ENV'] == "local" + return config['host'] if ENV['RAILS_ENV'] == "development" es_host = AwsDecrypt.decrypt_kms(config['host']) return unless es_host.present? - + "https://#{es_host}" end - + # Create elastic search document by id and body. Eg: id: "1234567", body: {id: "1234567", title: "test"} def create_document(id, body) response = @client.create index: @index, type: @type, id: id, body: body @@ -57,7 +58,7 @@ def delete_document_by_id(id) response end - + # Teacher set filter params def teacher_sets_input_params(params) keyword = params["keyword"] @@ -73,12 +74,12 @@ def teacher_sets_input_params(params) # Get teacher sets documents from elastic search. def get_teacher_sets_from_es(params) - + # Per page showing 10 teachersets. page = params["page"].present? ? params["page"].to_i - 1 : 0 from = page.to_i * @teachersets_per_page.to_i query, agg_hash = teacher_sets_query_based_on_filters(params) - + query[:from] = from query[:size] = @teachersets_per_page # Sorting teachersets based on availability and created_at values. @@ -90,7 +91,6 @@ def get_teacher_sets_from_es(params) [teacherset_docs, facets, teacherset_docs[:totalMatches]] rescue StandardError => e raise ElasticsearchException.new(ELASTIC_SEARCH_STANDARD_EXCEPTION[:code], e.message) - end # Get elastic serach queries based on input filter params. @@ -105,12 +105,12 @@ def teacher_sets_query_based_on_filters(params) # Eg: wrong spelling: 'hiden figurs', Still fuzziness will give results like "Hidden Figures" if keyword.present? - subjects_query = {:nested => {:path => "subjects", :query => + subjects_query = {:nested => {:path => "subjects", :query => [ {:multi_match => {:query => keyword, :type => "phrase_prefix", :boost => 3, :fields => ["subjects.title^3"]}}, {:multi_match => {:query => keyword, :fuzziness => 1, :fields => ["subjects.title^3"]}} ]}} - query[:query][:bool][:must] << {:bool => {:should => + query[:query][:bool][:must] << {:bool => {:should => [ {:multi_match => {:query => keyword, :type => "phrase_prefix", :boost => 3, :fields => ["title^10", "description^2", "contents"]}}, {:multi_match => {:query => keyword, :fuzziness => 1, :fields => ["title^10", "description^2", "contents"]}}, @@ -130,7 +130,6 @@ def teacher_sets_query_based_on_filters(params) if language.present? query[:query][:bool][:must] << {:multi_match => {:query => language.join, :fields => %w[primary_language]}} end - # If set_type present in filters get ES query based on set_type. # Eg: set_type: single/multi @@ -170,11 +169,11 @@ def group_by_facets_query(aggregation_hash) aggregation_hash["area of study"] = { terms: { field: "area_of_study", :size => 100, :order => {:_key => "asc"} } } aggregation_hash["subjects"] = {:nested => {:path => "subjects"}, - :aggregations => {:subjects => {:composite => {:size => 3000, :sources => [{:id => {:terms => {:field => "subjects.id"}}}, + :aggregations => {:subjects => {:composite => {:size => 3000, :sources => [{:id => {:terms => {:field => "subjects.id"}}}, {:title => {:terms => {:field => "subjects.title.keyword"}}}]}}}} aggregation_hash - end - + end + # Get teacher set facets def facets_for_teacher_sets(teacher_sets_docs, params) facets = [] @@ -196,7 +195,7 @@ def facets_for_teacher_sets(teacher_sets_docs, params) end facets end - + # Group by facets from elasticsearch (language, availability, set_type, area_of_study) def get_language_availability_set_type_area_of_study_facets(teacherset_docs, facets) [ @@ -231,7 +230,7 @@ def get_language_availability_set_type_area_of_study_facets(teacherset_docs, fac # Get subject facets # facets eg: [ {:label=>"language", :items=> [{:value=>"Chinese", :label=>"Chinese", :count=>34}]}, - # {:label=>"availability", :items=>[{:value=>"available", :label=>"Available", :count=>1223}, {:value=>"unavailable", + # {:label=>"availability", :items=>[{:value=>"available", :label=>"Available", :count=>1223}, {:value=>"unavailable", # :label=>"Checked Out", :count=>32}]}, # {:label=>"set type", :items=>[{:value=>"multi", :label=>"Topic Sets", :count=>910}, {:value=>"single", :label=>"Book Club Set", :count=>276}]}, # {:label=>"area of study", :items=> [{:value=>"Arabic Language Arts.", :label=>"Arabic Language Arts.", :count=>1}]}] @@ -331,6 +330,5 @@ def update_document_by_id(id, query) # Delete elastic search document by body.Eg: body: {id: "1234567", title: "test"} def delete_by_query(query) @client.delete_by_query(index: @index, body: query) - end end diff --git a/app/models/faq.rb b/app/models/faq.rb index 6000f497f..78a906c39 100644 --- a/app/models/faq.rb +++ b/app/models/faq.rb @@ -8,4 +8,8 @@ class Faq < ActiveRecord::Base # Reordering of Frequently asked question when faq is destroyed. before_destroy { |record| record.remove_from_list } scope :get_faqs, -> { order("position ASC") } + + def self.ransackable_attributes(auth_object = nil) + ["answer", "id", "id_value", "position", "question"] + end end diff --git a/app/models/hold.rb b/app/models/hold.rb index abc6677b0..11649bf2d 100644 --- a/app/models/hold.rb +++ b/app/models/hold.rb @@ -9,6 +9,8 @@ class Hold < ActiveRecord::Base belongs_to :teacher_set belongs_to :user + delegate :email, to: :user, prefix: true + has_many :hold_changes scope :pending, -> { where(status: 'pending') } @@ -20,6 +22,14 @@ class Hold < ActiveRecord::Base after_create :do_after_create + def self.ransackable_associations(auth_object = nil) + ["hold_changes", "teacher_set", "user", "user_email"] + end + + def self.ransackable_attributes(auth_object = nil) + ["access_key", "created_at", "date_required", "id", "id_value", "quantity", "status", "teacher_set_id", "updated_at", "user_id", "user", "user_email"] + end + STATUS_LABEL = { 'new' => 'Awaiting Review', 'pending' => 'Order processed and awaiting next available set', @@ -90,7 +100,7 @@ def order_number # Asks the hold_mailer to send a notificaion email to BookOps. def send_admin_notification_email - return if Rails.env.development? || Rails.env.local? + return if Rails.env.development? HoldMailer.admin_notification(self).deliver end diff --git a/app/models/hold_change.rb b/app/models/hold_change.rb index 6ea47de52..1d89d49a0 100644 --- a/app/models/hold_change.rb +++ b/app/models/hold_change.rb @@ -12,13 +12,24 @@ class HoldChange < ActiveRecord::Base def do_after_save update_hold - if hold.teacher_set.present? + + if hold.teacher_set.present? && hold.teacher_set.availability != 'unavailable' send_change_status_email else send_teacher_set_deleted_email end end - + + def self.ransackable_associations(auth_object = nil) + ['admin_user', 'hold'] + end + + def self.ransackable_attributes(auth_object = nil) + ["admin_user_id", "comment", "created_at", "hold_id", "id", "id_value", "status", "updated_at"] + end + + private + def send_change_status_email # deliver email if status has been changed to error, pending, closed, or cancelled HoldMailer.status_change(hold, status, comment).deliver if ['error', 'pending', 'closed', 'cancelled'].include? status @@ -26,7 +37,7 @@ def send_change_status_email def send_teacher_set_deleted_email HoldMailer.teacher_set_deleted_notification(hold, status, comment).deliver if ['closed', 'cancelled'].include? status - end + end def update_hold # puts "updating hold status: ", hold.status, status diff --git a/app/models/school.rb b/app/models/school.rb index dd28c3ea6..9dd5a316d 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -14,9 +14,13 @@ class School < ActiveRecord::Base default_scope { order('name ASC') } scope :active, -> { where(active: true) } - + validates :name, :presence => true + def self.ransackable_attributes(auth_object = nil) + ["active", "address_line_1", "address_line_2", "borough", "campus_id", "code", "created_at", "id", "id_value", "name", "phone_number", "postal_code", "state", "updated_at"] + end + # Full name of school + comma & borough if borough is present. # Comma can be overridden with any other punctuation mark that is passed in as the one argument. def full_name(delim = ', ') @@ -24,7 +28,7 @@ def full_name(delim = ', ') n += "#{delim}#{borough}" if !borough.nil? n end - + # This looks up a SierraCodeZcodeMatch by the school's zcode (ie "zk003") # and returns the sierra_code Sierra uses to lookup a zcode (ie "1") def sierra_code diff --git a/app/models/subject.rb b/app/models/subject.rb index c04210441..af308a60c 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -8,4 +8,8 @@ class Subject < ActiveRecord::Base MIN_COUNT_FOR_FACET = 5 + def self.ransackable_attributes(auth_object = nil) + ["created_at", "id", "id_value", "title", "updated_at"] + end + end diff --git a/app/models/teacher_set.rb b/app/models/teacher_set.rb index 02d42cb87..e561144ee 100644 --- a/app/models/teacher_set.rb +++ b/app/models/teacher_set.rb @@ -32,7 +32,7 @@ class TeacherSet < ActiveRecord::Base before_create :make_slug KEY_WORDS = ["NYC"] - + AVAILABLE = 'available' UNAVAILABLE = 'unavailable' @@ -48,6 +48,14 @@ class TeacherSet < ActiveRecord::Base FULLTEXT_COLUMNS = ['title', 'description', 'contents'] + def self.ransackable_associations(auth_object = nil) + ["books", "holds", "subject_teacher_sets", "subjects", "teacher_set_books", "teacher_set_notes", "versions"] + end + + def self.ransackable_attributes(auth_object = nil) + ["area_of_study", "availability", "available_copies", "bnumber", "call_number", "contents", "created_at", "description", "details_url", "edition", "grade_begin", "grade_end", "id", "isbn", "language", "last_book_change", "lexile_begin", "lexile_end", "physical_description", "primary_language", "publication_date", "publisher", "series", "set_type", "statement_of_responsibility", "sub_title", "title", "total_copies", "updated_at"] + end + def new_or_pending_holds # puts "holds: #{holds.where(:status => ['new','pending'])}" holds.where(:status => ['new','pending']) @@ -60,7 +68,7 @@ def held_by?(user) def availability_string AVAILABILITY_LABELS[self.availability] end - + # Get teacher-set record by bib_id def self.get_teacher_set_by_bnumber(bib_id) TeacherSet.where(bnumber: "b#{bib_id}").first @@ -73,7 +81,7 @@ def pending_holds_for_user(user) [] end end - + # Get all teacher-set status holds except for cancelled and closed. def ts_holds_count ts_holds = holds.where.not(status: ['cancelled']) @@ -89,14 +97,14 @@ def holds_count_for_user(user, hold_id=nil) # Current user Teacher set holds def holds_for_user(user, hold_id) return [] unless user - + if hold_id.present? ts_holds_by_user_and_hold_id(user, hold_id) else ts_holds_by_user(user) end end - + def availability self.available_copies.to_i > 0 ? AVAILABLE : UNAVAILABLE end @@ -133,12 +141,12 @@ def update_teacher_set_availability_in_elastic_search def ts_holds_by_user_and_hold_id(user, hold_id) holds.where(:user_id => user.id, :id => hold_id).where.not(status: ['cancelled', 'closed']) end - + # Get teacher-set holds by user. def ts_holds_by_user(user) holds.where(:user_id => user.id).where.not(status: ['cancelled', 'closed']) end - + def make_slug # check for nil title otherwise parameterize will fail parameterized_title = (self.title || '').parameterize @@ -836,14 +844,14 @@ def recalculate_availability # puts "#{(i+1) + (params[:page]-1)*params[:limit]} of #{items['count']}: Add/update #{title['id']}: #{title['title']}" # id = title['id'].to_i # # puts "upsert_from_catalog_id #{id}" - # new << id unless self.exists?(id) + # new << id unless self.exist?(id) # unique_ids << id # # If debugging a specific id, skip all except for that id # next if !just_id.nil? && id != just_id # =begin - # if self.exists? id + # if self.exist? id # s = self.find id # next if !s.description.empty? # end @@ -1010,8 +1018,9 @@ def update_subjects_via_api(subject_name_array) subject = Subject.find_or_create_by(title: subject_name) subject_teacher_set = SubjectTeacherSet.find_or_create_by(teacher_set_id: self.id, subject_id: subject.id) end - prune_subjects(old_subjects) + prune_result = prune_subjects(old_subjects) self.subjects.reload + prune_result end # Clean up the area_of_study field to match the subjects table title string rules. @@ -1081,7 +1090,7 @@ def update_notes(teacher_set_notes_string) rescue StandardError => e raise TeacherSetNoteException.new(TEACHER_SET_NOTE_EXCEPTION[:code], TEACHER_SET_NOTE_EXCEPTION[:msg]) end - + # Calls Bib service for items. # Parses out the items duedate, items code is '-' which determines if an item is available or not. # Calculates the total number of items and available items in the list @@ -1093,7 +1102,7 @@ def update_available_and_total_count(bibid) update_teacher_set_availability_in_elastic_search return {bibs_resp: response[:bibs_resp]} end - + # Calls Bib service for items. def get_items_info_from_bibs_service(bibid) bibs_resp, items_found = send_request_to_items_microservice(bibid) diff --git a/app/models/user.rb b/app/models/user.rb index 2a4a3e10c..2f3ca8a49 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -6,7 +6,7 @@ class User < ActiveRecord::Base include Oauth include MlnException include MlnResponse - + # Include default devise modules. Others available are: # :confirmable, :lockable, and :omniauthable devise :database_authenticatable, :registerable, @@ -15,7 +15,7 @@ class User < ActiveRecord::Base # Makes getters and setters attr_accessor :password - + validates_numericality_of :barcode, on: :create, presence: true, allow_blank: false, only_integer:true, less_than_or_equal_to: 27777099999999, uniqueness: true validates_numericality_of :barcode, on: :update, presence: true, allow_blank: false, @@ -47,6 +47,14 @@ class User < ActiveRecord::Base STATUS_LABELS = {'pending' => 'pending', 'complete' => 'complete'}.freeze + def self.ransackable_associations(auth_object = nil) + ["holds", "school", "email"] + end + + def self.ransackable_attributes(auth_object = nil) + ["alt_barcodes", "alt_email", "barcode", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "encrypted_password", "first_name", "holds", "home_library", "id", "id_value", "last_name", "last_sign_in_at", "last_sign_in_ip", "remember_created_at", "reset_password_sent_at", "reset_password_token", "school_id", "sign_in_count", "status", "unconfirmed_email", "updated_at"] + end + ## NOTE: Validation methods, including this one, are called twice when # making new user from the admin interface. While not a behavior we want, @@ -61,6 +69,7 @@ def validate_email_pattern allowed_email_patterns = AllowedUserEmailMasks.where(active:true).pluck(:email_pattern) index = email.index('@') + if (index && (allowed_email_patterns.include? email[index..])) return true else @@ -187,7 +196,7 @@ def assign_barcode(number_tries=0) # we've run out of allowed barcodes. Yes, we might have historical user records # with barcodes outside of the range, but we can't be making new records there. current_top_barcode = User.where.not(barcode: nil).order(barcode: :desc).pluck(:barcode).first - + if current_top_barcode.blank? # hurrah, we're in a fresh db, let's start our users table off last_user_barcode = min_barcode @@ -256,7 +265,7 @@ def barcode_available_in_sierra? timeout: 10 ) - if (response.code == 404 && response.message == "Not Found") + if (response.code == 404) is_barcode_available = true LogWrapper.log('ERROR', { 'method' => "barcode_available_in_sierra?", diff --git a/bin/rspec b/bin/rspec new file mode 100755 index 000000000..3c8368a4e --- /dev/null +++ b/bin/rspec @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +load File.expand_path("spring", __dir__) +require 'bundler/setup' +load Gem.bin_path('rspec-core', 'rspec') diff --git a/bin/spring b/bin/spring new file mode 100755 index 000000000..a81373ab6 --- /dev/null +++ b/bin/spring @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby + +# This file loads Spring without loading other gems in the Gemfile in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +if !defined?(Spring) && [nil, "development", "test"].include?(ENV["RAILS_ENV"]) + require "bundler" + + Bundler.locked_gems.specs.find { |spec| spec.name == "spring" }&.tap do |spring| + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem "spring", spring.version + require "spring/binstub" + end +end diff --git a/config/application.rb b/config/application.rb index ea63492ca..3b75ffaca 100644 --- a/config/application.rb +++ b/config/application.rb @@ -69,6 +69,8 @@ class Application < Rails::Application # Enable escaping HTML in JSON. config.active_support.escape_html_entities_in_json = true + config.active_record.yaml_column_permitted_classes = [Symbol, Date, Time, ActiveSupport::TimeWithZone, ActiveSupport::TimeZone] + # Use SQL instead of Active Record's schema dumper when creating the database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types diff --git a/config/application.yml b/config/application.yml index a7a508792..0ebf240d3 100644 --- a/config/application.yml +++ b/config/application.yml @@ -4,10 +4,10 @@ case ENV['RAILS_ENV'] -when 'local' +when 'development' ENV['MLN_INFO_SITE_HOSTNAME'] = "dev-www.mylibrarynyc.local" ENV['MLN_SETS_SITE_HOSTNAME'] = "dev-sets.mylibrarynyc.local" - ENV['DATABASE_URL'] = "postgresql://localhost/mylibnyc_local" + ENV['DATABASE_URL'] = "postgresql://postgres:password@postgres:5432/mln_development" ENV['API_GATEWAY_HEADER_KEY'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAIcwgYQGCSqGSIb3DQEHBqB3MHUCAQAwcAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAydkErOQnDmhq+LmN8CARCAQ6BaEialZwZtZrF9XDXGVq0hJHo8lVgwDMyjtOXAaYQ5Z9Z7O/9XU3hLUND7c6uagr+RwAXD8arCtKAzJbfhpO7BL1I=") ENV['SECRET_KEY_BASE'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAOMwgeAGCSqGSIb3DQEHBqCB0jCBzwIBADCByQYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxjUy6F+DQ0NZ0NH/UCARCAgZv7/TEPBAow+srmtwcgFdEMbthnWmJVMZmR+NyMl0gaoqiQyYqJvAwbmgwDBYQKeVm1qSqvbKJchR86HQJ2icnUCH/OShiQs3H8Bo+ddnc97v/mhJx8MlR6fYyxZF79VmhYvfIaRO1HwTyCMjbV7dGbVw8kj0xZG7tXXyAubcdBMeJrnja5GghViu+I3VaZxQz1/RwbMhK5x49M7A==") ENV['PATRON_MICROSERVICE_URL_V01'] = "https://qa-platform.nypl.org/api/v0.1/patrons" @@ -23,31 +23,6 @@ when 'local' ENV['NEWS_LETTER_GOOGLE_SPREAD_SHEET_ID'] = '1MFk2Pq1v_TbzIT2Ms0FXz_dM8NgC6R2g_fX9YS580KA' ENV['MLN_GOOGLE_ACCCOUNT'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAACXMwgglvBgkqhkiG9w0BBwaggglgMIIJXAIBADCCCVUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMB6DchHaPtWB7HoO/AgEQgIIJJqdLdp7E58xRTpXIZtTStT0LfQSUT67trxtZbFNg4KkmMGEh3BFLdi8Y/XJfSNuIjbd73fGZ94uUD3aShQM0Lun1uNebO0gRRGUg8c6+/MmfCSVMIqYTzkESqd/dNZW5IHqk4FqgosSXRBRdPrbzgeWXnDKMooeeIlwv60bAjeoXyrrZC9l5x6OGzeg8Kp7ioyfhXism7vBbPMaP21s+Fmyk/kIUnx2SvR8uHyfj8ramxUCs3qn4bkoaHj1RDgwR31xJiF2In6Ch2Z5pm5V6E8NZO4J5TV1KhNOpjShgY50g+vGS0gkUySRZjc9o3GytzHwBhe1yLmjf0phdjbPn/qlo7vY4BU5vFZ96I3e2DR6kj3uMRPRhCWErbM3FYjq4If1wrYPj89QePNe2v4ziDyIfBrayH9yK0JgVGFmzXdhU5kiYWV880pnptJeS++0siiiPNj/fA8tQJ7ZZ2yzVUW169mrCbuDZ4y38ACxw1y3vJBE8TCCbUgFg2FajcDP481ZfxFPQGHtgSAEoe1aQj7mryU++owmMPLcCruOAsh98S6eAUUX7d7+v0Lqc7J0hn+tS1OCoSVyTUA6bxZGKyLT05h+maVB9QjWM9GI0BfTcTB7CqZU2lwqUhVZLHf6D0rP5DWR/UQ7M/2BDkR61Gv7olr6H5BumpqrPlrz3CP2nJlJr4+bmi/z/OcLIrI42ymFt7uddGOMjTdM1cZCHyDzMzx5fiv/E7IUnpMZVmMfiJ8H8qjUuj4gYbjbFfln12zpr3sTWQdhL4xytxadPJjoa3jHvwe+mMR0pbtJDaHzVE4vJr+NdbH0m2NMvAL5+uH+7JGj+i1vzvjSIkfvxg+Mn69ZRWlrVaI0TWC3Xv2HnQpQAssv662Dnjkp7erQlCcbOrwk/JnQnwPbgn+5b8UU8t7CoSnh3owdnutvHZhGjbQdxkpxJzCsZXGZExagImVhn/XlIuw7vC+CL2ZiLOVFVvznE45t1wxJ8e2gFify6YTr7P5jv7sGD1mKstxZMeDw/+vUYVNCVm7hEc+P/2ZBOVEA9KfFhGSn2KFwqvSg7wRJkhrjc3H8y4rdrS1Q1D6jbIY0YOBB8TTtagAL/s1S5peX9QAUuDCrItEEB9ZFus+mGnCdHyahuFsQoAw/nCe3CQiUmBFFXA0V6i0NZ078lHh+h6GELpUxqrFkW61+8mww3AcnqpMRbwwrTTlk/tSGYIgTWXfn4AKtBQ7Ap9kZt9cXZT8aLJkR2bcn7JtH55ZFFYhIL4n1zNdj2eNSGHhvFXuid7BgC8YLiw0Gqb6vHMf1VxrQF1dlsLUT9/tmSFMbBBoKIeYywLCd3tBd7YexamQb6tA8JGV0fXj7spcKurj+bakYsJMwXiAOU1lLXnHbWVWGsZPxB9lZFYvMxKUj0XutrCg+mFBgFE9JrBFNFV3N8ZDJQeUUkQuKqmfm/Kb6tuVFw7sZRB1PafA0b0wobeZUaC49rJwONZUT5IBKTYBFDedl4sRXIS/3yoyvEJ3yt/7t1nlmHdotw0Q7//Rs+HhLKxWTytxYvYYBTH/u+DKIVp2MffNoTPLEHUyDqimCfq1+wOLJq2iowEYCqRhgoxT1EYjb9QSunOrjHk7KKQ78T4/xfkClboGqqi2+zSSoVgaQCZibKQaK2aDoD+VUVW0B06aS0bWm1uthIbXWzCM9iA4RGPERGpRKt4pjsjL+2QCmYsmBE4rhGa2O85tZ841F0EoU14zm76cfVvI20IwFB8/zKScNFOICgv0Y6QbtdTef7zDelTWw2SRC9EY/3MCYh5SUQSlDO5EXvvXGhrzuD7nukcD5vN8km+sUc1CR67iPuj9DDUCcxoEu38GKwIt+OO+ItO+MC2gpN5yXfHoGRBGJbZerW80ikSdvHaJDNWaRfPDdMgQ1VIPzgFRj7nHkHJF3VFn38NXWcbsqXlZz1ObvPob/kM4NnU2OEFV/p9z8Ios+bnV+kVKQjGcdPE5DnKDxTupUPyPEdADlKDULYg44GykzWIJOjOE/F0JU2n09axTjlJNoLqMsDozhqy/ksL6LORjWhkb2BC9jUGM24ZElemeHnrlZFYC8qT6/ya0XL1wGymsIIYyxX6rGK8GXvixKn/Gv+dsmy4hC6D5bQz4ZijxvRPwHAQ7gO7MxFlnhClEO1ROPevoThs0s+QdU2zKpDtrQYckQAcOcrXnDPf/dPibaDOj/x84m59NDbqvlMjJVXfI+yUDApCdBWoqWbJ7gxeVIsaUPXlci6xrSBVwEQ9OVB/MaE2pils0xNHh2HKvADe+AFZvNv/9hNvimR96ymooPhUgT0HW80ahnuL+qLueswNOFjR5KGEIMVxQ2NqCUQhEcpDYCR8H5qPsAahTs/rsQZ2aPtR3ud78FKKSr0IOwJ8ryGHpzqbbM/k2ii2FQZspOyfKzjsBUNFoBCiowGF0uHv6IrUogzrf6neEWlRN26mfQB5LtQuW53gKUYo0Buap6ysscWi10+cSKxXVgdzGNnxyter1zt3xoIoY+paZo/9HJgvxJPVQC1kNVjE/you0gWyK+T2SNCWf6+pjgbslNY7PMKv5IO+SEz6ZIMaBFnzopnKkp552t74IdPzbPrEbith70FwElWefegRQfQkduZzdwhbtm1goq5+omLk0ahBVwB8s7EynihU+G5msjgqsBJ3pVUPFsPerMR007jZOS+BbWLQf4mrdrtpEaBYxluFYdXXWSKGtUVsE+d/mYnXWNGmcHJRB9pkzHYwrcP1qHOpa14AYr0v4uNqOlOeNN5aZw+MawaJUYKlArHSaix7oZE+lNNRyk2I8iVUZ8bGiru6vt1PFQO+SuS7uMXsY6mH8iT/VPEgPVljNHduhK+ye/dgOPsHWrlFi1KP3Gfo6mue+qFcglimUtD44VtrITP7XJ1luWCrqmAOs8jgtyuvXLUQybyTdHvXXaLpBraG0UypJgVCJi+Xdd5ee5YisrByXIe9zdzS2pLWjE0Np6zsU1GbZ0ETKyYmke2WZhRmqQHVQkSCj34sipJN/jLc3Z1ULNNBDLrQm+m+Wi2benVSEKYEdachrGyMym8V9FEaVrH5RH8A2RxUcgUnsgcUmx/v56ryx11DBHH2fP4") ENV['ADOBE_LAUNCH_URL'] = "https://assets.adobedtm.com/1a9376472d37/47d869131fa4/launch-3ce19d1f4eed-development.min.js" -when 'development' - - ENV['RACK_ENV'] = 'development' - ENV['RAILS_ENV'] = 'development' - ENV['MLN_INFO_SITE_HOSTNAME'] = "development-www.mylibrarynyc.org" - ENV['MLN_SETS_SITE_HOSTNAME'] = "development-sets.mylibrarynyc.org" - ENV['DATABASE_URL'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAASwwggEoBgkqhkiG9w0BBwagggEZMIIBFQIBADCCAQ4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM3apJFu88CTtQfpWdAgEQgIHg5FzviDrg2Qkl2HnO09j5KWORAq1CDtGaZtIATpvKoCHoxogGd4GyJ8M1/J/zHAtnapZiwe4AH22b3aUGQrQLDreu3t1kqp/4jVlkvz1Xa8+dCqeEeIsHgMXG1FTHrH3KZY27Fkg2mAHkJMlFI97oMoV8gj6O6UUfn/ZhNthrNkVSMZNZt2wFoZGXUC8s2rztJdnhQk1RusdDMp70+yoNwa470nOpXHNFoFHf1NVJ0Ih1HD8qSeViwWR7Q8sJSQCUYv9OPCGXkLNUWO1xNWY5d255dMrR/tSnEtugDNRXI1c=") - - # encrypted development gateway token - ENV['API_GATEWAY_HEADER_KEY'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAIcwgYQGCSqGSIb3DQEHBqB3MHUCAQAwcAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxqCMn14f/GRhDOpHACARCAQwE4QQLBwytE/w5MXP8CSFPYFjLmd/OXer0Trz3rMXtci3QPWzKlT8aw5BUxZEdC7HQ/udhW62T6hI76MBLiRHqOJ3c=") - ENV['SECRET_KEY_BASE'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAOMwgeAGCSqGSIb3DQEHBqCB0jCBzwIBADCByQYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxjUy6F+DQ0NZ0NH/UCARCAgZv7/TEPBAow+srmtwcgFdEMbthnWmJVMZmR+NyMl0gaoqiQyYqJvAwbmgwDBYQKeVm1qSqvbKJchR86HQJ2icnUCH/OShiQs3H8Bo+ddnc97v/mhJx8MlR6fYyxZF79VmhYvfIaRO1HwTyCMjbV7dGbVw8kj0xZG7tXXyAubcdBMeJrnja5GghViu+I3VaZxQz1/RwbMhK5x49M7A==") - ENV['PATRON_MICROSERVICE_URL_V01'] = "https://qa-platform.nypl.org/api/v0.1/patrons" #Development services is not working. So using qa urls. - ENV['PATRON_MICROSERVICE_URL_V02'] = "https://qa-platform.nypl.org/api/v0.2/patrons" - ENV['BIBS_MICROSERVICE_URL_V01'] = "https://qa-platform.nypl.org/api/v0.1/bibs" - ENV['ITEMS_MICROSERVICE_URL_V01'] = "https://qa-platform.nypl.org/api/v0.1/items" - ENV['ISSO_OAUTH_TOKEN_URL'] = "https://isso.nypl.org/oauth/token" - ENV['ISSO_CLIENT_ID'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAGowaAYJKoZIhvcNAQcGoFswWQIBADBUBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDCL+6xESlcH6XPieZQIBEIAnue0eoIvwsVklKFk6Ss/15ozhEeOX57PLO7JzZ2C0VEftw0Wg6YWp") - ENV['ISSO_CLIENT_SECRET'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAIcwgYQGCSqGSIb3DQEHBqB3MHUCAQAwcAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAz6OkwUOUwsV+igt9ICARCAQ0GQCQ1PahswCs4FO/oADmOgGh1ORhBstr88yYUp8eh2FHWTRsmrLRImou+9zqrdKLnN2qcMuY0RLqFplr/5YChbPgg=") - ENV['SMTP_USERNAME'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAHIwcAYJKoZIhvcNAQcGoGMwYQIBADBcBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHQoVc0WU3CCeVrALQIBEIAva1O96JEfRV200A+p2jTJJRMBAkDwJKXW7qEN1gqXW3Q/Ghk84pnQra/LFiqnVvI=") - ENV['SMTP_PASSWORD'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAAIswgYgGCSqGSIb3DQEHBqB7MHkCAQAwdAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAyaW10RTaRiB65NvoMCARCAR1DWfdBiBrz/amice86UG68SHMneIKyJnOkU+kPsqEZxXjXsCZTdSBJ/QzTmhHSLzgv5+hkHe1PpQ17z6UZv6C3AAIdSJV/2") - ENV['NEWS_LETTER_GOOGLE_SPREAD_SHEET_ID'] = '15SiS-tihLk0rhbXuZ9Xyw4zXozX8bfaT5TtrhojV5yA' - ENV['MLN_ENVIRONMENT_URL'] = 'my-library-nyc-app-dev-1002.9aa2mtunik.us-east-1.elasticbeanstalk.com' - ENV['MLN_API_GATEWAY_URL'] = 'development-www.mylibrarynyc.org' - ENV['MLN_GOOGLE_ACCCOUNT'] = AwsDecrypt.decrypt_kms("AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAACX8wggl7BgkqhkiG9w0BBwaggglsMIIJaAIBADCCCWEGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMtT3giP/jFBjrlQH5AgEQgIIJMndZYe2TuUb+qAH8dRBNkbLMUHu7Oaf+L0J9s8Op0MyYzalbJFsjCj7KGr82SzRgoNnh3yiuoTIFQq97QaztyqXWTWN5geGN9ciEj4uHphuM/cZSSuabdfTXaMhK1M4Smf/SEbw/hdVlWp+fc30ZOzEmdugJvVKo7niCoWHayZ77Hvo0hAk0EShOKanb4gX0YjuIUvnUpwtiXaVD6BU0ogoUaWE1ibSX4+N/vxot3M4JFxVV5rDHKKcyWzitajekx9YseMFq8GdQRyhpHS0YD6wNjvtFvao2bzSa2KUX8MrAcZi65uiOtsHnt66hI+9+hArTcBfYxzRup3wZP/DGF1qzxGomdr+Hc6KGgtJmiV05teAeVpQfOKXMywa8sU7xAoPpX57Xj3fM23dizvcdlnLTux5IZT291OtNdtzKtc5xVyJDnZxbXbtSLxT8SdqLaiM/5S5yx6cXj6TcgFdw5a8E1wRskP2MbRrnqsX3sZwM/Ly+3NbFLPjTbNPtrRHKPJvKyM34J5sa0a+lcRMbhkVeXXi6ppohyevxfHUzTJtoDUEMQAem0Vguyrc17c/y/B0jsFx73677FXMabn0jeMJDNTlDnoLinxXylyRg6p9op0cb2Fm8yE/WSUDvQ+LzQ/UJtfXqPr84cDjBuSSyXFRksgg6Jidl2fHs3Ac7gBrzRqw1Q9vNuFR17/C9Q6xLVLAZkBF5LuxvhDOpoQRvmht+Ra6ua4Q5NOzGI/7awr5KyuTpEFU0SeJVaPqv5NcqeM3ImQzoFqFO6lX6KXJkksgacEDxmi/4E7XvgqILi2eUfrSg/EfmYni62YIl0z6VnUpEdZLGoGlLqVStXzDkWbMargNmr92NNozXL9DSi2nCEa32iWxYYD59jDSnGki8KAS920JA8caFZs3XPKN94vGgtHMwoTJ+5VlpfyC0b4/erW83QKQQHNZipIztio828cftMBT/E9/JpZH98emE/UnPi3zMe3PGYxHWh/M2rJyAA8kK2mkAG0pfGyAp7fkda5F2SDnSbVrDxZ8Xx5q0rSPj+43ImWhzg+KSC4NfcbChoJ1H0HNkCFPJM1cL5plS1MOOocVOpcJ1+JnNruVHKC2O7S4D7/gdwkmWY6wDton3vCHq4r26B5oL3/AfDpzlblCoMVrNMT4BLeJ8bWY8FN2qIfhouUcx+B48RV1rDfXH7VYs0YrugG5ZAIY7x+NbaSEKep8hg5AuqG3eGk2VvqmQ1/LsPXQrSfiYoYHhln5eHw6kkYvPMSt+V4Zy2q2k+MNnXbof6dY/L8upnBVIjRpIG5UkKCO3QpbDKw29cpTBBqlA24MTiKEmpNx8ZXioS7J/jdsE6odaXope+JFWhhLTVzvtcjOQt8uyudJ1jLKRwo5z4zz7G9VUlgqNAUGtGjJWQyQmvoOIRlfClRydjEveVlByfvwAYtxYjo6C4MgcxbJcyUcVnPv9cjR9KIDelIG4Ke/dSXWvBqox4h3vCsIXPZkJeS6kN9luevNoPlNdkszywiDykNIeqkzt7p6KUCGqnAKxxdaUBZqL1WxVyGp0olR6XNlHeD0N69luwmep9H0z8E0LKi6SBOkAdIiqVYsPEk2B1bjM4a9xL3k19OXH7bzyvfgCEgOEnCzRpq5jZwQSca3prk5eYGNjJpMN+Wuo6krunnSG3vH2rQGifDOZMIuEMxU3BBEybpKiQJqJvbSrw/Cv6blNWQSqWm20AqsqJ3CzlQG+lgwp4Zu0cjH3FNb8TczD2KgKRqOlmJLDZT0zaGxGGRtdBw8xYLb3Tz7z6QExKIOUDAUR6KmbL+a66oAwCpeanOvaHWv5YuaEnLUslLo6lh7gt/AAZwfPkzt1OaMla9YNyddpxMBATMQzNE5ZUj1FZv+M4Dgw8ZEbOHo4YwbhVJ/EwGlh1D1MAlYigHzvJcxdDLLIDv5EwUvUBFE4ZtkwVkv8rXwaz3lvZKQEamjAAg/tawHJwvBOv7SMbA/yn18BI14xsErs5JiRwLNWW1fymEvKnOBBysLjOBgC2cQNIg1T1xb75Qqd3yEDxi1FwpZngdj7r2u7rJHr2lnHC6K8DL/vULRWwz5qrX7AeV7XhN6S7QLCX6H08JMzVQmLNix73qDippO/VDG9wkIQaWvRh/BlqVfowhT0azp2NSBtJLaHlGS/s0j9ohj+ewtcM5DjNpxr652XCCnZ5+f+vvpTm49mmaIxvAJXGbIoV4EtdAHDh2pRSQhCfWlgpG9TdUfS+2EyH55E5gCOtb08Es0rQqf4Vj7iI5SBQOJgMWpKV50qLOU9Mu3xOIZr9mUOauiRtNtlABfJqL+KMU4z+yAXOyroURxaFIYYvknEn1ziz104b95SQv8EUnhhCz1591mDWNukkycF2NAFfE2HRYzrTzFepMfDUuRkvhMmwXm8PocDb+E8WaXKFbL1Pcp9P61hjHmHonPkALsVNjgVqLZlxIfRlmCef7oVxl9bEaAqHBoQ/0O+pG3OXc/p7q+2dOLtyql8MrGJFzThyhYrofZEsjQ/kFiVBwJDxjk8CCaQ6BEsa53VL4UGBxKk3dkSCbtWTBFWeHWtU11eXMBeFhMB5iUs+/QGjIxs+Y9AReYowPz3vq759rhFLUWyoyaS+cEc4Gn8594PcHZ4r0nIck0DoKl/yH+DgwdPazBUNcpQvwLJxETE3nLvElsJrrtVAew5JyME8U8NDuBgyxIhoWruykOfaW7a73fixNCRc04BLovtTMJQdDFc0pkV3bLgLMLCBkEnsvRjka29622KOYhQAr7StfXmPes0uKofgu/YYFCCtg9nrt1W/nf8/BsEFNzi4wQmXTvFbTQg+ZMytziJixQfackQqibf86UWE/giGMImFbu8hQQrlXpmo8ZR22I7cANf2s60kX9pEk9Gh6bjIi19/L0Ps9YVQP6qqSd+tyi0IN1aAeKh1DLQzV3JJiUvKnIl2F6f9Jo+GfyghZyAXGRVJN7ZjYECucFboJfX1+7gpjTfmdjSk6wo8erJcXCPe1ca2a5GkS4X/OafLbJaukMbxRzrMZkfsOs9bkopX0JmEZx1nGO5zJg8uG8/c/THewoU49R3Yf6Bm1M25F7zG1v+l9dANJcHvEIjh4iM4AW/aJsREaPKMgDv") - ENV['ADOBE_LAUNCH_URL'] = "https://assets.adobedtm.com/1a9376472d37/47d869131fa4/launch-3ce19d1f4eed-development.min.js" when 'qa' ENV['RACK_ENV'] = 'qa' @@ -106,7 +81,7 @@ when 'production' when 'test' - ENV['DATABASE_URL'] = "postgresql://localhost/mln_test" + ENV['DATABASE_URL'] = "postgresql://postgres:password@postgres:5432/mln_test" ENV['MLN_INFO_SITE_HOSTNAME'] = "qa-www.mylibrarynyc.org" ENV['MLN_SETS_SITE_HOSTNAME'] = "qa-sets.mylibrarynyc.org" ENV['RACK_ENV'] = 'test' @@ -121,7 +96,7 @@ when 'test' ENV['ITEMS_MICROSERVICE_URL_V01'] = "https://qa-platform.nypl.org/api/v0.1/items" ENV['BIBS_MICROSERVICE_URL_V01'] = "https://platform.nypl.org/api/v0.1/bibs" ENV['NEWS_LETTER_GOOGLE_SPREAD_SHEET_ID'] = 'test_id' - ENV['MLN_GOOGLE_ACCCOUNT'] = "{\"client_email\":\"google_mln_test@gmail.com\"}" + ENV['MLN_GOOGLE_ACCCOUNT'] = "{\"client_email\":\"google_mln_test@gmail.com\",\"private_key\":\"fake_key\"}" ENV['MLN_ENVIRONMENT_URL'] = "my-library-nyc-app-qa25.unpc66pkwp.us-east-1.elasticbeanstalk.com" ENV['MLN_API_GATEWAY_URL'] = 'qa-www.mylibrarynyc.org' ENV['ADOBE_LAUNCH_URL'] = "https://assets.adobedtm.com/1a9376472d37/47d869131fa4/launch-3ce19d1f4eed-development.min.js" diff --git a/config/boot.rb b/config/boot.rb index a120e93a2..d1a6770c9 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -5,4 +5,4 @@ # Set up gems listed in the Gemfile. ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 000000000..db14aea13 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,11 @@ +test: + adapter: test + +development: + adapter: async + +qa: + adapter: async + +production: + adapter: async diff --git a/config/elastic_search.yml b/config/elastic_search.yml index 20ec2682d..013e676af 100644 --- a/config/elastic_search.yml +++ b/config/elastic_search.yml @@ -1,18 +1,9 @@ -local: - teachersets: - host: 'http://localhost:9200/' - connect_timeout: 3 - index: 'teacherset' - type: 'teacherset' - teachersets_per_page: 10 - size: 10000 - development: teachersets: - host: "AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAALQwgbEGCSqGSIb3DQEHBqCBozCBoAIBADCBmgYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAyS9HSNvErgrdg9VuwCARCAbZYtB/RGgKYco/pRRFwU2rC2P6CMfQs4ExV20e693vMOqQiBHalhLXLASQVJZkR8Izatvt9G3pdhB7RdWbFaUh1HBiwQemuRV0rUnM3bhhAYh7I2SVUJFVCG3a07zmDDBLeVtEW+KbVXv9Qw0E0=" + host: 'http://elasticsearch:9200' connect_timeout: 3 index: 'teacherset' - type: 'teacherset' + type: '_doc' teachersets_per_page: 10 size: 10000 @@ -21,7 +12,7 @@ qa: host: "AQECAHh7ea2tyZ6phZgT4B9BDKwguhlFtRC6hgt+7HbmeFsrsgAAAKswgagGCSqGSIb3DQEHBqCBmjCBlwIBADCBkQYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxmV/rQcH0PEpTP/e0CARCAZM7Y5WpMxizb+hPnVNlHDp2MNM12elMYOcy3n7I0ix+DxfB6EfVDQoSMDSPWSf/uVlaBq/yMdEzYS3ZGN/Zzd1SrmU7N9S5aUEretGu+9/5sPu2eXl/N+mBzYxMqt00oznAf0mk=" connect_timeout: 3 index: 'teacherset' - type: 'teacherset' + type: '_doc' teachersets_per_page: 10 size: 10000 @@ -30,16 +21,16 @@ production: host: "AQECAHh7ea2tyZ6phZgT4B9BDKwguhlFtRC6hgt+7HbmeFsrsgAAALMwgbAGCSqGSIb3DQEHBqCBojCBnwIBADCBmQYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAz+uWwzu8aSQMbcufgCARCAbDerYV+KnsRNGPUtkRFBfynrgCR1i1h+Bx0XFJXvGMlfoqpuQh8PAWUNXjzpmoZhL2TQ9Eht+RIBIW7WlFG8jo1c0rdY4cfsA/wLdUE+VVIzb4WzX0rqS+lRjhMtyNuVJS/2YNWVmtYZAk4LJw==" connect_timeout: 3 index: 'teacherset' - type: 'teacherset' + type: '_doc' teachersets_per_page: 10 size: 10000 test: teachersets: - host: "AQECAHjqALewp8JBJNxIQvR4oY795dyG7INaGR1glMsTEgetggAAALQwgbEGCSqGSIb3DQEHBqCBozCBoAIBADCBmgYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAyS9HSNvErgrdg9VuwCARCAbZYtB/RGgKYco/pRRFwU2rC2P6CMfQs4ExV20e693vMOqQiBHalhLXLASQVJZkR8Izatvt9G3pdhB7RdWbFaUh1HBiwQemuRV0rUnM3bhhAYh7I2SVUJFVCG3a07zmDDBLeVtEW+KbVXv9Qw0E0=" + host: 'http://elasticsearch:9200' connect_timeout: 3 index: 'teacherset' - type: 'teacherset' + type: '_doc' teachersets_per_page: 10 size: 10000 - \ No newline at end of file + diff --git a/config/environments/development.rb b/config/environments/development.rb index 651aca74f..a8a4934d6 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -2,6 +2,7 @@ MyLibraryNYC::Application.configure do # Settings specified here will take precedence over those in config/application.rb + # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. @@ -13,7 +14,7 @@ # Show full error reports and disable caching config.consider_all_requests_local = false - config.action_dispatch.show_exceptions = true + config.action_controller.perform_caching = false config.action_mailer.raise_delivery_errors = true @@ -36,24 +37,28 @@ # Expands the lines which load the assets config.assets.debug = true - config.action_mailer.default_url_options = { :host => ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil) } + + config.action_mailer.default_url_options = { :host => "#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}:3000" } config.action_mailer.perform_deliveries = false + config.api_only = false + # config.middleware.use ActionDispatch::Cookies + # config.middleware.use ActionDispatch::Session::CookieStore + # config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore) + + config.logger = Logger.new($stdout) + config.logger.level = Logger::DEBUG + + # Turn off asset pipline information showing in logs + config.assets.logger = true - config.middleware.use ActionDispatch::Cookies - config.middleware.use ActionDispatch::Session::CookieStore - config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore) + config.eager_load = false + config.active_job.queue_adapter = :delayed_job + config.exceptions_app = lambda do |env| ExceptionsController.action(:render_error).call(env) end - config.logger = ActiveSupport::Logger.new("log/my-library-nyc-application.log") - config.logger.level = Logger::DEBUG - config.hosts = [ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil), ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil), - ENV.fetch('MLN_ENVIRONMENT_URL', nil), ENV.fetch('MLN_API_GATEWAY_URL', nil), - "http://my-library-nyc-app-react-dev-18.9aa2mtunik.us-east-1.elasticbeanstalk.com", - "my-library-nyc-app-react-dev-18.9aa2mtunik.us-east-1.elasticbeanstalk.com"] - config.eager_load = false - config.active_job.queue_adapter = :delayed_job + config.assets.debug = true Delayed::Worker.logger = Rails.logger end diff --git a/config/environments/local.rb b/config/environments/local.rb deleted file mode 100644 index a8a4934d6..000000000 --- a/config/environments/local.rb +++ /dev/null @@ -1,64 +0,0 @@ -# frozen_string_literal: true - -MyLibraryNYC::Application.configure do - # Settings specified here will take precedence over those in config/application.rb - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - # config.cache_store = :memory_store - - # Log error messages when you accidentally call methods on nil. - config.whiny_nils = true - - # Show full error reports and disable caching - config.consider_all_requests_local = false - - config.action_controller.perform_caching = false - - config.action_mailer.raise_delivery_errors = true - - # Print deprecation notices to the Rails logger - config.active_support.deprecation = :log - - # Only use best-standards-support built into browsers - config.action_dispatch.best_standards_support = :builtin - - # Raise exception on mass assignment protection for Active Record models - # config.active_record.mass_assignment_sanitizer = :strict - - # Log the query plan for queries taking more than this (works - # with SQLite, MySQL, and PostgreSQL) - # config.active_record.auto_explain_threshold_in_seconds = 0.5 - - # Do not compress assets - config.assets.compress = false - - # Expands the lines which load the assets - config.assets.debug = true - - config.action_mailer.default_url_options = { :host => "#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}:3000" } - config.action_mailer.perform_deliveries = false - config.api_only = false - # config.middleware.use ActionDispatch::Cookies - # config.middleware.use ActionDispatch::Session::CookieStore - # config.middleware.insert_after(ActionDispatch::Cookies, ActionDispatch::Session::CookieStore) - - config.logger = Logger.new($stdout) - config.logger.level = Logger::DEBUG - - # Turn off asset pipline information showing in logs - config.assets.logger = true - - config.eager_load = false - - config.active_job.queue_adapter = :delayed_job - - config.exceptions_app = lambda do |env| - ExceptionsController.action(:render_error).call(env) - end - - config.assets.debug = true - Delayed::Worker.logger = Rails.logger -end diff --git a/config/environments/test.rb b/config/environments/test.rb index 269d18ecc..e152d0f39 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -7,13 +7,15 @@ # test suite. You never need to work with it otherwise. Remember that # your test database is "scratch space" for the test suite and is wiped # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true + config.cache_classes = false # Configure static asset server for tests with Cache-Control for performance config.serve_static_assets = true config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' } config.action_mailer.default_url_options = { :host => "http://test.host" } + config.action_cable.mount_path = nil + # Log error messages when you accidentally call methods on nil config.whiny_nils = true diff --git a/config/feature_flag.yml b/config/feature_flag.yml index a6997947c..49ebb9860 100644 --- a/config/feature_flag.yml +++ b/config/feature_flag.yml @@ -1,7 +1,3 @@ -local: - teacherset.data.from.elasticsearch.enabled: true - news_letter.enabled: true - signup.pin_password.enabled: false development: teacherset.data.from.elasticsearch.enabled: true news_letter.enabled: true @@ -17,4 +13,4 @@ production: test: teacherset.data.from.elasticsearch.enabled: true news_letter.enabled: true - signup.pin_password.enabled: true \ No newline at end of file + signup.pin_password.enabled: true diff --git a/config/initializers/lograge.rb b/config/initializers/lograge.rb index fc890e2f9..7408f6420 100644 --- a/config/initializers/lograge.rb +++ b/config/initializers/lograge.rb @@ -2,10 +2,14 @@ MyLibraryNYC::Application.configure do config.lograge.enabled = true - config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base', 'ActionController::TestCase', - 'ActionController::ParamsWrapper'] + config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base', 'ActionController::TestCase', 'ActionController::ParamsWrapper'] config.lograge.custom_options = lambda do |event| - {time: Time.now, :host => event.payload[:host], :params => event.payload[:params], :level => event.payload[:level]} + { + time: Time.now, + :host => event.payload[:host], + :params => event.payload[:params], + :level => event.payload[:level] + } end - config.lograge.formatter = Lograge::Formatters::Logstash.new + config.lograge.formatter = Lograge::Formatters::Json.new end diff --git a/config/routes.rb b/config/routes.rb index a60537a4d..dc7104dcd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ MyLibraryNYC::Application.routes.draw do - devise_for :users, :path => "users", :path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'signup' }, + devise_for :users, :path => "users", :path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'signup' }, :controllers => { :registrations => 'users/registrations', :sessions => 'users/sessions' } get 'hello_world', to: 'hello_world#index' @@ -15,7 +15,6 @@ get '/logged_in', to: 'sessions#logged_in?' get 'extend_session_iframe' => 'home#extend_session_iframe' get 'home/calendar_event/:filename', to: 'home#mln_calendar' - get 'home/calendar_event/error', to: 'home#calendar_event_error' get 'home/calendar_event', to: 'home#calendar_event' get 'home/newsletter_confirmation_msg', to: 'home#newsletter_confirmation_msg' get '/menu_of_services/:filename', to: 'home#menu_of_services' @@ -51,7 +50,7 @@ match '/home/get_mln_file_names' => 'home#mln_file_names', via: [:get] match '/secondary_menu' => 'home#secondary_menu', via: [:get] - match '/news_letter/validate_news_letter_email_from_user_sign_up_page' => 'news_letter#validate_news_letter_email_from_user_sign_up_page', + match '/news_letter/validate_news_letter_email_from_user_sign_up_page' => 'news_letter#validate_news_letter_email_from_user_sign_up_page', via: [:get, :post] match '/news_letter/news_letter_email_is_valid' => 'news_letter#news_letter_email_is_valid', via: [:get, :post] diff --git a/db/migrate/20180920201052_create_versions.rb b/db/migrate/20180920201052_create_versions.rb index 3dfca793e..5ae817bd8 100644 --- a/db/migrate/20180920201052_create_versions.rb +++ b/db/migrate/20180920201052_create_versions.rb @@ -19,8 +19,8 @@ class CreateVersions < ActiveRecord::Migration[4.2] TEXT_BYTES = 1_073_741_823 def change - create_table :versions, versions_table_options do |t| - t.string :item_type, item_type_options + create_table :versions, **versions_table_options do |t| + t.string :item_type, **item_type_options t.integer :item_id, null: false, limit: 8 t.string :event, null: false t.string :whodunnit diff --git a/db/schema.rb b/db/schema.rb index 430d2ced8..06b7227f9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,284 +1,280 @@ -# frozen_string_literal: true - # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20240108205825) do - +ActiveRecord::Schema[7.2].define(version: 2024_11_03_215851) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "active_admin_comments", force: :cascade do |t| - t.string "resource_id", null: false - t.string "resource_type", null: false - t.integer "author_id" - t.string "author_type" - t.text "body" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "namespace" - t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id", using: :btree - t.index ["namespace"], name: "index_active_admin_comments_on_namespace", using: :btree - t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id", using: :btree + create_table "active_admin_comments", id: :serial, force: :cascade do |t| + t.string "resource_id", null: false + t.string "resource_type", null: false + t.string "author_type" + t.integer "author_id" + t.text "body" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.string "namespace" + t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id" + t.index ["namespace"], name: "index_active_admin_comments_on_namespace" + t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id" end - create_table "admin_users", force: :cascade do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" - t.datetime "reset_password_sent_at" - t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false - t.datetime "current_sign_in_at" - t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "email_notifications", default: true - t.index ["email"], name: "index_admin_users_on_email", unique: true, using: :btree - t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true, using: :btree + create_table "admin_users", id: :serial, force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at", precision: nil + t.datetime "remember_created_at", precision: nil + t.integer "sign_in_count", default: 0, null: false + t.datetime "current_sign_in_at", precision: nil + t.datetime "last_sign_in_at", precision: nil + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.boolean "email_notifications", default: true + t.index ["email"], name: "index_admin_users_on_email", unique: true + t.index ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true end - create_table "allowed_user_email_masks", force: :cascade do |t| - t.string "email_pattern", null: false - t.boolean "active", default: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "allowed_user_email_masks", id: :serial, force: :cascade do |t| + t.string "email_pattern", null: false + t.boolean "active", default: false + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false end - create_table "books", id: :bigserial, force: :cascade do |t| - t.text "title" - t.text "sub_title" - t.text "format" - t.text "details_url" - t.string "publication_date" - t.string "isbn" - t.string "primary_language" - t.text "call_number" - t.text "description" - t.text "physical_description" - t.text "notes" - t.text "statement_of_responsibility" - t.string "cover_uri" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "bnumber", limit: 20 - t.string "bib_code_3" - t.index ["bnumber"], name: "index_books_bnumber", using: :btree - t.index ["title"], name: "index_books_title", using: :btree + create_table "books", force: :cascade do |t| + t.text "title" + t.text "sub_title" + t.text "format" + t.text "details_url" + t.string "publication_date" + t.string "isbn" + t.string "primary_language" + t.text "call_number" + t.text "description" + t.text "physical_description" + t.text "notes" + t.text "statement_of_responsibility" + t.string "cover_uri" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.string "bnumber", limit: 20 + t.string "bib_code_3" + t.index ["bnumber"], name: "index_books_bnumber" + t.index ["title"], name: "index_books_title" end - create_table "boroughs", force: :cascade do |t| - t.string "name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "boroughs", id: :serial, force: :cascade do |t| + t.string "name" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false end - create_table "campuses", force: :cascade do |t| - t.string "name" - t.integer "borough_id" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["borough_id"], name: "index_campuses_on_borough_id", using: :btree + create_table "campuses", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "borough_id" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.index ["borough_id"], name: "index_campuses_on_borough_id" end - create_table "faqs", force: :cascade do |t| - t.text "question" - t.text "answer" - t.integer "position" + create_table "delayed_jobs", id: :serial, force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false + t.text "last_error" + t.datetime "run_at", precision: nil + t.datetime "locked_at", precision: nil + t.datetime "failed_at", precision: nil + t.string "locked_by" + t.string "queue" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.index ["priority", "run_at"], name: "delayed_jobs_priority" + end + + create_table "documents", force: :cascade do |t| + t.string "event_type" + t.string "url" + t.string "file_name" + t.binary "file" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - create_table "delayed_jobs", force: :cascade do |t| - t.integer "priority", default: 0, null: false - t.integer "attempts", default: 0, null: false - t.text "handler", null: false - t.text "last_error" - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by" - t.string "queue" - t.datetime "created_at" - t.datetime "updated_at" - t.index ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree + create_table "faqs", id: :serial, force: :cascade do |t| + t.text "question" + t.text "answer" + t.integer "position" end - create_table "hold_changes", force: :cascade do |t| - t.bigint "hold_id" - t.bigint "admin_user_id" - t.string "status", limit: 9 - t.text "comment" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "hold_changes", id: :serial, force: :cascade do |t| + t.bigint "hold_id" + t.bigint "admin_user_id" + t.string "status", limit: 9 + t.text "comment" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil end - create_table "holds", force: :cascade do |t| - t.bigint "teacher_set_id" - t.bigint "user_id" - t.date "date_required" - t.string "status", limit: 9, default: "new" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "access_key", limit: 30 - t.integer "quantity", default: 1 - t.index ["access_key"], name: "index_holds_access_key", unique: true, using: :btree + create_table "holds", id: :serial, force: :cascade do |t| + t.bigint "teacher_set_id" + t.bigint "user_id" + t.date "date_required" + t.string "status", limit: 9, default: "new" + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.string "access_key", limit: 30 + t.integer "quantity", default: 1 + t.index ["access_key"], name: "index_holds_access_key", unique: true end - create_table "schools", force: :cascade do |t| - t.string "name" - t.integer "campus_id" - t.string "code", limit: 32 - t.boolean "active", default: false - t.string "address_line_1" - t.string "address_line_2" - t.string "state" - t.string "postal_code" - t.string "phone_number" - t.string "borough" - t.datetime "created_at", null: false - t.datetime "updated_at" - t.index ["active"], name: "index_schools_on_active", using: :btree - t.index ["campus_id"], name: "index_schools_on_campus_id", using: :btree - t.index ["code"], name: "index_schools_on_code", unique: true, using: :btree + create_table "schools", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "campus_id" + t.string "code", limit: 60 + t.boolean "active", default: false + t.string "address_line_1" + t.string "address_line_2" + t.string "state" + t.string "postal_code" + t.string "phone_number" + t.string "borough" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil + t.index ["active"], name: "index_schools_on_active" + t.index ["campus_id"], name: "index_schools_on_campus_id" + t.index ["code"], name: "index_schools_on_code", unique: true end - create_table "sierra_code_zcode_matches", force: :cascade do |t| - t.integer "sierra_code" - t.string "zcode" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "sierra_code_zcode_matches", id: :serial, force: :cascade do |t| + t.integer "sierra_code" + t.string "zcode" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false end create_table "subject_teacher_sets", id: false, force: :cascade do |t| t.integer "subject_id" - t.bigint "teacher_set_id" - t.index ["subject_id", "teacher_set_id"], name: "index_subject_teacher_sets_on_subject_id_and_teacher_set_id", using: :btree - t.index ["teacher_set_id"], name: "index_subject_teacher_sets_on_teacher_set_id", using: :btree + t.bigint "teacher_set_id" + t.index ["subject_id", "teacher_set_id"], name: "index_subject_teacher_sets_on_subject_id_and_teacher_set_id" + t.index ["teacher_set_id"], name: "index_subject_teacher_sets_on_teacher_set_id" end - create_table "subjects", force: :cascade do |t| - t.string "title", limit: 30 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["title"], name: "index_subjects_title", unique: true, using: :btree + create_table "subjects", id: :serial, force: :cascade do |t| + t.string "title", limit: 30 + t.datetime "created_at", precision: nil + t.datetime "updated_at", precision: nil + t.index ["title"], name: "index_subjects_title", unique: true end - create_table "teacher_set_books", force: :cascade do |t| - t.bigint "book_id", null: false - t.bigint "teacher_set_id" - t.integer "rank", limit: 2, default: 0, null: false - t.index ["book_id"], name: "index_teacher_set_books_book_id", using: :btree - t.index ["teacher_set_id"], name: "index_teacher_set_books_teacher_set_id", using: :btree + create_table "teacher_set_books", id: :serial, force: :cascade do |t| + t.bigint "book_id", null: false + t.bigint "teacher_set_id" + t.integer "rank", limit: 2, default: 0, null: false + t.index ["book_id"], name: "index_teacher_set_books_book_id" + t.index ["teacher_set_id"], name: "index_teacher_set_books_teacher_set_id" end - create_table "teacher_set_notes", force: :cascade do |t| - t.bigint "teacher_set_id" - t.text "content" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["teacher_set_id"], name: "index_book_set_notes_on_book_set_id", using: :btree + create_table "teacher_set_notes", id: :serial, force: :cascade do |t| + t.bigint "teacher_set_id" + t.text "content" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.index ["teacher_set_id"], name: "index_book_set_notes_on_book_set_id" end - create_table "teacher_sets", id: :bigserial, force: :cascade do |t| - t.text "title" - t.string "call_number" - t.text "description" - t.text "details_url" - t.text "edition" - t.datetime "publication_date" - t.text "statement_of_responsibility" - t.text "sub_title" - t.string "availability" - t.string "isbn" - t.string "language" - t.text "physical_description" - t.string "primary_language" - t.text "publisher" - t.text "series" - t.integer "grade_begin", limit: 2 - t.integer "grade_end", limit: 2 - t.integer "lexile_begin" - t.integer "lexile_end" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "available_copies" - t.integer "total_copies" - t.string "area_of_study" - t.string "bnumber", limit: 20 - t.text "set_type" - t.text "contents" - t.text "last_book_change" - t.string "bib_code_3" - t.index ["area_of_study"], name: "index_area_of_study", using: :btree - t.index ["availability"], name: "index_teacher_sets_availaibilty", using: :btree - t.index ["bnumber"], name: "index_teacher_sets_bnumber", unique: true, using: :btree - t.index ["grade_begin", "grade_end"], name: "index_teacher_sets_grades", using: :btree - t.index ["lexile_begin", "lexile_end"], name: "index_teacher_sets_lexile", using: :btree - t.index ["set_type"], name: "index_teacher_set_type", using: :btree - t.index ["title"], name: "index_teacher_sets_title", using: :btree + create_table "teacher_sets", force: :cascade do |t| + t.text "title" + t.string "call_number" + t.text "description" + t.text "details_url" + t.text "edition" + t.datetime "publication_date", precision: nil + t.text "statement_of_responsibility" + t.text "sub_title" + t.string "availability" + t.string "isbn" + t.string "language" + t.text "physical_description" + t.string "primary_language" + t.text "publisher" + t.text "series" + t.integer "grade_begin", limit: 2 + t.integer "grade_end", limit: 2 + t.integer "lexile_begin" + t.integer "lexile_end" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.integer "available_copies" + t.integer "total_copies" + t.string "area_of_study" + t.string "bnumber", limit: 20 + t.text "set_type" + t.text "contents" + t.text "last_book_change" + t.index ["area_of_study"], name: "index_area_of_study" + t.index ["availability"], name: "index_teacher_sets_availaibilty" + t.index ["bnumber"], name: "index_teacher_sets_bnumber", unique: true + t.index ["grade_begin", "grade_end"], name: "index_teacher_sets_grades" + t.index ["lexile_begin", "lexile_end"], name: "index_teacher_sets_lexile" + t.index ["set_type"], name: "index_teacher_set_type" + t.index ["title"], name: "index_teacher_sets_title" end - create_table "users", force: :cascade do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" - t.datetime "reset_password_sent_at" - t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false - t.datetime "current_sign_in_at" - t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - t.string "confirmation_token" - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" - t.string "unconfirmed_email" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.bigint "barcode", null: false - t.string "first_name", limit: 40 - t.string "last_name", limit: 40 - t.string "alt_email" - t.string "home_library", limit: 6 - t.integer "school_id" - t.text "alt_barcodes" - t.string "status" - t.index "lower((email)::text), lower((alt_email)::text)", name: "index_users_on_email_or_alt_email_lower", using: :btree - t.index ["barcode"], name: "index_users_barcode", unique: true, using: :btree - t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree - t.index ["email"], name: "index_users_on_email", unique: true, using: :btree - t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + create_table "users", id: :serial, force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" + t.datetime "reset_password_sent_at", precision: nil + t.datetime "remember_created_at", precision: nil + t.integer "sign_in_count", default: 0, null: false + t.datetime "current_sign_in_at", precision: nil + t.datetime "last_sign_in_at", precision: nil + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.string "confirmation_token" + t.datetime "confirmed_at", precision: nil + t.datetime "confirmation_sent_at", precision: nil + t.string "unconfirmed_email" + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.bigint "barcode", null: false + t.string "first_name", limit: 40 + t.string "last_name", limit: 40 + t.string "alt_email" + t.string "home_library", limit: 6 + t.integer "school_id" + t.text "alt_barcodes" + t.string "status" + t.index ["barcode"], name: "index_users_barcode", unique: true + t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true + t.index ["email"], name: "index_users_on_email", unique: true + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true + t.index ["school_id"], name: "index_users_on_school_id" end - create_table "versions", force: :cascade do |t| - t.string "item_type", null: false - t.bigint "item_id", null: false - t.string "event", null: false - t.string "whodunnit" - t.text "object" - t.datetime "created_at" - t.text "object_changes" - t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id", using: :btree - end - - create_table "documents", force: :cascade do |t| - t.string "event_type" - t.string "url" - t.string "file_name" - t.binary "file" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false + create_table "versions", id: :serial, force: :cascade do |t| + t.string "item_type", null: false + t.bigint "item_id", null: false + t.string "event", null: false + t.string "whodunnit" + t.text "object" + t.datetime "created_at", precision: nil + t.text "object_changes" + t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id" end - add_foreign_key "users", "schools", column: "school_id", primary_key: "id" + add_foreign_key "users", "schools" end diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..65eb2587c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,45 @@ +services: + webapp: + stdin_open: true + tty: true + build: + context: . + ports: + - '3000:3000' + environment: + - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} + - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} + - RAILS_ENV=development + volumes: + - .:/app + depends_on: + - postgres + - elasticsearch + command: > + bash -c " + RAILS_ENV=test bundle exec rake db:set_up_for_local; + RAILS_ENV=development bundle exec rake db:set_up_for_local; + bundle exec rails server -b 0.0.0.0 + " + + postgres: + image: postgres:13 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + volumes: + - './data/postgres-my-library-nyc-app:/var/lib/postgresql/data' + ports: + - '5432:5432' + + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0 + environment: + - discovery.type=single-node + ports: + - '9200:9200' + volumes: + - 'esdata:/usr/share/elasticsearch/data' + +volumes: + esdata: diff --git a/lib/tasks/add.rake b/lib/tasks/add.rake index 543fbbed8..419a53b05 100644 --- a/lib/tasks/add.rake +++ b/lib/tasks/add.rake @@ -9,10 +9,10 @@ # desc "Add prod data to #{ENV['RAILS_ENV']} db" # task :add_data, [] => :environment do |t, args| -# sh 'dropdb mln_local --if-exists' -# sh 'heroku pg:pull DATABASE mln_local -a mylibrarynyc' -# sh 'psql mln_local -c "alter table teacher_sets drop column test_column"' -# sh 'pg_dump mln_local -f db/seed-data.sql --data-only --exclude-table="schema_migrations" --inserts --column-inserts' +# sh 'dropdb mln_development --if-exists' +# sh 'heroku pg:pull DATABASE mln_development -a mylibrarynyc' +# sh 'psql mln_development -c "alter table teacher_sets drop column test_column"' +# sh 'pg_dump mln_development -f db/seed-data.sql --data-only --exclude-table="schema_migrations" --inserts --column-inserts' # sh "psql #{ENV['DATABASE_URL']} -c 'drop schema public cascade'" # sh "psql #{ENV['DATABASE_URL']} -c 'create schema public'" diff --git a/lib/tasks/db_set_up_for_local.rake b/lib/tasks/db_set_up_for_local.rake new file mode 100644 index 000000000..ba0b1bc0c --- /dev/null +++ b/lib/tasks/db_set_up_for_local.rake @@ -0,0 +1,16 @@ +namespace :db do + desc "Setup the database if it doesn't exist" + task set_up_for_local: :environment do + env = ENV['RAILS_ENV'] || 'development' + + if ActiveRecord::Base.connection.database_exists? + puts "#{env.capitalize} database already exists" + else + puts "Setting up #{env} database..." + Rake::Task["db:create"].invoke + Rake::Task["db:schema:load"].invoke + Rake::Task["db:seed"].invoke if env == 'development' + end + end +end + diff --git a/lib/tasks/ingest.rake b/lib/tasks/ingest.rake index 7f5544d17..965488a87 100644 --- a/lib/tasks/ingest.rake +++ b/lib/tasks/ingest.rake @@ -262,9 +262,9 @@ school: school} School.active.each do |school| code = school.code path = "#{dumps_base}/#{code}.csv" - path = "#{dumps_base}/e#{code}.csv" if !File.exists?(path) + path = "#{dumps_base}/e#{code}.csv" if !File.exist?(path) - if File.exists?(path) + if File.exist?(path) puts "Process teachers for #{code}" CSV.foreach(path) do |line| # "p44607908",151,"KIM, DENISE",23333087938609,"zx445",9/27/2013,0,2,9/14/2011,"example@myschool.edu" diff --git a/lib/tasks/seed_teacher_sets.rake b/lib/tasks/seed_teacher_sets.rake new file mode 100644 index 000000000..0cf28b8e9 --- /dev/null +++ b/lib/tasks/seed_teacher_sets.rake @@ -0,0 +1,60 @@ +namespace :seeds do + desc "Seed Teacher Sets in Elasticsearch" + + task teacher_sets: :environment do + failed = [] + + TeacherSet.find_each do |ts| + created_at = ts.created_at.present? ? ts.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil + updated_at = ts.updated_at.present? ? ts.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil + availability = ts.availability.present? ? ts.availability.downcase : nil + + begin + subjects_arr = [] + + if ts.subjects.present? + ts.subjects.uniq.each do |subject| + subjects_hash = {} + s_created_at = subject.created_at.present? ? subject.created_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil + s_updated_at = subject.updated_at.present? ? subject.updated_at.strftime("%Y-%m-%dT%H:%M:%S%z") : nil + subjects_hash[:id] = subject.id + subjects_hash[:title] = subject.title + subjects_hash[:created_at] = s_created_at + subjects_hash[:updated_at] = s_updated_at + subjects_arr << subjects_hash + end + end + + body = { + title: ts.title, + description: ts.description, + contents: ts.contents, + id: ts.id.to_i, + details_url: ts.details_url, + grade_end: ts.grade_end, + grade_begin: ts.grade_begin, + availability: availability, + total_copies: ts.total_copies, + call_number: ts.call_number, + language: ts.language, + physical_description: ts.physical_description, + primary_language: ts.primary_language, + created_at: created_at, + updated_at: updated_at, + available_copies: ts.available_copies, + bnumber: ts.bnumber, + set_type: ts.set_type, + area_of_study: ts.area_of_study, + subjects: subjects_arr + } + + ElasticSearch.new.create_document(ts.id, body) + puts "updating elastic search" + rescue Elasticsearch::Transport::Transport::Errors::Conflict => e + puts "Error in elastic search: #{e.inspect}" + failed << ts.id + end + end + puts "Teacher sets with ids #{failed} not created" unless failed.empty? + end +end diff --git a/lib/tasks/sync_users.rake b/lib/tasks/sync_users.rake index a114419c7..97f2400a0 100644 --- a/lib/tasks/sync_users.rake +++ b/lib/tasks/sync_users.rake @@ -11,7 +11,7 @@ namespace :sync_users do # For each user, see if they exist in the MLN database. # If they do, and if the MLN user was created within the last month, while the Sierra user has been there for longer than that, # then this is a user account manually fixed by the Library Outreach team. - # call like this: RAILS_ENV=local rake check_user_fixes:check_mismatch['data/private/20181128_sierra_mln_user_accounts.csv',2,1,'23333090060508'] + # call like this: RAILS_ENV=development rake check_user_fixes:check_mismatch['data/private/20181128_sierra_mln_user_accounts.csv',2,1,'23333090060508'] desc "Check manually made account fixes" task :check_user_fixes, [:file_name, :start, :limit, :barcode] => :environment do |t, args| # if barcode is set, then only checks that barcode for Sierra-MLN mismatch @@ -86,7 +86,7 @@ namespace :sync_users do # For each user, see if they exist in the MLN database. # If they do not, then output the user, so we can review them later. # TODO: later functionality -- write to db a new user. - # call like this: RAILS_ENV=local rake sync_users:ingest_mismatched_sierra_users['data/private/20181128_sierra_mln_user_accounts.csv',2,1, + # call like this: RAILS_ENV=development rake sync_users:ingest_mismatched_sierra_users['data/private/20181128_sierra_mln_user_accounts.csv',2,1, # '23333090060508'] # @param safetyoff -- manually set this in the task call, to really truly write to the DB (a destructive change) desc "Check and Automatically Fix Sierra-MLN mismatch" diff --git a/package.json b/package.json index cc418a16f..d73194ff6 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,11 @@ "mocha": "4.0.1", "nightwatch": "^1.7.8", "nock": "^13.0.11", - "node-sass": "6.0", - "node-sass-glob-importer": "^5.3.2", "nyc": "^13.0.0", "prettier": "2.7.1", "react-addons-test-utils": "15.6.0", "redux-mock-store": "^1.5.4", + "sass": "^1.71.1", "sinon": "4.0.1", "supertest": "^6.1.5", "typescript": "^4.7.4" @@ -98,8 +97,6 @@ "jest-mock-axios": "^4.7.3", "jquery": "^3.6.0", "mini-css-extract-plugin": "^0.9.0", - "node-sass": "6.0", - "node-sass-glob-importer": "^5.3.2", "npm": "^7.20.5", "postcss": "8.4.21", "postcss-flexbugs-fixes": "^5.0.2", diff --git a/script/elastic_search/create_es_index_mappings.sh b/script/elastic_search/create_es_index_mappings.sh index 8277e3249..4e0d10faf 100755 --- a/script/elastic_search/create_es_index_mappings.sh +++ b/script/elastic_search/create_es_index_mappings.sh @@ -8,121 +8,142 @@ curl -XPUT "$es_url/teacherset?" -H 'Content-Type: application/json' -d ' "analysis": { "analyzer": { "ts_analyzer": { - "tokenizer" : "standard", - "filter": ["standard", "lowercase", "stop", "asciifolding"] + "tokenizer": "standard", + "filter": ["lowercase", "stop", "asciifolding"] } } } }, "mappings": { - "teacherset" :{ - "properties": { + "properties": { + "title": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + }, + "analyzer": "default" + }, + "description": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + }, + "analyzer": "default" + }, + "contents": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + }, + "analyzer": "default" + }, + "grade_begin": { + "type": "long" + }, + "grade_end": { + "type": "long" + }, + "id": { + "type": "long" + }, + "details_url": { + "type": "text" + }, + "availability": { + "type": "text", + "fields": { + "raw": { + "type": "keyword" + } + } + }, + "total_copies": { + "type": "long" + }, + "call_number": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + } + }, + "language": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + } + }, + "physical_description": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + } + }, + "primary_language": { + "type": "text", + "fielddata": true + }, + "available_copies": { + "type": "long" + }, + "bnumber": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword" + } + } + }, + "set_type": { + "type": "text", + "fielddata": true + }, + "area_of_study": { + "type": "text", + "fielddata": true + }, + "created_at": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + }, + "updated_at": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" + }, + "subjects": { + "type": "nested", + "properties": { + "id": { + "type": "long" + }, "title": { "type": "text", "fields": { "keyword": { - "type": "keyword" + "type": "keyword" } - }, - "analyzer": "ts_analyzer" + } }, - "description": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword" - } - }, - "analyzer": "ts_analyzer" + "created_at": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" }, - "contents": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword" - } - }, - "analyzer": "ts_analyzer" - }, - "grade_begin": { - "type": "integer" - }, - "grade_end": { - "type": "integer" - }, - "id": { - "type": "long" - }, - "details_url": { - "type": "keyword" - }, - "availability": { - "type": "text", - "fields": { - "raw": { - "type": "keyword" - } - } - }, - "total_copies": { - "type": "keyword" - }, - "call_number":{ - "type": "keyword" - }, - "language": { - "type": "keyword" - }, - "physical_description":{ - "type": "keyword" - }, - "primary_language": { - "type": "keyword" - }, - "available_copies": { - "type": "integer" - }, - "bnumber": { - "type": "keyword" - }, - "set_type":{ - "type": "keyword" - }, - "area_of_study": { - "type": "keyword" - }, - "created_at": { - "type": "date", - "format": "date_time_no_millis" - }, - "updated_at": { - "type": "date", - "format": "date_time_no_millis" - }, - "subjects": { - "type": "nested", - "properties": { - "id": { - "type": "integer" - }, - "title": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword" - } - } - }, - "created_at": { - "type": "date", - "format": "date_time_no_millis" - }, - "updated_at": { - "type": "date", - "format": "date_time_no_millis" - } - } + "updated_at": { + "type": "date", + "format": "strict_date_optional_time||epoch_millis" } + } } } } diff --git a/spec/factories/factories.rb b/spec/factories/factories.rb new file mode 100644 index 000000000..e4e4a8b9e --- /dev/null +++ b/spec/factories/factories.rb @@ -0,0 +1,36 @@ +FactoryBot.define do + factory :book do + end + + factory :faq do + end + + factory :hold do + teacher_set { create(:teacher_set) } + user { create(:user) } + end + + factory :teacher_set do + available_copies { 5 } + end + + factory :user do + email { 'test_user@schools.nyc.gov' } + password { Faker::Internet.password } + first_name { Faker::Name.first_name } + last_name { Faker::Name.last_name } + barcode { Faker::Number.number } + school { create(:school) } + + after(:build) { |u| create(:allowed_user_email_masks) } + end + + factory :allowed_user_email_masks do + active { true } + email_pattern { '@schools.nyc.gov' } + end + + factory :school do + name { 'Test School' } + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb new file mode 100644 index 000000000..d93143ced --- /dev/null +++ b/spec/rails_helper.rb @@ -0,0 +1,83 @@ +# This file is copied to spec/ when you run 'rails generate rspec:install' +require 'spec_helper' +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +# Prevent database truncation if the environment is production +abort("The Rails environment is running in production mode!") if Rails.env.production? +# Uncomment the line below in case you have `--require rails_helper` in the `.rspec` file +# that will avoid rails generators crashing because migrations haven't been run yet +# return unless Rails.env.test? +require 'rspec/rails' +# Add additional requires below this line. Rails is not loaded until this point! + +# Requires supporting ruby files with custom matchers and macros, etc, in +# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are +# run as spec files by default. This means that files in spec/support that end +# in _spec.rb will both be required and run as specs, causing the specs to be +# run twice. It is recommended that you do not name files matching this glob to +# end with _spec.rb. You can configure this pattern with the --pattern +# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. +# +# The following line is provided for convenience purposes. It has the downside +# of increasing the boot-up time by auto-requiring all files in the support +# directory. Alternatively, in the individual `*_spec.rb` files, manually +# require only the support files necessary. +# +# Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f } + +# Checks for pending migrations and applies them before tests are run. +# If you are not using ActiveRecord, you can remove these lines. +begin + ActiveRecord::Migration.maintain_test_schema! +rescue ActiveRecord::PendingMigrationError => e + abort e.to_s.strip +end + +RSpec.configure do |config| + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + config.fixture_paths = [ + Rails.root.join('spec/fixtures') + ] + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + config.use_transactional_fixtures = true + + # You can uncomment this line to turn off ActiveRecord support entirely. + # config.use_active_record = false + + # RSpec Rails can automatically mix in different behaviours to your tests + # based on their file location, for example enabling you to call `get` and + # `post` in specs under `spec/controllers`. + # + # You can disable this behaviour by removing the line below, and instead + # explicitly tag your specs with their type, e.g.: + # + # RSpec.describe UsersController, type: :controller do + # # ... + # end + # + # The different available types are documented in the features, such as in + # https://rspec.info/features/7-0/rspec-rails + config.infer_spec_type_from_file_location! + + # Filter lines from Rails gems in backtraces. + config.filter_rails_from_backtrace! + # arbitrary gems may also be filtered via: + # config.filter_gems_from_backtrace("gem name") + # + config.include FactoryBot::Syntax::Methods + + config.before(:suite) do + DatabaseCleaner.strategy = :transaction + DatabaseCleaner.allow_remote_database_url = true + DatabaseCleaner.clean_with(:truncation) + end + + config.around(:each) do |example| + DatabaseCleaner.cleaning do + example.run + end + end +end diff --git a/spec/requests/book_spec.rb b/spec/requests/book_spec.rb new file mode 100644 index 000000000..a0709d916 --- /dev/null +++ b/spec/requests/book_spec.rb @@ -0,0 +1,115 @@ +require 'rails_helper' + +RSpec.describe 'Book', type: :request do + describe '#index' do + let!(:book) { create(:book) } + let(:get_url) { "http://localhost:3000/books" } + + # Fix this if we want to serve /books. Otherwise, remove the route. (@JC 2024-10-03) + it 'returns a 406 not acceptable' do + get get_url, headers: { "ACCEPT" => "text/html" } + expect(response.response_code).to eq(406) + end + end + + describe '#show' do + let!(:book) { create(:book) } + let(:get_url) { "http://localhost:3000/books/#{book_id}" } + + context 'the book exists' do + let(:book_id) { book.id } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + context 'the book does not exist' do + let(:book_id) { 0 } + + it 'returns a 404 not found' do + get get_url + expect(response.response_code).to eq(404) + end + end + end + + describe '#book_details' do + let!(:book) { create(:book) } + let(:get_url) { "http://localhost:3000/book_details/#{book_id}" } + + context 'the book exists' do + let(:book_id) { book.id } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + context 'the book does not exist' do + let(:book_id) { 0 } + + # Maybe this should return a 404? (@JC 2024-10-03) + it 'gets successfully' do + get get_url + expect(response.response_code).to eq(200) + end + end + end + + ALLOWED_BOOK_PARAMS = %i[call_number cover_uri description details_url format isbn notes physical_description primary_language publication_date statement_of_responsibility sub_title title bnumber].freeze + + describe '#create' do + let(:post_url) { "http://localhost:3000/books" } + + context 'with no params' do + let(:book_params) { {} } + + it 'creates an empty book successfully' do + post post_url, params: book_params + expect(response.response_code).to eq(204) + from_db = Book.last + ALLOWED_BOOK_PARAMS.each { |param| expect(from_db.send(param)).to be_nil } + end + end + + context 'with all allowed params but catalog choice' do + let(:book_params) { {} } + + before do + ALLOWED_BOOK_PARAMS.each { |param| book_params[param] = "test_#{param}" } + end + + it 'creates an empty book successfully' do + post post_url, params: book_params + expect(response.response_code).to eq(204) + from_db = Book.last + ALLOWED_BOOK_PARAMS.each { |param| expect(from_db.send(param)).to eq("test_#{param}") } + end + end + + context 'with catalog choice' do + let(:book_params) { { :catalog_choice => 'some_catalog_choice' } } + + it 'creates the book successfully' do + post post_url, params: book_params + expect(response.response_code).to eq(204) + from_db = Book.last + from_db.catalog_choice = 'some_catalog_choice' + end + end + + context 'with only disallowed params' do + let(:book_params) { { :fake_param => 'fake_value', :another_fake_param => 'another_fake_value' } } + + it 'creates the empty book successfully' do + post post_url, params: book_params + expect(response.response_code).to eq(204) + from_db = Book.last + ALLOWED_BOOK_PARAMS.each { |param| expect(from_db.send(param)).to be_nil } + end + end + end +end diff --git a/spec/requests/hold_spec.rb b/spec/requests/hold_spec.rb new file mode 100644 index 000000000..fe813498e --- /dev/null +++ b/spec/requests/hold_spec.rb @@ -0,0 +1,48 @@ +require 'rails_helper' + +RSpec.describe 'Hold', type: :request do + describe '#index' do + let(:get_url) { "http://localhost:3000/holds" } + + it 'redirects' do + get get_url + expect(response.response_code).to eq(302) + end + end + + describe '#show' do + let(:get_url) { "http://localhost:3000/holds/#{hold_access_key}" } + let!(:hold) { create(:hold) } + + context 'the hold exists' do + let(:hold_access_key) { hold.access_key } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + context 'the hold does not exist' do + let(:hold_access_key) { 'unknown' } + + # probably should be a 404 (@JC - 2020-07-07) + it 'returns a 500 error' do + get get_url + expect(response.code).to eq('500') + end + end + end + + describe '#new' do + let(:get_url) { "http://localhost:3000/holds/new.json" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + + +end diff --git a/spec/requests/home_spec.rb b/spec/requests/home_spec.rb new file mode 100644 index 000000000..1a9a192db --- /dev/null +++ b/spec/requests/home_spec.rb @@ -0,0 +1,117 @@ +require 'rails_helper' + +RSpec.describe 'Home', type: :request do + describe '#index' do + let(:get_url) { "http://localhost:3000" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#mln_file_names' do + let(:get_url) { "http://localhost:3000/home/get_mln_file_names" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#swagger_docs' do + let(:get_url) { "http://localhost:3000/docs/mylibrarynyc" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#digital_resources' do + let(:get_url) { "http://localhost:3000/help/access-digital-resources" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#help' do + let(:get_url) { "http://localhost:3000/contact" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#faq_data' do + let(:get_url) { "http://localhost:3000/faq" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#newsletter_confirmation' do + let(:get_url) { "http://localhost:3000/newsletter_confirmation" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#newsletter_confirmation_msg' do + let(:get_url) { "http://localhost:3000/home/newsletter_confirmation_msg" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#calendar_event' do + let(:get_url) { "http://localhost:3000/home/calendar_event" } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#mln_calendar' do + let(:get_url) { "http://localhost:3000/home/calendar_event/#{filename}" } + let(:filename) { 'some_filename.pdf' } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + describe '#menu_of_services' do + let(:get_url) { "http://localhost:3000/menu_of_services/#{filename}" } + + context 'filename is menu_of_services.pdf' do + let(:filename) { 'menu_of_services.pdf' } + + it 'gets successfully' do + get get_url + expect(response).to be_successful + end + end + + context 'filename is something else' do + let(:filename) { 'something_else.pdf' } + + it 'redirects' do + get get_url + expect(response.response_code).to eq(302) + end + end + end + +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 000000000..327b58ea1 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,94 @@ +# This file was generated by the `rails generate rspec:install` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + config.disable_monkey_patching! + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/test/fixtures/holds.yml b/test/fixtures/holds.yml index 4799b8b09..748556a64 100644 --- a/test/fixtures/holds.yml +++ b/test/fixtures/holds.yml @@ -7,7 +7,7 @@ hold1: teacher_set: [teacher_set_one, teacher_set_two] user: user1 teacher_set_id: teacher_set_one.id - + hold2: access_key: access_key2 status: new @@ -69,6 +69,7 @@ hold10: user: user1 quantity: 2 teacher_set_id: teacher_set_eight.id + hold11: access_key: access_key11 teacher_set: nil diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index ba0896a95..f6494a462 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -9,22 +9,22 @@ user1: id: 206669143 email: myText@test.com school_id: 382274395 - school: school_one first_name: 'firstname' last_name: 'lastname' + barcode: '0000000000' user2: id: "1234" email: myText1@test.com school_id: 382274395 - school: school_one first_name: 'firstname' last_name: 'lastname' + barcode: '1111111111' user3: id: "12345" email: myText5@test.com school_id: 38227476 - school: school_three first_name: 'firstname3' - last_name: 'lastname3' \ No newline at end of file + last_name: 'lastname3' + barcode: '2222222222' diff --git a/test/functional/admin/holds_controller_test.rb b/test/functional/admin/holds_controller_test.rb index 4cbf73770..b0b9e12e9 100644 --- a/test/functional/admin/holds_controller_test.rb +++ b/test/functional/admin/holds_controller_test.rb @@ -21,7 +21,6 @@ class HoldsControllerTest < ActionController::TestCase assert_response :success end - test "Teacher set no longer exist for hold" do # @hold11 = this hold does not have any teacher-set. get :show, params: { id: @hold11.id } diff --git a/test/functional/api/v01/general_controller_test.rb b/test/functional/api/v01/general_controller_test.rb index d05a27ab3..de4533e92 100644 --- a/test/functional/api/v01/general_controller_test.rb +++ b/test/functional/api/v01/general_controller_test.rb @@ -2,14 +2,14 @@ require 'test_helper' -class Api::GeneralControllerTest < MiniTest::Test +class Api::GeneralControllerTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper before do @controller = Api::V01::GeneralController.new - @mintest_mock1 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new body = StringIO.new body.puts "#{{:test=>"test1"}}" @request = Struct.new(:key, :body).new('1234', body) @@ -18,7 +18,7 @@ class Api::GeneralControllerTest < MiniTest::Test describe '#test set_request_body' do it 'test request body' do - resp = @controller.set_request_body + resp = @controller.send(:set_request_body) assert_equal(resp.class, NoMethodError) end end @@ -27,19 +27,20 @@ class Api::GeneralControllerTest < MiniTest::Test it 'test render error' do resp = nil error_message = [400, 'error message'] - exp_output = {status: error_message[0], json: error_message[1]} - @mintest_mock1.expect(:call, exp_output, [error_message[0], error_message[1]]) + exp_output = { status: error_message[0], json: error_message[1] }.to_json + exp_input = [400, "{\"message\":\"error message\"}"] + @mintest_mock1.expect(:call, exp_output, exp_input) @controller.stub :api_response_builder, @mintest_mock1 do - resp = @controller.render_error(error_message) + resp = @controller.send(:render_error, error_message) end - assert_equal(error_message[0], resp[:status]) - assert_equal(error_message[1], resp[:json]) + assert_equal(error_message[0], JSON.parse(resp)['status']) + assert_equal(error_message[1], JSON.parse(resp)['json']) end end describe '#validate request' do it 'test validate request' do - resp = @controller.validate_request + resp = @controller.send(:validate_request) expected_resp = [400, "Request body is empty."] assert_equal(expected_resp[0], resp[0]) assert_equal(expected_resp[1], resp[1]) @@ -49,8 +50,8 @@ class Api::GeneralControllerTest < MiniTest::Test describe '#log error' do it 'test log error' do exception = Struct.new(:message, :backtrace).new('error occured', 'error') - resp = @controller.log_error(__method__, exception) + resp = @controller.send(:log_error, __method__, exception) assert_equal(true, resp) end end -end \ No newline at end of file +end diff --git a/test/functional/api/v01/items_controller_test.rb b/test/functional/api/v01/items_controller_test.rb index 5979b3296..cc315ee22 100644 --- a/test/functional/api/v01/items_controller_test.rb +++ b/test/functional/api/v01/items_controller_test.rb @@ -2,16 +2,16 @@ require 'test_helper' -class Api::ItemsControllerTest < MiniTest::Test +class Api::ItemsControllerTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper def setup @controller = Api::V01::ItemsController.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new - @mintest_mock3 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new + @mintest_mock3 = Minitest::Mock.new @teacher_set = TeacherSet.new(bnumber: 998) end # Update availability method parses the item bodies to retrieve the bib id. @@ -155,26 +155,26 @@ def setup def req_body_for_item [ { - 'nyplSource' => 'sierra-nypl', + 'nyplSource' => 'sierra-nypl', 'bibIds' => [ '998' ], 'status' => { - 'code' => '-', - 'display' => 'AVAILABLE', + 'code' => '-', + 'display' => 'AVAILABLE', 'duedate' => '2011-04-26T16:16:00-04:00' }, } ] end - + def bibid_missing_req_body_for_item - [ + [ { - 'nyplSource' => 'sierra-nypl', + 'nyplSource' => 'sierra-nypl', 'bibIds' => [], 'status' => { - 'code' => '-', - 'display' => 'AVAILABLE', + 'code' => '-', + 'display' => 'AVAILABLE', 'duedate' => '2011-04-26T16:16:00-04:00' }, } @@ -184,11 +184,11 @@ def bibid_missing_req_body_for_item def nypl_source_missing_req_body_for_item [ { - 'nyplSource' => '', + 'nyplSource' => '', 'bibIds' => ['998'], 'status' => { - 'code' => '-', - 'display' => 'AVAILABLE', + 'code' => '-', + 'display' => 'AVAILABLE', 'duedate' => '2011-04-26T16:16:00-04:00' }, } diff --git a/test/functional/holds_controller_test.rb b/test/functional/holds_controller_test.rb index e0f1e21ce..e806963c5 100644 --- a/test/functional/holds_controller_test.rb +++ b/test/functional/holds_controller_test.rb @@ -33,7 +33,7 @@ class HoldsControllerTest < ActionController::TestCase end test "should cancel hold" do - post :cancel, params: { id: @hold2.access_key } + post :holds_cancel_details, params: { id: @hold2.access_key } assert_response :success end @@ -56,19 +56,37 @@ class HoldsControllerTest < ActionController::TestCase # Before cancellation of hold teacher-set available_copies count is 2. # After cancellation of hold teacher-set available_copies count is 3. assert_equal(3, TeacherSet.find(resp_hold_obj.teacher_set_id).available_copies) - assert_response :redirect - assert_equal("Your order was successfully updated.", flash[:notice]) + assert_response :success + assert_equal("Your order was successfully updated.", JSON.parse(response.body)['message']) end test "test update method with empty holds" do sign_in @user - es_doc = {"_index" => "teacherset", "_type" => "teacherset", - "_id" => @hold4.teacher_set.id, "_version" => 11, "result" => "updated", - "_shards" => {"total" => 0, "successful" => 1, "failed" => 0}} + es_doc = { + "_index" => "teacherset", + "_type" => "teacherset", + "_id" => @hold4.teacher_set.id, + "_version" => 11, + "result" => "updated", + "_shards" => { + "total" => 0, + "successful" => 1, + "failed" => 0 + } + } TeacherSet.stub_any_instance :update_teacher_set_availability_in_elastic_search, es_doc do - post :update, params: { id: @hold4.access_key, hold_change: {"comment" => "qqq", "status" => "MyText"}, hold: {status: "MyText"} } + post_params = { + id: @hold4.access_key, + hold_change: { + "comment" => "qqq", "status" => "MyText" + }, + hold: { status: "MyText" } + } + + post :update, params: post_params end + assert_nil(flash[:notice]) end @@ -78,14 +96,22 @@ class HoldsControllerTest < ActionController::TestCase # Teacher_set available_copies before cancellation of hold. assert_equal(2, @hold2.teacher_set.available_copies) - - resp = post :update, params: { id: @hold2.access_key, hold_change: {"comment" => "qqq", "status" => "new"}, hold: {status: "new"} } + + post_params = { + id: @hold2.access_key, + hold_change: { + "comment" => "qqq", + "status" => "new" + }, + hold: { status: "new" } + } + resp = post :update, params: post_params resp_hold_obj = resp.request.env["action_controller.instance"].current_user.holds.find(@hold2.id) # Hold status not changed. # teacher-set available_copies also not changed, because hold is not cancelled. assert_equal(resp_hold_obj.status, "new") assert_equal(2, TeacherSet.find(resp_hold_obj.teacher_set_id).available_copies) - assert_response :redirect + assert_response :success end test "create hold and update teacher-set available_copies" do diff --git a/test/functional/home_controller_test.rb b/test/functional/home_controller_test.rb index d1abfff6f..dfb39d835 100644 --- a/test/functional/home_controller_test.rb +++ b/test/functional/home_controller_test.rb @@ -8,8 +8,8 @@ class HomeControllerTest < ActionController::TestCase assert_response :success end - test 'test faq method' do - get :faq + test 'test faq data method' do + get :faq_data assert_response :success end diff --git a/test/functional/news_letter_controller_test.rb b/test/functional/news_letter_controller_test.rb index a884607a4..b766fbd06 100644 --- a/test/functional/news_letter_controller_test.rb +++ b/test/functional/news_letter_controller_test.rb @@ -4,7 +4,7 @@ class NewsLetterControllerTest < ActionController::TestCase test "should get index" do - get :index, params: {email: "ss@ss.com"} + get 'index', params: {email: "ss@ss.com"} assert_response :success end end diff --git a/test/functional/settings_controller_test.rb b/test/functional/settings_controller_test.rb index 604a0ace7..98f6ea155 100644 --- a/test/functional/settings_controller_test.rb +++ b/test/functional/settings_controller_test.rb @@ -20,7 +20,7 @@ class SettingsControllerTest < ActionController::TestCase test "test index method with out current_user" do get :index, params: { settings: { contact_email: "test@gmail.com", school: { id: @school.id } } } assert_equal("You must be logged in to access this page", flash[:error]) - assert_response :redirect + assert_response :success # Changed because no double render is allowed @JC 2024-10-08 end test "test index method with out school code" do diff --git a/test/functional/teacher_sets_controller_test.rb b/test/functional/teacher_sets_controller_test.rb index 47152f45e..15f846f9c 100644 --- a/test/functional/teacher_sets_controller_test.rb +++ b/test/functional/teacher_sets_controller_test.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'test_helper' +require 'mocha/minitest' # TODO: We had some functional tests that tested CRUD (create-update-delete) # functionality of the teacher sets controller. They were deleted in @@ -14,6 +15,11 @@ class TeacherSetsControllerTest < ActionController::TestCase end test "should get index" do + @elastic_search_mock = mock('ElasticSearch') + @elastic_search_mock.stubs(:search).returns([]) + @elastic_search_mock.stubs(:get_teacher_sets_from_es).returns([{}, [], 0]) + ElasticSearch.stubs(:new).returns(@elastic_search_mock) + get :index assert_response :success end diff --git a/test/integration/routes_test.rb b/test/integration/routes_test.rb index 38729d825..389c59ea6 100644 --- a/test/integration/routes_test.rb +++ b/test/integration/routes_test.rb @@ -3,69 +3,33 @@ require 'test_helper' class RoutesTest < ActionDispatch::IntegrationTest - NO_ROUTE_MATCHES = "No route matches" - test "test for sets index page" do - assert_routing "/", :controller => "home", :action => "index" + test "test for home index page" do + assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}", + get_action_params('home', 'index') end - test "test for sets index page with sets hostname" do - assert_routing "http://#{ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil)}", :controller => "home", :action => "index" + test "test for schools participating-schools" do + assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/participating-schools", + get_action_params('schools', 'participating_schools_data') end - test "test for info-site index page" do - assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}", get_info_site_action_params('index') - end - - test "test for info-site participating-schools" do - assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/about/participating-schools", - get_info_site_action_params('participating_schools') - end - - test "test for info-site participating-schools page with sets hostname" do - resp = assert_raises ActionController::RoutingError do - Rails.application.routes.recognize_path("http://#{ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil)}/about/participating-schools") - end - assert_equal(true, resp.message.include?(NO_ROUTE_MATCHES)) - end - - test "test for info-site about page" do - assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/about/about-mylibrarynyc", get_info_site_action_params('about') - end - - test "test for info-site about page with sets hostname" do - resp = assert_raises ActionController::RoutingError do - Rails.application.routes.recognize_path("http://#{ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil)}/about/about-mylibrarynyc") - end - assert_equal(true, resp.message.include?(NO_ROUTE_MATCHES)) - end - - test "test for info-site contacts-links page" do - assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/contacts-links", get_info_site_action_params('contacts') - end - - test "test for info-site contacts-links page with sets hostname" do - resp = assert_raises ActionController::RoutingError do - Rails.application.routes.recognize_path("http://#{ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil)}/contacts-links") - end - assert_equal(true, resp.message.include?(NO_ROUTE_MATCHES)) + test "test for home contacts page" do + assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/contact", + get_action_params('home', 'help') end test "test for info-ste digital resources page" do - assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/help/access-digital-resources", - get_info_site_action_params('digital_resources') - end - - test "test for info-site digital resources page page with sets hostname" do - resp = assert_raises ActionController::RoutingError do - Rails.application.routes.recognize_path("http://#{ENV.fetch('MLN_SETS_SITE_HOSTNAME', nil)}/help/access-digital-resources") - end - assert_equal(true, resp.message.include?(NO_ROUTE_MATCHES)) + assert_routing "http://#{ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)}/help/access-digital-resources", + get_action_params('home' , 'digital_resources') end private - def get_info_site_action_params(action_name) - {:controller => "info_site", :action => action_name, :host => ENV.fetch('MLN_INFO_SITE_HOSTNAME', nil)} + def get_action_params(controller, action_name) + { + :controller => controller, + :action => action_name + } end end diff --git a/test/integration/user_flow_test.rb b/test/integration/user_flow_test.rb index e1005d25a..1c18261bf 100644 --- a/test/integration/user_flow_test.rb +++ b/test/integration/user_flow_test.rb @@ -3,12 +3,13 @@ require 'test_helper' class UserFlowTest < ActionDispatch::IntegrationTest - test "user method assign_barcode increments last valid barcode by 1" do + test "user method assign_barcode succeeds" do AllowedUserEmailMasks.create(active:true, email_pattern: "@schools.nyc.gov") user_one = crank!(:user, barcode: 27777000000099) user_two = crank(:user) user_two.assign_barcode - assert(user_two.barcode == 27777000000100) + assert(user_one.barcode != nil) + assert(user_two.barcode != nil) end [generate_email].each do |new_email| @@ -16,20 +17,16 @@ class UserFlowTest < ActionDispatch::IntegrationTest AllowedUserEmailMasks.create(active:true, email_pattern: "@schools.nyc.gov") user = crank!(:user, barcode: 27777000000000) SierraCodeZcodeMatch.create(sierra_code: 1, zcode: user.school.code) - get '/users/signup' - assert_select 'h1', 'Sign Up' + get '/signup' post '/users', params: { user: { first_name: user.first_name, last_name: user.last_name, email: new_email, - pin: user.pin, school_id: user.school_id } } - assert_response :redirect - follow_redirect! - assert 'div', 'Welcome! You have signed up successfully' + assert_response :success end end end diff --git a/test/models/document_test.rb b/test/models/document_test.rb index 4efa5a822..5ead8e70a 100644 --- a/test/models/document_test.rb +++ b/test/models/document_test.rb @@ -42,7 +42,7 @@ class DocumentTest < ActionController::TestCase test 'Google document not found' do - error_obj = Struct.new(:status_code, :body).new('404', 'body') + error_obj = Struct.new(:status_code, :body).new(404, 'body') email = JSON.parse(ENV.fetch('MLN_GOOGLE_ACCCOUNT', nil))['client_email'] error_msg = "There was an error accessing this file. Please check this URL is valid, and that the document is shared with #{email}" resp = @document.google_client_error_message(error_obj) diff --git a/test/models/hold_change_test.rb b/test/models/hold_change_test.rb index dfe2d355f..26ff31a52 100644 --- a/test/models/hold_change_test.rb +++ b/test/models/hold_change_test.rb @@ -15,7 +15,7 @@ class HoldChangeTest < ActionController::TestCase assert_equal("new", @hold2.status) @hold2.status = 'cancel' - @hold_changes1.update_hold + @hold_changes1.send(:update_hold) # Hold status is 'cancel' after update assert_equal("cancel", @hold2.status) end @@ -23,19 +23,18 @@ class HoldChangeTest < ActionController::TestCase test 'send hold change status email' do # hold_change status should be ['error', 'pending', 'closed', 'cancelled'] than only sending status email. @hold_changes1.status = 'closed' - resp = @hold_changes1.send_change_status_email + resp = @hold_changes1.send(:send_change_status_email) assert_equal("Order closed | Your teacher set order for MyString1", resp.subject) # hold_change status is new not sending email @hold_changes1.status = 'new' - resp = @hold_changes1.send_change_status_email + resp = @hold_changes1.send(:send_change_status_email) assert_nil(resp) end - test 'send hold teacher_set deleted email' do @hold_changes1.status = 'closed' - resp = @hold_changes1.send_teacher_set_deleted_email + resp = @hold_changes1.send(:send_teacher_set_deleted_email) assert_equal("Order closed | The Teacher Set you requested has been deleted", resp.subject) end @@ -47,7 +46,7 @@ class HoldChangeTest < ActionController::TestCase # test2 : Send deleted teacher-set notification email If Teacher-set is not available @hold_changes2.status = 'closed' - resp = @hold_changes2.do_after_save - assert_equal("Order closed | The Teacher Set you requested has been deleted", resp.subject) + resp2 = @hold_changes2.do_after_save + assert_equal("Order closed | The Teacher Set you requested has been deleted", resp2.subject) end end diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb deleted file mode 100644 index cb6c11c5b..000000000 --- a/test/performance/browsing_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -require 'test_helper' -require 'rails/performance_test_help' - -class BrowsingTest < ActionDispatch::PerformanceTest - # Refer to the documentation for all available options - # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory] - # :output => 'tmp/performance', :formats => [:flat] } - - def test_homepage - get '/' - end -end diff --git a/test/test_helper.rb b/test/test_helper.rb index 26934644f..8b648df68 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -18,6 +18,7 @@ ENV['RAILS_ENV'] = 'test' require File.expand_path('../../config/environment', __FILE__) +require 'active_support/all' require 'rails/test_help' require 'webmock/test_unit' require 'factories/user_factory' @@ -30,10 +31,15 @@ include WebMock::API WebMock.disable_net_connect!(allow_localhost: true) +WebMock.disable_net_connect!(allow: 'elasticsearch:9200') require 'minitest' require 'minitest/assertions' require 'minitest/autorun' +require 'minitest/reporters' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + require 'stringio' require 'active_support' @@ -4179,6 +4185,7 @@ def mock_google_address puts "Starting test run..." puts "Starting DatabaseCleaner..." + DatabaseCleaner.allow_remote_database_url = true DatabaseCleaner.strategy = :truncation DatabaseCleaner.start ensure diff --git a/test/unit/bibs_controller_test.rb b/test/unit/bibs_controller_test.rb index c836b93f6..cb59ffac1 100644 --- a/test/unit/bibs_controller_test.rb +++ b/test/unit/bibs_controller_test.rb @@ -2,7 +2,7 @@ require 'test_helper' -class BibsControllerTest < MiniTest::Test +class BibsControllerTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper diff --git a/test/unit/book_unit_test.rb b/test/unit/book_unit_test.rb index 074a11930..66e8b0ccc 100644 --- a/test/unit/book_unit_test.rb +++ b/test/unit/book_unit_test.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true require 'test_helper' -class BookUnitTest < MiniTest::Test +class BookUnitTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper def setup @book_model = Book.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new end def test_bib_service_response_failure_case diff --git a/test/unit/elastic_search_test.rb b/test/unit/elastic_search_test.rb index ec13bc8f2..c8fe1f814 100644 --- a/test/unit/elastic_search_test.rb +++ b/test/unit/elastic_search_test.rb @@ -1,22 +1,22 @@ # frozen_string_literal: true require 'test_helper' -class ElasticSearchTest < MiniTest::Test +class ElasticSearchTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper def setup @es_model = ElasticSearch.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new # models the format of the ES query terms, the structure we'll be sending our search requests in @agg_hash = {"language" => {:terms => {:field => "primary_language", :size => 100, :order => {:_key => "asc"}}}, "set type" => {:terms => {:field => "set_type", :size => 10, :order => {:_key => "asc"}}}, "availability" => {:terms => {:field => "availability.raw", :size => 10, :order => {:_key => "asc"}}}, "area of study" => {:terms => {:field => "area_of_study", :size => 100, :order => {:_key => "asc"}}}, - "subjects" => {:nested => {:path => "subjects"}, :aggregations => {:subjects => {:composite => {:size => 3000, - :sources => [{:id => {:terms => {:field => "subjects.id"}}}, + "subjects" => {:nested => {:path => "subjects"}, :aggregations => {:subjects => {:composite => {:size => 3000, + :sources => [{:id => {:terms => {:field => "subjects.id"}}}, {:title => {:terms => {:field => "subjects.title.keyword"}}}]}}}}} end @@ -174,8 +174,9 @@ def setup params = { "language" => ['language'] } @mintest_mock1.expect(:call, [nil, nil, nil, ['language']], [params]) @mintest_mock2.expect(:call, @agg_hash, [{}]) - expected_resp = [{:query => {:bool => {:must => [{:multi_match => {:query => "language", :fields => %w[language primary_language]}}]}}}] + expected_resp = [{:query => {:bool => {:must => [{:multi_match => {:query => "language", :fields => %w[primary_language]}}]}}}] expected_resp << @agg_hash + expected_resp.delete(:availability) resp = nil @es_model.stub :teacher_sets_input_params, @mintest_mock1 do @@ -189,13 +190,14 @@ def setup end end - # User query fields are correctly formatted into an aggregate query structure describe 'test group_by facets_query' do it 'test group_by facets query' do aggregation_hash = {} resp = @es_model.group_by_facets_query(aggregation_hash) - assert_equal(@agg_hash, resp) + expected_hash = @agg_hash.dup + expected_hash.delete('availability') + assert_equal(expected_hash, resp) end end @@ -213,20 +215,20 @@ def setup @mintest_mock1.expect(:call, expected_facets, [es_document_resp, facets]) subjects_facets = {:label => "subjects", :items => [{:value => "123", :label => "subject", :count => 5}]} - @mintest_mock2.expect(:call, subjects_facets, [es_document_resp, expected_facets]) + @mintest_mock2.expect(:call, subjects_facets, [es_document_resp, expected_facets, {}]) @es_model.stub :get_language_availability_set_type_area_of_study_facets, @mintest_mock1 do @es_model.stub :get_subject_facets, @mintest_mock2 do - resp = @es_model.facets_for_teacher_sets(es_document_resp) + resp = @es_model.facets_for_teacher_sets(es_document_resp, {}) end end - assert_equal(teacherset_facets, resp) + assert_equal(teacherset_facets, resp) end end # Test subject facets # facets eg: [ {:label=>"language", :items=> [{:value=>"Chinese", :label=>"Chinese", :count=>34}]}, - # {:label=>"availability", :items=>[{:value=>"available", :label=>"Available", :count=>1223}, {:value=>"unavailable", + # {:label=>"availability", :items=>[{:value=>"available", :label=>"Available", :count=>1223}, {:value=>"unavailable", # :label=>"Checked Out", :count=>32}]}, # {:label=>"set type", :items=>[{:value=>"multi", :label=>"Topic Sets", :count=>910}, {:value=>"single", :label=>"Book Club Set", :count=>276}]}, # {:label=>"area of study", :items=> [{:value=>"Arabic Language Arts.", :label=>"Arabic Language Arts.", :count=>1}]}] @@ -234,11 +236,11 @@ def setup it 'test subject facets' do facets = [ {:label => "language", :items => [{:value => "English", :label => "English", :count => 1}]}, - {:label => "availability", :items => [{:value => "available", :label => "Available", :count => 1}]}, +# {:label => "availability", :items => [{:value => "available", :label => "Available", :count => 1}]}, {:label => "set type", :items => [{:value => "multi", :label => "Topic Sets", :count => 1}]}, {:label => "area of study", :items => [{:value => "Arabic Language Arts.", :label => "Arabic Language Arts.", :count => 1}]} ] - resp = @es_model.get_subject_facets(es_document_resp, facets) + resp = @es_model.get_subject_facets(es_document_resp, facets, {}) assert_equal(teacherset_facets[1], resp) end end @@ -247,7 +249,7 @@ def setup describe 'test language availability set_type area_of_study facts' do it 'get language_availability_set_type_area_of_study_facts' do expected_resp = [{:label => "language", :items => [{:value => "English", :label => "English", :count => 1}]}, - {:label => "availability", :items => [{:value => "available", :label => "Available", :count => 1}]}, +# {:label => "availability", :items => [{:value => "available", :label => "Available", :count => 1}]}, {:label => "set type", :items => [{:value => "multi", :label => "multi", :count => 1}]}, {:label => "area of study", :items => [{:value => "Arabic Language Arts.", :label => "Arabic Language Arts.", :count => 1}]}] resp = @es_model.get_language_availability_set_type_area_of_study_facets(es_document_resp, []) diff --git a/test/unit/encrypt_decrypt_string_test.rb b/test/unit/encrypt_decrypt_string_test.rb index 999944619..462f216c9 100644 --- a/test/unit/encrypt_decrypt_string_test.rb +++ b/test/unit/encrypt_decrypt_string_test.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'test_helper' -class EncryptDecryptStringTest < MiniTest::Test +class EncryptDecryptStringTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper diff --git a/test/unit/faqs_controller_test.rb b/test/unit/faqs_controller_test.rb index a67e01ea1..1f1dc8d3f 100644 --- a/test/unit/faqs_controller_test.rb +++ b/test/unit/faqs_controller_test.rb @@ -1,19 +1,12 @@ # frozen_string_literal: true require 'test_helper' -class FaqsControllerTest < MiniTest::Test +class FaqsControllerTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper def setup @faq_controller = FaqsController.new end - - describe "test faqs" do - it 'test faqs' do - resp = @faq_controller.frequently_asked_questions - assert_equal(2, resp.count) - end - end end diff --git a/test/unit/helpers/bibs_helper_test.rb b/test/unit/helpers/bibs_helper_test.rb index 543a17dae..ce46ceabd 100644 --- a/test/unit/helpers/bibs_helper_test.rb +++ b/test/unit/helpers/bibs_helper_test.rb @@ -2,16 +2,16 @@ require 'test_helper' -class BibsHelperTest < MiniTest::Test +class BibsHelperTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper include BibsHelper include MlnResponse include MlnHelper - + def setup - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new end diff --git a/test/unit/helpers/mln_helper_test.rb b/test/unit/helpers/mln_helper_test.rb index a24e0ad6c..7ed1ce791 100644 --- a/test/unit/helpers/mln_helper_test.rb +++ b/test/unit/helpers/mln_helper_test.rb @@ -2,7 +2,7 @@ require 'test_helper' -class MlnHelperTest < MiniTest::Test +class MlnHelperTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper include MlnResponse diff --git a/test/unit/helpers/teacher_sets_es_helper_test.rb b/test/unit/helpers/teacher_sets_es_helper_test.rb index 14e4c39bd..b18c42b0e 100644 --- a/test/unit/helpers/teacher_sets_es_helper_test.rb +++ b/test/unit/helpers/teacher_sets_es_helper_test.rb @@ -2,7 +2,7 @@ require 'test_helper' -class TeacherSetsEsHelperTest < MiniTest::Test +class TeacherSetsEsHelperTest < Minitest::Test extend Minitest::Spec::DSL include TeacherSetsEsHelper diff --git a/test/unit/helpers/teacher_sets_helper_test.rb b/test/unit/helpers/teacher_sets_helper_test.rb index 9a4e8ca40..442090f88 100644 --- a/test/unit/helpers/teacher_sets_helper_test.rb +++ b/test/unit/helpers/teacher_sets_helper_test.rb @@ -9,8 +9,8 @@ class TeacherSetsHelperTest < ActiveSupport::TestCase before do @teacher_set = TeacherSet.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new end describe 'Get var field data from request body' do diff --git a/test/unit/news_letter_controller_unit_test.rb b/test/unit/news_letter_controller_unit_test.rb index 96652c0dd..7fcae7b24 100644 --- a/test/unit/news_letter_controller_unit_test.rb +++ b/test/unit/news_letter_controller_unit_test.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true require 'test_helper' -class NewsLetterControllerUnitTest < MiniTest::Test +class NewsLetterControllerUnitTest < Minitest::Test extend Minitest::Spec::DSL include LogWrapper def setup @nl_controller = NewsLetterController.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new end describe 'news-letter email already in google sheets?' do @@ -63,13 +63,11 @@ def setup # Case: 3 it 'Test successfully create the news letter email in google sheets method' do email = 'test@ss1.com' - params = {key: "edededede"} - google_sheet = Struct.new - google_sheet.updates = Struct.new - google_sheet.updates.spreadsheet_id = "wed11" + params = { key: 'edededede' } + google_sheet = Struct.new(:spreadsheet_id, :table_range).new('wed11', 'A1') @mintest_mock1.expect(:call, ['test@ss.com']) @mintest_mock2.expect(:call, google_sheet, [email]) - + resp = nil @nl_controller.stub :news_letter_google_spread_sheet_emails, @mintest_mock1 do EncryptDecryptString.stub :decrypt_string, email, [params['key']] do diff --git a/test/unit/teacher_set_test.rb b/test/unit/teacher_set_test.rb index 7594ea972..c23f4f6de 100644 --- a/test/unit/teacher_set_test.rb +++ b/test/unit/teacher_set_test.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'test_helper' +require 'mocha/minitest' class TeacherSetTest < ActiveSupport::TestCase @@ -10,6 +11,10 @@ class TeacherSetTest < ActiveSupport::TestCase include MlnException before do + @school1 = schools(:school_one) + @school2 = schools(:school_two) + @school3 = schools(:school_three) + @user = holds(:hold1).user @hold1 = holds(:hold1) @hold2 = holds(:hold2) @@ -18,7 +23,7 @@ class TeacherSetTest < ActiveSupport::TestCase @hold10 = holds(:hold10) @user2 = holds(:hold9).user @user3 = holds(:hold10).user - + @teacher_set = teacher_sets(:teacher_set_one) @teacher_set2 = teacher_sets(:teacher_set_two) @teacher_set3 = teacher_sets(:teacher_set_three) @@ -27,11 +32,10 @@ class TeacherSetTest < ActiveSupport::TestCase @teacher_set7 = teacher_sets(:teacher_set_seven) @teacher_set8 = teacher_sets(:teacher_set_eight) @model = TeacherSet.new - @mintest_mock1 = MiniTest::Mock.new - @mintest_mock2 = MiniTest::Mock.new + @mintest_mock1 = Minitest::Mock.new + @mintest_mock2 = Minitest::Mock.new @elasticsearch_adapter_mock = Minitest::Mock.new end - describe 'creating a teacher set does not create a version, because papertrail is turned off' do it 'test creating a teacher set does not create a version, because papertrail is turned off' do @@ -50,15 +54,21 @@ class TeacherSetTest < ActiveSupport::TestCase end end - #Calls Bibs service - #Calculates the total number of items and available items in the BIb service response + # Calls Bibs service + # Calculates the total number of items and available items in the Bib service response describe 'test update available and total count method' do + before do + @elastic_search_mock = mock('ElasticSearch') + @elastic_search_mock.stubs(:update_document_by_id).returns(true) + ElasticSearch.stubs(:new).returns(@elastic_search_mock) + end + it 'test update available and total count' do bib_id = '21480355' nypl_source = 'sierra-nypl' @items_found = "ert" resp = nil - total_count = 2 + total_count = 2 available_count = 2 @mintest_mock1.expect(:call, [bib_items_response, true], [bib_id]) @@ -71,7 +81,7 @@ class TeacherSetTest < ActiveSupport::TestCase end end end - assert_equal(bib_items_response, resp[:bibs_resp]) + assert_equal(bib_items_response, resp[:bibs_resp]) end #Test:2 Bibid is not found in bibs service @@ -91,7 +101,7 @@ class TeacherSetTest < ActiveSupport::TestCase assert_equal(bib_id_not_found_response, resp[:bibs_resp]) end end - + # Parses out the items duedate, items code is '-' which determines if an item is available or not. # Calculates the total number of items in the list, the number of items that are # available to lend. @@ -106,7 +116,6 @@ class TeacherSetTest < ActiveSupport::TestCase end end - # case 1: {:fieldTag=>"n", :marcTag=>"526", :ind1=>"0", :ind2=>"", :content=>"null", :subfields=>[{:tag=>"a", :content=>"Topic Set"}]} # If subfields.content type is "Topic Set", set_type value stored as 'multi' in teacher_sets table. # If subfields.content type is "Book Club Set" set_type value stored as 'single' in teacher_sets table. @@ -180,7 +189,6 @@ class TeacherSetTest < ActiveSupport::TestCase end end - describe 'Test delete teacher_set record' do it 'Delete teacher_set record in db and elastic search' do es_resp = {"found" => true, "result" => 'deleted'} @@ -205,7 +213,6 @@ class TeacherSetTest < ActiveSupport::TestCase end end - describe 'create_or_update_teacherset ' do it 'test create or update teacherset' do resp = nil @@ -217,7 +224,7 @@ class TeacherSetTest < ActiveSupport::TestCase SIERRA_USER["data"][0]['suppressed'] = false ts_items_info = {bibs_resp: SIERRA_USER, total_count: 1, available_count: 1, availability_string: 'available'} - + TeacherSet.stub_any_instance :get_items_info_from_bibs_service, ts_items_info do TeacherSet.stub_any_instance :create_or_update_teacherset_document_in_es, es_resp do resp = TeacherSet.create_or_update_teacher_set(SIERRA_USER["data"][0]) @@ -246,7 +253,7 @@ class TeacherSetTest < ActiveSupport::TestCase end it 'Bib request-body has suppressed value as true but teacher-set record not found in database' do - bib_id = rand.to_s[2..8] + bib_id = rand.to_s[2..8] # Created teacher-set record not saved in DB. TeacherSet.new(bnumber: "b#{bib_id}") @@ -264,8 +271,8 @@ class TeacherSetTest < ActiveSupport::TestCase # Update teacher-set document in ES describe '#test create or update teacherset' do before do - @es_doc = {"_index" => "teacherset", "_type" => "teacherset", - "_id" => 8888, "_version" => 11, "result" => "updated", + @es_doc = {"_index" => "teacherset", "_type" => "teacherset", + "_id" => 8888, "_version" => 11, "result" => "updated", "_shards" => {"total" => 0, "successful" => 1, "failed" => 0}} @expected_resp = {:title=>"title",:description=>"desc", :contents=>nil,:id=>8888,:details_url=>nil,:grade_end=>nil, @@ -295,7 +302,7 @@ class TeacherSetTest < ActiveSupport::TestCase elasticsearch_adapter_mock.expect(:update_document_by_id, nil) do raise StandardError, ELASTIC_SEARCH_STANDARD_EXCEPTION[:msg] end - + resp = assert_raises(ElasticsearchException) do ElasticSearch.stub :new, elasticsearch_adapter_mock do teacher_set.create_or_update_teacherset_document_in_es @@ -428,7 +435,7 @@ class TeacherSetTest < ActiveSupport::TestCase describe 'teacher_set#update_teacher_set_availability_in_db' do - + it 'update teacher-set availability while creation the hold ' do # Teacher-set available_copies and availability before creation of hold assert_equal('available', @teacher_set7.availability) @@ -445,7 +452,7 @@ class TeacherSetTest < ActiveSupport::TestCase assert_equal('unavailable', @teacher_set8.availability) assert_equal(0, @teacher_set8.available_copies) resp = @teacher_set8.update_teacher_set_availability_in_db('cancelled', nil, @user3, @hold10.id) - + # After cancellation of hold available_copies count increased and availability status changed to 'available' assert_equal(2, @teacher_set8.available_copies) assert_equal('available', @teacher_set8.availability) @@ -479,8 +486,8 @@ class TeacherSetTest < ActiveSupport::TestCase it 'should call ElasticSearch#update_document_by_id' do resp = nil elasticsearch_adapter_mock = Minitest::Mock.new - es_doc = {"_index" => "teacherset", "_type" => "teacherset", - "_id" => @teacher_set2.id, "_version" => 11, "result" => "updated", + es_doc = {"_index" => "teacherset", "_type" => "teacherset", + "_id" => @teacher_set2.id, "_version" => 11, "result" => "updated", "_shards" => {"total" => 0, "successful" => 1, "failed" => 0}} body = { :availability => @teacher_set2.availability, @@ -512,24 +519,24 @@ def bib_id_not_found_response def bib_items_response { 'data' => [ { - 'nyplSource' => 'sierra-nypl', + 'nyplSource' => 'sierra-nypl', 'bibIds' => [ '21480355' ], 'status' => { - 'code' => 'W', - 'display' => 'AVAILABLE', + 'code' => 'W', + 'display' => 'AVAILABLE', 'duedate' => '2011-04-26T16:16:00-04:00' }, }, { - 'nyplSource' => 'sierra-nypl', + 'nyplSource' => 'sierra-nypl', 'bibIds' => [ '21480355' ], 'status' => { - 'code' => '-', - 'display' => 'AVAILABLE', + 'code' => '-', + 'display' => 'AVAILABLE', 'duedate' => "" }, } diff --git a/test/unit/user_test.rb b/test/unit/user_tests.rb similarity index 58% rename from test/unit/user_test.rb rename to test/unit/user_tests.rb index 4247abc13..d84a598ac 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_tests.rb @@ -2,7 +2,7 @@ require 'test_helper' -class UserTest < ActiveSupport::TestCase +class UserTests < ActiveSupport::TestCase include AwsDecrypt setup do @@ -16,31 +16,34 @@ class UserTest < ActiveSupport::TestCase [generate_barcode].each do |barcode| test 'sierra user can be found by barcode' do mock_check_barcode_request(barcode, '200') - response = @user.check_barcode_found_in_sierra(barcode) + @user.barcode = barcode + response = @user.barcode_available_in_sierra? user_would_be_unique_in_sierra = false - assert_equal response, !user_would_be_unique_in_sierra + assert_equal response, user_would_be_unique_in_sierra end test 'sierra user cannot be found by barcode' do mock_check_barcode_request(barcode, '404') - response = @user.check_barcode_found_in_sierra(barcode) + @user.barcode = barcode + response = @user.barcode_available_in_sierra? user_would_be_unique_in_sierra = true - assert_equal response, !user_would_be_unique_in_sierra + assert_equal response, user_would_be_unique_in_sierra end test 'multiple sierra users found' do mock_check_barcode_request(barcode, '409') - response = @user.check_barcode_found_in_sierra(barcode) + @user.barcode = barcode + response = @user.barcode_available_in_sierra? user_would_be_unique_in_sierra = false - assert_equal response, !user_would_be_unique_in_sierra + assert_equal response, user_would_be_unique_in_sierra end - test 'sierra barcode lookup crashes' do + test 'sierra barcode lookup fails' do mock_check_barcode_request(barcode, '500') - exception = assert_raise(Exceptions::InvalidResponse) do - @user.check_barcode_found_in_sierra(barcode) - end - assert_equal('Invalid status code of: 500', exception.message) + @user.barcode = barcode + response = @user.barcode_available_in_sierra? + user_would_be_unique_in_sierra = false + assert_equal response, user_would_be_unique_in_sierra end test 'user model cannot be created without first name' do @@ -54,48 +57,6 @@ class UserTest < ActiveSupport::TestCase @user.save assert_equal(["can't be blank", "is invalid"], @user.errors.messages[:last_name]) end - - test 'user model cannot be created without pin' do - @user.pin = "" - @user.save - assert_equal(["can't be blank", "is invalid", "must be 4 to 32 characters."], @user.errors.messages[:pin]) - end - - test 'validate pin length less than 4 characters' do - @user.pin = "123" - @user.save - assert_equal(["must be 4 to 32 characters."], @user.errors.messages[:pin]) - end - - test 'validate pin length is 33 characters' do - @user.pin = "1234!qwertyuioplkjhgfsaqwerwuytr2" - @user.save - assert_equal(["must be 4 to 32 characters."], @user.errors.messages[:pin]) - end - - test 'pin length is 32 characters' do - @user.pin = "1234!qwertyuioplkjhgfsaqwerwuytr" - @user.save - assert_empty(@user.errors.messages) - end - - test 'user model cannot be created with 4 of the same repeated digits as pin' do - @user.pin = "1111" - @user.save - assert_equal(@user.errors.messages[:pin],[@pin_error]) - end - - test 'user model cannot be created with alternate repeated digits as pin' do - @user.pin = "1212" - @user.save - assert_equal(@user.errors.messages[:pin],[@pin_error]) - end - - test 'user model cannot be created with 3 of the same repeated digits in a row as pin' do - @user.pin = "0007" - @user.save - assert_equal(@user.errors.messages[:pin],[@pin_error]) - end end ## NOTE: We manage allowed email addresses dynamically now, but schools.nyc.gov @@ -137,18 +98,16 @@ class UserTest < ActiveSupport::TestCase a 201 illustrating patron was created through patron creator microservice" do crank(:queens_user, barcode: 27777011111111) - assert_equal(206, @user.send_request_to_patron_creator_service) + assert_equal(206, @user.send_request_to_patron_creator_service(@user.password)) end # Need to call twice, in order to receive the second response # in the mock_send_request_to_patron_creator_service # method which is a status code of 500 - test "user method send_request_to_patron_creator_service returns - an exception illustrating patron was not created - through patron creator micro-service" do - @user.send_request_to_patron_creator_service + test "user method send_request_to_patron_creator_service returns an exception illustrating patron was not created through patron creator micro-service" do + @user.send_request_to_patron_creator_service(@user.password) exception = assert_raise(Exceptions::InvalidResponse) do - @user.send_request_to_patron_creator_service + @user.send_request_to_patron_creator_service(@user.password) end assert_equal('Invalid status code of: 500', exception.message) end @@ -174,38 +133,4 @@ class UserTest < ActiveSupport::TestCase SierraCodeZcodeMatch.create(sierra_code: 1, zcode: user.school.code) assert_equal(user.pcode4, user.school.sierra_code) end - - - test 'validate different pin pattern' do - # user model cannot be created with alternate repeated words as pin - # Test1 - @user.pin = "abcabc" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - - # Test2 - @user.pin = "abcabcabcabc" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - - # Test3 - @user.pin = "abab" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - - # Test4 - @user.pin = "ababab" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - - # Test5 - @user.pin = "aaabb111333444" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - - # Test6 - @user.pin = "@@>>@@>>abc123" - @user.save - assert_equal(@user.errors.messages[:pin], [@pin_error]) - end -end \ No newline at end of file +end diff --git a/yarn.lock b/yarn.lock index 744ecb438..4aa3f6d75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3837,11 +3837,6 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz" integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - "@types/node@*": version "15.12.2" resolved "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz" @@ -4596,11 +4591,6 @@ astral-regex@^1.0.0: resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async@0.9.x: version "0.9.2" resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" @@ -5903,23 +5893,6 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -5997,7 +5970,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -6025,30 +5998,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-case@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz" - integrity sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw== - dependencies: - camel-case "^3.0.0" - constant-case "^2.0.0" - dot-case "^2.1.0" - header-case "^1.0.0" - is-lower-case "^1.1.0" - is-upper-case "^1.1.0" - lower-case "^1.1.1" - lower-case-first "^1.0.0" - no-case "^2.3.2" - param-case "^2.1.0" - pascal-case "^2.0.0" - path-case "^2.1.0" - sentence-case "^2.1.0" - snake-case "^2.1.0" - swap-case "^1.1.0" - title-case "^2.1.0" - upper-case "^1.1.1" - upper-case-first "^1.1.0" - channels@0.0.4: version "0.0.4" resolved "https://registry.npmjs.org/channels/-/channels-0.0.4.tgz" @@ -6475,14 +6424,6 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -constant-case@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" - integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY= - dependencies: - snake-case "^2.1.0" - upper-case "^1.1.1" - contains-path@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" @@ -6684,14 +6625,6 @@ css-loader@^0.28.11: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" -css-node-extract@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/css-node-extract/-/css-node-extract-2.1.3.tgz" - integrity sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw== - dependencies: - change-case "^3.0.1" - postcss "^6.0.14" - css-prefers-color-scheme@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.1.tgz#30fcb94cc38b639b66fb99e1882ffd97f741feaa" @@ -6718,13 +6651,6 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" -css-selector-extract@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/css-selector-extract/-/css-selector-extract-3.3.6.tgz" - integrity sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg== - dependencies: - postcss "^6.0.14" - css-selector-tokenizer@^0.7.0: version "0.7.3" resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz" @@ -6956,15 +6882,7 @@ debuglog@^1.0.1: resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -7117,11 +7035,6 @@ depd@^1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" @@ -7350,13 +7263,6 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.1" -dot-case@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz" - integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4= - dependencies: - no-case "^2.2.0" - dotenv@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz" @@ -8220,13 +8126,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^25.5.0: version "25.5.0" resolved "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz" @@ -8525,16 +8424,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" @@ -8813,13 +8702,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -8863,11 +8745,6 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stdin@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" @@ -8977,7 +8854,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@~7.1.1: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: version "7.1.7" resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -8989,26 +8866,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -9055,15 +8912,6 @@ globrex@^0.1.2: resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -9114,11 +8962,6 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" @@ -9237,14 +9080,6 @@ he@1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz" - integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.3" - hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" @@ -9260,13 +9095,6 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -9563,11 +9391,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, i resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - ini@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" @@ -9908,13 +9731,6 @@ is-lambda@^1.0.1: resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= -is-lower-case@^1.1.0: - version "1.1.3" - resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz" - integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M= - dependencies: - lower-case "^1.1.0" - is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" @@ -9959,7 +9775,7 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: +is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -10065,13 +9881,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-upper-case@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz" - integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8= - dependencies: - upper-case "^1.1.0" - is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" @@ -10097,7 +9906,7 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -11475,7 +11284,7 @@ jquery-ujs@^1.2.2: resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== -js-base64@^2.1.8, js-base64@^2.1.9: +js-base64@^2.1.9: version "2.6.4" resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== @@ -11786,7 +11595,7 @@ kind-of@^5.0.0: resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -12182,7 +11991,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.0, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.2.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12229,18 +12038,6 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case-first@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" - integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E= - dependencies: - lower-case "^1.1.2" - -lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" @@ -12350,16 +12147,6 @@ map-cache@^0.2.2: resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" @@ -12391,24 +12178,6 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz" @@ -12458,7 +12227,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.4: +micromatch@^3.1.4: version "3.1.10" resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -12519,7 +12288,7 @@ mini-css-extract-plugin@^0.9.0: schema-utils "^1.0.0" webpack-sources "^1.1.0" -minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -12533,15 +12302,6 @@ minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - minimist@0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" @@ -12757,11 +12517,6 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.13.2: - version "2.14.2" - resolved "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - nanoid@^3.3.4: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -12861,13 +12616,6 @@ nise@^1.1.1: lolex "^5.0.1" path-to-regexp "^1.7.0" -no-case@^2.2.0, no-case@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -12949,47 +12697,6 @@ node-releases@^2.0.6: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -node-sass-glob-importer@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/node-sass-glob-importer/-/node-sass-glob-importer-5.3.2.tgz" - integrity sha512-QTX7KPsISgp55REV6pMH703nzHfWCOEYEQC0cDyTRo7XO6WDvyC0OAzekuQ4gs505IZcxv9KxZ3uPJ5s5H9D3g== - dependencies: - node-sass-magic-importer "^5.3.2" - -node-sass-magic-importer@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz" - integrity sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q== - dependencies: - css-node-extract "^2.1.3" - css-selector-extract "^3.3.6" - findup-sync "^3.0.0" - glob "^7.1.3" - object-hash "^1.3.1" - postcss-scss "^2.0.0" - resolve "^1.10.1" - -node-sass@6.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-6.0.1.tgz#cad1ccd0ce63e35c7181f545d8b986f3a9a887fe" - integrity sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^7.0.3" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - lodash "^4.17.15" - meow "^9.0.0" - nan "^2.13.2" - node-gyp "^7.1.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - nopt@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" @@ -13211,7 +12918,7 @@ npm@^7.20.5: which "^2.0.2" write-file-atomic "^3.0.3" -npmlog@^4.0.0, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -13319,11 +13026,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== - object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.7.0, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" @@ -13664,13 +13366,6 @@ pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5: ssri "^8.0.1" tar "^6.1.0" -param-case@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" - integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= - dependencies: - no-case "^2.2.0" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -13722,11 +13417,6 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" @@ -13763,14 +13453,6 @@ parse5@^7.0.0, parse5@^7.1.1: dependencies: entities "^4.4.0" -pascal-case@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz" - integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4= - dependencies: - camel-case "^3.0.0" - upper-case-first "^1.1.0" - pascal-case@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" @@ -13784,13 +13466,6 @@ pascalcase@^0.1.1: resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-case@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz" - integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU= - dependencies: - no-case "^2.2.0" - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" @@ -14440,13 +14115,6 @@ postcss-replace-overflow-wrap@^4.0.0: resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -postcss-scss@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz" - integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== - dependencies: - postcss "^7.0.6" - postcss-selector-not@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-7.0.2.tgz#f9184c7770be5dcb4abd7efa3610a15fbd2f0b31" @@ -14533,7 +14201,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 source-map "^0.5.6" supports-color "^3.2.3" -postcss@^6.0.1, postcss@^6.0.14: +postcss@^6.0.1: version "6.0.23" resolved "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -14542,15 +14210,6 @@ postcss@^6.0.1, postcss@^6.0.14: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -14820,11 +14479,6 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - raf@^3.4.1: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" @@ -15305,7 +14959,7 @@ readable-stream@1.1, readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.1, readable-stream@^2.0.6: +readable-stream@^2.0.6: version "2.3.7" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -15639,14 +15293,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -15684,7 +15330,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -15907,16 +15553,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - sass-loader@^7.2.0: version "7.3.1" resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz" @@ -16009,14 +15645,6 @@ scroll-behavior@^0.9.5: dom-helpers "^3.4.0" invariant "^2.2.4" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - section-iterator@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/section-iterator/-/section-iterator-2.0.0.tgz" @@ -16068,14 +15696,6 @@ semver@^7.5.3, semver@^7.5.4: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== -sentence-case@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz" - integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ= - dependencies: - no-case "^2.2.0" - upper-case-first "^1.1.2" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" @@ -16232,13 +15852,6 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" - integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8= - dependencies: - no-case "^2.2.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" @@ -16374,13 +15987,6 @@ source-map@0.1.40: dependencies: amdefine ">=0.0.4" -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" @@ -16520,13 +16126,6 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" @@ -16865,14 +16464,6 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" -swap-case@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" - integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM= - dependencies: - lower-case "^1.1.1" - upper-case "^1.1.1" - "symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" @@ -17019,14 +16610,6 @@ tiny-relative-date@^1.3.0: resolved "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== -title-case@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz" - integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o= - dependencies: - no-case "^2.2.0" - upper-case "^1.0.3" - title-case@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz" @@ -17154,23 +16737,11 @@ treeverse@^1.0.4: resolved "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz" integrity sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g== -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - ts-jest@^25.3.1: version "25.5.1" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-25.5.1.tgz" @@ -17337,11 +16908,6 @@ type-detect@^1.0.0: resolved "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz" integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" @@ -17505,18 +17071,6 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" -upper-case-first@^1.1.0, upper-case-first@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz" - integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU= - dependencies: - upper-case "^1.1.1" - -upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" @@ -17830,7 +17384,7 @@ which-typed-array@^1.1.8: has-tostringtag "^1.0.0" is-typed-array "^1.1.10" -which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: +which@1.3.1, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -18054,11 +17608,6 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" @@ -18073,7 +17622,7 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" -yargs@13.3.2, yargs@^13.3.0, yargs@^13.3.2: +yargs@13.3.2, yargs@^13.3.0: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==