From c593bd0746fb3d59130a612dfa44c95f2739653d Mon Sep 17 00:00:00 2001 From: Konstantin Gredeskoul Date: Mon, 26 Feb 2024 18:07:08 -0800 Subject: [PATCH 1/3] [WIP] Rails 6.0.2 & Ruby 3.2.3 --- .envrc | 13 + .github/workflows/rspec.yml | 84 + .github/workflows/rubocop.yml | 25 - .github/workflows/ruby.yml | 67 +- .github/workflows/rubyonrails.yml | 52 +- .gitignore | 2 +- .rspec | 1 + .rubocop.yml | 114 +- .rubocop_todo.yml | 234 +- .ruby-version | 2 +- Brewfile | 115 + Brewfile.lock.json | 2978 +++++++++++++++++ Gemfile | 18 +- Gemfile.lock | 547 +-- Makefile | 4 + Rakefile | 6 +- app/assets/config/manifest.js | 6 + app/assets/javascripts/bootstrap.js.coffee | 5 +- .../bootstrap_and_overrides.css.less | 30 - .../stylesheets/bootstrap_and_overrides.scss | 29 + {lib => app/classes}/fnf/event_reporter.rb | 0 app/classes/fnf/events.rb | 30 + .../classes}/fnf/events/abstract_event.rb | 2 +- .../events/ticket_request_approved_event.rb | 1 - .../events/ticket_request_declined_event.rb | 3 +- .../fnf/events/ticket_request_event.rb | 0 app/controllers/application_controller.rb | 2 +- app/controllers/eald_payments_controller.rb | 6 +- app/controllers/emails_controller.rb | 8 +- app/controllers/events_controller.rb | 34 +- app/controllers/home_controller.rb | 2 +- app/controllers/jobs_controller.rb | 2 +- app/controllers/passwords_controller.rb | 4 +- app/controllers/payments_controller.rb | 2 +- app/controllers/shifts_controller.rb | 10 +- app/controllers/ticket_requests_controller.rb | 22 +- app/controllers/time_slots_controller.rb | 8 +- app/helpers/shifts_helper.rb | 8 +- app/helpers/ticket_requests_helper.rb | 4 +- app/mailers/ticket_request_mailer.rb | 1 + app/models/application_record.rb | 3 + app/models/eald_payment.rb | 23 +- app/models/event.rb | 42 +- app/models/event_admin.rb | 25 +- app/models/job.rb | 21 +- app/models/payment.rb | 24 +- app/models/price_rule.rb | 19 +- app/models/price_rule/kids_equal_to.rb | 16 + app/models/shift.rb | 26 +- app/models/site_admin.rb | 15 +- app/models/ticket_request.rb | 46 +- app/models/time_slot.rb | 20 +- app/models/user.rb | 38 +- bin/boot-up | 229 +- bin/site-admin | 6 +- config.ru | 2 +- config/application.rb | 40 +- config/boot.rb | 6 +- config/environment.rb | 6 +- config/environments/development.rb | 9 +- config/environments/production.rb | 17 +- config/environments/test.rb | 6 +- config/initializers/auto_annotate_models.rb | 47 + config/initializers/event_initializer.rb | 16 - config/initializers/extensions.rb | 2 +- config/initializers/inflections.rb | 5 + config/initializers/secret_token.rb | 2 +- config/initializers/stripe.rb | 4 +- config/locales/en.bootstrap.yml | 23 + config/puma.rb | 4 +- config/routes.rb | 14 +- config/unicorn.rb | 2 +- .../20130210233501_devise_create_users.rb | 2 +- db/migrate/20130223202959_create_events.rb | 2 +- .../20130223204913_create_ticket_requests.rb | 2 +- db/migrate/20130224204644_create_payments.rb | 2 +- db/migrate/20130225033247_add_name_to_user.rb | 2 +- .../20130226010856_create_site_admins.rb | 2 +- ...130226221916_add_user_to_ticket_request.rb | 2 +- ...58_add_special_price_to_ticket_requests.rb | 2 +- db/migrate/20130304020307_create_jobs.rb | 2 +- .../20130304021739_create_time_slots.rb | 2 +- db/migrate/20130304022508_create_shifts.rb | 2 +- ...11213508_add_event_id_to_ticket_request.rb | 2 +- ...325024448_add_ticket_cost_info_to_event.rb | 2 +- ...8_rename_assistance_to_needs_assistance.rb | 2 +- ...add_volunteer_shifts_to_ticket_requests.rb | 2 +- .../20130427054403_create_event_admins.rb | 4 +- ...051822_add_max_cabin_requests_to_events.rb | 2 +- .../20130509021514_create_price_rules.rb | 4 +- ...4035306_add_performer_to_ticket_request.rb | 2 +- .../20130616002401_add_photo_to_events.rb | 2 +- ..._add_tickets_require_approval_to_events.rb | 2 +- ...ove_default_status_from_ticket_requests.rb | 6 +- ...5_add_require_mailing_address_to_events.rb | 2 +- ...dd_allow_financial_assistance_to_events.rb | 2 +- ...54452_add_ask_how_many_shifts_to_events.rb | 2 +- ..._constraint_from_ticket_request_address.rb | 6 +- ...7204929_add_donation_to_ticket_requests.rb | 2 +- ...707222903_add_allow_donations_to_events.rb | 2 +- ...art_and_end_ticket_sale_times_to_events.rb | 2 +- ...40428041744_add_explanation_to_payments.rb | 2 +- ...40428045329_add_role_to_ticket_requests.rb | 2 +- ...4_remove_performer_from_ticket_requests.rb | 2 +- ...le_camping_requested_to_ticket_requests.rb | 2 +- ...revious_contribution_to_ticket_requests.rb | 2 +- ...04_extract_address_into_multiple_fields.rb | 2 +- ...e_volunteer_shifts_from_ticket_requests.rb | 2 +- ..._remove_ask_how_many_shifts_from_events.rb | 2 +- ...026_add_camping_type_to_ticket_requests.rb | 2 +- ...4708_add_admin_notes_to_ticket_requests.rb | 2 +- ...51614_add_authentication_token_to_users.rb | 2 +- ...ing_type_explanation_to_ticket_requests.rb | 2 +- ..._change_camping_type_on_ticket_requests.rb | 2 +- ...7_add_ticket_request_end_time_to_events.rb | 2 +- ...608_add_agrees_terms_to_ticket_requests.rb | 2 +- db/migrate/20160611234315_add_eald_columns.rb | 2 +- ...0527021019_add_guests_to_ticket_request.rb | 2 +- db/structure.sql | 313 +- development/config/.psqlrc | 67 + development/config/.psqlrc.macros | 136 + development/config/.vim/autoload/plug.vim | 2538 ++++++++++++++ development/config/.vim/coc-settings.json | 10 + development/config/.vim/colors/ayu.vim | 268 ++ development/config/.vim/colors/brogrammer.vim | 118 + development/config/.vim/colors/evolution.vim | 146 + development/config/.vim/colors/molokai.vim | 276 ++ .../config/.vim/colors/monokai_pro.vim | 171 + development/config/.vim/scripts.vim | 0 development/config/.vim/syntax/bind.vim | 116 + development/config/.vim/syntax/json.vim | 143 + development/config/.vim/syntax/nginx.vim | 664 ++++ development/config/.vim/syntax/nmap.vim | 62 + development/config/.vimrc | 1 + development/config/.vimrc.customizations | 262 ++ development/config/config.Darwin.arm64 | 8 + lib/extensions/time.rb | 2 +- lib/fnf/events.rb | 6 +- lib/fnf/html_generator.rb | 14 +- lib/tasks/auto_annotate_models.rake | 59 + log/.gitkeep | 0 spec/controllers/emails_controller_spec.rb | 8 +- spec/controllers/events_controller_spec.rb | 11 +- .../ticket_requests_controller_spec.rb | 76 +- spec/factories/event.rb | 18 +- spec/factories/payment.rb | 2 +- spec/factories/ticket_request.rb | 23 +- spec/factories/user.rb | 4 +- spec/lib/fnf/csv_reader_spec.rb | 3 +- spec/lib/fnf/event_reporter_spec.rb | 5 +- spec/lib/fnf/events/events_spec.rb | 10 +- spec/lib/fnf/html_generator_spec.rb | 9 +- spec/lib/fnf/music_submissions_spec.rb | 5 +- spec/mailers/payment_mailer_spec.rb | 8 +- spec/mailers/ticket_request_mailer_spec.rb | 6 +- spec/models/event_admin_spec.rb | 38 +- spec/models/event_spec.rb | 196 +- spec/models/site_admin_spec.rb | 21 +- spec/models/ticket_request_spec.rb | 206 +- spec/models/user_spec.rb | 89 +- spec/spec_helper.rb | 16 +- spec/support/factory_bot.rb | 36 +- spec/support/time_extensions.rb | 6 +- 163 files changed, 10098 insertions(+), 1421 deletions(-) create mode 100644 .github/workflows/rspec.yml delete mode 100644 .github/workflows/rubocop.yml create mode 100644 Brewfile create mode 100644 Brewfile.lock.json create mode 100644 app/assets/config/manifest.js delete mode 100644 app/assets/stylesheets/bootstrap_and_overrides.css.less create mode 100644 app/assets/stylesheets/bootstrap_and_overrides.scss rename {lib => app/classes}/fnf/event_reporter.rb (100%) create mode 100644 app/classes/fnf/events.rb rename {lib => app/classes}/fnf/events/abstract_event.rb (95%) rename {lib => app/classes}/fnf/events/ticket_request_approved_event.rb (99%) rename {lib => app/classes}/fnf/events/ticket_request_declined_event.rb (83%) rename {lib => app/classes}/fnf/events/ticket_request_event.rb (100%) create mode 100644 app/models/application_record.rb create mode 100644 config/initializers/auto_annotate_models.rb delete mode 100644 config/initializers/event_initializer.rb create mode 100644 config/locales/en.bootstrap.yml create mode 100644 development/config/.psqlrc create mode 100644 development/config/.psqlrc.macros create mode 100644 development/config/.vim/autoload/plug.vim create mode 100644 development/config/.vim/coc-settings.json create mode 100644 development/config/.vim/colors/ayu.vim create mode 100644 development/config/.vim/colors/brogrammer.vim create mode 100644 development/config/.vim/colors/evolution.vim create mode 100644 development/config/.vim/colors/molokai.vim create mode 100644 development/config/.vim/colors/monokai_pro.vim create mode 100644 development/config/.vim/scripts.vim create mode 100644 development/config/.vim/syntax/bind.vim create mode 100644 development/config/.vim/syntax/json.vim create mode 100644 development/config/.vim/syntax/nginx.vim create mode 100644 development/config/.vim/syntax/nmap.vim create mode 100644 development/config/.vimrc create mode 100644 development/config/.vimrc.customizations create mode 100644 development/config/config.Darwin.arm64 create mode 100644 lib/tasks/auto_annotate_models.rake create mode 100644 log/.gitkeep diff --git a/.envrc b/.envrc index 3306c889..e268be8e 100644 --- a/.envrc +++ b/.envrc @@ -1,5 +1,18 @@ # vim: ft=bash PATH_add bin +PATH_add /opt/homebrew/bin + +export brew_prefix="$(brew --prefix)" +export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES + +export V8HOME=$(brew --prefix v8@3.15) + +export CFLAGS="-Wno-error=implicit-function-declaration -Wno-error=no-compound-token-split-by-macro" +export CPPFLAGS="$CPPFLAGS -I ${brew_prefix}/include -I ${V8HOME}/include" +export LDFLAGS="$LDFLAGS -L ${brew_prefix}/lib -L ${V8HOME}/lib" + +export RUBY_CPPFLAGS="$CPPFLAGS" +export RUBY_CFLAGS="$CFLAGS" [[ -f .envrc.local ]] && source .envrc.local diff --git a/.github/workflows/rspec.yml b/.github/workflows/rspec.yml new file mode 100644 index 00000000..5607ced2 --- /dev/null +++ b/.github/workflows/rspec.yml @@ -0,0 +1,84 @@ +# .github/workflows/main.yaml +name: "TicketBooth CI: rspec" + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + main: + name: CI + runs-on: ubuntu-latest + + # If you need DB like MySQL then define service below. + # Example for PostgreSQL and Redis can be found here: + # https://github.com/actions/example-services/tree/master/.github/workflows + services: + postgresql: + image: postgres + env: + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "" + POSTGRES_HOST_AUTH_METHOD: "trust" + ports: + - 5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + redis: + image: redis + ports: + - 6379/tcp + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - uses: niden/actions-memcached@v7 + + - run: sudo apt-get update -yqq + - run: sudo apt-get install -yqq netcat libpq-dev + + - name: "Verify Memcached is running" + run: echo -e "stats\nquit" | nc localhost 11211 | grep -e "accepting_conns 1" -q + + - uses: actions/checkout@v4 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2.3' + bundler-cache: true + + - name: "Create and migrate the DB" + run: | + bin/rails db:create + bin/rails db:migrate + bin/rails db:test:prepare + + - name: "Run Rspec" + run: bundle exec rspec --format documentation + + - name: "Run Rubocop" + run: bundle exec rubocop + + + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2.3' + bundler-cache: true + + - name: RuboCop + run: bin/rubocop --parallel diff --git a/.github/workflows/rubocop.yml b/.github/workflows/rubocop.yml deleted file mode 100644 index fdefa3c5..00000000 --- a/.github/workflows/rubocop.yml +++ /dev/null @@ -1,25 +0,0 @@ - -name: Rubocop - -on: - push: - branches: [ main ] - pull_request: - branches: [ main] - -jobs: - test: - runs-on: ubuntu-latest - env: - CODECOV_TOKEN: "" - steps: - - uses: actions/checkout@v2 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: 2.5.8 # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - - - run: | - gem install bundler --version 1.17.3 -N - bundle _1.17.3_ install -j 12 - bundle exec rubocop --format progress -P diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index feb3fdab..cc7e8753 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -1,5 +1,4 @@ - -name: RSpec +name: "TicketBooth CI: Ruby" on: push: branches: [ main ] @@ -7,38 +6,54 @@ on: branches: [ main ] jobs: - build: + # Label of the container job + container-job: + # Containers must run in Linux based operating systems runs-on: ubuntu-latest + # Docker Hub image that `container-job` executes in + container: ruby:3.2 + + # Service containers to run with `container-job` services: postgres: - image: postgres:13 - ports: - - 5432:5432 + # Docker Hub image + image: postgres:16 + # Provide the password for postgres env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "" + POSTGRES_HOST_AUTH_METHOD: "trust" + + # Set health checks to wait until postgres has started + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + redis: + # Docker Hub image image: redis - ports: - - 6379:6379 - options: --entrypoint redis-server + # Set health checks to wait until redis has started + options: >- + --health-cmd "redis-cli ping" + --health-interval 10sa + --health-timeout 5s + --health-retries 5 + steps: - - uses: actions/checkout@v2 - - uses: ruby/setup-ruby@v1 + - uses: niden/actions-memcached@v7 + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1 with: - ruby-version: 2.5.8 # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - - - run: | - gem update --system 3.2.3 || true - gem install bundler --version 1.17.3 -N - bundle _1.17.3_ install -j 12 + ruby-version: '3.2.3' # Not needed with a .ruby-version file + bundler-cache: true + - run: bundle install -j 12 - run: | - bundle exec rake db:create - bundle exec rake db:migrate - bundle exec rake db:test:prepare + bin/rails db:create + bin/rails db:migrate + bin/rails db:test:prepare + - run: bundle exec rspec --format documentation + - run: bundle exec rubocop - - run: | - bundle exec rspec diff --git a/.github/workflows/rubyonrails.yml b/.github/workflows/rubyonrails.yml index c34d8101..39e4fa87 100644 --- a/.github/workflows/rubyonrails.yml +++ b/.github/workflows/rubyonrails.yml @@ -4,7 +4,7 @@ # # This workflow will install a prebuilt Ruby version, install dependencies, and # run tests and linters. -name: "Ruby on Rails CI" +name: "TicketBooth CI: Ruby on Rails" on: push: branches: [ "main" ] @@ -15,44 +15,54 @@ jobs: runs-on: ubuntu-latest services: postgres: - image: postgres:15-alpine + image: postgres ports: - "5432:5432" env: - POSTGRES_DB: tickets_test - POSTGRES_USER: postgres - POSTGRES_PASSWORD: password + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "" + POSTGRES_HOST_AUTH_METHOD: "trust" + + redis: + # Docker Hub image + image: redis + # Set health checks to wait until redis has started + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 env: RAILS_ENV: test DATABASE_URL: "postgres://postgres:password@localhost:5432/tickets_test" steps: + - run: sudo apt-get -yqq install libpq-dev + - uses: niden/actions-memcached@v7 + - name: Checkout code - uses: actions/checkout@v3 - # Add or replace dependency steps here - - name: Install Ruby and gems - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + uses: actions/checkout@v4 + + - uses: ruby/setup-ruby@v1 with: + ruby-version: '3.2.3' bundler-cache: true - # Add or replace database setup steps here + - name: Set up database schema run: bin/rails db:schema:load - # Add or replace test runners here + - name: Run tests - run: bin/rake + run: bundle exec rspec lint: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 - - name: Install Ruby and gems - uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0 + uses: actions/checkout@v4 + + - uses: ruby/setup-ruby@v1 with: + ruby-version: '3.2.3' bundler-cache: true - # Add or replace any other lints here - - name: Security audit dependencies - run: bin/bundler-audit --update - - name: Security audit application code - run: bin/brakeman -q -w2 - - name: Lint Ruby files + + - name: RuboCop run: bin/rubocop --parallel diff --git a/.gitignore b/.gitignore index ae9e9c53..0f2d6809 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ **/.DS_Store .idea .vscode -/log +/log/*.log /tmp # Ignore file uploads in development diff --git a/.rspec b/.rspec index 65e0669b..eca4e0ef 100644 --- a/.rspec +++ b/.rspec @@ -3,3 +3,4 @@ --order rand --profile 5 --require spec_helper +-b diff --git a/.rubocop.yml b/.rubocop.yml index 489bf554..6a91b93e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,111 +2,9 @@ inherit_from: .rubocop_todo.yml AllCops: NewCops: enable -Gemspec/DateAssignment: # new in 1.10 - Enabled: true -Gemspec/RequireMFA: # new in 1.23 - Enabled: true -Layout/LineEndStringConcatenationIndentation: # new in 1.18 - Enabled: true -Layout/SpaceBeforeBrackets: # new in 1.7 - Enabled: true -Lint/AmbiguousAssignment: # new in 1.7 - Enabled: true -Lint/AmbiguousOperatorPrecedence: # new in 1.21 - Enabled: true -Lint/AmbiguousRange: # new in 1.19 - Enabled: true -Lint/DeprecatedConstants: # new in 1.8 - Enabled: true -Lint/DuplicateBranch: # new in 1.3 - Enabled: true -Lint/DuplicateRegexpCharacterClassElement: # new in 1.1 - Enabled: true -Lint/EmptyBlock: # new in 1.1 - Enabled: true -Lint/EmptyClass: # new in 1.3 - Enabled: true -Lint/EmptyInPattern: # new in 1.16 - Enabled: true -Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21 - Enabled: true -Lint/LambdaWithoutLiteralBlock: # new in 1.8 - Enabled: true -Lint/NoReturnInBeginEndBlocks: # new in 1.2 - Enabled: true -Lint/NumberedParameterAssignment: # new in 1.9 - Enabled: true -Lint/OrAssignmentToConstant: # new in 1.9 - Enabled: true -Lint/RedundantDirGlobSort: # new in 1.8 - Enabled: true -Lint/RefinementImportMethods: # new in 1.27 - Enabled: true -Lint/RequireRelativeSelfPath: # new in 1.22 - Enabled: true -Lint/SymbolConversion: # new in 1.9 - Enabled: true -Lint/ToEnumArguments: # new in 1.1 - Enabled: true -Lint/TripleQuotes: # new in 1.9 - Enabled: true -Lint/UnexpectedBlockArity: # new in 1.5 - Enabled: true -Lint/UnmodifiedReduceAccumulator: # new in 1.1 - Enabled: true -Lint/UselessRuby2Keywords: # new in 1.23 - Enabled: true -Naming/BlockForwarding: # new in 1.24 - Enabled: true -Security/IoMethods: # new in 1.22 - Enabled: true -Style/ArgumentsForwarding: # new in 1.1 - Enabled: true -Style/CollectionCompact: # new in 1.2 - Enabled: true -Style/DocumentDynamicEvalDefinition: # new in 1.1 - Enabled: true -Style/EndlessMethod: # new in 1.8 - Enabled: true -Style/FileRead: # new in 1.24 - Enabled: true -Style/FileWrite: # new in 1.24 - Enabled: true -Style/HashConversion: # new in 1.10 - Enabled: true -Style/HashExcept: # new in 1.7 - Enabled: true -Style/IfWithBooleanLiteralBranches: # new in 1.9 - Enabled: true -Style/InPatternThen: # new in 1.16 - Enabled: true -Style/MapToHash: # new in 1.24 - Enabled: true -Style/MultilineInPatternThen: # new in 1.16 - Enabled: true -Style/NegatedIfElseCondition: # new in 1.2 - Enabled: true -Style/NestedFileDirname: # new in 1.26 - Enabled: true -Style/NilLambda: # new in 1.3 - Enabled: true -Style/NumberedParameters: # new in 1.22 - Enabled: true -Style/NumberedParametersLimit: # new in 1.22 - Enabled: true -Style/OpenStructUse: # new in 1.23 - Enabled: true -Style/QuotedSymbols: # new in 1.16 - Enabled: true -Style/RedundantArgument: # new in 1.4 - Enabled: true -Style/RedundantInitialize: # new in 1.27 - Enabled: true -Style/RedundantSelfAssignmentBranch: # new in 1.19 - Enabled: true -Style/SelectByRegexp: # new in 1.22 - Enabled: true -Style/StringChars: # new in 1.12 - Enabled: true -Style/SwapValues: # new in 1.1 - Enabled: true +require: + - rubocop-factory_bot + - rubocop-rails + - rubocop-rake + - rubocop-rspec + diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index ceaf9ed4..75bff208 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,17 +1,17 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2022-05-02 03:13:36 UTC using RuboCop version 1.27.0. +# on 2024-02-16 22:39:17 UTC using RuboCop version 1.60.2. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 2 +# Offense count: 1 +# This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: AllowSafeAssignment. Lint/AssignmentInCondition: Exclude: - 'app/controllers/passwords_controller.rb' - - 'app/controllers/ticket_requests_controller.rb' # Offense count: 1 Lint/ShadowingOuterLocalVariable: @@ -24,61 +24,247 @@ Lint/UnmodifiedReduceAccumulator: - 'app/helpers/shifts_helper.rb' # Offense count: 1 +# This cop supports unsafe autocorrection (--autocorrect-all). Lint/UselessAssignment: Exclude: - 'config/unicorn.rb' -# Offense count: 20 -# Configuration parameters: IgnoredMethods, CountRepeatedAttributes. +# Offense count: 19 +# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes. Metrics/AbcSize: Max: 62 -# Offense count: 21 -# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods. -# IgnoredMethods: refine +# Offense count: 3 +# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode. +# AllowedMethods: refine Metrics/BlockLength: - Max: 255 + Max: 55 -# Offense count: 2 +# Offense count: 3 # Configuration parameters: CountComments, CountAsOne. Metrics/ClassLength: - Max: 157 + Max: 156 -# Offense count: 4 -# Configuration parameters: IgnoredMethods. +# Offense count: 5 +# Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/CyclomaticComplexity: Max: 13 -# Offense count: 25 -# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods. +# Offense count: 24 +# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns. Metrics/MethodLength: - Max: 59 + Max: 58 # Offense count: 1 # Configuration parameters: CountComments, CountAsOne. Metrics/ModuleLength: Max: 114 -# Offense count: 3 -# Configuration parameters: IgnoredMethods. +# Offense count: 4 +# Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/PerceivedComplexity: Max: 15 # Offense count: 6 # Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. -# AllowedNames: at, by, db, id, in, io, ip, of, on, os, pp, to +# AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to Naming/MethodParameterName: Exclude: - 'spec/support/factory_bot.rb' - 'spec/support/time_extensions.rb' -# Offense count: 74 +# Offense count: 15 +# Configuration parameters: Prefixes, AllowedPatterns. +# Prefixes: when, with, without +RSpec/ContextWording: + Exclude: + - 'spec/controllers/events_controller_spec.rb' + - 'spec/models/event_spec.rb' + - 'spec/models/ticket_request_spec.rb' + +# Offense count: 1 +# Configuration parameters: IgnoredMetadata. +RSpec/DescribeClass: + Exclude: + - 'spec/lib/fnf/music_submissions_spec.rb' + +# Offense count: 1 +RSpec/ExpectInHook: + Exclude: + - 'spec/lib/fnf/event_reporter_spec.rb' + +# Offense count: 1 +# Configuration parameters: . +# SupportedStyles: have_received, receive +RSpec/MessageSpies: + EnforcedStyle: receive + +# Offense count: 15 +# Configuration parameters: AllowSubject. +RSpec/MultipleMemoizedHelpers: + Max: 11 + +# Offense count: 3 +# Configuration parameters: EnforcedStyle, IgnoreSharedExamples. +# SupportedStyles: always, named_only +RSpec/NamedSubject: + Exclude: + - 'spec/controllers/ticket_requests_controller_spec.rb' + - 'spec/lib/fnf/csv_reader_spec.rb' + - 'spec/models/ticket_request_spec.rb' + +# Offense count: 60 +# Configuration parameters: AllowedGroups. +RSpec/NestedGroups: + Max: 5 + +# Offense count: 52 +# Configuration parameters: AllowedPatterns. +# AllowedPatterns: ^expect_, ^assert_ +RSpec/NoExpectationExample: + Exclude: + - 'spec/controllers/emails_controller_spec.rb' + - 'spec/controllers/events_controller_spec.rb' + - 'spec/controllers/ticket_requests_controller_spec.rb' + - 'spec/lib/fnf/event_reporter_spec.rb' + - 'spec/mailers/payment_mailer_spec.rb' + - 'spec/mailers/ticket_request_mailer_spec.rb' + - 'spec/models/event_spec.rb' + - 'spec/models/ticket_request_spec.rb' + - 'spec/models/user_spec.rb' + +# Offense count: 2 +RSpec/RepeatedExampleGroupBody: + Exclude: + - 'spec/models/event_spec.rb' + +# Offense count: 3 +# This cop supports unsafe autocorrection (--autocorrect-all). +Rails/ApplicationMailer: + Exclude: + - 'app/mailers/eald_payment_mailer.rb' + - 'app/mailers/payment_mailer.rb' + - 'app/mailers/ticket_request_mailer.rb' + +# Offense count: 9 +# Configuration parameters: Database, Include. +# SupportedDatabases: mysql, postgresql +# Include: db/**/*.rb +Rails/BulkChangeTable: + Exclude: + - 'db/migrate/20130226221916_add_user_to_ticket_request.rb' + - 'db/migrate/20130325024448_add_ticket_cost_info_to_event.rb' + - 'db/migrate/20130803212458_add_start_and_end_ticket_sale_times_to_events.rb' + - 'db/migrate/20140428045329_add_role_to_ticket_requests.rb' + - 'db/migrate/20140605045004_extract_address_into_multiple_fields.rb' + - 'db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb' + - 'db/migrate/20160611234315_add_eald_columns.rb' + +# Offense count: 3 +# Configuration parameters: Include. +# Include: app/models/**/*.rb +Rails/HasManyOrHasOneDependent: + Exclude: + - 'app/models/event.rb' + - 'app/models/ticket_request.rb' + - 'app/models/user.rb' + +# Offense count: 3 +# Configuration parameters: Include. +# Include: app/helpers/**/*.rb +Rails/HelperInstanceVariable: + Exclude: + - 'app/helpers/shifts_helper.rb' + +# Offense count: 14 +Rails/I18nLocaleTexts: + Exclude: + - 'app/controllers/home_controller.rb' + - 'app/controllers/jobs_controller.rb' + - 'app/controllers/passwords_controller.rb' + - 'app/controllers/payments_controller.rb' + - 'app/controllers/shifts_controller.rb' + - 'app/controllers/ticket_requests_controller.rb' + - 'app/models/event_admin.rb' + - 'app/models/payment.rb' + - 'app/models/site_admin.rb' + - 'app/models/user.rb' + +# Offense count: 1 +# Configuration parameters: Database, Include. +# SupportedDatabases: mysql +# Include: db/**/*.rb +Rails/NotNullColumn: + Exclude: + - 'db/migrate/20130311213508_add_event_id_to_ticket_request.rb' + +# Offense count: 9 +# Configuration parameters: Include. +# Include: db/**/*.rb +Rails/ReversibleMigration: + Exclude: + - 'db/migrate/20130226221916_add_user_to_ticket_request.rb' + - 'db/migrate/20140515053804_remove_performer_from_ticket_requests.rb' + - 'db/migrate/20140605045004_extract_address_into_multiple_fields.rb' + - 'db/migrate/20140605052627_remove_volunteer_shifts_from_ticket_requests.rb' + - 'db/migrate/20140605053705_remove_ask_how_many_shifts_from_events.rb' + - 'db/migrate/20140605060026_add_camping_type_to_ticket_requests.rb' + - 'db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb' + +# Offense count: 3 +# Configuration parameters: ForbiddenMethods, AllowedMethods. +# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all +Rails/SkipsModelValidations: + Exclude: + - 'app/controllers/application_controller.rb' + - 'app/controllers/ticket_requests_controller.rb' + - 'app/models/user.rb' + +# Offense count: 3 +# Configuration parameters: Include. +# Include: db/**/*.rb +Rails/ThreeStateBooleanColumn: + Exclude: + - 'db/migrate/20140515054433_add_vehicle_camping_requested_to_ticket_requests.rb' + - 'db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb' + - 'db/migrate/20150609064608_add_agrees_terms_to_ticket_requests.rb' + +# Offense count: 1 +# Configuration parameters: TransactionMethods. +Rails/TransactionExitStatement: + Exclude: + - 'app/models/ticket_request.rb' + +# Offense count: 2 +# Configuration parameters: Include. +# Include: app/models/**/*.rb +Rails/UniqueValidationWithoutIndex: + Exclude: + - 'app/models/payment.rb' + - 'app/models/site_admin.rb' + +# Offense count: 2 +# This cop supports safe autocorrection (--autocorrect). +Rake/Desc: + Exclude: + - 'Rakefile' + +# Offense count: 81 # Configuration parameters: AllowedConstants. Style/Documentation: Enabled: false +# Offense count: 1 +# This cop supports unsafe autocorrection (--autocorrect-all). +# Configuration parameters: EnforcedStyle. +# SupportedStyles: always, always_true, never +Style/FrozenStringLiteralComment: + Exclude: + - 'app/models/application_record.rb' + # Offense count: 5 -# Configuration parameters: MinBodyLength. +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: MinBodyLength, AllowConsecutiveConditionals. Style/GuardClause: Exclude: - 'app/controllers/application_controller.rb' @@ -92,9 +278,9 @@ Style/MissingRespondToMissing: Exclude: - 'spec/support/factory_bot.rb' -# Offense count: 3 -# This cop supports safe auto-correction (--auto-correct). -# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. +# Offense count: 7 +# This cop supports safe autocorrection (--autocorrect). +# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. # URISchemes: http, https Layout/LineLength: Max: 174 diff --git a/.ruby-version b/.ruby-version index 30f69e8c..b347b11e 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.9 +3.2.3 diff --git a/Brewfile b/Brewfile new file mode 100644 index 00000000..cf525934 --- /dev/null +++ b/Brewfile @@ -0,0 +1,115 @@ +# frozen_string_literal: true + +# vim: ft=ruby + +tap 'homebrew/bundle' +tap 'homebrew/services' +tap 'heroku/brew' + +# heroku CLI +brew 'heroku' + +# Build Environment/C/C++ +brew 'autoconf' +brew 'automake' +brew 'bash-completion@2' +brew 'bat' +brew 'cmake' +brew 'coreutils' +brew 'direnv' +brew 'fzf' +brew 'gcc' +brew 'glances' +brew 'gnutls' +brew 'gnu-indent' +brew 'gnu-sed' +brew 'gnu-tar' +brew 'gnu-time' +brew 'gnu-which' +brew 'gpg2' +brew 'jemalloc' +brew 'jq' +brew 'libffi' +brew 'libmemcached' +brew 'libpq' +brew 'libtiff' +brew 'libtool' +brew 'libxml2' +brew 'libxslt' +brew 'libyaml' +brew 'libzip' +brew 'make' +brew 'p7zip' +brew 'parallel' +brew 'pcre' +brew 'pcre' +brew 'pg_top' +brew 'pkg-config' +brew 'postgresql@15' +brew 'pstree' +brew 'pyenv' +brew 'rbenv' +brew 'readline' +brew 'redis' +brew 'ripgrep' +brew 'rsync' +brew 'ruby-build' +brew 'ruby-completion' +brew 'shellcheck' +brew 'stripe/stripe-mock/stripe-mock' +brew 'tree' +brew 'vim' +brew 'watch' +brew 'wget' +brew 'yamlfmt' +brew 'yamllint' +brew 'ydiff' +brew 'yq' +brew 'zlib' +brew 'v8' + +cask 'chromedriver' +cask 'github' + +cask 'font-andale-mono' +cask 'font-anonymice-powerline' +cask 'font-arvo' +cask 'font-aurulent-sans-mono-nerd-font' +cask 'font-awesome-terminal-fonts' +cask 'font-bitstream-vera-sans-mono-nerd-font' +cask 'font-blex-mono-nerd-font' +cask 'font-cairo' +cask 'font-cascadia-mono' +cask 'font-consolas-for-powerline' +cask 'font-cousine' +cask 'font-cutive-mono' +cask 'font-d2coding' +cask 'font-dejavu-sans-mono-for-powerline' +cask 'font-everson-mono' +cask 'font-fantasque-sans-mono' +cask 'font-fontawesome' +cask 'font-ia-writer-mono' +cask 'font-inconsolata' +cask 'font-jetbrains-mono' +cask 'font-kawkab-mono' +cask 'font-lekton-nerd-font' +cask 'font-menlo-for-powerline' +cask 'font-meslo-for-powerline' +cask 'font-miriam-mono-clm' +cask 'font-monoid' +cask 'font-monoisome' +cask 'font-mononoki' +cask 'font-monoton' +cask 'font-noto-mono' +cask 'font-oswald' +cask 'font-oxygen' +cask 'font-oxygen-mono' +cask 'font-powerline-symbols' +cask 'font-pt-mono' +cask 'font-roboto' +cask 'font-roboto-mono-nerd-font' +cask 'font-share-tech-mono' +cask 'font-sometype-mono' +cask 'font-titillium' +cask 'font-ubuntu' +cask 'font-victor-mono' diff --git a/Brewfile.lock.json b/Brewfile.lock.json new file mode 100644 index 00000000..ede91c28 --- /dev/null +++ b/Brewfile.lock.json @@ -0,0 +1,2978 @@ +{ + "entries": { + "tap": { + "homebrew/bundle": { + "revision": "2f22c21799744c6b027a0695b36a37185d66a6a6" + }, + "homebrew/services": { + "revision": "404a74488dd9f5e2799f495ba3736dfb604b025b" + }, + "heroku/brew": { + "revision": "379bc49cf928a18cb0e7dcad4946278ff831e420" + } + }, + "brew": { + "heroku": { + "version": "8.5.0", + "bottle": false + }, + "autoconf": { + "version": "2.72", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186", + "sha256": "bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186", + "sha256": "bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186", + "sha256": "bb39057e87dd9cb940bee15ff5b5172952a0350e59b14a6f55b8006a07813186" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd", + "sha256": "12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd", + "sha256": "12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd", + "sha256": "12368e33b89d221550ba9e261b0c6ece0b0e89250fb4c95169d09081e0ebb2dd" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/autoconf/blobs/sha256:d760774b6bcad93822e666a8a2ee8557f674eba7f784b9ab9e397313378474b8", + "sha256": "d760774b6bcad93822e666a8a2ee8557f674eba7f784b9ab9e397313378474b8" + } + } + } + }, + "automake": { + "version": "1.16.5", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:7a116fd1052d95a13b40837b85a34cca35dbae9ed2864d1db92abfa960176b55", + "sha256": "7a116fd1052d95a13b40837b85a34cca35dbae9ed2864d1db92abfa960176b55" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a", + "sha256": "f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a", + "sha256": "f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a", + "sha256": "f68481d06be7fa3f0a0881edb825a336e7f6548191c762d68bd817183b238f5a" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:4f3ecdf86b3a0302f64b848440b0595095face19a0b9778498e5e64d022c1a81", + "sha256": "4f3ecdf86b3a0302f64b848440b0595095face19a0b9778498e5e64d022c1a81" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d", + "sha256": "ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d", + "sha256": "ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d", + "sha256": "ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d" + }, + "catalina": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d", + "sha256": "ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d" + }, + "mojave": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d", + "sha256": "ae77a247a13ea860236a29b02769f5327395f712413f694d8a8d20cb6c21332d" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/automake/blobs/sha256:59808c20f7dc565f106b432941b43c52f3d7f46a8d562ab27a4aabd424783158", + "sha256": "59808c20f7dc565f106b432941b43c52f3d7f46a8d562ab27a4aabd424783158" + } + } + } + }, + "bash-completion@2": { + "version": "2.11", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", + "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", + "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", + "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", + "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", + "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", + "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:ac195162fd4c749460be5eada9042bca58d30646f3eff1371af50cb1fde5714c", + "sha256": "ac195162fd4c749460be5eada9042bca58d30646f3eff1371af50cb1fde5714c" + } + } + } + }, + "bat": { + "version": "0.24.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:66f03028e55d7a9ce344c7910b8469e16c0acd812ebc2886cdff8c10f9cf34c4", + "sha256": "66f03028e55d7a9ce344c7910b8469e16c0acd812ebc2886cdff8c10f9cf34c4" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:b36dd52fda8441a5b9c83f0914b4f362c8caa9c6a1143b1ee2c7f54941b8ed6b", + "sha256": "b36dd52fda8441a5b9c83f0914b4f362c8caa9c6a1143b1ee2c7f54941b8ed6b" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:0a7454b37d7b095de1006996ceb43a585ca05339c2f540dde1703202b139695d", + "sha256": "0a7454b37d7b095de1006996ceb43a585ca05339c2f540dde1703202b139695d" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:58769b8c6b1380e9d066586bf8f678993457ef9ea449c3d4d7955461018d3b49", + "sha256": "58769b8c6b1380e9d066586bf8f678993457ef9ea449c3d4d7955461018d3b49" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:d6e91c86547c67292cb6abf92fac7f9c6272bf6bca5483466e3e9adc744ce1c0", + "sha256": "d6e91c86547c67292cb6abf92fac7f9c6272bf6bca5483466e3e9adc744ce1c0" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:eb2c932132331cb87e5cace268b034e32c3a4741fccd42813cf853269e3a9c21", + "sha256": "eb2c932132331cb87e5cace268b034e32c3a4741fccd42813cf853269e3a9c21" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/bat/blobs/sha256:0ae5db045ded8528d1588d703d62d6be481ebe006888c7e29f7e178b07e0e926", + "sha256": "0ae5db045ded8528d1588d703d62d6be481ebe006888c7e29f7e178b07e0e926" + } + } + } + }, + "cmake": { + "version": "3.28.3", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:91fc13f7284a925a794549c0f708b612a4fa87b0fdfdf6d224fd14512aaa1397", + "sha256": "91fc13f7284a925a794549c0f708b612a4fa87b0fdfdf6d224fd14512aaa1397" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:971a7a7ede64c866acd74211c51b14ccc9f15d5214538b7f2c386cfcc9d5df17", + "sha256": "971a7a7ede64c866acd74211c51b14ccc9f15d5214538b7f2c386cfcc9d5df17" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:53c78bcbe47be5bc2f2512f679a760e5b9d596724773ddb31f58e3abf8375f9c", + "sha256": "53c78bcbe47be5bc2f2512f679a760e5b9d596724773ddb31f58e3abf8375f9c" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:d1e4a8a2bcbb4dd3f447fa59761ccff46553d452100bbcc69aa730b74daa6481", + "sha256": "d1e4a8a2bcbb4dd3f447fa59761ccff46553d452100bbcc69aa730b74daa6481" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:eb0c7a47da85e62faa20aa5f89da9180d026eb400266249f14219b972754e0fa", + "sha256": "eb0c7a47da85e62faa20aa5f89da9180d026eb400266249f14219b972754e0fa" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:d3219efe5909c5ee3cd3827b719bf7f1dbc22a5ca0ab4ed65d5f72b204a6e334", + "sha256": "d3219efe5909c5ee3cd3827b719bf7f1dbc22a5ca0ab4ed65d5f72b204a6e334" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/cmake/blobs/sha256:3004aab27511db3212d6fa3bc60958ca8e6c6d2d2739c538bba5f39f9f8aee7b", + "sha256": "3004aab27511db3212d6fa3bc60958ca8e6c6d2d2739c538bba5f39f9f8aee7b" + } + } + } + }, + "coreutils": { + "version": "9.4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:a37cf7152382ee80a7e4f6cb318929c4dd213d8367607e0b6dbf56762883ec29", + "sha256": "a37cf7152382ee80a7e4f6cb318929c4dd213d8367607e0b6dbf56762883ec29" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:3707a17440f54975e547469c1309b2f260ef4bfc5c2c53ddc22998ae3a7fbe19", + "sha256": "3707a17440f54975e547469c1309b2f260ef4bfc5c2c53ddc22998ae3a7fbe19" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:e4e7b23c4426f5e7902cabb6a2eae635e78460ebb16a8473a25f519955302c5a", + "sha256": "e4e7b23c4426f5e7902cabb6a2eae635e78460ebb16a8473a25f519955302c5a" + }, + "arm64_big_sur": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:37fc8c6586e633c1a8277bc0ecb9893b7d170709f0fc1e7e36bbb00abd14fcc7", + "sha256": "37fc8c6586e633c1a8277bc0ecb9893b7d170709f0fc1e7e36bbb00abd14fcc7" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:c1be62140384a011c75ba6395c6bae84f07d655624014f415354375e1dd0173a", + "sha256": "c1be62140384a011c75ba6395c6bae84f07d655624014f415354375e1dd0173a" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:5f03b30eff5c9cd0bc74bb429059f9b9d7af4edb8e6b80b52228b0bf35d53197", + "sha256": "5f03b30eff5c9cd0bc74bb429059f9b9d7af4edb8e6b80b52228b0bf35d53197" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:ec46f14061242a7439e7fbb1e328b3e1dccfec465425aaf25aa4b4fe5363f95b", + "sha256": "ec46f14061242a7439e7fbb1e328b3e1dccfec465425aaf25aa4b4fe5363f95b" + }, + "big_sur": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:6504082e9752f7a37fd9d02b5f31a5fe68342526f31a774ce7cda90dc189c97f", + "sha256": "6504082e9752f7a37fd9d02b5f31a5fe68342526f31a774ce7cda90dc189c97f" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/coreutils/blobs/sha256:362b7fcf429b62749f37056d1c8de07dfd6a7a5445eb6eec8f1f64a07a87c1d5", + "sha256": "362b7fcf429b62749f37056d1c8de07dfd6a7a5445eb6eec8f1f64a07a87c1d5" + } + } + } + }, + "direnv": { + "version": "2.33.0", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:b1795e6743e0bb769f92d07aa5d2401c57b7bee715fc68894c2f5d1c95aba013", + "sha256": "b1795e6743e0bb769f92d07aa5d2401c57b7bee715fc68894c2f5d1c95aba013" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:1c2d6d8b0bdc071b4344600ec914dd52f521c3d21f9fd38a6e218e65cc50fb36", + "sha256": "1c2d6d8b0bdc071b4344600ec914dd52f521c3d21f9fd38a6e218e65cc50fb36" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:1e365c468da6a471f28c21ef11871641f8414d1c45b9710509884a9aa8b6fe78", + "sha256": "1e365c468da6a471f28c21ef11871641f8414d1c45b9710509884a9aa8b6fe78" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:cd4b008579b836b43778c197cfa953cb3934505db0e65053ae5a9d4c10155c60", + "sha256": "cd4b008579b836b43778c197cfa953cb3934505db0e65053ae5a9d4c10155c60" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:55781935916235989a46904640a4728a0a3dc24228db7cc9dbac5954b95e52dd", + "sha256": "55781935916235989a46904640a4728a0a3dc24228db7cc9dbac5954b95e52dd" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:6b0c4abed5b230f6e3112df41f9019dd8291a5cb3c82e3337471e2b4aa5e28ea", + "sha256": "6b0c4abed5b230f6e3112df41f9019dd8291a5cb3c82e3337471e2b4aa5e28ea" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:65deffe8cb70793402e4ac64655d9805b0b84f174fe8a32dd0722d1781bc4a1f", + "sha256": "65deffe8cb70793402e4ac64655d9805b0b84f174fe8a32dd0722d1781bc4a1f" + } + } + } + }, + "fzf": { + "version": "0.46.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:aa98d4e9bfcb82ff81f42d23f1944ac56ee3bae5d8e44627a764d0d643fe2a08", + "sha256": "aa98d4e9bfcb82ff81f42d23f1944ac56ee3bae5d8e44627a764d0d643fe2a08" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:9269ef300b9fbc0fb3e88f9f0dd262602655fb13783bf148d785f9b93624c8ff", + "sha256": "9269ef300b9fbc0fb3e88f9f0dd262602655fb13783bf148d785f9b93624c8ff" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:928b58a367f41f39f85a211f20c19286f8ea7d05ab1c303c6d749b2e439b95a1", + "sha256": "928b58a367f41f39f85a211f20c19286f8ea7d05ab1c303c6d749b2e439b95a1" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:f267b893cfeb9ffc33c4722c82fff589e40dca418cc8beddc9ff787cf8080bca", + "sha256": "f267b893cfeb9ffc33c4722c82fff589e40dca418cc8beddc9ff787cf8080bca" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:c3bf340555075c036d0df533b845908518c64dbf21d682fb85baf97f178785c0", + "sha256": "c3bf340555075c036d0df533b845908518c64dbf21d682fb85baf97f178785c0" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:fb616e6906d5dc39d0e83e5e9197cc0984b4d14a9c5805830f4443a262d5f629", + "sha256": "fb616e6906d5dc39d0e83e5e9197cc0984b4d14a9c5805830f4443a262d5f629" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:1d2690cd2e82cd9c814a33e5dfc1f90bec1b579c5cf2e104626bb1dcfcc2864c", + "sha256": "1d2690cd2e82cd9c814a33e5dfc1f90bec1b579c5cf2e104626bb1dcfcc2864c" + } + } + } + }, + "gcc": { + "version": "13.2.0", + "bottle": { + "rebuild": 2, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:85037a5e7d463f55d9a0ff3963b24008c8a10937d137909bd6e91cf64ddfe8b6", + "sha256": "85037a5e7d463f55d9a0ff3963b24008c8a10937d137909bd6e91cf64ddfe8b6" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:38c7d0503b0a99dddaefe5a1512e927cb3976927c2b1882e5519501bdf1e9015", + "sha256": "38c7d0503b0a99dddaefe5a1512e927cb3976927c2b1882e5519501bdf1e9015" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:026a25661c70e7c0ca6a33afeb406c9b76fd87b93396a1bc2e94aa10ba0801e3", + "sha256": "026a25661c70e7c0ca6a33afeb406c9b76fd87b93396a1bc2e94aa10ba0801e3" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:e93cce391ed5d2898d3186403e7256d997d03855a72e9cb0c85067fd7825cf13", + "sha256": "e93cce391ed5d2898d3186403e7256d997d03855a72e9cb0c85067fd7825cf13" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:29f3443225b387ae5542aeee0a941fa9af1c91da44f27101735f510bdfc3a11b", + "sha256": "29f3443225b387ae5542aeee0a941fa9af1c91da44f27101735f510bdfc3a11b" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:52f6401306f6facb4b2005ca6d1c8e02592ef50e26922d9f5cc2a75b00703a0f", + "sha256": "52f6401306f6facb4b2005ca6d1c8e02592ef50e26922d9f5cc2a75b00703a0f" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gcc/blobs/sha256:28257893721f3b163e4364b0ae437dcfdf5e3fd22b8d6d703fa8e02821d0dcd2", + "sha256": "28257893721f3b163e4364b0ae437dcfdf5e3fd22b8d6d703fa8e02821d0dcd2" + } + } + } + }, + "glances": { + "version": "3.4.0.3", + "bottle": { + "rebuild": 3, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:8975199729672566e15b0ec095cc88b048dcb5eafd1f116debc5c75cd218d404", + "sha256": "8975199729672566e15b0ec095cc88b048dcb5eafd1f116debc5c75cd218d404" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:f897e7e780bffb144439713351420078a7e4c8a1c3dc2eb9bf9ec1bcac044440", + "sha256": "f897e7e780bffb144439713351420078a7e4c8a1c3dc2eb9bf9ec1bcac044440" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:f8e903fffdf03b3e9fb57478a575f3e7ef2ba60b7b291da23c86b86db25da610", + "sha256": "f8e903fffdf03b3e9fb57478a575f3e7ef2ba60b7b291da23c86b86db25da610" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:354ecf359f2ba52e90068961d8db04797ac4a513f5bd88277fe8364ff23bb795", + "sha256": "354ecf359f2ba52e90068961d8db04797ac4a513f5bd88277fe8364ff23bb795" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:dde228e56d2bd9634e1d80a2f7d786dab00a056aecc1fbe75e24a8213c5f88b4", + "sha256": "dde228e56d2bd9634e1d80a2f7d786dab00a056aecc1fbe75e24a8213c5f88b4" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:0600c2432101a001cd67bfe4b7ee0aded6b149f39a314fb9bcd3c3536d600ebf", + "sha256": "0600c2432101a001cd67bfe4b7ee0aded6b149f39a314fb9bcd3c3536d600ebf" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:75b17c5577dc5a51614d2abd4c612ce9a692c3295fe98561f3f2786197c2d1d1", + "sha256": "75b17c5577dc5a51614d2abd4c612ce9a692c3295fe98561f3f2786197c2d1d1" + } + } + } + }, + "gnutls": { + "version": "3.8.3", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:e56a8040de546196d50156e40673c1f932820adfd7b87ff05d9fb7d8d1729c0d", + "sha256": "e56a8040de546196d50156e40673c1f932820adfd7b87ff05d9fb7d8d1729c0d" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:ececffc311fa3ec8f0d4576cdcc6f31dc1152cb365a773d537c64d789e9251dc", + "sha256": "ececffc311fa3ec8f0d4576cdcc6f31dc1152cb365a773d537c64d789e9251dc" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:2773884a8ac832948974bd13316e2b79cbf6c37becdab9b5762425bc5826e998", + "sha256": "2773884a8ac832948974bd13316e2b79cbf6c37becdab9b5762425bc5826e998" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:9beb8badafa9dc4ecb08e797340b45b518931cf3b641aa4ffa00bf6f89787f81", + "sha256": "9beb8badafa9dc4ecb08e797340b45b518931cf3b641aa4ffa00bf6f89787f81" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:38c8435f33f0296eb5263b8e8a2f93eea22f0ff349d3d582f628ff63d78ae3af", + "sha256": "38c8435f33f0296eb5263b8e8a2f93eea22f0ff349d3d582f628ff63d78ae3af" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:64fa0e2d07ea245b18f1e9179ca6213afe7495f3f715abe34de3018080d41906", + "sha256": "64fa0e2d07ea245b18f1e9179ca6213afe7495f3f715abe34de3018080d41906" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnutls/blobs/sha256:3cf526c00c2078d354a33947e9910e36462fc0f77c624e871fc0ca2aa873b177", + "sha256": "3cf526c00c2078d354a33947e9910e36462fc0f77c624e871fc0ca2aa873b177" + } + } + } + }, + "gnu-indent": { + "version": "2.2.13", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:90269c7d0cb032e8defb0ed1a46222decdf12856f47206d7290aa42f41f64dc5", + "sha256": "90269c7d0cb032e8defb0ed1a46222decdf12856f47206d7290aa42f41f64dc5" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:ed32867a9b921557dcbd8eab24d0bd8045f6525d9000d0034fa9ed2a14e23a54", + "sha256": "ed32867a9b921557dcbd8eab24d0bd8045f6525d9000d0034fa9ed2a14e23a54" + }, + "arm64_big_sur": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:e60464107020d08df53cf12dd388825cbeefd0d1ecf986f00cdf890d7cc58413", + "sha256": "e60464107020d08df53cf12dd388825cbeefd0d1ecf986f00cdf890d7cc58413" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:97399d01070ba20f588dde6cddf6a20353a1e2def99bd99d9f11d0d3c8f12748", + "sha256": "97399d01070ba20f588dde6cddf6a20353a1e2def99bd99d9f11d0d3c8f12748" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:ece97222820cb413acad02586561c87d8cda14370e6b4d0e2e5d47f5e7774402", + "sha256": "ece97222820cb413acad02586561c87d8cda14370e6b4d0e2e5d47f5e7774402" + }, + "big_sur": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:cf85276b497f4cf5e909ee415393207ad67c94bb9aa130e564f92f7b435d09a6", + "sha256": "cf85276b497f4cf5e909ee415393207ad67c94bb9aa130e564f92f7b435d09a6" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-indent/blobs/sha256:0e3f4a54c4abad7a07b57331772f24737237413f9ad4bd67ed8827909b515ced", + "sha256": "0e3f4a54c4abad7a07b57331772f24737237413f9ad4bd67ed8827909b515ced" + } + } + } + }, + "gnu-sed": { + "version": "4.9", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:1c4c92a7683dcbd3d251bf2e541ed46151401423cc9cbf30db9ce7185dc218a3", + "sha256": "1c4c92a7683dcbd3d251bf2e541ed46151401423cc9cbf30db9ce7185dc218a3" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:5abaf39c16d02125db97d14cd36a96cf1a20a87821199cb38a55134fd4e0aaef", + "sha256": "5abaf39c16d02125db97d14cd36a96cf1a20a87821199cb38a55134fd4e0aaef" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:20ae3f853a32e7f7f0f340e8c751ab7350888a655bfe7c5c20e5746c61a24fd7", + "sha256": "20ae3f853a32e7f7f0f340e8c751ab7350888a655bfe7c5c20e5746c61a24fd7" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:d7c89842a90d03dbb497bc1ded17b7d732fe20eaf69613fd4abb48820ab80895", + "sha256": "d7c89842a90d03dbb497bc1ded17b7d732fe20eaf69613fd4abb48820ab80895" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:6ab6bc1628639ff2789fe20e4dd690e4bfe047d3a772bbb7b5d57efe88787951", + "sha256": "6ab6bc1628639ff2789fe20e4dd690e4bfe047d3a772bbb7b5d57efe88787951" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:a1ac59a9a6fa20c6c904e047df3ee4d0b4e57c0a5df3821b17b8cd82bcc67b5a", + "sha256": "a1ac59a9a6fa20c6c904e047df3ee4d0b4e57c0a5df3821b17b8cd82bcc67b5a" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:f5e2460ad86516b2517f1e77d672a4fd6ad30b158c470cccbb3b6464f228674d", + "sha256": "f5e2460ad86516b2517f1e77d672a4fd6ad30b158c470cccbb3b6464f228674d" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:c1c63d995d132a82fadc80b470eecfe816cb86c8cd716f01de5f003bc1199fcc", + "sha256": "c1c63d995d132a82fadc80b470eecfe816cb86c8cd716f01de5f003bc1199fcc" + }, + "catalina": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:fb5ee7317d987d9ac7f2ee357736a9bc594c88b5fbbca4f6a65046f1c2898c44", + "sha256": "fb5ee7317d987d9ac7f2ee357736a9bc594c88b5fbbca4f6a65046f1c2898c44" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-sed/blobs/sha256:8abd5b48de6b706c1ce7c2f7b8775420f63078ba294bd5ad801e458776228bbc", + "sha256": "8abd5b48de6b706c1ce7c2f7b8775420f63078ba294bd5ad801e458776228bbc" + } + } + } + }, + "gnu-tar": { + "version": "1.35", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:15a0dbc1fe67cae4498891493686afca6d745b001a2913760ce79cd52c918079", + "sha256": "15a0dbc1fe67cae4498891493686afca6d745b001a2913760ce79cd52c918079" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:0b5debb34f53626f09c119c96ab75e46dfcc9c816ca5ccbf4ce1b051251c3752", + "sha256": "0b5debb34f53626f09c119c96ab75e46dfcc9c816ca5ccbf4ce1b051251c3752" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:78bbae315786562366b35a1c1d25c391824281aab63421e4243ec927dbe647b1", + "sha256": "78bbae315786562366b35a1c1d25c391824281aab63421e4243ec927dbe647b1" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:98ce20547135be57ef9ee9b6e85df5081ba8b907f113c6d19b3e4a296b3930fc", + "sha256": "98ce20547135be57ef9ee9b6e85df5081ba8b907f113c6d19b3e4a296b3930fc" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:da82f5abafab8ba2bfc25a33e500a546985e0b2789ea915d7ad05292b41a373b", + "sha256": "da82f5abafab8ba2bfc25a33e500a546985e0b2789ea915d7ad05292b41a373b" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:5078709c3c1643d2ac42da4fc354baee127d06e4a4f8b04c9770867ec5166188", + "sha256": "5078709c3c1643d2ac42da4fc354baee127d06e4a4f8b04c9770867ec5166188" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:b083b4ca16eea4b23615ce1b90b7e1a3ee52dd90cd5a4275567cb0ea55339ee4", + "sha256": "b083b4ca16eea4b23615ce1b90b7e1a3ee52dd90cd5a4275567cb0ea55339ee4" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:d7947a84f5bd5458a1faf9854a90d788c7661a6aba37b7ff7f8fba1e9d04ac24", + "sha256": "d7947a84f5bd5458a1faf9854a90d788c7661a6aba37b7ff7f8fba1e9d04ac24" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnu-tar/blobs/sha256:5209eb2c2693093b26bc232c09df1caf0b5254f9a2003aa88b81a7c7f9f2391a", + "sha256": "5209eb2c2693093b26bc232c09df1caf0b5254f9a2003aa88b81a7c7f9f2391a" + } + } + } + }, + "gnu-time": { + "version": "1.9", + "bottle": { + "rebuild": 2, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:77a541727f4a75443a930e18391ed483b0a3fc797876376a0f7b34260db9a88d", + "sha256": "77a541727f4a75443a930e18391ed483b0a3fc797876376a0f7b34260db9a88d" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:f5015e7e94a474156cdc47fb188143388231916979598f5398b72e79393a2000", + "sha256": "f5015e7e94a474156cdc47fb188143388231916979598f5398b72e79393a2000" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:ff4691a2d76432eb0222284ccbeda79b3375cefdb1c606ba74ea3e8e06ac25f5", + "sha256": "ff4691a2d76432eb0222284ccbeda79b3375cefdb1c606ba74ea3e8e06ac25f5" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:3930463651363f08ca7a90ec25deafd85c57f7a71be8ee236f7e15f20de7ff22", + "sha256": "3930463651363f08ca7a90ec25deafd85c57f7a71be8ee236f7e15f20de7ff22" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:99cb9faea67317bef1bd531f810c91b4f77817d127942ba3902dcc8b6605c437", + "sha256": "99cb9faea67317bef1bd531f810c91b4f77817d127942ba3902dcc8b6605c437" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:950250410ffda2307e42e465b0a563b0d4175f83017467df59c580cba41d8c85", + "sha256": "950250410ffda2307e42e465b0a563b0d4175f83017467df59c580cba41d8c85" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:e7b649410f591aa0d0068ae267e7357db99c86c73fd5e992db0f5512614a07a6", + "sha256": "e7b649410f591aa0d0068ae267e7357db99c86c73fd5e992db0f5512614a07a6" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:f4fc9d2c49b65130d04a476d4cd887b1e1033a7870df9805be28aba09be901f0", + "sha256": "f4fc9d2c49b65130d04a476d4cd887b1e1033a7870df9805be28aba09be901f0" + }, + "catalina": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:9a1d1160f85f46b3022dc4d978dfafe6b3a02fc97446bc51f8b1ae4580b7c69a", + "sha256": "9a1d1160f85f46b3022dc4d978dfafe6b3a02fc97446bc51f8b1ae4580b7c69a" + }, + "mojave": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:dc007b95e2f9fb0df3380da55d3c9337529b1a4a3cd762972eb88512f567ea1c", + "sha256": "dc007b95e2f9fb0df3380da55d3c9337529b1a4a3cd762972eb88512f567ea1c" + }, + "high_sierra": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:ad5d776c38e43f16fad8976770eeaa18e40562c166fa65fdaa12af61981c7b90", + "sha256": "ad5d776c38e43f16fad8976770eeaa18e40562c166fa65fdaa12af61981c7b90" + }, + "sierra": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:d51ef948a5a87281175fef771cb28469cbdb3085e3c51ad325d780ff921cc013", + "sha256": "d51ef948a5a87281175fef771cb28469cbdb3085e3c51ad325d780ff921cc013" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-time/blobs/sha256:c9c5ae5e7ac2f00cf8655ce4b6095e4706bcc36300d36a1c7121ab03d010ea5f", + "sha256": "c9c5ae5e7ac2f00cf8655ce4b6095e4706bcc36300d36a1c7121ab03d010ea5f" + } + } + } + }, + "gnu-which": { + "version": "2.21", + "bottle": { + "rebuild": 3, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:97c6d0e56281d2adc27fd8c38b267edc4ff12dff39a5dfa4adb7db45fd0cb042", + "sha256": "97c6d0e56281d2adc27fd8c38b267edc4ff12dff39a5dfa4adb7db45fd0cb042" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:0778972c32eb2eb9cbde5026fe69c0a5c4bdfbc1e16f18c327e0c6f92a32385e", + "sha256": "0778972c32eb2eb9cbde5026fe69c0a5c4bdfbc1e16f18c327e0c6f92a32385e" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:8343d2e916151642b540143f2b3f8a79af4a6e22df55e01b846bad2d0e509074", + "sha256": "8343d2e916151642b540143f2b3f8a79af4a6e22df55e01b846bad2d0e509074" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:873e8ac50fdc7b40699f7ebcf29c73c768d2db8d958f1fdb2d4be13c0b670c3a", + "sha256": "873e8ac50fdc7b40699f7ebcf29c73c768d2db8d958f1fdb2d4be13c0b670c3a" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:5524dce5bf9b05388b10687ba53cb3d2cb2a12f589ebd67625688aec5f3598de", + "sha256": "5524dce5bf9b05388b10687ba53cb3d2cb2a12f589ebd67625688aec5f3598de" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:ff5af1e6019d670be02d24175b1be0cc0973e303f4788d1e5b8ef4c167f0d36f", + "sha256": "ff5af1e6019d670be02d24175b1be0cc0973e303f4788d1e5b8ef4c167f0d36f" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:21e5e71e2a9aadc88636bdb7e76dc5aef17e5ca31b99e02553bc61263e2c36e8", + "sha256": "21e5e71e2a9aadc88636bdb7e76dc5aef17e5ca31b99e02553bc61263e2c36e8" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:eeb493d3cc6252da45b29cf1d2a1d6daca630a6cd467ae690c3979673ea9a589", + "sha256": "eeb493d3cc6252da45b29cf1d2a1d6daca630a6cd467ae690c3979673ea9a589" + }, + "catalina": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:f9e6512591096a9f53067ea4a0b5b9f8516515b49fd5bdabfc6e31c1c0c876f2", + "sha256": "f9e6512591096a9f53067ea4a0b5b9f8516515b49fd5bdabfc6e31c1c0c876f2" + }, + "mojave": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:170008e80a4cc5f1e45b3445f9fb6f099d7700aa6dd825602f6d32316c27735b", + "sha256": "170008e80a4cc5f1e45b3445f9fb6f099d7700aa6dd825602f6d32316c27735b" + }, + "high_sierra": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:66446416b0dc367076ab38cfc9775d8c201fc571b1a2cd2fc0197daa6b83882a", + "sha256": "66446416b0dc367076ab38cfc9775d8c201fc571b1a2cd2fc0197daa6b83882a" + }, + "sierra": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:68ea3522ec318c9b25d711ce4405b4cd6a41edca20b7df008adc499ab794c4fa", + "sha256": "68ea3522ec318c9b25d711ce4405b4cd6a41edca20b7df008adc499ab794c4fa" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/gnu-which/blobs/sha256:cf191a85d1f5684e84909ccf5d5df3ec3b9ffd7facc629bc2664f99078bf414e", + "sha256": "cf191a85d1f5684e84909ccf5d5df3ec3b9ffd7facc629bc2664f99078bf414e" + } + } + } + }, + "jemalloc": { + "version": "5.3.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:f70f02aa2f1b858ed5e5cef84a271efeaaa27e79f266844997aab95daa66a7fa", + "sha256": "f70f02aa2f1b858ed5e5cef84a271efeaaa27e79f266844997aab95daa66a7fa" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:33e0c3fbe56642e081018a9674df734d34afdc35af7d03f5dd2b484a804555e3", + "sha256": "33e0c3fbe56642e081018a9674df734d34afdc35af7d03f5dd2b484a804555e3" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:b7ef9abad498e6eb53fb476fde4396fc9ab99a23092ea14bcf576548e198f9bd", + "sha256": "b7ef9abad498e6eb53fb476fde4396fc9ab99a23092ea14bcf576548e198f9bd" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:b24e4a9413b347397a10ebc9a7a2d309d88c0f9479c1cdebe6c302acba9a43a9", + "sha256": "b24e4a9413b347397a10ebc9a7a2d309d88c0f9479c1cdebe6c302acba9a43a9" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:cb1d95640b85ec863d457722af363119b9a16274ce6f9e968f939fcf85bdd350", + "sha256": "cb1d95640b85ec863d457722af363119b9a16274ce6f9e968f939fcf85bdd350" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:66b5f3a4c4ad9f7801e6ad2e76d1586e7b57e2cc64b24c2684dd1c2af8bc82f3", + "sha256": "66b5f3a4c4ad9f7801e6ad2e76d1586e7b57e2cc64b24c2684dd1c2af8bc82f3" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:27ae29c02d718c38ee5f623c3ef08ad3530a6fd3595d16d2ddadd6552bf32c12", + "sha256": "27ae29c02d718c38ee5f623c3ef08ad3530a6fd3595d16d2ddadd6552bf32c12" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:72aef17aa140b457400c4f2b74d0473bf1160616c3df7cb8604ac2bf734afea5", + "sha256": "72aef17aa140b457400c4f2b74d0473bf1160616c3df7cb8604ac2bf734afea5" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:3f5cf334d16ab432bf210c7e171510d0edcd834f939b57bddfd428af5ed248ae", + "sha256": "3f5cf334d16ab432bf210c7e171510d0edcd834f939b57bddfd428af5ed248ae" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/jemalloc/blobs/sha256:240b20cc078b21d90c32bd34447952b9b464958b1858ae109f168558993f9278", + "sha256": "240b20cc078b21d90c32bd34447952b9b464958b1858ae109f168558993f9278" + } + } + } + }, + "jq": { + "version": "1.7.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:07bc9081c0fdb43aca089e5839f6a270fc45ca9aa7d7633e16fac0fdfe4c4ad8", + "sha256": "07bc9081c0fdb43aca089e5839f6a270fc45ca9aa7d7633e16fac0fdfe4c4ad8" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:1b27f5277eb2cdfac9f3970ee9adadddc5e04e45469de05a663bc16e793b4eea", + "sha256": "1b27f5277eb2cdfac9f3970ee9adadddc5e04e45469de05a663bc16e793b4eea" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:41911a73dc6a44c9788c198abc18307213d070d7ca6375e8dd6994335aaee136", + "sha256": "41911a73dc6a44c9788c198abc18307213d070d7ca6375e8dd6994335aaee136" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:b68d33a5e3c79a0f457d96de1ad1f200c05314f5fea9244d712847c92032b5f7", + "sha256": "b68d33a5e3c79a0f457d96de1ad1f200c05314f5fea9244d712847c92032b5f7" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:10b845b1505892ff585b49e89fe3b09761d148b2c14ca6f5a1aa58002452f8f0", + "sha256": "10b845b1505892ff585b49e89fe3b09761d148b2c14ca6f5a1aa58002452f8f0" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:449c76665ac72b34daeb1a09dd19217e3be1e723c63ec3ac88e02b8c9a750f34", + "sha256": "449c76665ac72b34daeb1a09dd19217e3be1e723c63ec3ac88e02b8c9a750f34" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/jq/blobs/sha256:ed490b627b327b3458a70a78c546be07d57bfc6958921f875b76e85f6be51f47", + "sha256": "ed490b627b327b3458a70a78c546be07d57bfc6958921f875b76e85f6be51f47" + } + } + } + }, + "libffi": { + "version": "3.4.5", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:05b449dea2ce5e3f9d0a68557ab04938dc95c179bd33797e8b455efab7861241", + "sha256": "05b449dea2ce5e3f9d0a68557ab04938dc95c179bd33797e8b455efab7861241" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:c1f444ded62e9fc4da1179f2f1f18bbf3db6be8d8e3b764f52d3370a6a534ed3", + "sha256": "c1f444ded62e9fc4da1179f2f1f18bbf3db6be8d8e3b764f52d3370a6a534ed3" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:971cbcb1d220e448683bbc76c561e03e41610a8ce4065b9be92e2e7e838c4a07", + "sha256": "971cbcb1d220e448683bbc76c561e03e41610a8ce4065b9be92e2e7e838c4a07" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:70c125b86120c56b00f737b46f207da0b46d54233367d36d53ea774562e39c18", + "sha256": "70c125b86120c56b00f737b46f207da0b46d54233367d36d53ea774562e39c18" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:4aff209ef6d0aadd8dbc6384deb2cb1173bed527e27838142ab2c5b93a647e76", + "sha256": "4aff209ef6d0aadd8dbc6384deb2cb1173bed527e27838142ab2c5b93a647e76" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:7c96a49210ba55ce4473d36c2dbd86192ae33f2c267ee47b5ed0e970aea62093", + "sha256": "7c96a49210ba55ce4473d36c2dbd86192ae33f2c267ee47b5ed0e970aea62093" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:ad76b74572cf5792f5160938bd6ae8b934f0d021abd300d45feba51dca1313fc", + "sha256": "ad76b74572cf5792f5160938bd6ae8b934f0d021abd300d45feba51dca1313fc" + } + } + } + }, + "libmemcached": { + "version": "1.0.18_2", + "bottle": { + "rebuild": 2, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:652c9f9862e367e62acc5d2b1ddc20d798e6f15c51bccbc69e642acd4df1be0a", + "sha256": "652c9f9862e367e62acc5d2b1ddc20d798e6f15c51bccbc69e642acd4df1be0a" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:0511d48bcc88a6860030c5c6bec5d36818068b43f11d67561f1519ce0dbf6b73", + "sha256": "0511d48bcc88a6860030c5c6bec5d36818068b43f11d67561f1519ce0dbf6b73" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:37977639be769bfd5ef97d38f408f57cf84f3607ce881c4d6f2c2d7c70a9b2a4", + "sha256": "37977639be769bfd5ef97d38f408f57cf84f3607ce881c4d6f2c2d7c70a9b2a4" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:2ec7b12e9181c83bbbd45b62ba2a1a0e2958fe2caaa0d94be1da2319831de3be", + "sha256": "2ec7b12e9181c83bbbd45b62ba2a1a0e2958fe2caaa0d94be1da2319831de3be" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:feedeadf282983ee5a86dff88537f2ba2f470d53d664efbc6a9c6bd393177037", + "sha256": "feedeadf282983ee5a86dff88537f2ba2f470d53d664efbc6a9c6bd393177037" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:2807a08a7c29739bd49450c44ec6f926e7c626b3b2104b1ed160226820a5465b", + "sha256": "2807a08a7c29739bd49450c44ec6f926e7c626b3b2104b1ed160226820a5465b" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:902c0e16ba5ec76696c3f45888ef0c61b840a10b344149242bec812a7c99ee0d", + "sha256": "902c0e16ba5ec76696c3f45888ef0c61b840a10b344149242bec812a7c99ee0d" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:c41f0bfdc440d240f8d0653dcc87270bd315571eab6979ff94d3271f863cb0e7", + "sha256": "c41f0bfdc440d240f8d0653dcc87270bd315571eab6979ff94d3271f863cb0e7" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:70c6e1e3dd76241e343a4a3b38a62fae5bea6d2e2405739b11473d084f4409a9", + "sha256": "70c6e1e3dd76241e343a4a3b38a62fae5bea6d2e2405739b11473d084f4409a9" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libmemcached/blobs/sha256:b551d4cc72d953e3018369057901f77a88b1b633661f5acfedcf6bba37385a8b", + "sha256": "b551d4cc72d953e3018369057901f77a88b1b633661f5acfedcf6bba37385a8b" + } + } + } + }, + "libpq": { + "version": "16.2", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:7b741e015bcbdf7405c854315670ecd6467c00e3ca96313296d0b4bf4db4a70d", + "sha256": "7b741e015bcbdf7405c854315670ecd6467c00e3ca96313296d0b4bf4db4a70d" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:f9bebf61ad6968b16251ef392daffcacadd274a4243e191c728abf62b6c673d1", + "sha256": "f9bebf61ad6968b16251ef392daffcacadd274a4243e191c728abf62b6c673d1" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:d1d138f0aa5445ff1de80c96d768f2f1af8017ab1232a32d839c1be22061b44c", + "sha256": "d1d138f0aa5445ff1de80c96d768f2f1af8017ab1232a32d839c1be22061b44c" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:33aba502daa1767fc650485a63d671d28bde4312af561b0263582654b7d014f4", + "sha256": "33aba502daa1767fc650485a63d671d28bde4312af561b0263582654b7d014f4" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:d992fdf45b62d9bd05e9514ac16c823ed150bab698afebb4f008bdfc6e825b61", + "sha256": "d992fdf45b62d9bd05e9514ac16c823ed150bab698afebb4f008bdfc6e825b61" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:a7b72a7f3fcbc65ff857893114205aa79ff354b47f63a492f0dfd77bdd27c282", + "sha256": "a7b72a7f3fcbc65ff857893114205aa79ff354b47f63a492f0dfd77bdd27c282" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:7a8856e34634895f82b7f041b95ebe82a7644877b00e4476f1eefd617f831bb1", + "sha256": "7a8856e34634895f82b7f041b95ebe82a7644877b00e4476f1eefd617f831bb1" + } + } + } + }, + "libtiff": { + "version": "4.6.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:a9cafbce08b697fb25e326ea1dd3a0e01c3acc3f8f616e844940e49b33386ab3", + "sha256": "a9cafbce08b697fb25e326ea1dd3a0e01c3acc3f8f616e844940e49b33386ab3" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:12f3e1b0e5cd225a05d914692cf6de0f86f29ba1f51b806723237da2f85a7b13", + "sha256": "12f3e1b0e5cd225a05d914692cf6de0f86f29ba1f51b806723237da2f85a7b13" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:8a7ed5ea7efe9534f15bca3ae2134d9f35bd08372da5949c33d025f80ae1d47e", + "sha256": "8a7ed5ea7efe9534f15bca3ae2134d9f35bd08372da5949c33d025f80ae1d47e" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:53b3bed3893804a56efa2ef20af3c2087298ba313b44e4cc6531d0bcfc54aaa9", + "sha256": "53b3bed3893804a56efa2ef20af3c2087298ba313b44e4cc6531d0bcfc54aaa9" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:a89a2671064dbf7af6b84a9f2d20546b3dff82ed4b6f95c17bdfe48ce6c615fc", + "sha256": "a89a2671064dbf7af6b84a9f2d20546b3dff82ed4b6f95c17bdfe48ce6c615fc" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:7347c37cf98bec3f956296caee0ecee54e7bfcc7b32d6e2e02b9ae04c80e3ca6", + "sha256": "7347c37cf98bec3f956296caee0ecee54e7bfcc7b32d6e2e02b9ae04c80e3ca6" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:8e3e1d5d4da3485867a6e0e2b35cf79e37f1b00e3e5399cf9b36996b1cbbff0c", + "sha256": "8e3e1d5d4da3485867a6e0e2b35cf79e37f1b00e3e5399cf9b36996b1cbbff0c" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:e0e6f2c0bc25665bfffb66505ebc9fc410aeeed3435edf770e9ecee88c7bc0e1", + "sha256": "e0e6f2c0bc25665bfffb66505ebc9fc410aeeed3435edf770e9ecee88c7bc0e1" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libtiff/blobs/sha256:9a6e0bb56c39b72a33b0a5629dc3fd49e4f1391513bcf7d04a764523cc0321c8", + "sha256": "9a6e0bb56c39b72a33b0a5629dc3fd49e4f1391513bcf7d04a764523cc0321c8" + } + } + } + }, + "libtool": { + "version": "2.4.7", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:211b174c29c24b3bdd42c44a12262ba479c4707b19bd2abd41f41a67f1b45cf5", + "sha256": "211b174c29c24b3bdd42c44a12262ba479c4707b19bd2abd41f41a67f1b45cf5" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:a7196b340a6b2ee833b9451409a2e83b08ba192bebe4fd019c6e658789c76298", + "sha256": "a7196b340a6b2ee833b9451409a2e83b08ba192bebe4fd019c6e658789c76298" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:359d2a8f85d03f310263b91c665bf591703e8a7a6e79396bc2fc64df75e0655a", + "sha256": "359d2a8f85d03f310263b91c665bf591703e8a7a6e79396bc2fc64df75e0655a" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:faa1bb0c78ff5881efcaf476ccfc6ec400e56a4583fcc850d265b70f37fd577e", + "sha256": "faa1bb0c78ff5881efcaf476ccfc6ec400e56a4583fcc850d265b70f37fd577e" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:47676ae503261483d5f1f35caa074efc416527bc471e25b0dc5c19bf588ed39f", + "sha256": "47676ae503261483d5f1f35caa074efc416527bc471e25b0dc5c19bf588ed39f" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:d20beb0eb96c3ab67be5987393c64a575781c5d7abe6fb20efd2ae343a0680c7", + "sha256": "d20beb0eb96c3ab67be5987393c64a575781c5d7abe6fb20efd2ae343a0680c7" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:4b248059b3fed99774183f17e335eca05edb25698dabcecbe916f4ec63a48cc6", + "sha256": "4b248059b3fed99774183f17e335eca05edb25698dabcecbe916f4ec63a48cc6" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:deffadfecec61da06dde9edf5eae19381f80f99ae78e57607732fd54be366b8a", + "sha256": "deffadfecec61da06dde9edf5eae19381f80f99ae78e57607732fd54be366b8a" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libtool/blobs/sha256:f55d5bcc07a45f599800b2c9fb5818c13be90803355e169cdb0e1ddc621bee5e", + "sha256": "f55d5bcc07a45f599800b2c9fb5818c13be90803355e169cdb0e1ddc621bee5e" + } + } + } + }, + "libxml2": { + "version": "2.12.5", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:00b0550e2f1645ea5d850e8ec45b39b3261a21f3cbcbad06c607a221dcc2b632", + "sha256": "00b0550e2f1645ea5d850e8ec45b39b3261a21f3cbcbad06c607a221dcc2b632" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:03b55a5795abe691eccb3e312e6e263c4e04d285fc55e20b7cc44981115c2a06", + "sha256": "03b55a5795abe691eccb3e312e6e263c4e04d285fc55e20b7cc44981115c2a06" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:b3979ddac33f9937edc6bfa5c4419a6748f34f2949ceaa32e443c55a5d5a4442", + "sha256": "b3979ddac33f9937edc6bfa5c4419a6748f34f2949ceaa32e443c55a5d5a4442" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:c3146cf97fd68a928035c0a12ce1b82f46258bab577e5bc347b1631b9351b510", + "sha256": "c3146cf97fd68a928035c0a12ce1b82f46258bab577e5bc347b1631b9351b510" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:0eb3b7e9aa4299e9fad1ab438c86bc398ceea781b6fcb9aac7c769aadacb0d8a", + "sha256": "0eb3b7e9aa4299e9fad1ab438c86bc398ceea781b6fcb9aac7c769aadacb0d8a" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:73939dd8f148fbc0f40ab0fa9ef6e066173ecb47783d55fc6573d76b3c267acf", + "sha256": "73939dd8f148fbc0f40ab0fa9ef6e066173ecb47783d55fc6573d76b3c267acf" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:ff5db5bc23ceab1dc888d3bbd1ebedb2970675cd550c2cdac23f57f224bc4692", + "sha256": "ff5db5bc23ceab1dc888d3bbd1ebedb2970675cd550c2cdac23f57f224bc4692" + } + } + } + }, + "libxslt": { + "version": "1.1.39", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:28019195eef786264be3a0e67f814753a9108653c5f9e07964b89502c66b06e9", + "sha256": "28019195eef786264be3a0e67f814753a9108653c5f9e07964b89502c66b06e9" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:9921d7bd84d8fc6914244d5142fb60741eabc71a9a3af87b3c04967f9d334aba", + "sha256": "9921d7bd84d8fc6914244d5142fb60741eabc71a9a3af87b3c04967f9d334aba" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:c48449d1ad89ada8cf9133ea7ea88b247730144ea874dff9608eae0a7b89b882", + "sha256": "c48449d1ad89ada8cf9133ea7ea88b247730144ea874dff9608eae0a7b89b882" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:9a4458989d734defc29a7c042b1144a0a66c3768530fb0e07fe52ea78828e606", + "sha256": "9a4458989d734defc29a7c042b1144a0a66c3768530fb0e07fe52ea78828e606" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:695cb26667ee927b4f20fae395b48b8af4bf666f3dc9625bef2e3823aa2e65d8", + "sha256": "695cb26667ee927b4f20fae395b48b8af4bf666f3dc9625bef2e3823aa2e65d8" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:ed196bcf4372dacf751a8ba6d45feac8aa6220a877828785651c4694e6209f5b", + "sha256": "ed196bcf4372dacf751a8ba6d45feac8aa6220a877828785651c4694e6209f5b" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libxslt/blobs/sha256:81e671ea1b060a25b0db9ab3486ae21b1da5982b6e4a35593a411e9c6d103544", + "sha256": "81e671ea1b060a25b0db9ab3486ae21b1da5982b6e4a35593a411e9c6d103544" + } + } + } + }, + "libyaml": { + "version": "0.2.5", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:98c0cf81bcdf7577d5fdc8cc18732970b9ae7e0e7423a733f88f0f566ba483ad", + "sha256": "98c0cf81bcdf7577d5fdc8cc18732970b9ae7e0e7423a733f88f0f566ba483ad" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:11239e8f5066c6d0d0718208d4eab518da00c7289f33c9c76c0a09ba5c0417c9", + "sha256": "11239e8f5066c6d0d0718208d4eab518da00c7289f33c9c76c0a09ba5c0417c9" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:a436da33a05f805258c5951a365dec4e8d70a908dbe5dacdeb6b2ecd0efd5024", + "sha256": "a436da33a05f805258c5951a365dec4e8d70a908dbe5dacdeb6b2ecd0efd5024" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:fe1082f3475a144261b41e2c3e0728b9331911b1cbfadfbc1f3d70d454709154", + "sha256": "fe1082f3475a144261b41e2c3e0728b9331911b1cbfadfbc1f3d70d454709154" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:4d6e02ce3a82b60033bc7e55bef841dcfef0c05c051176d96accb50744136c6d", + "sha256": "4d6e02ce3a82b60033bc7e55bef841dcfef0c05c051176d96accb50744136c6d" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:b49e62f014b3e7d85a169b422b7521356700c7caaaea9f4901086cafe692a86e", + "sha256": "b49e62f014b3e7d85a169b422b7521356700c7caaaea9f4901086cafe692a86e" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:dbd54ce703c6d8eb77e708f75b4730ad2653d28f6291c4a26dc22158beb3f210", + "sha256": "dbd54ce703c6d8eb77e708f75b4730ad2653d28f6291c4a26dc22158beb3f210" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:83547fba540a38c30705a59a2e746952c68857212e823c6ee97c186e088f75cd", + "sha256": "83547fba540a38c30705a59a2e746952c68857212e823c6ee97c186e088f75cd" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:56d3549b342cffb181e3eb05356697bbb362b9733c73e0eeff9b637ecf92cd23", + "sha256": "56d3549b342cffb181e3eb05356697bbb362b9733c73e0eeff9b637ecf92cd23" + }, + "mojave": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:a04988b3868cfadf7bcaff6b753b59388cbea70b38f2fa41a25229150d073696", + "sha256": "a04988b3868cfadf7bcaff6b753b59388cbea70b38f2fa41a25229150d073696" + }, + "high_sierra": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:d3e22ad09c3d6872c5f7ee7c7f1146c9f14c178ff4c3a3488a20bf584bc854d5", + "sha256": "d3e22ad09c3d6872c5f7ee7c7f1146c9f14c178ff4c3a3488a20bf584bc854d5" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:354677a745b6c62109e792ddbd0cbdaf9e6a471d84fdbde3a7d9bae36d832da8", + "sha256": "354677a745b6c62109e792ddbd0cbdaf9e6a471d84fdbde3a7d9bae36d832da8" + } + } + } + }, + "libzip": { + "version": "1.10.1", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:8ecf154f8c0bab71c0008c6f73eb8cd2df78cfa424d8bdcffc66dc95b3bf7c14", + "sha256": "8ecf154f8c0bab71c0008c6f73eb8cd2df78cfa424d8bdcffc66dc95b3bf7c14" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:cd7bda731a8b2e5d1a3cdf5be6b515718c56d55d16a5b45faa1a91daf9c0ca2b", + "sha256": "cd7bda731a8b2e5d1a3cdf5be6b515718c56d55d16a5b45faa1a91daf9c0ca2b" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:a0d8bae54df1068c92ad894eddca0cd7465ecbaa3ef875c07c46bcea764bac71", + "sha256": "a0d8bae54df1068c92ad894eddca0cd7465ecbaa3ef875c07c46bcea764bac71" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:6549fda9b8f6ac3904b55bc0b8c601ecf15773eb4c97c40091148559d69bfec1", + "sha256": "6549fda9b8f6ac3904b55bc0b8c601ecf15773eb4c97c40091148559d69bfec1" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:f782643b254f58ddf3830272c0221f5d35db84ebd4f3d4ef19894ca0c91648ad", + "sha256": "f782643b254f58ddf3830272c0221f5d35db84ebd4f3d4ef19894ca0c91648ad" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:4fca00c15a69f25064b40b12e37a6f552edd632f77e2947e076745b55aaeffd3", + "sha256": "4fca00c15a69f25064b40b12e37a6f552edd632f77e2947e076745b55aaeffd3" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:5fbb0e2a2cd9b17a416d518d324d9eb3eac88626851bad41d9fb144ccebd8757", + "sha256": "5fbb0e2a2cd9b17a416d518d324d9eb3eac88626851bad41d9fb144ccebd8757" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:db6453b117d39f0fe310f30e0d92124c453dd1568edd5800fd886bdb2b35e9df", + "sha256": "db6453b117d39f0fe310f30e0d92124c453dd1568edd5800fd886bdb2b35e9df" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/libzip/blobs/sha256:a5c180236137518d040277c1310e4b7c34337a0d396053e9a2534861453f70bc", + "sha256": "a5c180236137518d040277c1310e4b7c34337a0d396053e9a2534861453f70bc" + } + } + } + }, + "make": { + "version": "4.4.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:2cf9b5846e07363681d41819a13d2d9a993a69dd5090bbfae3da182915e777b9", + "sha256": "2cf9b5846e07363681d41819a13d2d9a993a69dd5090bbfae3da182915e777b9" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:23e26446ffdefd2b7fe44c559e11ab6bc127abd32233847f4e73bb3de87d98c6", + "sha256": "23e26446ffdefd2b7fe44c559e11ab6bc127abd32233847f4e73bb3de87d98c6" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:f3c69489afdb2ad686c7674d85deac4fcfdb3f891664c08c5d255af20a6eddcb", + "sha256": "f3c69489afdb2ad686c7674d85deac4fcfdb3f891664c08c5d255af20a6eddcb" + }, + "arm64_big_sur": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:cdb852c53ed94d31d5f4988338336b004f21857d1ecaa8e84b1c155bf92e0c47", + "sha256": "cdb852c53ed94d31d5f4988338336b004f21857d1ecaa8e84b1c155bf92e0c47" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:8c51e1eebb1cb1ae3acc4c52d041b141dd7d1ca005ba0081fd7c47162d4a50db", + "sha256": "8c51e1eebb1cb1ae3acc4c52d041b141dd7d1ca005ba0081fd7c47162d4a50db" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:206c13dc47f17131b1337ed24677b69288c2f03f780d09d1c3e5fd11a41d6ad9", + "sha256": "206c13dc47f17131b1337ed24677b69288c2f03f780d09d1c3e5fd11a41d6ad9" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:75651f4a57f1a712dfed7ed926de8b4c7f6c728544627ea059304f28455c4bab", + "sha256": "75651f4a57f1a712dfed7ed926de8b4c7f6c728544627ea059304f28455c4bab" + }, + "big_sur": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:2571cf69a3d123408660797685af0040097b1c273b13dfd0e3653ca1150830e2", + "sha256": "2571cf69a3d123408660797685af0040097b1c273b13dfd0e3653ca1150830e2" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/make/blobs/sha256:bded8e436d51f10ee36207ec69a0a318fb8583f83a5863f45bb203d3ae055170", + "sha256": "bded8e436d51f10ee36207ec69a0a318fb8583f83a5863f45bb203d3ae055170" + } + } + } + }, + "p7zip": { + "version": "17.05", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:19bf0feb4e993c7cfad0d42bf8b9820ba67a9ebbd7ad4efd312a4a7953704a1a", + "sha256": "19bf0feb4e993c7cfad0d42bf8b9820ba67a9ebbd7ad4efd312a4a7953704a1a" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:ba7f3e60841e85ab16ae76e7f0be634e15ea1b0c4a3a631cbe57447cbc9d77b6", + "sha256": "ba7f3e60841e85ab16ae76e7f0be634e15ea1b0c4a3a631cbe57447cbc9d77b6" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:ed5af58015207456c265187cd73b53a80db239a9029bed1579065faa2391fec1", + "sha256": "ed5af58015207456c265187cd73b53a80db239a9029bed1579065faa2391fec1" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:145a4d0ecb748931931030b2e8844d5e007cba92cfed3b4ae07b4f15bc461e22", + "sha256": "145a4d0ecb748931931030b2e8844d5e007cba92cfed3b4ae07b4f15bc461e22" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:2827eb7db9135c059d4498667e08ac37e4e020d39df6df0cebb1080d09cea9c5", + "sha256": "2827eb7db9135c059d4498667e08ac37e4e020d39df6df0cebb1080d09cea9c5" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:6b4bac2c955ef9902583dafa2f9bf6e0e3f5d503c81e51c1ed1ddde01b2ae4df", + "sha256": "6b4bac2c955ef9902583dafa2f9bf6e0e3f5d503c81e51c1ed1ddde01b2ae4df" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:91623462e2bdad09edfa899267359fcfd03ab34d8b70176462b1364e6f23f91c", + "sha256": "91623462e2bdad09edfa899267359fcfd03ab34d8b70176462b1364e6f23f91c" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:663d0ac5174855af24bf4dd7b729ef5693b7a421327379ba2d210b370f12aef0", + "sha256": "663d0ac5174855af24bf4dd7b729ef5693b7a421327379ba2d210b370f12aef0" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/p7zip/blobs/sha256:a421f6e2445fa536da9ab14e83060f3a2949cbdf1e5ac38484339e7b6b22fa04", + "sha256": "a421f6e2445fa536da9ab14e83060f3a2949cbdf1e5ac38484339e7b6b22fa04" + } + } + } + }, + "parallel": { + "version": "20240122", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "all": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/parallel/blobs/sha256:37486dfc46ee2d752d153623aab1caba37501b4e9a7bc1d8781d34891f166415", + "sha256": "37486dfc46ee2d752d153623aab1caba37501b4e9a7bc1d8781d34891f166415" + } + } + } + }, + "pcre": { + "version": "8.45", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:fbc1ec29701c2c3f0eb750a0aecf03b90acb6d47f1bbf1dc07eb8a7c9340650e", + "sha256": "fbc1ec29701c2c3f0eb750a0aecf03b90acb6d47f1bbf1dc07eb8a7c9340650e" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:542a6e5dcf5f1ac6592992f949687a56515d154abf1bfdd71327edcfb5183fb6", + "sha256": "542a6e5dcf5f1ac6592992f949687a56515d154abf1bfdd71327edcfb5183fb6" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:11193fd0a113c0bb330b1c2c21ab6f40d225c1893a451bba85e8a1562b914a1c", + "sha256": "11193fd0a113c0bb330b1c2c21ab6f40d225c1893a451bba85e8a1562b914a1c" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:2d6bfcafce9da9739e32ee433087e69a78cda3f18291350953e6ad260fefc50b", + "sha256": "2d6bfcafce9da9739e32ee433087e69a78cda3f18291350953e6ad260fefc50b" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:636ad19cc22f9c7608d5be592f8404c67458723d9629dbae026a93b8a3810e39", + "sha256": "636ad19cc22f9c7608d5be592f8404c67458723d9629dbae026a93b8a3810e39" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:df481fdd99c1dff924ea2d679623512d6c0c275e3b7c223e753ec654994ac6e5", + "sha256": "df481fdd99c1dff924ea2d679623512d6c0c275e3b7c223e753ec654994ac6e5" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:5e5cc7a5bf8bb6488ec57d4263bf6b0bc89e93252a0a2460f846de29373162d8", + "sha256": "5e5cc7a5bf8bb6488ec57d4263bf6b0bc89e93252a0a2460f846de29373162d8" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:fb2fefbe1232706a603a6b385fc37253e5aafaf3536cb68b828ad1940b95e601", + "sha256": "fb2fefbe1232706a603a6b385fc37253e5aafaf3536cb68b828ad1940b95e601" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:180d88dc2230e98162685b86d00436903db4349aac701f9769997d61adb78418", + "sha256": "180d88dc2230e98162685b86d00436903db4349aac701f9769997d61adb78418" + }, + "mojave": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:a42b79956773d18c4ac337868cfc15fadadf5e779d65c12ffd6f8fd379b5514c", + "sha256": "a42b79956773d18c4ac337868cfc15fadadf5e779d65c12ffd6f8fd379b5514c" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pcre/blobs/sha256:296026b6d5430399e40fb4f8074045a9a27d5374d83f2f6d4659c2647959f36d", + "sha256": "296026b6d5430399e40fb4f8074045a9a27d5374d83f2f6d4659c2647959f36d" + } + } + } + }, + "pg_top": { + "version": "3.7.0_4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:852a0e040171868c8c6c677306c82c81ed1fc52e7cb47413c1ddcb48cf5bb987", + "sha256": "852a0e040171868c8c6c677306c82c81ed1fc52e7cb47413c1ddcb48cf5bb987" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:c7d46c3124f4336b96d82dac38fdaf58ecb871587f7e1f1bc52368ab3ba29e78", + "sha256": "c7d46c3124f4336b96d82dac38fdaf58ecb871587f7e1f1bc52368ab3ba29e78" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:a157f605a85907c0d04410199dfcc4d7de515844f0ad41bcbcde1b8b771431c8", + "sha256": "a157f605a85907c0d04410199dfcc4d7de515844f0ad41bcbcde1b8b771431c8" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:506d2459e302e37bac0f38f99cd2cc2d3c3f5fd39631ee540a6f54d59af07f4a", + "sha256": "506d2459e302e37bac0f38f99cd2cc2d3c3f5fd39631ee540a6f54d59af07f4a" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:59ad81e7e985e9b841a4667a901e94cadac8923be21654c5918326a230424910", + "sha256": "59ad81e7e985e9b841a4667a901e94cadac8923be21654c5918326a230424910" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:825e51d876eb38a90e72413f751b88c291b1da0956c8f07b494da5d51f10ca95", + "sha256": "825e51d876eb38a90e72413f751b88c291b1da0956c8f07b494da5d51f10ca95" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:6252dc42f3d6e6570b0371f2f10cd146a06bd52b492636bbb35f62ff07239b7a", + "sha256": "6252dc42f3d6e6570b0371f2f10cd146a06bd52b492636bbb35f62ff07239b7a" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:7980c5af9dec1de3a76a74fbd4b359ec1a90bdd7223fa7ffc8f4294642042fc8", + "sha256": "7980c5af9dec1de3a76a74fbd4b359ec1a90bdd7223fa7ffc8f4294642042fc8" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:edf54d452403cf5be9b63a0a744560a00bb9e83ace3885ae33d36d96b0a8c2a4", + "sha256": "edf54d452403cf5be9b63a0a744560a00bb9e83ace3885ae33d36d96b0a8c2a4" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pg_top/blobs/sha256:65fe3861c5e90a4c9403f4b551892cd8ac85fbbea1cc23f551ee0eda3c9de01d", + "sha256": "65fe3861c5e90a4c9403f4b551892cd8ac85fbbea1cc23f551ee0eda3c9de01d" + } + } + } + }, + "pkg-config": { + "version": "0.29.2_3", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:7b59abc0b5381065b1eab174217307af9324e0d02edf903171b29250ae58aeaf", + "sha256": "7b59abc0b5381065b1eab174217307af9324e0d02edf903171b29250ae58aeaf" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:3ff612c5e44b945c8c0cc6df7d3edb407ca67cddad9c89f9ab99ced494b7a8c2", + "sha256": "3ff612c5e44b945c8c0cc6df7d3edb407ca67cddad9c89f9ab99ced494b7a8c2" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:2af9bceb60b70a259f236f1d46d2bb24c4d0a4af8cd63d974dde4d76313711e0", + "sha256": "2af9bceb60b70a259f236f1d46d2bb24c4d0a4af8cd63d974dde4d76313711e0" + }, + "arm64_big_sur": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:ffd4491f62201d14b7eca6beff954a2ab265351589cd5b3b79b8bbb414485574", + "sha256": "ffd4491f62201d14b7eca6beff954a2ab265351589cd5b3b79b8bbb414485574" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:421571f340277c62c5cc6fd68737bd7c4e085de113452ea49b33bcd46509bb12", + "sha256": "421571f340277c62c5cc6fd68737bd7c4e085de113452ea49b33bcd46509bb12" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:c44b1544815518726d280d92d6f6df09bd45e41ad20fd43424725c1c20760be8", + "sha256": "c44b1544815518726d280d92d6f6df09bd45e41ad20fd43424725c1c20760be8" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:a6ba80711f98b65d8a2bf2c9278540860415e9b5e545da338a4d94f39d119285", + "sha256": "a6ba80711f98b65d8a2bf2c9278540860415e9b5e545da338a4d94f39d119285" + }, + "big_sur": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:0040b6ebe07f60549800b211343fd5fb3cf83c866d9f62e40f5fb2f38b71e161", + "sha256": "0040b6ebe07f60549800b211343fd5fb3cf83c866d9f62e40f5fb2f38b71e161" + }, + "catalina": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:80f141e695f73bd058fd82e9f539dc67471666ff6800c5e280b5af7d3050f435", + "sha256": "80f141e695f73bd058fd82e9f539dc67471666ff6800c5e280b5af7d3050f435" + }, + "mojave": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:0d14b797dba0e0ab595c9afba8ab7ef9c901b60b4f806b36580ef95ebb370232", + "sha256": "0d14b797dba0e0ab595c9afba8ab7ef9c901b60b4f806b36580ef95ebb370232" + }, + "high_sierra": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:8c6160305abd948b8cf3e0d5c6bb0df192fa765bbb9535dda0b573cb60abbe52", + "sha256": "8c6160305abd948b8cf3e0d5c6bb0df192fa765bbb9535dda0b573cb60abbe52" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pkg-config/blobs/sha256:3d9b8bf9b7b4bd08086be1104e3e18afb1c437dfaca03e6e7df8f2710b9c1c1a", + "sha256": "3d9b8bf9b7b4bd08086be1104e3e18afb1c437dfaca03e6e7df8f2710b9c1c1a" + } + } + } + }, + "postgresql@15": { + "version": "15.6", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:a09c7f607a65febd03c483c6e9109d253bc7953d16f92959c98910390036c115", + "sha256": "a09c7f607a65febd03c483c6e9109d253bc7953d16f92959c98910390036c115" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:273df86364d2b4e7382692f517bedcaeac222acd73d7e322d67e6a27fb32fc06", + "sha256": "273df86364d2b4e7382692f517bedcaeac222acd73d7e322d67e6a27fb32fc06" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:a814bbd6163c62e4f622ee03a79dc994b8906db9d5f93b54a95de10710834774", + "sha256": "a814bbd6163c62e4f622ee03a79dc994b8906db9d5f93b54a95de10710834774" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:f5bc70401ca0f7ba9902366be93fc983bf41cd23b7d1b23c1cf4acbe69cd184f", + "sha256": "f5bc70401ca0f7ba9902366be93fc983bf41cd23b7d1b23c1cf4acbe69cd184f" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:fa5202cf03a0bf69999b366f82059c6d700f33eb3022eefb0130f17f1b9b7232", + "sha256": "fa5202cf03a0bf69999b366f82059c6d700f33eb3022eefb0130f17f1b9b7232" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:93ba2c2c053e16bc51826a98d5b4825a2e900e80403f25b28a30b68c6a2c2ae8", + "sha256": "93ba2c2c053e16bc51826a98d5b4825a2e900e80403f25b28a30b68c6a2c2ae8" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:d60903d734f4f66c0636ed698636320da27a0283eba134ab8fb97cc4cb7d67e3", + "sha256": "d60903d734f4f66c0636ed698636320da27a0283eba134ab8fb97cc4cb7d67e3" + } + } + } + }, + "pstree": { + "version": "2.40", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:05dcf81f64516f4b96ccb2a82fe610e65d2733d0cfb6dbff41b54fcd9f45f111", + "sha256": "05dcf81f64516f4b96ccb2a82fe610e65d2733d0cfb6dbff41b54fcd9f45f111" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:ca06848c6042d6f8c7ee44477aae9d5e1ed8f73be77dc99d9ec126460bc1f9f8", + "sha256": "ca06848c6042d6f8c7ee44477aae9d5e1ed8f73be77dc99d9ec126460bc1f9f8" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:e43ea23b1cc41dbd5717b22c8de73faae3fa58e88a9f18845533e7f4acc24eeb", + "sha256": "e43ea23b1cc41dbd5717b22c8de73faae3fa58e88a9f18845533e7f4acc24eeb" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:bc1765755ab89e61a17983692eb4ceb6c659f2f90b1f26bfea0ed1a908a7dc07", + "sha256": "bc1765755ab89e61a17983692eb4ceb6c659f2f90b1f26bfea0ed1a908a7dc07" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:ceea272a5221af7418627c38fb6c310e65bdd316ca201d06861e1ddb5314e570", + "sha256": "ceea272a5221af7418627c38fb6c310e65bdd316ca201d06861e1ddb5314e570" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:b95d35e5b4f3bb8953ccec2ee1e3f25fdd14ed942606de9f4abcd9b2dfa31a5b", + "sha256": "b95d35e5b4f3bb8953ccec2ee1e3f25fdd14ed942606de9f4abcd9b2dfa31a5b" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:fc23e46dee144842b941ad5b6527018154d38b67827e4f019bf9efab24a15365", + "sha256": "fc23e46dee144842b941ad5b6527018154d38b67827e4f019bf9efab24a15365" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:bf6f7f6e9a1ec7b0e5454e15973ee091a143eb887c67d81b07f262c447c685b7", + "sha256": "bf6f7f6e9a1ec7b0e5454e15973ee091a143eb887c67d81b07f262c447c685b7" + }, + "catalina": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:820b3dd1b26142457348dfc27c29ad8f1b6d86367995d8895ff41d8c74f91c8a", + "sha256": "820b3dd1b26142457348dfc27c29ad8f1b6d86367995d8895ff41d8c74f91c8a" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pstree/blobs/sha256:d65aff524b410c2ea45556fad2e5b07b9052896c07ee386fc6213208fdc7bc43", + "sha256": "d65aff524b410c2ea45556fad2e5b07b9052896c07ee386fc6213208fdc7bc43" + } + } + } + }, + "pyenv": { + "version": "2.3.36", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:c4bf54d570612931776fe72ecf3266df21d4797ae331aaf754c8e9c42a580d8e", + "sha256": "c4bf54d570612931776fe72ecf3266df21d4797ae331aaf754c8e9c42a580d8e" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:2d34bde99fdab4ed2a69c32f3df7eece15834dc0f4d5cbf08d873fa947548719", + "sha256": "2d34bde99fdab4ed2a69c32f3df7eece15834dc0f4d5cbf08d873fa947548719" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:ff8291320e2fbec388f35b94496554f21347bee7565f5a6daf686d27868c44b7", + "sha256": "ff8291320e2fbec388f35b94496554f21347bee7565f5a6daf686d27868c44b7" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:d117a99ed53502aff29109bfa366693ca623f2326e1e6b4db68fef7b7f63eeba", + "sha256": "d117a99ed53502aff29109bfa366693ca623f2326e1e6b4db68fef7b7f63eeba" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:d115c7e02e0b6dc287b938df1f4d924dd2f51404cd0338fe37cf3ecb4c8030c8", + "sha256": "d115c7e02e0b6dc287b938df1f4d924dd2f51404cd0338fe37cf3ecb4c8030c8" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:793c27652b1bee70ae47ba9e17e60c5ac022af41049a517aacbc972cdd66daa1", + "sha256": "793c27652b1bee70ae47ba9e17e60c5ac022af41049a517aacbc972cdd66daa1" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/pyenv/blobs/sha256:de5c91913de57e76a772ccabf959ac691fbb836b48b62caeaf07ee25094dd52e", + "sha256": "de5c91913de57e76a772ccabf959ac691fbb836b48b62caeaf07ee25094dd52e" + } + } + } + }, + "rbenv": { + "version": "1.2.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:8b4c091ff01a423d4c091cfde63243341517694014430d248c2b9fa6efeda8a7", + "sha256": "8b4c091ff01a423d4c091cfde63243341517694014430d248c2b9fa6efeda8a7" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:09bccc5974bd7b23f60a42c94bf7bc7d0e605cf4ef1f4068f63a1fe905bc5c74", + "sha256": "09bccc5974bd7b23f60a42c94bf7bc7d0e605cf4ef1f4068f63a1fe905bc5c74" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:dede9454bc8a665ac2b1858a0522fb77d95deebb5db7437918cfb056ff119b16", + "sha256": "dede9454bc8a665ac2b1858a0522fb77d95deebb5db7437918cfb056ff119b16" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:d5e6168ad6ab8843946273319fc6949b322c80f2d666a6bdda62466e256e6746", + "sha256": "d5e6168ad6ab8843946273319fc6949b322c80f2d666a6bdda62466e256e6746" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:59a2e9120361bc20b5c3fe8122438e5e43ee00e475ea6730fe507fda2de6d7ab", + "sha256": "59a2e9120361bc20b5c3fe8122438e5e43ee00e475ea6730fe507fda2de6d7ab" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:e654c2cf9b9966093b2d045cb9b12dbd32a7cd8926194838e13ee7d17184b1f5", + "sha256": "e654c2cf9b9966093b2d045cb9b12dbd32a7cd8926194838e13ee7d17184b1f5" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:42657e04e2d1e8bf9abb9c5f0ba50e567df95f93a2a212491f005e4bd0ad9cee", + "sha256": "42657e04e2d1e8bf9abb9c5f0ba50e567df95f93a2a212491f005e4bd0ad9cee" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:8a1b159909d472cc461d0a9b85a192a31ab58860e34f022fcbb33175732d24aa", + "sha256": "8a1b159909d472cc461d0a9b85a192a31ab58860e34f022fcbb33175732d24aa" + }, + "catalina": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:a2ca52c4fe3b7000d9f84f81836ddcb9b3aea9c20ee092dd71c1e10cf3a6a19a", + "sha256": "a2ca52c4fe3b7000d9f84f81836ddcb9b3aea9c20ee092dd71c1e10cf3a6a19a" + }, + "mojave": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:87ca53a9f4f84aff56ccbf2f823f903d20bc6669dde548018892857cc8871936", + "sha256": "87ca53a9f4f84aff56ccbf2f823f903d20bc6669dde548018892857cc8871936" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/rbenv/blobs/sha256:f4be8e4efef32c1fcdaa585312b3262d33b3306d9d7d9c75abd1230227b10bb7", + "sha256": "f4be8e4efef32c1fcdaa585312b3262d33b3306d9d7d9c75abd1230227b10bb7" + } + } + } + }, + "readline": { + "version": "8.2.7", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:4b08134e70e90a968bf82227fbec6861b07fdf630e7ab66e6effe95b6721cf36", + "sha256": "4b08134e70e90a968bf82227fbec6861b07fdf630e7ab66e6effe95b6721cf36" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:1cbe9a00128c3b5cdf1107419087f00505533c73a60c3a210212e041dd12b3ee", + "sha256": "1cbe9a00128c3b5cdf1107419087f00505533c73a60c3a210212e041dd12b3ee" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:210af83c5ce5ca9fe63a5ef41db95cdd555391656b5f807c23e00a50c3a47b60", + "sha256": "210af83c5ce5ca9fe63a5ef41db95cdd555391656b5f807c23e00a50c3a47b60" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:e1e1f92fcb4d3685d9b074949e7e11543fa8f9e3bf06f6a68674c3f841fcf82a", + "sha256": "e1e1f92fcb4d3685d9b074949e7e11543fa8f9e3bf06f6a68674c3f841fcf82a" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:65951f699eed34b0ae5d612b88bed9a5e2f64324d4c19443db492e57c2d6625f", + "sha256": "65951f699eed34b0ae5d612b88bed9a5e2f64324d4c19443db492e57c2d6625f" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:f87042db256d98a53353dad8e81d567a94f74d766ab2cfc3dc7ecf5a5670fa05", + "sha256": "f87042db256d98a53353dad8e81d567a94f74d766ab2cfc3dc7ecf5a5670fa05" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:f3eac4b1dedcc5724be3e63f0347a6b5829313022f4e71d3c5dc28904479b579", + "sha256": "f3eac4b1dedcc5724be3e63f0347a6b5829313022f4e71d3c5dc28904479b579" + } + } + } + }, + "redis": { + "version": "7.2.4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:7840031cf7bb94c62d6e42b6e730e8447c31ae37e3564a43a772fb8e6e0e51cf", + "sha256": "7840031cf7bb94c62d6e42b6e730e8447c31ae37e3564a43a772fb8e6e0e51cf" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:975f8c13a24d1b0f4a8e0f3c9ea2338d209ec9bcfcebd3130d0a72c3e4809c58", + "sha256": "975f8c13a24d1b0f4a8e0f3c9ea2338d209ec9bcfcebd3130d0a72c3e4809c58" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:ac32435ac27d8a061ee32ba88cf842ee3dff64a85803aa4d6a65d841e32ccbbd", + "sha256": "ac32435ac27d8a061ee32ba88cf842ee3dff64a85803aa4d6a65d841e32ccbbd" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:09767dffd13dd62aed6bb904f35946c3b9dae2db58cc884dc179d6e12b573673", + "sha256": "09767dffd13dd62aed6bb904f35946c3b9dae2db58cc884dc179d6e12b573673" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:3ce1ca917e08acf3cad5023e0d7184505be327f797f18eb692711325d8c540c9", + "sha256": "3ce1ca917e08acf3cad5023e0d7184505be327f797f18eb692711325d8c540c9" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:357f32b7bbe42ae1323d693bebd756f1589ae38a03e25f1a217fdd870b301797", + "sha256": "357f32b7bbe42ae1323d693bebd756f1589ae38a03e25f1a217fdd870b301797" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/redis/blobs/sha256:92d2c8978df576d27b03b8f806136eaa920329c0fec4f4606f1a07abaad6c353", + "sha256": "92d2c8978df576d27b03b8f806136eaa920329c0fec4f4606f1a07abaad6c353" + } + } + } + }, + "ripgrep": { + "version": "14.1.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:22cc1f3423a7fddb550fb94bd2715ce5455076d17f2c88ef0c157749ea4b87d6", + "sha256": "22cc1f3423a7fddb550fb94bd2715ce5455076d17f2c88ef0c157749ea4b87d6" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:837aaf1b32879f1177f9599e67d73a7f474d25ad5d3ba053216b05cbf8539b2a", + "sha256": "837aaf1b32879f1177f9599e67d73a7f474d25ad5d3ba053216b05cbf8539b2a" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:9a6e788f0a35d38ed325c7880e772775fe04c61e27c3506785ce10f6095ec891", + "sha256": "9a6e788f0a35d38ed325c7880e772775fe04c61e27c3506785ce10f6095ec891" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:35ee71e72b612f0cc7748ff0e58b4cdfeec0693c83df6f553d9be1160cc7ba74", + "sha256": "35ee71e72b612f0cc7748ff0e58b4cdfeec0693c83df6f553d9be1160cc7ba74" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:42eaa5b6b69a460c31c859c44b263d651e649d6eae4478651b09e155a14faf64", + "sha256": "42eaa5b6b69a460c31c859c44b263d651e649d6eae4478651b09e155a14faf64" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:69c2e49f5d8054e1d2efb6e77aa8f83183b6bcfd6470354da30a2bfb251edd00", + "sha256": "69c2e49f5d8054e1d2efb6e77aa8f83183b6bcfd6470354da30a2bfb251edd00" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ripgrep/blobs/sha256:bf2810ab20dc5006c02d9ced344bb47f1c2e5770ae051c35f81faaa34fe48d9d", + "sha256": "bf2810ab20dc5006c02d9ced344bb47f1c2e5770ae051c35f81faaa34fe48d9d" + } + } + } + }, + "rsync": { + "version": "3.2.7_1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:d68788aadb63680a636992bdb2edb9b0380aa8d2efb95652fcedac30516b7044", + "sha256": "d68788aadb63680a636992bdb2edb9b0380aa8d2efb95652fcedac30516b7044" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:071de5ab73fa5f455d1861ac33b5f618f7672f53442ccb50a8c3af55312f58e0", + "sha256": "071de5ab73fa5f455d1861ac33b5f618f7672f53442ccb50a8c3af55312f58e0" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:01361cf8e78ce7c629d97b6474ad417632010e099b6aa881fac5bf39786a973c", + "sha256": "01361cf8e78ce7c629d97b6474ad417632010e099b6aa881fac5bf39786a973c" + }, + "arm64_big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:e7e106b801d5fd324ae7fc99384141cad1a11b031dbb3a18825747aa1f6e1313", + "sha256": "e7e106b801d5fd324ae7fc99384141cad1a11b031dbb3a18825747aa1f6e1313" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:eb41ded3d3630e37e01d718f386a41ba5f5820cd949cb1e0cc56131ad1d01d14", + "sha256": "eb41ded3d3630e37e01d718f386a41ba5f5820cd949cb1e0cc56131ad1d01d14" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:c1d2161f8ca6d894e3f32f1d1cb54babd5bed9a8e078a08a9c37f776a4bc06db", + "sha256": "c1d2161f8ca6d894e3f32f1d1cb54babd5bed9a8e078a08a9c37f776a4bc06db" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:63d05e0e6ecb5161b9e29704db7607d00e97898e143bca3eabba5c146b776aaf", + "sha256": "63d05e0e6ecb5161b9e29704db7607d00e97898e143bca3eabba5c146b776aaf" + }, + "big_sur": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:a6262a2ac03fa34a43bd0e187a54a1e89cf523dd03c7fe87a6fde5d1599860ee", + "sha256": "a6262a2ac03fa34a43bd0e187a54a1e89cf523dd03c7fe87a6fde5d1599860ee" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/rsync/blobs/sha256:81689deca3e1695f3976b576c54a38348632c43ce8453d6d1b318d8a087f2827", + "sha256": "81689deca3e1695f3976b576c54a38348632c43ce8453d6d1b318d8a087f2827" + } + } + } + }, + "ruby-build": { + "version": "20240119", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "all": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ruby-build/blobs/sha256:61f4463a727fd0e6434db47da818bc3184c0788cba906e1083743329aa288641", + "sha256": "61f4463a727fd0e6434db47da818bc3184c0788cba906e1083743329aa288641" + } + } + } + }, + "ruby-completion": { + "version": "1.0.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "all": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ruby-completion/blobs/sha256:ddef10f9066b45d6d50d2795bfc16b7fbc528145db20e6a7c7714e2a26e3ac83", + "sha256": "ddef10f9066b45d6d50d2795bfc16b7fbc528145db20e6a7c7714e2a26e3ac83" + } + } + } + }, + "shellcheck": { + "version": "0.9.0", + "bottle": { + "rebuild": 1, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:0688df1adf51536205cde96e4910b26c88b10eb2f967a8255c726f9d0cb57d2a", + "sha256": "0688df1adf51536205cde96e4910b26c88b10eb2f967a8255c726f9d0cb57d2a" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:42ac0d4c4c44a3fd85a52caa0d655c32f28e609713530ba69a52d182b61351e4", + "sha256": "42ac0d4c4c44a3fd85a52caa0d655c32f28e609713530ba69a52d182b61351e4" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:4d9fc87309f3997d443d5a5e2c6ec72f3586cbeecdeb002f52f64414f106110e", + "sha256": "4d9fc87309f3997d443d5a5e2c6ec72f3586cbeecdeb002f52f64414f106110e" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:dec4133905b1115275e6ce2d9cd5ef966cbac0e5912fc32e3c89356922ea0ec1", + "sha256": "dec4133905b1115275e6ce2d9cd5ef966cbac0e5912fc32e3c89356922ea0ec1" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:89d1c2a187c42d41e99856895989e2bf57a9f82e8a0265dd30d3f417baf273dd", + "sha256": "89d1c2a187c42d41e99856895989e2bf57a9f82e8a0265dd30d3f417baf273dd" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:f1506e3dfd48ac61184f37b5b6cb48328018bc37e415f78dd4348d2730ad9cf7", + "sha256": "f1506e3dfd48ac61184f37b5b6cb48328018bc37e415f78dd4348d2730ad9cf7" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:d0f7c834a0266325e8dab25a04aeadc67664701b767d3ed2529286fb0fb66823", + "sha256": "d0f7c834a0266325e8dab25a04aeadc67664701b767d3ed2529286fb0fb66823" + } + } + } + }, + "tree": { + "version": "2.1.1_1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:2d1c490c83719c983ec360085e9d0049418ff424259bc00122869f8acf68ed63", + "sha256": "2d1c490c83719c983ec360085e9d0049418ff424259bc00122869f8acf68ed63" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:13b597dcee0eec0e8d3a7f864dfb5713d812605092bf1e417c765e788d0c0d31", + "sha256": "13b597dcee0eec0e8d3a7f864dfb5713d812605092bf1e417c765e788d0c0d31" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:0bd195b460f491c6e71b0277efb3c4cdbab8b6d814072519ade39e5ca257b048", + "sha256": "0bd195b460f491c6e71b0277efb3c4cdbab8b6d814072519ade39e5ca257b048" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:af3d14eb91e4bf756bb5ef5f6a489aeb33e6cf5fc4f72c99d70352bec364e282", + "sha256": "af3d14eb91e4bf756bb5ef5f6a489aeb33e6cf5fc4f72c99d70352bec364e282" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:da304661d82c58ee3d4a14f80479d15d3405ca4c1be78b6085f7c62e67f79412", + "sha256": "da304661d82c58ee3d4a14f80479d15d3405ca4c1be78b6085f7c62e67f79412" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:13a0875d7da74de5ccfd1c6d3bd6167d2c4c0d7d4d747cc3ebb377fad60df365", + "sha256": "13a0875d7da74de5ccfd1c6d3bd6167d2c4c0d7d4d747cc3ebb377fad60df365" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/tree/blobs/sha256:48bf95e7ef6c5f14db8a551b3ba22db93613f39ad04985f2edd3d34754daf89e", + "sha256": "48bf95e7ef6c5f14db8a551b3ba22db93613f39ad04985f2edd3d34754daf89e" + } + } + } + }, + "vim": { + "version": "9.1.0100", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:28fb07081aeaefa1864747ed178a513e828be1fb675f05bb17e5d6d906e2c780", + "sha256": "28fb07081aeaefa1864747ed178a513e828be1fb675f05bb17e5d6d906e2c780" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:623813f161c1b71dce847ac9d6ace8dd828ae01e7eb485e58601447e170bcdd2", + "sha256": "623813f161c1b71dce847ac9d6ace8dd828ae01e7eb485e58601447e170bcdd2" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:719be799ad7c9311a6e46ed612d4bc84b8a32ae374e3588ddc505b65a22708a5", + "sha256": "719be799ad7c9311a6e46ed612d4bc84b8a32ae374e3588ddc505b65a22708a5" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:1e445120cc5de83923593ebddedbdec362f4e2847c2a86a50e1f088af0686346", + "sha256": "1e445120cc5de83923593ebddedbdec362f4e2847c2a86a50e1f088af0686346" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:3b7c700ce9c544bdbf0f0b94d3d55e50c0ec265d27d6c5cd8025732a947b00dd", + "sha256": "3b7c700ce9c544bdbf0f0b94d3d55e50c0ec265d27d6c5cd8025732a947b00dd" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:c3d114a5f900e40993fce185b1185e37e8643c80764a36dd0becef97683d030c", + "sha256": "c3d114a5f900e40993fce185b1185e37e8643c80764a36dd0becef97683d030c" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:1567bc1a19316eb93136b5cfa74ae7da5594703449046ee3d52120609e8e1a8b", + "sha256": "1567bc1a19316eb93136b5cfa74ae7da5594703449046ee3d52120609e8e1a8b" + } + } + } + }, + "watch": { + "version": "4.0.4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:9d8b55c73a9b913186f6ef8dc7642e8a718b5edea93fc3301fff5f44ad42fe90", + "sha256": "9d8b55c73a9b913186f6ef8dc7642e8a718b5edea93fc3301fff5f44ad42fe90" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:f2e3977aacd949425257bb08b9ed66125e4cdff76a6e5b2464718139bc966d8c", + "sha256": "f2e3977aacd949425257bb08b9ed66125e4cdff76a6e5b2464718139bc966d8c" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:5f7ea5b77d12731688f4e2e72e8190f70c62763d4bdb94e8c30ea1c0625db9d6", + "sha256": "5f7ea5b77d12731688f4e2e72e8190f70c62763d4bdb94e8c30ea1c0625db9d6" + }, + "arm64_big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:3aac6404005a0953a1126687829863e19fa4d0f02acc4e58d8d099615bd9d014", + "sha256": "3aac6404005a0953a1126687829863e19fa4d0f02acc4e58d8d099615bd9d014" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:58baecc442fe806ece26dcd2c055532f226b8a06a732d32392c0858c56a6ac67", + "sha256": "58baecc442fe806ece26dcd2c055532f226b8a06a732d32392c0858c56a6ac67" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:80193cc3557144f620767de324af7f45bd0717496b81d8d09f811cf0e9e7397c", + "sha256": "80193cc3557144f620767de324af7f45bd0717496b81d8d09f811cf0e9e7397c" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:f52987abe01c3e3a09c5608d02fd8a4714632f4256ae58c79d4a32f41e42669b", + "sha256": "f52987abe01c3e3a09c5608d02fd8a4714632f4256ae58c79d4a32f41e42669b" + }, + "big_sur": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:d61077f4bffe12e0132a86c138630d2c422932272a61959ab1a01e8b7c244edb", + "sha256": "d61077f4bffe12e0132a86c138630d2c422932272a61959ab1a01e8b7c244edb" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/watch/blobs/sha256:03aa0061c8707c4d31402f1697429c7619e08e29221de08eed00ec9a26d3bc1e", + "sha256": "03aa0061c8707c4d31402f1697429c7619e08e29221de08eed00ec9a26d3bc1e" + } + } + } + }, + "wget": { + "version": "1.21.4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:47cb2b77bcb48ee8d8b8fb222bcafe0febe11195ac6476402917da03211412d8", + "sha256": "47cb2b77bcb48ee8d8b8fb222bcafe0febe11195ac6476402917da03211412d8" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:c7b3fe54045aa9dc0d4da59adc8776a781766b9d72cf629ea6ac3d0935f2e8de", + "sha256": "c7b3fe54045aa9dc0d4da59adc8776a781766b9d72cf629ea6ac3d0935f2e8de" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:f24fa0ffc6139c1063772ce054602910f6178ae636e32c150c2e6e81a61aa10b", + "sha256": "f24fa0ffc6139c1063772ce054602910f6178ae636e32c150c2e6e81a61aa10b" + }, + "arm64_big_sur": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:5d481ab27cab089083c35830f28e9e8c069708c8692e5ab35160b91f0ada90dd", + "sha256": "5d481ab27cab089083c35830f28e9e8c069708c8692e5ab35160b91f0ada90dd" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:3def758612b330624284f14c2617b04caa03f910ee7ee0921553a85f99d541f0", + "sha256": "3def758612b330624284f14c2617b04caa03f910ee7ee0921553a85f99d541f0" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:f1d0f59e9cd5863d4d4e29a4f0d7cf1c34da8ab4535d9b9a7b8822dbc4ce5e1b", + "sha256": "f1d0f59e9cd5863d4d4e29a4f0d7cf1c34da8ab4535d9b9a7b8822dbc4ce5e1b" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:cf388783b9a7c9f017b3d7f176e8dbf6963f4a96d321a171a14e403b005b1bd4", + "sha256": "cf388783b9a7c9f017b3d7f176e8dbf6963f4a96d321a171a14e403b005b1bd4" + }, + "big_sur": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:5d2a224fb078f5b344070188c8b44307b52610f459104b0b08aa62d4e4016716", + "sha256": "5d2a224fb078f5b344070188c8b44307b52610f459104b0b08aa62d4e4016716" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/wget/blobs/sha256:f73c136ea66bb8c7dfd4c35ef3b247ec588ed622c72ad7b425dc4f7a1922dce9", + "sha256": "f73c136ea66bb8c7dfd4c35ef3b247ec588ed622c72ad7b425dc4f7a1922dce9" + } + } + } + }, + "yamlfmt": { + "version": "0.11.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:e0b8c469f4ea5763210196cac0559cf4af4dc55be045fd64d601163a40b4bd7a", + "sha256": "e0b8c469f4ea5763210196cac0559cf4af4dc55be045fd64d601163a40b4bd7a" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:47b6975bcb89b9036bd675036b5b336b60a3f87a7bf4e7c8d2bf06ca85b3d0ba", + "sha256": "47b6975bcb89b9036bd675036b5b336b60a3f87a7bf4e7c8d2bf06ca85b3d0ba" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:b7c5e22e842081e375399c15e8e7ccf037561e2bac51b2bb259d4c9c7212165f", + "sha256": "b7c5e22e842081e375399c15e8e7ccf037561e2bac51b2bb259d4c9c7212165f" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:e10c21d430b641d39c0798f2c890f7628b44d42ab4f99229fed936b2b38c9a9c", + "sha256": "e10c21d430b641d39c0798f2c890f7628b44d42ab4f99229fed936b2b38c9a9c" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:30eee693734fc1f71bf2c67b1bc7e4dfaccdf64e8b1ad2997719000961fdbaea", + "sha256": "30eee693734fc1f71bf2c67b1bc7e4dfaccdf64e8b1ad2997719000961fdbaea" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:d68f766149e173cc19dd3275c19e931d09add173f9c6e6b4c66b0679e41c77dd", + "sha256": "d68f766149e173cc19dd3275c19e931d09add173f9c6e6b4c66b0679e41c77dd" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamlfmt/blobs/sha256:7d1bfa0101976985cb399566af4e0f1b0921b484618d04dd32372d0ff308c34d", + "sha256": "7d1bfa0101976985cb399566af4e0f1b0921b484618d04dd32372d0ff308c34d" + } + } + } + }, + "yamllint": { + "version": "1.35.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:16120f61c559ec5fd83bb28d110b265d7bfeb38fb5f6ae3958b6edddc3836fde", + "sha256": "16120f61c559ec5fd83bb28d110b265d7bfeb38fb5f6ae3958b6edddc3836fde" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:9ede8ae30ddc0615758e87836e91d84e712616801d17c0ff0ae1ebb737f4ae7f", + "sha256": "9ede8ae30ddc0615758e87836e91d84e712616801d17c0ff0ae1ebb737f4ae7f" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:ee60920ab2ac09300844b9a0ddadef8b212d331e77ad00a3a8d163ce4651860a", + "sha256": "ee60920ab2ac09300844b9a0ddadef8b212d331e77ad00a3a8d163ce4651860a" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:3a9a0bfa4caf102c09649e2c5ef5d8c33da13ffc0390c167ed6b4b35b8715b5f", + "sha256": "3a9a0bfa4caf102c09649e2c5ef5d8c33da13ffc0390c167ed6b4b35b8715b5f" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:8d1074f726fc3dce640a3c19542edcac8bfd67676508c43879ed833d919a12b1", + "sha256": "8d1074f726fc3dce640a3c19542edcac8bfd67676508c43879ed833d919a12b1" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:9c609546ff7edd2d308ec5dc3e49676eeab8eda9ef9211571aadeeeeee74920b", + "sha256": "9c609546ff7edd2d308ec5dc3e49676eeab8eda9ef9211571aadeeeeee74920b" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:8799f333c63d658c4dd6d87113fab523b23b8e41940e869c50e4205609145bb7", + "sha256": "8799f333c63d658c4dd6d87113fab523b23b8e41940e869c50e4205609145bb7" + } + } + } + }, + "ydiff": { + "version": "1.2_2", + "bottle": { + "rebuild": 4, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:19ee8a1c937369430282cbd2f7cf269b9d96f09abf2f1ea8d89347a829ea047e", + "sha256": "19ee8a1c937369430282cbd2f7cf269b9d96f09abf2f1ea8d89347a829ea047e" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:cf4bdaea2c095aeeb6898af0427d933e7ef75d7bdf24e2c4e816c7db6f9dffd1", + "sha256": "cf4bdaea2c095aeeb6898af0427d933e7ef75d7bdf24e2c4e816c7db6f9dffd1" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:ebacd80de18c253475b438d029e8e38f0ff14a598dba7129d0685e727b4ea26f", + "sha256": "ebacd80de18c253475b438d029e8e38f0ff14a598dba7129d0685e727b4ea26f" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:bdb09bbe71fe3a2a31a39a360b189ab3ec91d88b38f34421e09ad7a97b9c7768", + "sha256": "bdb09bbe71fe3a2a31a39a360b189ab3ec91d88b38f34421e09ad7a97b9c7768" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:aa35b53ae4de532ac6aac3eeeb9f5cc5147fe2747295f1af2910c4cb72432220", + "sha256": "aa35b53ae4de532ac6aac3eeeb9f5cc5147fe2747295f1af2910c4cb72432220" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:eb9f8a23eb756125eb81cf3c7340c2760ef13ad6581b6745e07ef09ab7fdd74f", + "sha256": "eb9f8a23eb756125eb81cf3c7340c2760ef13ad6581b6745e07ef09ab7fdd74f" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:4a516a84269d8f058ff8d271fce358dac1b58da7b49f2942854b829944890c29", + "sha256": "4a516a84269d8f058ff8d271fce358dac1b58da7b49f2942854b829944890c29" + } + } + } + }, + "yq": { + "version": "4.41.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:c5404881e9aba4d22663971dd620f7e8bbd2bbed07d6623ddcb06b8108eb8271", + "sha256": "c5404881e9aba4d22663971dd620f7e8bbd2bbed07d6623ddcb06b8108eb8271" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:ab37a388dac49f8aa1dee95154cf840cd4c23cd8756cf394dc629e647d908c8d", + "sha256": "ab37a388dac49f8aa1dee95154cf840cd4c23cd8756cf394dc629e647d908c8d" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:8580ba4cd20a0d5610dd253d91689d1fdacb5eb792ec2115713921524b8eb4ad", + "sha256": "8580ba4cd20a0d5610dd253d91689d1fdacb5eb792ec2115713921524b8eb4ad" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:db2d0b23fcae3685db08dc78b67c592166ec4311f6058aad40fd984face94e60", + "sha256": "db2d0b23fcae3685db08dc78b67c592166ec4311f6058aad40fd984face94e60" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:823638d8a82d905fcd00c7e88b12cfe6ada9e9e4a9ea627cfb37d55965648354", + "sha256": "823638d8a82d905fcd00c7e88b12cfe6ada9e9e4a9ea627cfb37d55965648354" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:87ff086af7864d8419c519642079d6923cbc7931250faa39dd0df44a58ffcaf9", + "sha256": "87ff086af7864d8419c519642079d6923cbc7931250faa39dd0df44a58ffcaf9" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:2c42c4894c4508bd6af2551dd07e5fe5646fe0ecb25d0a96931a263b5a46fdc1", + "sha256": "2c42c4894c4508bd6af2551dd07e5fe5646fe0ecb25d0a96931a263b5a46fdc1" + } + } + } + }, + "zlib": { + "version": "1.3.1", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:f867540472a59ab3fb1201625df546593e5fae2e98948c4c16c6154b0468b682", + "sha256": "f867540472a59ab3fb1201625df546593e5fae2e98948c4c16c6154b0468b682" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:9033eedbd240076116fea9fa181882e75edee7fe0c5d2e3850258a185c52792f", + "sha256": "9033eedbd240076116fea9fa181882e75edee7fe0c5d2e3850258a185c52792f" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:ebf10e203575beb64d6a8637ec2dc31774fa3141cfccab8ae7039f88b9efa7f6", + "sha256": "ebf10e203575beb64d6a8637ec2dc31774fa3141cfccab8ae7039f88b9efa7f6" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:217f4245cd1da65a3388f512530089f526cd63a38d49ee5f29a90576dfeb3bb7", + "sha256": "217f4245cd1da65a3388f512530089f526cd63a38d49ee5f29a90576dfeb3bb7" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:6012d7831245716d8507da3d1eb14ad274f8aa0b71b59275fe6bbbd6cebd787f", + "sha256": "6012d7831245716d8507da3d1eb14ad274f8aa0b71b59275fe6bbbd6cebd787f" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:56bbfa3d7bd6a5ccf17ffa53ab926e67f24e74bd64b4740b56fd96c312e37c44", + "sha256": "56bbfa3d7bd6a5ccf17ffa53ab926e67f24e74bd64b4740b56fd96c312e37c44" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/zlib/blobs/sha256:38f2469db2ce63b70855a98e5ee27b5b5a92874e52542cbdc0b230bba1e7195f", + "sha256": "38f2469db2ce63b70855a98e5ee27b5b5a92874e52542cbdc0b230bba1e7195f" + } + } + } + }, + "v8": { + "version": "12.1.285.24", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:f32a5a022378b428cea1b649a34fd55d8c7edc443e1526a701314a993eca4f08", + "sha256": "f32a5a022378b428cea1b649a34fd55d8c7edc443e1526a701314a993eca4f08" + }, + "arm64_ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:fc52a73f061198c928bc31a5561ad8460e948a8ea20ae45218e4f360d3c52fa0", + "sha256": "fc52a73f061198c928bc31a5561ad8460e948a8ea20ae45218e4f360d3c52fa0" + }, + "arm64_monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:4cd19a160f5ad942a30968f582ffaeb9485aad034e122c14910a4101e68aac35", + "sha256": "4cd19a160f5ad942a30968f582ffaeb9485aad034e122c14910a4101e68aac35" + }, + "sonoma": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:ca514e9dd9466c58c3fd466a11796655d8131985602b44d0c7a02d3788fb3841", + "sha256": "ca514e9dd9466c58c3fd466a11796655d8131985602b44d0c7a02d3788fb3841" + }, + "ventura": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:2de6daceddeae9d5c08d0842bdf08b9eb78a85bc3a869eae6629e4a5b883bcae", + "sha256": "2de6daceddeae9d5c08d0842bdf08b9eb78a85bc3a869eae6629e4a5b883bcae" + }, + "monterey": { + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:9596dd1d33272babe4959de7869f569a00de8e62a8df7711e60b172a6a3f0c43", + "sha256": "9596dd1d33272babe4959de7869f569a00de8e62a8df7711e60b172a6a3f0c43" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/v8/blobs/sha256:c109bd1d47b502257784e1e28acbfdf68292f2f839feaab396d7fe71cc5a063e", + "sha256": "c109bd1d47b502257784e1e28acbfdf68292f2f839feaab396d7fe71cc5a063e" + } + } + } + }, + "gpg2": { + "version": "2.4.4", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:eead9f697214f8c9245ca7cb24aecff0ca3e8f46322ddf890c89146396782bc0", + "sha256": "eead9f697214f8c9245ca7cb24aecff0ca3e8f46322ddf890c89146396782bc0" + }, + "arm64_ventura": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:e096a8063b3cfbb76deb3afcba2ab5556a6403ca4c31bc1d1683edd3ad77fb70", + "sha256": "e096a8063b3cfbb76deb3afcba2ab5556a6403ca4c31bc1d1683edd3ad77fb70" + }, + "arm64_monterey": { + "cellar": "/opt/homebrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:8e7c0ff2b1a73454e093b384aafb71a021c31049219dd4b55fd188a6574fa51e", + "sha256": "8e7c0ff2b1a73454e093b384aafb71a021c31049219dd4b55fd188a6574fa51e" + }, + "sonoma": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:10a786c7b9f9eac5c960d303076ea31e1b62e6dd03168948ac6ee32752f97967", + "sha256": "10a786c7b9f9eac5c960d303076ea31e1b62e6dd03168948ac6ee32752f97967" + }, + "ventura": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:5bf0ac220534eb57328b643cefc17b31d3457e5a3bc0fbad53587e86412c4caa", + "sha256": "5bf0ac220534eb57328b643cefc17b31d3457e5a3bc0fbad53587e86412c4caa" + }, + "monterey": { + "cellar": "/usr/local/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:6491443b90accbc12ad485d13025fc60d4d5a56e4f4d09e99fe3767f53c3d2b5", + "sha256": "6491443b90accbc12ad485d13025fc60d4d5a56e4f4d09e99fe3767f53c3d2b5" + }, + "x86_64_linux": { + "cellar": "/home/linuxbrew/.linuxbrew/Cellar", + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:2701069f114e5a3b6b10ce4e6a34bb6df0edcbafdc4a4a7edc69208983d9109f", + "sha256": "2701069f114e5a3b6b10ce4e6a34bb6df0edcbafdc4a4a7edc69208983d9109f" + } + } + } + }, + "stripe/stripe-mock/stripe-mock": { + "version": "0.182.0", + "bottle": false + } + }, + "cask": { + "chromedriver": { + "version": "121.0.6167.85", + "options": { + "full_name": "chromedriver" + } + }, + "github": { + "version": "3.3.8-48bb7059", + "options": { + "full_name": "github" + } + }, + "font-andale-mono": { + "version": "latest", + "options": { + "full_name": "font-andale-mono" + } + }, + "font-anonymice-powerline": { + "version": "latest", + "options": { + "full_name": "font-anonymice-powerline" + } + }, + "font-arvo": { + "version": "latest", + "options": { + "full_name": "font-arvo" + } + }, + "font-aurulent-sans-mono-nerd-font": { + "version": "3.1.1", + "options": { + "full_name": "font-aurulent-sans-mono-nerd-font" + } + }, + "font-awesome-terminal-fonts": { + "version": "latest", + "options": { + "full_name": "font-awesome-terminal-fonts" + } + }, + "font-bitstream-vera-sans-mono-nerd-font": { + "version": "3.1.1", + "options": { + "full_name": "font-bitstream-vera-sans-mono-nerd-font" + } + }, + "font-blex-mono-nerd-font": { + "version": "3.1.1", + "options": { + "full_name": "font-blex-mono-nerd-font" + } + }, + "font-cairo": { + "version": "latest", + "options": { + "full_name": "font-cairo" + } + }, + "font-cascadia-mono": { + "version": "2111.01", + "options": { + "full_name": "font-cascadia-mono" + } + }, + "font-consolas-for-powerline": { + "version": "latest", + "options": { + "full_name": "font-consolas-for-powerline" + } + }, + "font-cousine": { + "version": "latest", + "options": { + "full_name": "font-cousine" + } + }, + "font-cutive-mono": { + "version": "latest", + "options": { + "full_name": "font-cutive-mono" + } + }, + "font-d2coding": { + "version": "1.3.2,20180524", + "options": { + "full_name": "font-d2coding" + } + }, + "font-dejavu-sans-mono-for-powerline": { + "version": "latest", + "options": { + "full_name": "font-dejavu-sans-mono-for-powerline" + } + }, + "font-everson-mono": { + "version": "7.0.0", + "options": { + "full_name": "font-everson-mono" + } + }, + "font-fantasque-sans-mono": { + "version": "1.8.0", + "options": { + "full_name": "font-fantasque-sans-mono" + } + }, + "font-fontawesome": { + "version": "6.5.1", + "options": { + "full_name": "font-fontawesome" + } + }, + "font-ia-writer-mono": { + "version": "latest", + "options": { + "full_name": "font-ia-writer-mono" + } + }, + "font-inconsolata": { + "version": "latest", + "options": { + "full_name": "font-inconsolata" + } + }, + "font-jetbrains-mono": { + "version": "2.304", + "options": { + "full_name": "font-jetbrains-mono" + } + }, + "font-kawkab-mono": { + "version": "0.501", + "options": { + "full_name": "font-kawkab-mono" + } + }, + "font-lekton-nerd-font": { + "version": "3.1.1", + "options": { + "full_name": "font-lekton-nerd-font" + } + }, + "font-menlo-for-powerline": { + "version": "latest", + "options": { + "full_name": "font-menlo-for-powerline" + } + }, + "font-meslo-for-powerline": { + "version": "2015-12-04", + "options": { + "full_name": "font-meslo-for-powerline" + } + }, + "font-miriam-mono-clm": { + "version": "latest", + "options": { + "full_name": "font-miriam-mono-clm" + } + }, + "font-monoid": { + "version": "0.61", + "options": { + "full_name": "font-monoid" + } + }, + "font-monoisome": { + "version": "0.61", + "options": { + "full_name": "font-monoisome" + } + }, + "font-mononoki": { + "version": "1.6", + "options": { + "full_name": "font-mononoki" + } + }, + "font-monoton": { + "version": "latest", + "options": { + "full_name": "font-monoton" + } + }, + "font-noto-mono": { + "version": "latest", + "options": { + "full_name": "font-noto-mono" + } + }, + "font-oswald": { + "version": "latest", + "options": { + "full_name": "font-oswald" + } + }, + "font-oxygen": { + "version": "latest", + "options": { + "full_name": "font-oxygen" + } + }, + "font-oxygen-mono": { + "version": "latest", + "options": { + "full_name": "font-oxygen-mono" + } + }, + "font-powerline-symbols": { + "version": "latest", + "options": { + "full_name": "font-powerline-symbols" + } + }, + "font-pt-mono": { + "version": "latest", + "options": { + "full_name": "font-pt-mono" + } + }, + "font-roboto": { + "version": "latest", + "options": { + "full_name": "font-roboto" + } + }, + "font-roboto-mono-nerd-font": { + "version": "3.1.1", + "options": { + "full_name": "font-roboto-mono-nerd-font" + } + }, + "font-share-tech-mono": { + "version": "latest", + "options": { + "full_name": "font-share-tech-mono" + } + }, + "font-sometype-mono": { + "version": "latest", + "options": { + "full_name": "font-sometype-mono" + } + }, + "font-titillium": { + "version": "2.0,258e06fe34c35320321f0458e6625bba", + "options": { + "full_name": "font-titillium" + } + }, + "font-ubuntu": { + "version": "latest", + "options": { + "full_name": "font-ubuntu" + } + }, + "font-victor-mono": { + "version": "1.5.6", + "options": { + "full_name": "font-victor-mono" + } + } + } + }, + "system": { + "macos": { + "sonoma": { + "HOMEBREW_VERSION": "4.2.8", + "HOMEBREW_PREFIX": "/opt/homebrew", + "Homebrew/homebrew-core": "api", + "CLT": "15.1.0.0.1.1700200546", + "Xcode": "15.2", + "macOS": "14.3.1" + } + } + } +} diff --git a/Gemfile b/Gemfile index 681f3b55..373df874 100644 --- a/Gemfile +++ b/Gemfile @@ -2,38 +2,41 @@ source 'https://rubygems.org' -gem 'rails', '~> 4.2' +gem 'rails', '~> 6.0.2' gem 'attribute_normalizer' gem 'awesome_print' +gem 'bootsnap' +gem 'bootstrap-sass' # , '3.0.2.1' gem 'carrierwave' gem 'coffee-rails' gem 'colored2' gem 'commonjs' gem 'country_select' +gem 'dalli' gem 'devise' gem 'haml' gem 'jquery-rails' -gem 'less' -gem 'less-rails' gem 'libv8' gem 'mini_magick' +gem 'mini_racer' gem 'newrelic_rpm' -gem 'pg', '~> 0.20' -gem 'protected_attributes' -gem 'psych', '< 4' +gem 'pg', '~> 1.4' +gem 'protected_attributes_continued' +gem 'psych' gem 'puma' gem 'puma-status' gem 'rake' gem 'rollbar' +gem 'sass', '~> 3.4' gem 'sass-rails' gem 'sentry-raven' gem 'stripe' -gem 'therubyracer', platforms: :ruby gem 'twitter-bootstrap-rails' gem 'uglifier' gem 'ventable' gem 'yard' +gem 'annotate' group :development, :test do gem 'codecov' @@ -46,7 +49,6 @@ group :development, :test do end group :development do - gem 'annotate' gem 'asciidoctor' gem 'capistrano', '< 3' end diff --git a/Gemfile.lock b/Gemfile.lock index 10d0bdc7..1084b572 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,318 +1,389 @@ GEM remote: https://rubygems.org/ specs: - accept_values_for (0.7.5) - activemodel (>= 4.2, < 6.0) - rspec (>= 2.0, < 4.0) - actionmailer (4.2.11.1) - actionpack (= 4.2.11.1) - actionview (= 4.2.11.1) - activejob (= 4.2.11.1) + accept_values_for (0.9.2) + activemodel (>= 5.0, < 7.1) + rspec (>= 3.0, < 4.0) + actioncable (6.0.6.1) + actionpack (= 6.0.6.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailbox (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) + mail (>= 2.7.1) + actionmailer (6.0.6.1) + actionpack (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.11.1) - actionview (= 4.2.11.1) - activesupport (= 4.2.11.1) - rack (~> 1.6) - rack-test (~> 0.6.2) - rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.11.1) - activesupport (= 4.2.11.1) - builder (~> 3.1) - erubis (~> 2.7.0) - rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (4.2.11.1) - activesupport (= 4.2.11.1) - globalid (>= 0.3.0) - activemodel (4.2.11.1) - activesupport (= 4.2.11.1) + rails-dom-testing (~> 2.0) + actionpack (6.0.6.1) + actionview (= 6.0.6.1) + activesupport (= 6.0.6.1) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.6.1) + actionpack (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) + nokogiri (>= 1.8.5) + actionview (6.0.6.1) + activesupport (= 6.0.6.1) builder (~> 3.1) - activerecord (4.2.11.1) - activemodel (= 4.2.11.1) - activesupport (= 4.2.11.1) - arel (~> 6.0) - activesupport (4.2.11.1) - i18n (~> 0.7) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + activejob (6.0.6.1) + activesupport (= 6.0.6.1) + globalid (>= 0.3.6) + activemodel (6.0.6.1) + activesupport (= 6.0.6.1) + activerecord (6.0.6.1) + activemodel (= 6.0.6.1) + activesupport (= 6.0.6.1) + activestorage (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + marcel (~> 1.0) + activesupport (6.0.6.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - annotate (3.1.1) - activerecord (>= 3.2, < 7.0) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.8.6) + public_suffix (>= 2.0.2, < 6.0) + annotate (3.2.0) + activerecord (>= 3.2, < 8.0) rake (>= 10.4, < 14.0) - arel (6.0.4) - asciidoctor (2.0.17) + asciidoctor (2.0.20) ast (2.4.2) attribute_normalizer (1.2.0) + autoprefixer-rails (10.4.16.0) + execjs (~> 2) awesome_print (1.9.2) - bcrypt (3.1.13) + bcrypt (3.1.20) + bootsnap (1.18.3) + msgpack (~> 1.2) + bootstrap-sass (3.4.1) + autoprefixer-rails (>= 5.2.1) + sassc (>= 2.0.0) builder (3.2.4) - capistrano (2.15.9) + capistrano (2.15.11) highline net-scp (>= 1.0.0) net-sftp (>= 2.0.0) net-ssh (>= 2.0.14) net-ssh-gateway (>= 1.1.0) - carrierwave (1.3.2) - activemodel (>= 4.0.0) - activesupport (>= 4.0.0) - mime-types (>= 1.16) + carrierwave (3.0.5) + activemodel (>= 6.0.0) + activesupport (>= 6.0.0) + addressable (~> 2.6) + image_processing (~> 1.1) + marcel (~> 1.0.0) ssrf_filter (~> 1.0) codecov (0.6.0) simplecov (>= 0.15, < 0.22) - coffee-rails (4.2.2) + coffee-rails (5.0.0) coffee-script (>= 2.2.0) - railties (>= 4.0.0) + railties (>= 5.2.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) - colored2 (3.1.2) + colored2 (4.0.0) colorize (0.8.1) commonjs (0.2.7) - concurrent-ruby (1.1.10) - countries (2.1.4) - i18n_data (~> 0.8.0) - money (~> 6.9) - sixarm_ruby_unaccent (~> 1.1) - unicode_utils (~> 1.4) - country_select (3.1.1) - countries (~> 2.0) - sort_alphabetical (~> 1.0) - crass (1.0.5) + concurrent-ruby (1.2.3) + countries (5.7.1) + unaccent (~> 0.3) + country_select (8.0.3) + countries (~> 5.0) + crass (1.0.6) + dalli (3.2.8) dante (0.2.0) - devise (4.7.1) + date (3.3.4) + devise (4.9.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - diff-lcs (1.3) - docile (1.3.2) - erubis (2.7.0) - execjs (2.7.0) - factory_bot (4.8.2) - activesupport (>= 3.0.0) - factory_bot_rails (4.8.2) - factory_bot (~> 4.8.2) - railties (>= 3.0.0) - faraday (0.15.1) - multipart-post (>= 1.2, < 3) - ffi (1.10.0) - globalid (0.4.2) - activesupport (>= 4.2.0) - grease (0.3.1) - haml (5.0.4) - temple (>= 0.8.0) + diff-lcs (1.5.1) + docile (1.4.0) + erubi (1.12.0) + execjs (2.9.1) + factory_bot (6.4.6) + activesupport (>= 5.0.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faraday (2.9.0) + faraday-net_http (>= 2.0, < 3.2) + faraday-net_http (3.1.0) + net-http + ffi (1.16.3) + globalid (1.1.0) + activesupport (>= 5.0) + haml (6.3.0) + temple (>= 0.8.2) + thor tilt - highline (1.7.10) - i18n (0.9.5) + highline (3.0.1) + i18n (1.14.1) concurrent-ruby (~> 1.0) - i18n_data (0.8.0) - jquery-rails (4.3.3) + image_processing (1.12.2) + mini_magick (>= 4.9.5, < 5) + ruby-vips (>= 2.0.17, < 3) + jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.6.1) + json (2.7.1) + language_server-protocol (3.17.0.3) less (2.6.0) commonjs (~> 0.2.7) - less-rails (3.0.0) - actionpack (>= 4.0) - grease + less-rails (4.0.0) + actionpack (>= 4) less (~> 2.6.0) - sprockets (> 2, < 4) - tilt - libv8 (3.16.14.19) - loofah (2.3.1) + sprockets (>= 2) + libv8 (8.4.255.0.1-universal-darwin) + libv8 (8.4.255.0.1-x86_64-linux) + libv8-node (18.16.0.0-arm64-darwin) + libv8-node (18.16.0.0-x86_64-linux) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) - mime-types (3.4.1) - mime-types-data (~> 3.2015) - mime-types-data (3.2022.0105) - mini_magick (4.9.5) - mini_mime (1.0.1) - mini_portile2 (2.4.0) - minitest (5.15.0) - money (6.11.3) - i18n (>= 0.6.4, < 1.1) + net-imap + net-pop + net-smtp + marcel (1.0.2) + method_source (1.0.0) + mini_magick (4.12.0) + mini_mime (1.1.5) + mini_racer (0.8.0) + libv8-node (~> 18.16.0.0) + minitest (5.22.2) + msgpack (1.7.2) multi_json (1.15.0) - multipart-post (2.0.0) - net-scp (1.2.1) - net-ssh (>= 2.6.5) - net-sftp (2.1.2) - net-ssh (>= 2.6.5) - net-ssh (4.2.0) + net-http (0.4.1) + uri + net-imap (0.4.10) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-scp (4.0.0) + net-ssh (>= 2.6.5, < 8.0.0) + net-sftp (4.0.0) + net-ssh (>= 5.0.0, < 8.0.0) + net-smtp (0.4.0.1) + net-protocol + net-ssh (7.2.1) net-ssh-gateway (2.0.0) net-ssh (>= 4.0.0) net_http_unix (0.2.2) - newrelic_rpm (8.6.0) - nio4r (2.5.9) - nokogiri (1.10.8) - mini_portile2 (~> 2.4.0) + newrelic_rpm (9.7.1) + nio4r (2.7.0) + nokogiri (1.16.2-arm64-darwin) + racc (~> 1.4) + nokogiri (1.16.2-x86_64-linux) + racc (~> 1.4) orm_adapter (0.5.0) - parallel (1.22.1) - parser (3.1.2.0) + parallel (1.24.0) + parser (3.3.0.5) ast (~> 2.4.1) - pg (0.21.0) - protected_attributes (1.1.4) - activemodel (>= 4.0.1, < 5.0) - psych (3.3.2) - puma (5.6.7) + racc + pg (1.5.5) + protected_attributes_continued (1.9.0) + activemodel (>= 5.0) + psych (5.1.2) + stringio + public_suffix (5.0.4) + puma (6.4.2) nio4r (~> 2.0) - puma-status (1.4) + puma-status (1.6) colorize (~> 0.8) net_http_unix (~> 0.2) parallel (~> 1) - rack (1.6.12) - rack-test (0.6.3) - rack (>= 1.0) - rails (4.2.11.1) - actionmailer (= 4.2.11.1) - actionpack (= 4.2.11.1) - actionview (= 4.2.11.1) - activejob (= 4.2.11.1) - activemodel (= 4.2.11.1) - activerecord (= 4.2.11.1) - activesupport (= 4.2.11.1) - bundler (>= 1.3.0, < 2.0) - railties (= 4.2.11.1) - sprockets-rails - rails-deprecated_sanitizer (1.0.3) - activesupport (>= 4.2.0.alpha) - rails-dom-testing (1.0.9) - activesupport (>= 4.2.0, < 5.0) - nokogiri (~> 1.6) - rails-deprecated_sanitizer (>= 1.0.1) - rails-html-sanitizer (1.0.4) - loofah (~> 2.2, >= 2.2.2) - railties (4.2.11.1) - actionpack (= 4.2.11.1) - activesupport (= 4.2.11.1) + racc (1.7.3) + rack (2.2.8) + rack-test (2.1.0) + rack (>= 1.3) + rails (6.0.6.1) + actioncable (= 6.0.6.1) + actionmailbox (= 6.0.6.1) + actionmailer (= 6.0.6.1) + actionpack (= 6.0.6.1) + actiontext (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) + activemodel (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) + bundler (>= 1.3.0) + railties (= 6.0.6.1) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (6.0.6.1) + actionpack (= 6.0.6.1) + activesupport (= 6.0.6.1) + method_source rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) + thor (>= 0.20.3, < 2.0) rainbow (3.1.1) - rake (13.0.1) - rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) - ref (2.0.0) - regexp_parser (2.3.0) + rake (13.1.0) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + regexp_parser (2.9.0) relaxed-rubocop (2.5) - responders (2.4.1) - actionpack (>= 4.2.0, < 6.0) - railties (>= 4.2.0, < 6.0) - rexml (3.2.5) - rollbar (3.3.0) - rspec (3.7.0) - rspec-core (~> 3.7.0) - rspec-expectations (~> 3.7.0) - rspec-mocks (~> 3.7.0) - rspec-core (3.7.1) - rspec-support (~> 3.7.0) - rspec-expectations (3.7.0) + responders (3.1.1) + actionpack (>= 5.2) + railties (>= 5.2) + rexml (3.2.6) + rollbar (3.5.1) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.0) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) + rspec-support (~> 3.13.0) rspec-its (1.3.0) rspec-core (>= 3.0.0) rspec-expectations (>= 3.0.0) - rspec-mocks (3.7.0) + rspec-mocks (3.13.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.7.0) - rspec-rails (3.7.2) - actionpack (>= 3.0) - activesupport (>= 3.0) - railties (>= 3.0) - rspec-core (~> 3.7.0) - rspec-expectations (~> 3.7.0) - rspec-mocks (~> 3.7.0) - rspec-support (~> 3.7.0) - rspec-support (3.7.1) - rubocop (1.27.0) + rspec-support (~> 3.13.0) + rspec-rails (5.1.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) + rspec-core (~> 3.10) + rspec-expectations (~> 3.10) + rspec-mocks (~> 3.10) + rspec-support (~> 3.10) + rspec-support (3.13.0) + rubocop (1.60.2) + json (~> 2.3) + language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.1.0.0) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.16.0, < 2.0) + rexml (>= 3.2.5, < 4.0) + rubocop-ast (>= 1.30.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.17.0) - parser (>= 3.1.1.0) - rubocop-rails (2.14.2) + unicode-display_width (>= 2.4.0, < 3.0) + rubocop-ast (1.30.0) + parser (>= 3.2.1.0) + rubocop-capybara (2.20.0) + rubocop (~> 1.41) + rubocop-factory_bot (2.25.1) + rubocop (~> 1.41) + rubocop-rails (2.23.1) activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 1.7.0, < 2.0) + rubocop (>= 1.33.0, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) rubocop-rake (0.6.0) rubocop (~> 1.0) - rubocop-rspec (2.10.0) - rubocop (~> 1.19) - ruby-progressbar (1.11.0) - sass (3.5.6) + rubocop-rspec (2.26.1) + rubocop (~> 1.40) + rubocop-capybara (~> 2.17) + rubocop-factory_bot (~> 2.22) + ruby-progressbar (1.13.0) + ruby-vips (2.2.0) + ffi (~> 1.12) + 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 (5.0.7) - railties (>= 4.0.0, < 6) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) - sentry-raven (2.7.3) - faraday (>= 0.7.6, < 1.0) - simplecov (0.17.1) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) + sassc (2.4.0) + ffi (~> 1.9) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt + sentry-raven (3.1.2) + faraday (>= 1.0) + simplecov (0.21.2) docile (~> 1.1) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - simplecov-html (0.10.2) - sixarm_ruby_unaccent (1.2.0) - sort_alphabetical (1.1.0) - unicode_utils (>= 1.2.2) - sprockets (3.7.2) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.4) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - ssrf_filter (1.0.7) - stripe (3.15.0) - faraday (~> 0.10) + ssrf_filter (1.1.2) + stringio (3.1.0) + stripe (10.9.0) stripe-ruby-mock (2.5.8) dante (>= 0.2.0) multi_json (~> 1.0) stripe (>= 2.0.3) - temple (0.8.0) - therubyracer (0.12.3) - libv8 (~> 3.16.14.15) - ref - thor (0.20.3) + temple (0.10.3) + thor (1.3.0) thread_safe (0.3.6) - tilt (2.0.8) - timeout (0.3.0) - twitter-bootstrap-rails (2.2.8) - actionpack (>= 3.1) - execjs - rails (>= 3.1) - railties (>= 3.1) - tzinfo (1.2.10) + tilt (2.3.0) + timeout (0.4.1) + twitter-bootstrap-rails (5.0.0) + actionpack (>= 5.0, < 8.0) + execjs (~> 2.7) + less-rails (>= 3.0, < 5.0) + railties (>= 5.0, < 8.0) + tzinfo (1.2.11) thread_safe (~> 0.1) - uglifier (4.1.10) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) - unicode-display_width (2.1.0) - unicode_utils (1.4.0) + unaccent (0.4.0) + unicode-display_width (2.5.0) + uri (0.13.0) ventable (1.2.0) - warden (1.2.7) - rack (>= 1.0) - webrick (1.7.0) - yard (0.9.27) - webrick (~> 1.7.0) + warden (1.2.9) + rack (>= 2.0.9) + websocket-driver (0.7.6) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + yard (0.9.34) + zeitwerk (2.6.13) PLATFORMS - ruby + arm64-darwin-21 + arm64-darwin-22 + x86_64-linux DEPENDENCIES accept_values_for @@ -320,6 +391,8 @@ DEPENDENCIES asciidoctor attribute_normalizer awesome_print + bootsnap + bootstrap-sass capistrano (< 3) carrierwave codecov @@ -327,21 +400,21 @@ DEPENDENCIES colored2 commonjs country_select + dalli devise factory_bot_rails haml jquery-rails - less - less-rails libv8 mini_magick + mini_racer newrelic_rpm - pg (~> 0.20) - protected_attributes - psych (< 4) + pg (~> 1.4) + protected_attributes_continued + psych puma puma-status - rails (~> 4.2) + rails (~> 6.0.2) rake relaxed-rubocop rollbar @@ -351,12 +424,12 @@ DEPENDENCIES rubocop-rails rubocop-rake rubocop-rspec + sass (~> 3.4) sass-rails sentry-raven simplecov stripe stripe-ruby-mock (~> 2.5.0) - therubyracer timeout twitter-bootstrap-rails uglifier @@ -364,4 +437,4 @@ DEPENDENCIES yard BUNDLED WITH - 1.17.3 + 2.5.6 diff --git a/Makefile b/Makefile index 6571fcb9..05e02442 100755 --- a/Makefile +++ b/Makefile @@ -66,3 +66,7 @@ docker-image: ## Builds a docker image named 'tickets' shellcheck: ## Run shellcheck on the shell files $(CURRENT_DIR)/bin/shchk + +dev-install: ## Optional install of VIM configuration and other dev tools + $(CURRENT_DIR)/development/dev-install + diff --git a/Rakefile b/Rakefile index cbca03e4..29775fd4 100755 --- a/Rakefile +++ b/Rakefile @@ -15,11 +15,11 @@ if is_dev_test require 'yard' namespace :todolist do - task :statsetup do + task statsetup: :environment do require 'rails/code_statistics' - ::STATS_DIRECTORIES << %w[Uploaders app/uploaders] + STATS_DIRECTORIES << %w[Uploaders app/uploaders] # For test folders not defined in CodeStatistics::TEST_TYPES (ie: spec/) - ::STATS_DIRECTORIES << %w[Specs spec] + STATS_DIRECTORIES << %w[Specs spec] CodeStatistics::TEST_TYPES << 'Specs' end end diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 00000000..8886a99b --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,6 @@ +//= link fnf.png +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css +//= require bootstrap +//= require twitter/bootstrap diff --git a/app/assets/javascripts/bootstrap.js.coffee b/app/assets/javascripts/bootstrap.js.coffee index c9404a8e..94406798 100644 --- a/app/assets/javascripts/bootstrap.js.coffee +++ b/app/assets/javascripts/bootstrap.js.coffee @@ -1,4 +1,3 @@ jQuery -> - $("a[rel=popover]").popover() - $(".tooltip").tooltip() - $("a[rel=tooltip]").tooltip() \ No newline at end of file + $("a[rel~=popover], .has-popover").popover() + $("a[rel~=tooltip], .has-tooltip").tooltip() diff --git a/app/assets/stylesheets/bootstrap_and_overrides.css.less b/app/assets/stylesheets/bootstrap_and_overrides.css.less deleted file mode 100644 index 0729ddbf..00000000 --- a/app/assets/stylesheets/bootstrap_and_overrides.css.less +++ /dev/null @@ -1,30 +0,0 @@ -@import "twitter/bootstrap/bootstrap"; -@import "twitter/bootstrap/responsive"; - -// Set the correct sprite paths -@iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings"); -@iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white"); - -// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines) -@fontAwesomeEotPath: asset-url("fontawesome-webfont.eot"); -@fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot#iefix"); -@fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff"); -@fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf"); -@fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular"); - -// Font Awesome -@import "fontawesome/font-awesome"; - -// Glyphicons -//@import "twitter/bootstrap/sprites.less"; - -// Your custom LESS stylesheets goes here -// -// Since bootstrap was imported above you have access to its mixins which -// you may use and inherit here -// -// If you'd like to override bootstrap's own variables, you can do so here as well -// See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation -// -// Example: -// @linkColor: #ff0000; diff --git a/app/assets/stylesheets/bootstrap_and_overrides.scss b/app/assets/stylesheets/bootstrap_and_overrides.scss new file mode 100644 index 00000000..426cdb41 --- /dev/null +++ b/app/assets/stylesheets/bootstrap_and_overrides.scss @@ -0,0 +1,29 @@ + +// Set the correct sprite paths +$iconSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings"); +$iconWhiteSpritePath: asset-path("twitter/bootstrap/glyphicons-halflings-white"); + +// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines) +$fontAwesomeEotPath: asset-url("fontawesome-webfont.eot"); +$fontAwesomeEotPath_iefix: asset-url("fontawesome-webfont.eot#iefix"); +$fontAwesomeWoffPath: asset-url("fontawesome-webfont.woff"); +$fontAwesomeTtfPath: asset-url("fontawesome-webfont.ttf"); +$fontAwesomeSvgPath: asset-url("fontawesome-webfont.svg#fontawesomeregular"); + +// Font Awesome +// @import "fontawesome/font-awesome"; + +// Glyphicons +//@import "twitter/bootstrap/sprites.scss"; + +// Your custom scss stylesheets goes here +// +// Since bootstrap was imported above you have access to its mixins which +// you may use and inherit here +// +// If you'd like to override bootstrap's own variables, you can do so here as well +// See http://twitter.github.com/bootstrap/customize.html#variables for their names and documentation +// +// Example: +// $linkColor: #ff0000; + diff --git a/lib/fnf/event_reporter.rb b/app/classes/fnf/event_reporter.rb similarity index 100% rename from lib/fnf/event_reporter.rb rename to app/classes/fnf/event_reporter.rb diff --git a/app/classes/fnf/events.rb b/app/classes/fnf/events.rb new file mode 100644 index 00000000..eb5a3606 --- /dev/null +++ b/app/classes/fnf/events.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'ventable' +require_relative 'events/ticket_request_event' +require_relative 'events/ticket_request_approved_event' +require_relative 'events/ticket_request_declined_event' + +require_relative '../../mailers/ticket_request_mailer' + +module FnF + module Events + class << self + attr_accessor :initialized + + def initialize_events! + return if initialized + + TicketRequestEvent.configure { notifies ::TicketRequestMailer } + + TicketRequestDeclinedEvent.configure { notifies ::TicketRequestMailer } + + TicketRequestApprovedEvent.configure { notifies ::TicketRequestMailer } + + self.initialized = true + end + end + end +end + +FnF::Events.initialize_events! diff --git a/lib/fnf/events/abstract_event.rb b/app/classes/fnf/events/abstract_event.rb similarity index 95% rename from lib/fnf/events/abstract_event.rb rename to app/classes/fnf/events/abstract_event.rb index acba909f..d94f87a3 100644 --- a/lib/fnf/events/abstract_event.rb +++ b/app/classes/fnf/events/abstract_event.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true -require_relative '../event_reporter' require 'ventable' + module FnF module Events class AbstractEvent diff --git a/lib/fnf/events/ticket_request_approved_event.rb b/app/classes/fnf/events/ticket_request_approved_event.rb similarity index 99% rename from lib/fnf/events/ticket_request_approved_event.rb rename to app/classes/fnf/events/ticket_request_approved_event.rb index 3b91cdab..f1ffa9bd 100644 --- a/lib/fnf/events/ticket_request_approved_event.rb +++ b/app/classes/fnf/events/ticket_request_approved_event.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative 'abstract_event' - module FnF module Events # This event fires whenever the ticket request is approved diff --git a/lib/fnf/events/ticket_request_declined_event.rb b/app/classes/fnf/events/ticket_request_declined_event.rb similarity index 83% rename from lib/fnf/events/ticket_request_declined_event.rb rename to app/classes/fnf/events/ticket_request_declined_event.rb index da8ec109..815a67cf 100644 --- a/lib/fnf/events/ticket_request_declined_event.rb +++ b/app/classes/fnf/events/ticket_request_declined_event.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true -require_relative 'abstract_event' - +require_relative 'ticket_request_event' module FnF module Events # This event fires whenever the ticket request is declined diff --git a/lib/fnf/events/ticket_request_event.rb b/app/classes/fnf/events/ticket_request_event.rb similarity index 100% rename from lib/fnf/events/ticket_request_event.rb rename to app/classes/fnf/events/ticket_request_event.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a92c4994..5c782634 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -26,7 +26,7 @@ def configure_permitted_parameters def authenticate_user_from_token! user_id = params[:user_id].presence - user = User.find_by_id(user_id) + user = User.find_by(id: user_id) if user && Devise.secure_compare(user.authentication_token, params[:user_token]) user.update_attribute(:authentication_token, nil) # One-time use diff --git a/app/controllers/eald_payments_controller.rb b/app/controllers/eald_payments_controller.rb index 39304e3b..f0227edb 100644 --- a/app/controllers/eald_payments_controller.rb +++ b/app/controllers/eald_payments_controller.rb @@ -22,10 +22,10 @@ def new early_arrival_passes = params.fetch(:early_arrival_passes, 1) late_departure_passes = params.fetch(:late_departure_passes, 1) @eald_payment = EaldPayment.new(event_id: @event.id, - email: email, + email:, name: full_name, - early_arrival_passes: early_arrival_passes, - late_departure_passes: late_departure_passes) + early_arrival_passes:, + late_departure_passes:) end def create diff --git a/app/controllers/emails_controller.rb b/app/controllers/emails_controller.rb index c2462738..ab078b62 100644 --- a/app/controllers/emails_controller.rb +++ b/app/controllers/emails_controller.rb @@ -4,7 +4,7 @@ class EmailsController < ApplicationController def index respond_to do |format| format.any do - if User.where(email: params[:email]).first + if User.where(email: email_params[:email]).first head :ok else head :not_found @@ -12,4 +12,10 @@ def index end end end + + private + + def email_params + params.permit(:email) + end end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 3a8b50b3..9f37c349 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -31,9 +31,9 @@ def edit end def create - populate_params_event(params) + populate_permitted_params_event(permitted_params) - @event = Event.new(params[:event]) + @event = Event.new(permitted_params[:event]) if @event.save redirect_to @event @@ -43,9 +43,9 @@ def create end def update - populate_params_event(params) + populate_permitted_params_event(permitted_params) - if @event.update_attributes(params[:event]) + if @event.update(permitted_params[:event]) redirect_to @event else render action: 'edit' @@ -61,8 +61,8 @@ def destroy def add_admin return redirect_to :back unless @event.admin?(current_user) - email = params[:user_email] - user = User.find_by_email(email) + email = permitted_params[:user_email] + user = User.find_by(email:) return redirect_to :back, notice: "No user with email '#{email}' exists" unless user @event.admins << user @@ -78,8 +78,8 @@ def add_admin def remove_admin return redirect_to :back unless @event.admin?(current_user) - user_id = params[:user_id] - event_admin = EventAdmin.where(event_id: @event, user_id: user_id).first + user_id = permitted_params[:user_id] + event_admin = EventAdmin.where(event_id: @event, user_id:).first return redirect_to :back, notice: "No user with id #{user_id} exists" unless event_admin event_admin.destroy @@ -111,12 +111,12 @@ def download_guest_list private - def populate_params_event(params) - params[:event][:start_time] = Time.from_picker(params.delete(:start_time)) - params[:event][:end_time] = Time.from_picker(params.delete(:end_time)) - params[:event][:ticket_sales_start_time] = Time.from_picker(params.delete(:ticket_sales_start_time)) - params[:event][:ticket_sales_end_time] = Time.from_picker(params.delete(:ticket_sales_end_time)) - params[:event][:ticket_requests_end_time] = Time.from_picker(params.delete(:ticket_requests_end_time)) + def populate_permitted_params_event(permitted_params) + permitted_params[:event][:start_time] = Time.from_picker(permitted_params.delete(:start_time)) + permitted_params[:event][:end_time] = Time.from_picker(permitted_params.delete(:end_time)) + permitted_params[:event][:ticket_sales_start_time] = Time.from_picker(permitted_params.delete(:ticket_sales_start_time)) + permitted_params[:event][:ticket_sales_end_time] = Time.from_picker(permitted_params.delete(:ticket_sales_end_time)) + permitted_params[:event][:ticket_requests_end_time] = Time.from_picker(permitted_params.delete(:ticket_requests_end_time)) end def completed_ticket_requests @@ -129,6 +129,10 @@ def completed_ticket_requests end def set_event - @event = Event.find(params[:id]) + @event = Event.find(permitted_params[:id]) + end + + def permitted_params + params.permit(:id, :event, :user_email, :user_id, :start_time, :end_time, :ticket_sales_start_time, :ticket_sales_end_time, :ticket_requests_end_time) end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 69be221b..bb91773a 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -23,7 +23,7 @@ def index end def oops - flash[:error] = 'No events exist at the moment, please have your Site Administrator create a public event first.' + flash.now[:error] = 'No events exist at the moment, please have your Site Administrator create a public event first.' render end end diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb index 779b8e51..3a9f8c8b 100644 --- a/app/controllers/jobs_controller.rb +++ b/app/controllers/jobs_controller.rb @@ -37,7 +37,7 @@ def create def update @job = Job.find(params[:id]) - if @job.update_attributes(params[:job]) + if @job.update(params[:job]) redirect_to event_job_path(@event, @job), notice: 'Job was successfully updated.' else diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb index d2cf95be..77899352 100644 --- a/app/controllers/passwords_controller.rb +++ b/app/controllers/passwords_controller.rb @@ -4,10 +4,10 @@ class PasswordsController < ApplicationController def reset email = params[:email].presence - if email && user = User.where(email: email).first + if email && user = User.where(email:).first user.send_reset_password_instructions end - redirect_to request.referrer, alert: 'A password reset link has been sent to your email!' + redirect_to request.referer, alert: 'A password reset link has been sent to your email!' end end diff --git a/app/controllers/payments_controller.rb b/app/controllers/payments_controller.rb index 751e8b2a..f1609efd 100644 --- a/app/controllers/payments_controller.rb +++ b/app/controllers/payments_controller.rb @@ -8,7 +8,7 @@ def show @charge = Stripe::Charge.retrieve(@payment.stripe_charge_id) if @payment.stripe_charge_id @ticket_request = @payment.ticket_request @event = @ticket_request.event - return redirect_to root_path unless @payment.can_view?(current_user) + redirect_to root_path unless @payment.can_view?(current_user) end def new diff --git a/app/controllers/shifts_controller.rb b/app/controllers/shifts_controller.rb index 600ba25d..ab4a8408 100644 --- a/app/controllers/shifts_controller.rb +++ b/app/controllers/shifts_controller.rb @@ -6,7 +6,7 @@ class ShiftsController < ApplicationController def index @ticket_request = @event.ticket_requests.where(user_id: current_user).first - if !@ticket_request.present? && !current_user.site_admin? + if @ticket_request.blank? && !current_user.site_admin? flash[:error] = 'The user you are logged in with has not requested a ticket for this event' return redirect_to :root end @@ -22,8 +22,8 @@ def create if @shift.save redirect_to event_shifts_path(@event), - notice: "Successfully volunteered for #{@shift.time_slot.job.name}" \ - " for #{@shift.time_slot.start_time.localtime.to_s(:dhmm)}" + notice: "Successfully volunteered for #{@shift.time_slot.job.name} " \ + "for #{@shift.time_slot.start_time.localtime.to_s(:dhmm)}" else render action: 'index' end @@ -34,8 +34,8 @@ def destroy @shift.destroy redirect_to event_shifts_url(@event), - notice: "Unvolunteered from #{@shift.time_slot.job.name}" \ - " for #{@shift.time_slot.start_time.localtime.to_s(:dhmm)}" + notice: "Unvolunteered from #{@shift.time_slot.job.name} " \ + "for #{@shift.time_slot.start_time.localtime.to_s(:dhmm)}" end private diff --git a/app/controllers/ticket_requests_controller.rb b/app/controllers/ticket_requests_controller.rb index 609a72e1..9250f565 100644 --- a/app/controllers/ticket_requests_controller.rb +++ b/app/controllers/ticket_requests_controller.rb @@ -45,7 +45,7 @@ def index def download temp_csv = Tempfile.new('csv') - raise(ArgumentError, 'Blank temp_csv') unless temp_csv && temp_csv&.path + raise(ArgumentError, 'Blank temp_csv') unless temp_csv&.path CSV.open(temp_csv.path, 'wb') do |csv| csv << (%w[name email] + TicketRequest.columns.map(&:name)) @@ -96,12 +96,12 @@ def edit def create unless @event.ticket_sales_open? - flash[:error] = 'Sorry, but ticket sales have closed' + flash.now[:error] = 'Sorry, but ticket sales have closed' return render action: 'new' end - params[:ticket_request][:user] = current_user if signed_in? - @ticket_request = TicketRequest.new(params[:ticket_request]) + permitted_params[:ticket_request][:user] = current_user if signed_in? + @ticket_request = TicketRequest.new(permitted_params[:ticket_request]) if @ticket_request.save FnF::Events::TicketRequestEvent.new( @@ -123,9 +123,9 @@ def create def update # Allow ticket request to edit guests and nothing else - params[:ticket_request].slice!(:guests) unless @event.admin?(current_user) + permitted_params[:ticket_request].slice!(:guests) unless @event.admin?(current_user) - if @ticket_request.update_attributes(params[:ticket_request]) + if @ticket_request.update(permitted_params[:ticket_request]) redirect_to event_ticket_request_path(@event, @ticket_request) else render action: 'edit' @@ -147,7 +147,7 @@ def approve end def decline - if @ticket_request.update_attributes(status: TicketRequest::STATUS_DECLINED) + if @ticket_request.update(status: TicketRequest::STATUS_DECLINED) ::FnF::Events::TicketRequestDeclinedEvent.new( user: current_user, target: @ticket_request @@ -185,11 +185,15 @@ def refund private def set_event - @event = Event.find(params[:event_id]) + @event = Event.find(permitted_params[:event_id]) end def set_ticket_request - @ticket_request = TicketRequest.find(params[:id]) + @ticket_request = TicketRequest.find(permitted_params[:id]) redirect_to @event unless @ticket_request.event == @event end + + def permitted_params + params.permit(:event_id, :id, ticket_request: %i[address_line1 address_line2]) + end end diff --git a/app/controllers/time_slots_controller.rb b/app/controllers/time_slots_controller.rb index f8bb3ec3..71ffa21b 100644 --- a/app/controllers/time_slots_controller.rb +++ b/app/controllers/time_slots_controller.rb @@ -17,9 +17,9 @@ def new slots = last_time_slot.slots end - @time_slot = TimeSlot.new start_time: start_time, - end_time: end_time, - slots: slots + @time_slot = TimeSlot.new start_time:, + end_time:, + slots: end def edit @@ -43,7 +43,7 @@ def update params[:time_slot][:start_time] = Time.from_picker(params.delete(:start_time)) params[:time_slot][:end_time] = Time.from_picker(params.delete(:end_time)) - if @time_slot.update_attributes(params[:time_slot]) + if @time_slot.update(params[:time_slot]) redirect_to event_job_path(@event, @job) else render action: 'edit' diff --git a/app/helpers/shifts_helper.rb b/app/helpers/shifts_helper.rb index fe1fc206..e27d84cb 100644 --- a/app/helpers/shifts_helper.rb +++ b/app/helpers/shifts_helper.rb @@ -23,17 +23,17 @@ def schedule_matrix .inject(nil) do |last_time_slot, time_slot| offset = (time_slot.start_time - earliest) / interval duration = (time_slot.end_time - time_slot.start_time) / interval - rows[offset] << { offset: offset, time_slot: time_slot, rowspan: duration.to_i } + rows[offset] << { offset:, time_slot:, rowspan: duration.to_i } # Fill in empty gaps if last_time_slot && last_time_slot.end_time < time_slot.start_time offset = (last_time_slot.end_time - earliest) / interval duration = (time_slot.start_time - last_time_slot.end_time) / interval - rows[offset] << { offset: offset, rowspan: duration.to_i } + rows[offset] << { offset:, rowspan: duration.to_i } elsif !last_time_slot && earliest < time_slot.start_time offset = 0 duration = (time_slot.start_time - earliest) / interval - rows[offset] << { offset: offset, rowspan: duration.to_i } + rows[offset] << { offset:, rowspan: duration.to_i } end # TODO: last_time_slot is always nil, since it's not set anywhere, right? -- @kigster @@ -44,7 +44,7 @@ def schedule_matrix if last_time_slot && last_time_slot.end_time < latest offset = (last_time_slot.end_time - earliest) / interval duration = (latest - last_time_slot.end_time) / interval - rows[offset] << { offset: offset, rowspan: duration.to_i } + rows[offset] << { offset:, rowspan: duration.to_i } elsif !last_time_slot rows[0] << { offset: 0, rowspan: blocks } end diff --git a/app/helpers/ticket_requests_helper.rb b/app/helpers/ticket_requests_helper.rb index d6c201aa..1be5d9d7 100644 --- a/app/helpers/ticket_requests_helper.rb +++ b/app/helpers/ticket_requests_helper.rb @@ -58,9 +58,9 @@ def eald_paid?(ticket_request) end def price_rules_to_json(event) - event.price_rules.map do |price_rule| + event.price_rules.to_h do |price_rule| [price_rule.trigger_value, price_rule.price.to_i] - end.to_h.to_json + end.to_json end def help_text_for(sym) diff --git a/app/mailers/ticket_request_mailer.rb b/app/mailers/ticket_request_mailer.rb index 32e679c9..7ca777d9 100644 --- a/app/mailers/ticket_request_mailer.rb +++ b/app/mailers/ticket_request_mailer.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'awesome_print' + class TicketRequestMailer < ActionMailer::Base DEFAULT_SENDER_EMAIL = 'tickets@fnf.org' DEFAULT_REPLY_TO_EMAIL = 'tickets@fnf.org' diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 00000000..10a4cba8 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/eald_payment.rb b/app/models/eald_payment.rb index 50e51110..de764a29 100644 --- a/app/models/eald_payment.rb +++ b/app/models/eald_payment.rb @@ -1,18 +1,35 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: eald_payments +# +# id :bigint not null, primary key +# amount_charged_cents :integer not null +# early_arrival_passes :integer default(0), not null +# email :string(255) not null +# late_departure_passes :integer default(0), not null +# name :string(255) not null +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint +# stripe_charge_id :string not null +# +# Indexes +# +# index_eald_payments_on_event_id (event_id) +# # Payment for early arrival/late departures passes. # # We only associate this with an event, as we want to treat these separately # from ticket requests. -class EaldPayment < ActiveRecord::Base +class EaldPayment < ApplicationRecord include PaymentsHelper belongs_to :event attr_accessible :event_id, :name, :email, :early_arrival_passes, :late_departure_passes, :stripe_card_token - validates :event_id, presence: true - validates :early_arrival_passes, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } diff --git a/app/models/event.rb b/app/models/event.rb index ce4fd663..edd35be5 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -1,7 +1,35 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: events +# +# id :bigint not null, primary key +# adult_ticket_price :decimal(8, 2) +# allow_donations :boolean default(FALSE), not null +# allow_financial_assistance :boolean default(FALSE), not null +# cabin_price :decimal(8, 2) +# early_arrival_price :decimal(8, 2) default(0.0) +# end_time :datetime +# kid_ticket_price :decimal(8, 2) +# late_departure_price :decimal(8, 2) default(0.0) +# max_adult_tickets_per_request :integer +# max_cabin_requests :integer +# max_cabins_per_request :integer +# max_kid_tickets_per_request :integer +# name :string +# photo :string +# require_mailing_address :boolean default(FALSE), not null +# start_time :datetime +# ticket_requests_end_time :datetime +# ticket_sales_end_time :datetime +# ticket_sales_start_time :datetime +# tickets_require_approval :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# # Core object containing all information related to an actual event being held. -class Event < ActiveRecord::Base +class Event < ApplicationRecord has_many :event_admins has_many :admins, through: :event_admins, source: :user has_many :jobs, dependent: :destroy @@ -45,7 +73,7 @@ class Event < ActiveRecord::Base :ensure_prices_set_if_maximum_specified def admin?(user) - user && (user.site_admin? || admins.where(id: user).exists?) + user && (user.site_admin? || admins.exists?(id: user)) end def cabins_available? @@ -56,18 +84,18 @@ def cabins_available? end def ticket_sales_open? - return false if ticket_sales_start_time && Time.now < ticket_sales_start_time - return Time.now < ticket_sales_end_time if ticket_sales_end_time - return false if Time.now >= end_time + return false if ticket_sales_start_time && Time.zone.now < ticket_sales_start_time + return Time.zone.now < ticket_sales_end_time if ticket_sales_end_time + return false if Time.zone.now >= end_time true end def ticket_requests_open? - return false if Time.now >= end_time + return false if Time.zone.now >= end_time return true unless ticket_requests_end_time - ticket_requests_end_time > Time.now + ticket_requests_end_time > Time.zone.now end def eald? diff --git a/app/models/event_admin.rb b/app/models/event_admin.rb index a4ec91b3..408a2c09 100644 --- a/app/models/event_admin.rb +++ b/app/models/event_admin.rb @@ -1,13 +1,28 @@ # frozen_string_literal: true -class EventAdmin < ActiveRecord::Base +# == Schema Information +# +# Table name: event_admins +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint +# user_id :bigint +# +# Indexes +# +# index_event_admins_on_event_id (event_id) +# index_event_admins_on_event_id_and_user_id (event_id,user_id) UNIQUE +# index_event_admins_on_user_id (user_id) +# index_event_admins_on_user_id_only (user_id) +# +class EventAdmin < ApplicationRecord attr_accessible :event_id, :user_id belongs_to :event belongs_to :user - validates :event_id, presence: true - - validates :user_id, presence: true, - uniqueness: { scope: :event_id, message: 'already admin for this event' } + validates :user_id, + uniqueness: { scope: :event_id, message: 'already admin for this event' } end diff --git a/app/models/job.rb b/app/models/job.rb index eb405560..26f3557f 100644 --- a/app/models/job.rb +++ b/app/models/job.rb @@ -1,13 +1,28 @@ # frozen_string_literal: true -class Job < ActiveRecord::Base +# == Schema Information +# +# Table name: jobs +# +# id :bigint not null, primary key +# description :string(512) not null +# name :string(100) not null +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint not null +# +# Indexes +# +# index_jobs_on_event_id (event_id) +# +class Job < ApplicationRecord belongs_to :event has_many :time_slots, dependent: :destroy attr_accessible :description, :event_id, :name - validates :event_id, presence: true, - numericality: { only_integer: true, greater_than: 0 } + validates :event_id, + numericality: { only_integer: true, greater_than: 0 } validates :name, presence: true, length: { maximum: 100 } validates :description, presence: true, length: { maximum: 512 } diff --git a/app/models/payment.rb b/app/models/payment.rb index 63284af9..61b95272 100644 --- a/app/models/payment.rb +++ b/app/models/payment.rb @@ -1,6 +1,18 @@ # frozen_string_literal: true -class Payment < ActiveRecord::Base +# == Schema Information +# +# Table name: payments +# +# id :bigint not null, primary key +# explanation :string +# status :string(1) default("P"), not null +# created_at :datetime not null +# updated_at :datetime not null +# stripe_charge_id :string(255) +# ticket_request_id :integer not null +# +class Payment < ApplicationRecord include PaymentsHelper STATUSES = [ @@ -18,8 +30,8 @@ class Payment < ActiveRecord::Base attr_accessor :stripe_card_token - validates :ticket_request, presence: true, - uniqueness: { message: 'ticket request has already been paid' } + validates :ticket_request, + uniqueness: { message: 'ticket request has already been paid' } validates :status, presence: true, inclusion: { in: STATUSES } def save_and_charge! @@ -50,9 +62,7 @@ def mark_received save! end - def can_view?(user) - ticket_request.can_view?(user) - end + delegate :can_view?, to: :ticket_request def due_date (created_at + 2.weeks).to_date @@ -75,7 +85,7 @@ def via_credit_card? def modifying_forbidden_attributes?(attributed) # Only allow donation field to be updated attributed.any? do |attribute, _value| - !%w[donation id].include?(attribute.to_s) + %w[donation id].exclude?(attribute.to_s) end end end diff --git a/app/models/price_rule.rb b/app/models/price_rule.rb index ffd59ec6..f5ba5445 100644 --- a/app/models/price_rule.rb +++ b/app/models/price_rule.rb @@ -1,11 +1,26 @@ # frozen_string_literal: true -class PriceRule < ActiveRecord::Base +# == Schema Information +# +# Table name: price_rules +# +# id :bigint not null, primary key +# price :decimal(8, 2) +# trigger_value :integer +# type :string +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint +# +# Indexes +# +# index_price_rules_on_event_id (event_id) +# +class PriceRule < ApplicationRecord belongs_to :event attr_accessible :event, :price, :trigger_value, :type - validates :event_id, presence: true validates :price, numericality: { only_integer: true, greater_than_or_equal_to: 0 } validates :trigger_value, presence: true, diff --git a/app/models/price_rule/kids_equal_to.rb b/app/models/price_rule/kids_equal_to.rb index 3f90457d..93521fbb 100644 --- a/app/models/price_rule/kids_equal_to.rb +++ b/app/models/price_rule/kids_equal_to.rb @@ -1,5 +1,21 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: price_rules +# +# id :bigint not null, primary key +# price :decimal(8, 2) +# trigger_value :integer +# type :string +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint +# +# Indexes +# +# index_price_rules_on_event_id (event_id) +# # Applied when a ticket request has indicated that they are bringing a specific # number of kids. class PriceRule diff --git a/app/models/shift.rb b/app/models/shift.rb index 0939cde0..867e45e4 100644 --- a/app/models/shift.rb +++ b/app/models/shift.rb @@ -1,6 +1,22 @@ # frozen_string_literal: true -class Shift < ActiveRecord::Base +# == Schema Information +# +# Table name: shifts +# +# id :bigint not null, primary key +# name :string(70) +# created_at :datetime not null +# updated_at :datetime not null +# time_slot_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_shifts_on_time_slot_id (time_slot_id) +# index_shifts_on_user_id (user_id) +# +class Shift < ApplicationRecord belongs_to :time_slot belongs_to :user @@ -9,11 +25,11 @@ class Shift < ActiveRecord::Base validates :name, length: { in: 3..User::MAX_NAME_LENGTH }, allow_nil: true, allow_blank: false - validates :time_slot_id, presence: true, - numericality: { only_integer: true, greater_than: 0 } + validates :time_slot_id, + numericality: { only_integer: true, greater_than: 0 } - validates :user_id, presence: true, - numericality: { only_integer: true, greater_than: 0 } + validates :user_id, + numericality: { only_integer: true, greater_than: 0 } def volunteer_name self[:name] || user.name diff --git a/app/models/site_admin.rb b/app/models/site_admin.rb index bf0ea445..45fe38e3 100644 --- a/app/models/site_admin.rb +++ b/app/models/site_admin.rb @@ -1,10 +1,19 @@ # frozen_string_literal: true -class SiteAdmin < ActiveRecord::Base +# == Schema Information +# +# Table name: site_admins +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# user_id :integer not null +# +class SiteAdmin < ApplicationRecord attr_accessible :user_id belongs_to :user - validates :user_id, presence: true, - uniqueness: { message: 'already site admin' } + validates :user_id, + uniqueness: { message: 'already site admin' } end diff --git a/app/models/ticket_request.rb b/app/models/ticket_request.rb index c4d3eedf..ba3437a2 100644 --- a/app/models/ticket_request.rb +++ b/app/models/ticket_request.rb @@ -1,9 +1,43 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: ticket_requests +# +# id :bigint not null, primary key +# address_line1 :string(200) +# address_line2 :string(200) +# admin_notes :string(512) +# adults :integer default(1), not null +# agrees_to_terms :boolean +# cabins :integer default(0), not null +# car_camping :boolean +# car_camping_explanation :string(200) +# city :string(50) +# country_code :string(4) +# donation :decimal(8, 2) default(0.0) +# early_arrival_passes :integer default(0), not null +# guests :text +# kids :integer default(0), not null +# late_departure_passes :integer default(0), not null +# needs_assistance :boolean default(FALSE), not null +# notes :string(500) +# previous_contribution :string(250) +# role :string default("volunteer"), not null +# role_explanation :string(200) +# special_price :decimal(8, 2) +# state :string(50) +# status :string(1) not null +# zip_code :string(32) +# created_at :datetime not null +# updated_at :datetime not null +# event_id :integer not null +# user_id :integer not null +# # Individual request for one or more tickets. # This is intended to capture as much information as possible about the ticket, # as well as the state of the request. -class TicketRequest < ActiveRecord::Base +class TicketRequest < ApplicationRecord STATUSES = [ STATUS_PENDING = 'P', STATUS_AWAITING_PAYMENT = 'A', @@ -48,8 +82,6 @@ class TicketRequest < ActiveRecord::Base validates :user, presence: { unless: -> { user.try(:new_record?) } } - validates :event_id, presence: true - validates :status, presence: true, inclusion: { in: STATUSES } validates :address_line1, :city, :state, :zip_code, :country_code, @@ -90,7 +122,7 @@ class TicketRequest < ActiveRecord::Base scope :awaiting_payment, -> { where(status: STATUS_AWAITING_PAYMENT) } scope :approved, -> { awaiting_payment } scope :declined, -> { where(status: STATUS_DECLINED) } - scope :not_declined, -> { where('status != ?', STATUS_DECLINED) } + scope :not_declined, -> { where.not(status: STATUS_DECLINED) } before_validation do if event @@ -114,7 +146,7 @@ def completed? end def mark_complete - update_attributes status: STATUS_COMPLETED + update status: STATUS_COMPLETED end def pending? @@ -130,7 +162,7 @@ def awaiting_payment? end def approve - update_attributes status: (free? ? STATUS_COMPLETED : STATUS_AWAITING_PAYMENT) + update status: (free? ? STATUS_COMPLETED : STATUS_AWAITING_PAYMENT) end def declined? @@ -159,7 +191,7 @@ def refund begin TicketRequest.transaction do Stripe::Charge.retrieve(payment.stripe_charge_id).refund - return update_attributes(status: STATUS_REFUNDED) + return update(status: STATUS_REFUNDED) end rescue Stripe::StripeError => e errors.add(:base, "Cannot refund ticket: #{e.message}") diff --git a/app/models/time_slot.rb b/app/models/time_slot.rb index bc81f6bb..a1b22068 100644 --- a/app/models/time_slot.rb +++ b/app/models/time_slot.rb @@ -1,6 +1,22 @@ # frozen_string_literal: true -class TimeSlot < ActiveRecord::Base +# == Schema Information +# +# Table name: time_slots +# +# id :bigint not null, primary key +# end_time :datetime not null +# slots :integer not null +# start_time :datetime not null +# created_at :datetime not null +# updated_at :datetime not null +# job_id :bigint not null +# +# Indexes +# +# index_time_slots_on_job_id (job_id) +# +class TimeSlot < ApplicationRecord belongs_to :job has_many :shifts, dependent: :destroy @@ -10,7 +26,7 @@ class TimeSlot < ActiveRecord::Base validates :end_time, presence: true validate :end_time_after_start_time - validates :job_id, presence: true, numericality: { only_integer: true }, + validates :job_id, numericality: { only_integer: true }, allow_nil: false validates :slots, presence: true, numericality: { only_integer: true, greater_than: 0 } diff --git a/app/models/user.rb b/app/models/user.rb index c2ed7c00..6e08938e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,9 +1,43 @@ # frozen_string_literal: true +# == Schema Information +# +# Table name: users +# +# id :bigint not null, primary key +# authentication_token :string(64) +# confirmation_sent_at :datetime +# confirmation_token :string +# confirmed_at :datetime +# current_sign_in_at :datetime +# current_sign_in_ip :string +# email :string not null +# encrypted_password :string not null +# failed_attempts :integer default(0) +# last_sign_in_at :datetime +# last_sign_in_ip :string +# locked_at :datetime +# name :string(70) not null +# remember_created_at :datetime +# reset_password_sent_at :datetime +# reset_password_token :string +# sign_in_count :integer default(0) +# unconfirmed_email :string +# unlock_token :string +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_users_on_confirmation_token (confirmation_token) UNIQUE +# index_users_on_email (email) UNIQUE +# index_users_on_reset_password_token (reset_password_token) UNIQUE +# index_users_on_unlock_token (unlock_token) UNIQUE +# require 'securerandom' # A real-life living breathing human. -class User < ActiveRecord::Base +class User < ApplicationRecord # Include default devise modules. Others available are: # :token_authenticatable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :lockable, @@ -19,7 +53,7 @@ class User < ActiveRecord::Base MAX_PASSWORD_LENGTH = 255 # Setup accessible (or protected) attributes for your model - attr_accessible :name, :email, :password, :remember_me + # attr_accessible :name, :email, :password, :remember_me normalize_attributes :name, :email diff --git a/bin/boot-up b/bin/boot-up index f4df534f..2ead1114 100755 --- a/bin/boot-up +++ b/bin/boot-up @@ -16,226 +16,9 @@ export BASHMATIC_HOME="${BASHMATIC_HOME:-"${HOME}/.bashmatic"}" source "${BASHMATIC_HOME}/init.sh" >/dev/null 2>&1 output.constrain-screen-width 100 -export default_bundler_version="1.17.3" -export python_version="2.7.18" -export python_major_version="$(echo "${python_version}" | cut -d '.' -f 1)" - -export ruby_version="$(cat .ruby-version | tr -d '\n')" - -function ensure-postgresql() { - [[ -n "$( ps -ef | grep "[p]ostg" )" ]] && pg_isready >/dev/null && { - success "PostgreSQL is already running." - return 0 - } - - (command -v brew >/dev/null) && { - run.set-all continue-on-error - - h1 "Installing and starting PostgreSQL using Homebrew..." - - run "brew install postgresql@14" - run "brew link postgresql@14" - run "brew services start postgresql@14" - - sleep 3 - - pg_isready && success "Database is UP." - pg_isready || { - error "Unable to start PostgreSQL. Please install it manually" \ - "from: https://www.postgresql.org/download/" - open "https://www.postgresql.org/download/" - exit 1 - } - - run "createuser -s postgres -U ${USER}" - run "createuser -s root -U ${USER}" - } -} - -function ensure-stripe-mock() { - run.set-all continue-on-error - run "brew install stripe/stripe-mock/stripe-mock" - run "brew upgrade stripe-mock" - run "brew services start stripe-mock" -} - -function ensure-python() { - local local_python_version - local -a version_parts - run.set-all continue-on-error - command -v python >/dev/null && { - version_parts=( $(python -c 'import sys; print(sys.version_info[0])' | tr '.' ' ') ) - } - - local_python_version="${version_parts[0]}" - - if [[ ${local_python_version} -eq ${python_major_version} ]]; then - success "Python ${python_version} is already installed." - return 0 - else - h1 "Installing Python ${python_version} using pyenv..." - command -v pyenv >/dev/null || run "brew install pyenv" - eval "$(pyenv init -)" - run "pyenv install -s ${python_version}" - run "pyenv global ${python_version}" - fi -} - -function ensure-ruby-via-ruby-install() { - run "brew install ruby-install --formulae" - export CFLAGS="-Wno-error=implicit-function-declaration" - run "mkdir -p ${HOME}/.rbenv/versions" - run "ruby-install --install-dir ${HOME}/.rbenv/versions ${ruby_version} -- --enable-shared" -} - - -function ensure-ruby-via-rbenv() { - export CFLAGS="-Wno-error=implicit-function-declaration" - run "rbenv install -s ${ruby_version}" -} - -function ensure-ruby() { - h2 "Ensuring Ruby & Gems are Installed..." - if command -v rbenv >/dev/null; then - run "brew upgrade rbenv ruby-build" - else - run "brew install rbenv ruby-build" - fi - - eval "$(rbenv init -)" - - local bundler_version=$(gem.gemfile.bundler-version) - test -z "${bundler_version}" && bundler_version="${default_bundler_version}" - - if ${use_ruby_install}; then - ensure-ruby-via-ruby-install - else - ensure-ruby-via-rbenv - fi -} - - -function ensure-bundle() { - h2 "Installing Dependent Gems..." - run "gem install bundler --version ${bundler_version} -N" - - run "bundle config set --local path 'vendor/bundle'" - run "bundle config pg --with-pg-config=$(command -v pg_config)" - run "bundle config libv8 --with-system-v8" - run "bundle config therubyracer --with-v8-dir=$(brew --prefix)/opt/v8@3.15" - run "bundle check || bundle install -j 12 || bundler update --bundler && bundle install" - - h2 "Creating Databases & Running Tests" - run "bundle exec rake db:create" - run "bundle exec rake db:migrate db:seed" - run "bundle exec rake db:test:prepare" - run.set-next show-output-on - run "bundle exec rspec" -} - -function puma-pids() { - # shellcheck disable=SC2009 - ps -ef | grep "[p]uma" | cut -d ' ' -f 4 -} - -function puma-running() { - netstat -an | grep LISTEN | grep -q 3000 -} - -# shellcheck disable=SC2207 -function kill-puma() { - local counter=0 - while puma-running; do - counter=$((counter + 1)) - if [[ ${counter} -gt 10 ]]; then - .err "Too many attempts to kill puma, please whack it manually." - exit 1 - fi - local -a pids=($(puma-pids)) - if [[ ${#pids[@]} -gt 0 ]]; then - set +e - kill -TERM "${pids[@]}" - sleep 5 - pids=($(puma-pids)) - [[ ${#pids[@]} -gt 0 ]] && { - kill -KILL "${pids[@]}" - sleep 2 - } - fi - done -} - -function .err() { - printf -- "\n${bakred} 🖕 ${clr}${txtred}${clr} ${txtred}${clr}${bakred} %s ${clr}${txtred}${clr}\n" "$*" -} - -function .inf() { - printf -- "${bakgrn} ️✔︎ ${clr}${txtgrn}${clr} ${txtylw}%s....${clr}\n" "$*" -} - -function setup() { - export MAKE_ENV=".make.env" - cat <>"${MAKE_ENV}" -export RUBYOPT="-W0" -export MALLOC_ARENA_MAX=2 -EOF - - eval "$(cat "${MAKE_ENV}")" - - local v8pkg="$(brew list | grep v8)" - [[ -z "${v8pkg}" || ${v8pkg} == "v8" ]] && brew uninstall v8 >/dev/null 2>&1 - - run "brew list | grep -q v8@3.15 || brew install v8@3.15 2>/dev/null" - - ensure-postgresql || exit 1 - ensure-ruby || exit 4 - ensure-python || exit 3 - ensure-bundle || exit 5 - ensure-stripe-mock || exit 6 - return 0 -} - -function main() { - setup - - if [[ -z "${RAILS_ENV}" ]]; then - .err "RAILS_ENV must be set prior to calling this script." - echo - .inf "To boot the application via the 'make' target, run one of the: " - echo - .inf ' make development boot' - .inf ' make staging boot' - .inf ' make production boot' - echo - exit 1 - else - .inf "Starting with RAILS_ENV=${RAILS_ENV}" - fi - - puma-running && { - .err "It appears that port 3000 is taken by something..." - exit 1 - } - .inf "Starting Puma on port 3000" - (sleep 8 && open "http://127.0.0.1:3000") & - run.set-next show-output-on - run "bundle exec puma -C config/puma.rb" - rm -f "${MAKE_ENV}" -} - -export use_ruby_install=false - -[[ "$1" == "-h" || "$1" == "--help" ]] && { - echo "Usage: $0 [--source] [--ruby-install]" - echo - echo " --source - load the source code of this script but don't run main()" - echo " --ruby-install - Use ruby-install to build ruby instead of rbenv" - echo - exit 0 -} - -[[ "$*" =~ "--ruby-install" ]] && use_ruby_install=true - -[[ "$1" == "--source" ]] || main "$@" - - +run "brew bundle --no-upgrade --no-lock" +run "rbenv install -s $(cat .ruby-version)" +run "mkdir -p .bundle" +run "cp development/config/config.Darwin.arm64 .bundle/config" +run "bundle install -j 12" +run "bin/rails db:migrate" diff --git a/bin/site-admin b/bin/site-admin index 993b7841..0ea44017 100755 --- a/bin/site-admin +++ b/bin/site-admin @@ -8,7 +8,7 @@ require 'colored2' user_email = ARGV[1] action = ARGV[0] -if ARGV.size.zero? || user_email !~ URI::MailTo::EMAIL_REGEXP || !%w[add remove].include?(action) +if ARGV.empty? || user_email !~ URI::MailTo::EMAIL_REGEXP || !%w[add remove].include?(action) puts 'USAGE:'.bold.green puts ' bin/site-admin '.bold.blue + 'add '.bold.magenta + ' '.bold.yellow puts ' bin/site-admin '.bold.blue + 'remove'.bold.magenta + ' '.bold.yellow @@ -25,7 +25,7 @@ class God def initialize(user_email:) @email = user_email - @user = ::User.where(email: email).first + @user = ::User.where(email:).first if user.present? puts "\nNice to meet you, #{user.name.bold.blue} ;-)".yellow else @@ -65,4 +65,4 @@ class God end end -God.new(user_email: user_email).divine_intervention(action.to_sym) +God.new(user_email:).divine_intervention(action.to_sym) diff --git a/config.ru b/config.ru index 49b3fb10..a9b62d3d 100644 --- a/config.ru +++ b/config.ru @@ -2,5 +2,5 @@ # This file is used by Rack-based servers to start the application. -require ::File.expand_path('config/environment', __dir__) +require File.expand_path('config/environment', __dir__) run TicketBooth::Application diff --git a/config/application.rb b/config/application.rb index d328ea95..bbe7d559 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,38 +1,22 @@ # frozen_string_literal: true -require File.expand_path('boot', __dir__) +require_relative 'boot' require 'rails/all' +require 'twitter-bootstrap-rails' -if defined?(Bundler) - # If you precompile assets before deploying to production, use this line - Bundler.require(:default, Rails.env) -end +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) -# @description Main Application Class for the Ticket Booth module TicketBooth class Application < ::Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - - # Custom directories with classes and modules you want to be autoloadable. - # config.autoload_paths += %W(#{config.root}/extras) - - # Only load the plugins named here, in the order given (default is alphabetical). - # :all can be used as a placeholder for all plugins not explicitly named. - # config.plugins = [ :exception_notification, :ssl_requirement, :all ] - - # Activate observers that should always be running. - # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 6.0 - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. - # config.time_zone = 'Central Time (US & Canada)' + config.time_zone = 'Pacific Time (US & Canada)' - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - # config.i18n.default_locale = :de + config.generators.test_framework = :rspec # Configure the default encoding used in templates for Ruby 1.9. config.encoding = 'utf-8' @@ -48,8 +32,6 @@ class Application < ::Rails::Application # like if you have constraints or database-specific column types config.active_record.schema_format = :sql - config.active_record.raise_in_transactional_callbacks = true - # Enable the asset pipeline config.assets.enabled = true @@ -58,5 +40,9 @@ class Application < ::Rails::Application # Force application to not access DB or load models when precompiling assets config.assets.initialize_on_precompile = false + + config.eager_load_paths << Rails.root.join('app/classes') end end + +require_relative '../app/classes/fnf/events' diff --git a/config/boot.rb b/config/boot.rb index b37c7b06..c04863fa 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true -require 'rubygems' - -# Set up gems listed in the Gemfile. ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) -require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/environment.rb b/config/environment.rb index 62ac0bc6..45f110be 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true -# Load the rails application -require File.expand_path('application', __dir__) +# Load the Rails application. +require_relative 'application' -# Initialize the rails application +# Initialize the Rails application. TicketBooth::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index 5a5b6f6c..debf91f5 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -7,8 +7,11 @@ # 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 - # Enable threaded mode - # config.threadsafe! + + # Use a different cache store in production + config.cache_store = :mem_cache_store + + config.autoloader = :zeitwerk config.eager_load = false @@ -20,7 +23,7 @@ config.active_support.deprecation = :log # Raise exception on mass assignment protection for Active Record models - config.active_record.mass_assignment_sanitizer = :strict + # config.active_record.mass_assignment_sanitizer = :strict # Expands the lines which load the assets config.assets.debug = true diff --git a/config/environments/production.rb b/config/environments/production.rb index e8b3d8e5..2706c20b 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -51,7 +51,7 @@ # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) # Use a different cache store in production - # config.cache_store = :mem_cache_store + config.cache_store = :mem_cache_store # Enable serving of images, stylesheets, and JavaScripts from an asset server # config.action_controller.asset_host = "http://assets.example.com" @@ -59,9 +59,6 @@ # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) # config.assets.precompile += %w( search.js ) - # Enable threaded mode - # config.threadsafe! - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation can not be found) config.i18n.fallbacks = true @@ -69,16 +66,16 @@ # Send deprecation notices to registered listeners config.active_support.deprecation = :notify - config.action_mailer.default_url_options = { host: ENV['TICKETS_HOST'] } + config.action_mailer.default_url_options = { host: ENV.fetch('TICKETS_HOST', nil) } config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { - address: ENV['SMTP_ADDRESS'], - port: ENV['SMTP_PORT'], - domain: ENV['SMTP_DOMAIN'], - user_name: ENV['SMTP_USERNAME'], - password: ENV['SMTP_PASSWORD'], + address: ENV.fetch('SMTP_ADDRESS', nil), + port: ENV.fetch('SMTP_PORT', nil), + domain: ENV.fetch('SMTP_DOMAIN', nil), + user_name: ENV.fetch('SMTP_USERNAME', nil), + password: ENV.fetch('SMTP_PASSWORD', nil), authentication: :plain, enable_starttls_auto: true } diff --git a/config/environments/test.rb b/config/environments/test.rb index 2d4ff432..2e15c540 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -8,10 +8,8 @@ # 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 = false - # Enable threaded mode - # config.threadsafe! - config.eager_load = true + config.eager_load = false # Prepend all log lines with the following tags config.log_tags = [->(_req) { DateTime.now }, :uuid] @@ -37,7 +35,7 @@ config.action_controller.allow_forgery_protection = false # Raise exception on mass assignment protection for Active Record models - config.active_record.mass_assignment_sanitizer = :strict + # config.active_record.mass_assignment_sanitizer = :strict # Tell Action Mailer not to deliver emails to the real world. # The :test delivery method accumulates sent emails in the diff --git a/config/initializers/auto_annotate_models.rb b/config/initializers/auto_annotate_models.rb new file mode 100644 index 00000000..dc98c888 --- /dev/null +++ b/config/initializers/auto_annotate_models.rb @@ -0,0 +1,47 @@ +Annotate.set_defaults( + 'active_admin' => 'false', + 'additional_file_patterns' => [], + 'routes' => 'false', + 'models' => 'true', + 'position_in_routes' => 'before', + 'position_in_class' => 'before', + 'position_in_test' => 'before', + 'position_in_fixture' => 'before', + 'position_in_factory' => 'before', + 'position_in_serializer' => 'before', + 'show_foreign_keys' => 'true', + 'show_complete_foreign_keys' => 'false', + 'show_indexes' => 'true', + 'simple_indexes' => 'false', + 'model_dir' => 'app/models', + 'root_dir' => '', + 'include_version' => 'false', + 'require' => '', + 'exclude_tests' => 'false', + 'exclude_fixtures' => 'false', + 'exclude_factories' => 'false', + 'exclude_serializers' => 'false', + 'exclude_scaffolds' => 'true', + 'exclude_controllers' => 'true', + 'exclude_helpers' => 'true', + 'exclude_sti_subclasses' => 'false', + 'ignore_model_sub_dir' => 'false', + 'ignore_columns' => nil, + 'ignore_routes' => nil, + 'ignore_unknown_models' => 'false', + 'hide_limit_column_types' => 'integer,bigint,boolean', + 'hide_default_column_types' => 'json,jsonb,hstore', + 'skip_on_db_migrate' => 'false', + 'format_bare' => 'true', + 'format_rdoc' => 'false', + 'format_yard' => 'false', + 'format_markdown' => 'false', + 'sort' => 'false', + 'force' => 'false', + 'frozen' => 'false', + 'classified_sort' => 'true', + 'trace' => 'false', + 'wrapper_open' => nil, + 'wrapper_close' => nil, + 'with_comment' => 'true' +) diff --git a/config/initializers/event_initializer.rb b/config/initializers/event_initializer.rb deleted file mode 100644 index c299671c..00000000 --- a/config/initializers/event_initializer.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -require 'ventable' -require_relative '../../lib/fnf/events' - -module FnF - module Events - TicketRequestEvent.configure do - notifies ::TicketRequestMailer - end - - TicketRequestApprovedEvent.configure do - notifies ::TicketRequestMailer - end - end -end diff --git a/config/initializers/extensions.rb b/config/initializers/extensions.rb index 0915f36d..1f9cb945 100644 --- a/config/initializers/extensions.rb +++ b/config/initializers/extensions.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -Dir.glob("#{Rails.root}/lib/extensions/*").sort.each { |f| require f } +Dir.glob(Rails.root.join('lib/extensions/*').to_s).each { |f| require f } diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 6de9b251..7640e4fb 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + # Be sure to restart your server when you modify this file. # Add new inflection rules using the following format @@ -14,3 +15,7 @@ # ActiveSupport::Inflector.inflections do |inflect| # inflect.acronym 'RESTful' # end + +ActiveSupport::Inflector.inflections do |inflect| + inflect.acronym 'FnF' +end diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index 1fd19fbd..39ce00f2 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true -secret_config = YAML.load_file("#{Rails.root}/config/secret.yml") +secret_config = YAML.load_file(Rails.root.join('config/secret.yml').to_s) TicketBooth::Application.config.secret_key_base = secret_config['secret_key_base'] diff --git a/config/initializers/stripe.rb b/config/initializers/stripe.rb index 3d3130c5..34f57941 100644 --- a/config/initializers/stripe.rb +++ b/config/initializers/stripe.rb @@ -1,4 +1,4 @@ # frozen_string_literal: true -Stripe.api_key = ENV['STRIPE_SECRET_KEY'] -STRIPE_PUBLIC_KEY = ENV['STRIPE_PUBLIC_KEY'] +Stripe.api_key = ENV.fetch('STRIPE_SECRET_KEY', nil) +STRIPE_PUBLIC_KEY = ENV.fetch('STRIPE_PUBLIC_KEY', nil) diff --git a/config/locales/en.bootstrap.yml b/config/locales/en.bootstrap.yml new file mode 100644 index 00000000..8d751190 --- /dev/null +++ b/config/locales/en.bootstrap.yml @@ -0,0 +1,23 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + breadcrumbs: + application: + root: "Index" + pages: + pages: "Pages" + helpers: + actions: "Actions" + links: + back: "Back" + cancel: "Cancel" + confirm: "Are you sure?" + destroy: "Delete" + new: "New" + edit: "Edit" + titles: + edit: "Edit %{model}" + save: "Save %{model}" + new: "New %{model}" + delete: "Delete %{model}" diff --git a/config/puma.rb b/config/puma.rb index 373bf0a0..56295b35 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -32,14 +32,14 @@ log_requests log_formatter do |str| - "#{format '%5d', $PROCESS_ID} | #{Time.now.strftime DATETIME_FORMAT} : |puma| #{str}" + "#{format '%5d', $PROCESS_ID} | #{Time.zone.now.strftime DATETIME_FORMAT} : |puma| #{str}" end require 'newrelic_rpm' lowlevel_error_handler do |exception| begin - ::NewRelic::Agent.notice_error(exception) + NewRelic::Agent.notice_error(exception) rescue StandardError nil end diff --git a/config/routes.rb b/config/routes.rb index 8e973c49..d85a6223 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,14 +7,14 @@ event_id = 9 - get 'fnf-tickets', controller: :ticket_requests, action: :new, event_id: event_id - get 'fnf_tickets', controller: :ticket_requests, action: :new, event_id: event_id - get 'fnftickets', controller: :ticket_requests, action: :new, event_id: event_id - get 'fnf', controller: :ticket_requests, action: :new, event_id: event_id - get 'FNF', controller: :ticket_requests, action: :new, event_id: event_id - get 'FnF', controller: :ticket_requests, action: :new, event_id: event_id + get('fnf-tickets', controller: :ticket_requests, action: :new, event_id:) + get('fnf_tickets', controller: :ticket_requests, action: :new, event_id:) + get('fnftickets', controller: :ticket_requests, action: :new, event_id:) + get('fnf', controller: :ticket_requests, action: :new, event_id:) + get('FNF', controller: :ticket_requests, action: :new, event_id:) + get('FnF', controller: :ticket_requests, action: :new, event_id:) - get 'eald', controller: :eald_payments, action: :new, event_id: event_id + get('eald', controller: :eald_payments, action: :new, event_id:) resources :payments, only: %i[new create show] do collection do diff --git a/config/unicorn.rb b/config/unicorn.rb index ee5c4e27..f094476a 100644 --- a/config/unicorn.rb +++ b/config/unicorn.rb @@ -3,7 +3,7 @@ # Set environment to production unless something else is specified app_name = 'tickets' env = ENV['RAILS_ENV'] || 'production' -deploy_path = "#{ENV['HOME']}/deploy" +deploy_path = "#{Dir.home}/deploy" shared_path = "#{deploy_path}/shared" # listen on both a Unix domain socket and a TCP port, diff --git a/db/migrate/20130210233501_devise_create_users.rb b/db/migrate/20130210233501_devise_create_users.rb index 273b5d5b..0b55975d 100644 --- a/db/migrate/20130210233501_devise_create_users.rb +++ b/db/migrate/20130210233501_devise_create_users.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class DeviseCreateUsers < ActiveRecord::Migration +class DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table(:users) do |t| ## Database authenticatable diff --git a/db/migrate/20130223202959_create_events.rb b/db/migrate/20130223202959_create_events.rb index 2a290325..6736a29d 100644 --- a/db/migrate/20130223202959_create_events.rb +++ b/db/migrate/20130223202959_create_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateEvents < ActiveRecord::Migration +class CreateEvents < ActiveRecord::Migration[6.0] def change create_table :events do |t| t.string :name diff --git a/db/migrate/20130223204913_create_ticket_requests.rb b/db/migrate/20130223204913_create_ticket_requests.rb index 13859902..540bf52a 100644 --- a/db/migrate/20130223204913_create_ticket_requests.rb +++ b/db/migrate/20130223204913_create_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateTicketRequests < ActiveRecord::Migration +class CreateTicketRequests < ActiveRecord::Migration[6.0] def change create_table :ticket_requests do |t| t.string :name, limit: 70, null: false diff --git a/db/migrate/20130224204644_create_payments.rb b/db/migrate/20130224204644_create_payments.rb index bfa3fe2f..3edbb1bb 100644 --- a/db/migrate/20130224204644_create_payments.rb +++ b/db/migrate/20130224204644_create_payments.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreatePayments < ActiveRecord::Migration +class CreatePayments < ActiveRecord::Migration[6.0] def change create_table :payments do |t| t.integer :ticket_request_id, null: false diff --git a/db/migrate/20130225033247_add_name_to_user.rb b/db/migrate/20130225033247_add_name_to_user.rb index 1b07f2f3..bc4885df 100644 --- a/db/migrate/20130225033247_add_name_to_user.rb +++ b/db/migrate/20130225033247_add_name_to_user.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddNameToUser < ActiveRecord::Migration +class AddNameToUser < ActiveRecord::Migration[6.0] def change change_table(:users) do |t| t.column :name, :string, limit: 70, null: false diff --git a/db/migrate/20130226010856_create_site_admins.rb b/db/migrate/20130226010856_create_site_admins.rb index 38465318..032a68d3 100644 --- a/db/migrate/20130226010856_create_site_admins.rb +++ b/db/migrate/20130226010856_create_site_admins.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateSiteAdmins < ActiveRecord::Migration +class CreateSiteAdmins < ActiveRecord::Migration[6.0] def change create_table :site_admins do |t| t.integer :user_id, null: false diff --git a/db/migrate/20130226221916_add_user_to_ticket_request.rb b/db/migrate/20130226221916_add_user_to_ticket_request.rb index 59d491fd..18895876 100644 --- a/db/migrate/20130226221916_add_user_to_ticket_request.rb +++ b/db/migrate/20130226221916_add_user_to_ticket_request.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddUserToTicketRequest < ActiveRecord::Migration +class AddUserToTicketRequest < ActiveRecord::Migration[6.0] def change change_table(:ticket_requests) do |t| t.column :user_id, :integer, null: false diff --git a/db/migrate/20130228052958_add_special_price_to_ticket_requests.rb b/db/migrate/20130228052958_add_special_price_to_ticket_requests.rb index 5334ca19..097d23ae 100644 --- a/db/migrate/20130228052958_add_special_price_to_ticket_requests.rb +++ b/db/migrate/20130228052958_add_special_price_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddSpecialPriceToTicketRequests < ActiveRecord::Migration +class AddSpecialPriceToTicketRequests < ActiveRecord::Migration[6.0] def change change_table(:ticket_requests) do |t| t.column :special_price, :decimal, precision: 8, scale: 2, null: true diff --git a/db/migrate/20130304020307_create_jobs.rb b/db/migrate/20130304020307_create_jobs.rb index d9eafc1f..b4cd0820 100644 --- a/db/migrate/20130304020307_create_jobs.rb +++ b/db/migrate/20130304020307_create_jobs.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateJobs < ActiveRecord::Migration +class CreateJobs < ActiveRecord::Migration[6.0] def change create_table :jobs do |t| t.belongs_to :event, null: false diff --git a/db/migrate/20130304021739_create_time_slots.rb b/db/migrate/20130304021739_create_time_slots.rb index 6410625e..d3717c6e 100644 --- a/db/migrate/20130304021739_create_time_slots.rb +++ b/db/migrate/20130304021739_create_time_slots.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateTimeSlots < ActiveRecord::Migration +class CreateTimeSlots < ActiveRecord::Migration[6.0] def change create_table :time_slots do |t| t.belongs_to :job, null: false diff --git a/db/migrate/20130304022508_create_shifts.rb b/db/migrate/20130304022508_create_shifts.rb index d6b06521..cf900f86 100644 --- a/db/migrate/20130304022508_create_shifts.rb +++ b/db/migrate/20130304022508_create_shifts.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateShifts < ActiveRecord::Migration +class CreateShifts < ActiveRecord::Migration[6.0] def change create_table :shifts do |t| t.belongs_to :time_slot, null: false diff --git a/db/migrate/20130311213508_add_event_id_to_ticket_request.rb b/db/migrate/20130311213508_add_event_id_to_ticket_request.rb index 04869390..309687f2 100644 --- a/db/migrate/20130311213508_add_event_id_to_ticket_request.rb +++ b/db/migrate/20130311213508_add_event_id_to_ticket_request.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddEventIdToTicketRequest < ActiveRecord::Migration +class AddEventIdToTicketRequest < ActiveRecord::Migration[6.0] def change add_column :ticket_requests, :event_id, :integer, null: false end diff --git a/db/migrate/20130325024448_add_ticket_cost_info_to_event.rb b/db/migrate/20130325024448_add_ticket_cost_info_to_event.rb index 261e740d..63e4cb39 100644 --- a/db/migrate/20130325024448_add_ticket_cost_info_to_event.rb +++ b/db/migrate/20130325024448_add_ticket_cost_info_to_event.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddTicketCostInfoToEvent < ActiveRecord::Migration +class AddTicketCostInfoToEvent < ActiveRecord::Migration[6.0] def change change_table :events do |t| t.column :adult_ticket_price, :decimal, precision: 8, scale: 2 diff --git a/db/migrate/20130325051758_rename_assistance_to_needs_assistance.rb b/db/migrate/20130325051758_rename_assistance_to_needs_assistance.rb index c216bb6e..94435afa 100644 --- a/db/migrate/20130325051758_rename_assistance_to_needs_assistance.rb +++ b/db/migrate/20130325051758_rename_assistance_to_needs_assistance.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class RenameAssistanceToNeedsAssistance < ActiveRecord::Migration +class RenameAssistanceToNeedsAssistance < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.rename :assistance, :needs_assistance diff --git a/db/migrate/20130425052112_add_volunteer_shifts_to_ticket_requests.rb b/db/migrate/20130425052112_add_volunteer_shifts_to_ticket_requests.rb index b0114f2a..46805f8a 100644 --- a/db/migrate/20130425052112_add_volunteer_shifts_to_ticket_requests.rb +++ b/db/migrate/20130425052112_add_volunteer_shifts_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddVolunteerShiftsToTicketRequests < ActiveRecord::Migration +class AddVolunteerShiftsToTicketRequests < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.integer :volunteer_shifts diff --git a/db/migrate/20130427054403_create_event_admins.rb b/db/migrate/20130427054403_create_event_admins.rb index af2c7aa2..17c3be05 100644 --- a/db/migrate/20130427054403_create_event_admins.rb +++ b/db/migrate/20130427054403_create_event_admins.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreateEventAdmins < ActiveRecord::Migration +class CreateEventAdmins < ActiveRecord::Migration[6.0] def change create_table :event_admins do |t| t.references :event @@ -10,6 +10,6 @@ def change end add_index :event_admins, %i[event_id user_id], unique: true - add_index :event_admins, :user_id + add_index :event_admins, :user_id, name: 'index_event_admins_on_user_id_only' end end diff --git a/db/migrate/20130507051822_add_max_cabin_requests_to_events.rb b/db/migrate/20130507051822_add_max_cabin_requests_to_events.rb index b83f8ad4..e3260367 100644 --- a/db/migrate/20130507051822_add_max_cabin_requests_to_events.rb +++ b/db/migrate/20130507051822_add_max_cabin_requests_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddMaxCabinRequestsToEvents < ActiveRecord::Migration +class AddMaxCabinRequestsToEvents < ActiveRecord::Migration[6.0] def change change_table :events do |t| t.integer :max_cabin_requests diff --git a/db/migrate/20130509021514_create_price_rules.rb b/db/migrate/20130509021514_create_price_rules.rb index f20f25fd..f3332c23 100644 --- a/db/migrate/20130509021514_create_price_rules.rb +++ b/db/migrate/20130509021514_create_price_rules.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class CreatePriceRules < ActiveRecord::Migration +class CreatePriceRules < ActiveRecord::Migration[6.0] def change create_table :price_rules do |t| t.string :type @@ -10,7 +10,5 @@ def change t.timestamps end - - add_index :price_rules, :event_id end end diff --git a/db/migrate/20130514035306_add_performer_to_ticket_request.rb b/db/migrate/20130514035306_add_performer_to_ticket_request.rb index ce17a130..e416b5b6 100644 --- a/db/migrate/20130514035306_add_performer_to_ticket_request.rb +++ b/db/migrate/20130514035306_add_performer_to_ticket_request.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddPerformerToTicketRequest < ActiveRecord::Migration +class AddPerformerToTicketRequest < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.boolean :performer, null: false, default: false diff --git a/db/migrate/20130616002401_add_photo_to_events.rb b/db/migrate/20130616002401_add_photo_to_events.rb index 34704ed2..62d0a7c1 100644 --- a/db/migrate/20130616002401_add_photo_to_events.rb +++ b/db/migrate/20130616002401_add_photo_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddPhotoToEvents < ActiveRecord::Migration +class AddPhotoToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :photo, :string end diff --git a/db/migrate/20130628042018_add_tickets_require_approval_to_events.rb b/db/migrate/20130628042018_add_tickets_require_approval_to_events.rb index 7f723de9..7b3c4825 100644 --- a/db/migrate/20130628042018_add_tickets_require_approval_to_events.rb +++ b/db/migrate/20130628042018_add_tickets_require_approval_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddTicketsRequireApprovalToEvents < ActiveRecord::Migration +class AddTicketsRequireApprovalToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :tickets_require_approval, :boolean, default: true, null: false end diff --git a/db/migrate/20130628050717_remove_default_status_from_ticket_requests.rb b/db/migrate/20130628050717_remove_default_status_from_ticket_requests.rb index f71428c9..d65d189a 100644 --- a/db/migrate/20130628050717_remove_default_status_from_ticket_requests.rb +++ b/db/migrate/20130628050717_remove_default_status_from_ticket_requests.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true -class RemoveDefaultStatusFromTicketRequests < ActiveRecord::Migration +class RemoveDefaultStatusFromTicketRequests < ActiveRecord::Migration[6.0] def up - execute <<-SQL + execute <<-SQL.squish ALTER TABLE ticket_requests ALTER COLUMN status DROP DEFAULT SQL end def down - execute <<-SQL + execute <<-SQL.squish ALTER TABLE ticket_requests ALTER COLUMN status SET DEFAULT 'P' SQL diff --git a/db/migrate/20130701042655_add_require_mailing_address_to_events.rb b/db/migrate/20130701042655_add_require_mailing_address_to_events.rb index bda744bb..b4f8f393 100644 --- a/db/migrate/20130701042655_add_require_mailing_address_to_events.rb +++ b/db/migrate/20130701042655_add_require_mailing_address_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddRequireMailingAddressToEvents < ActiveRecord::Migration +class AddRequireMailingAddressToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :require_mailing_address, :boolean, default: false, null: false end diff --git a/db/migrate/20130701045629_add_allow_financial_assistance_to_events.rb b/db/migrate/20130701045629_add_allow_financial_assistance_to_events.rb index dc400749..72f7be2d 100644 --- a/db/migrate/20130701045629_add_allow_financial_assistance_to_events.rb +++ b/db/migrate/20130701045629_add_allow_financial_assistance_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAllowFinancialAssistanceToEvents < ActiveRecord::Migration +class AddAllowFinancialAssistanceToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :allow_financial_assistance, :boolean, default: false, null: false end diff --git a/db/migrate/20130701054452_add_ask_how_many_shifts_to_events.rb b/db/migrate/20130701054452_add_ask_how_many_shifts_to_events.rb index 0d26d0c5..982d755e 100644 --- a/db/migrate/20130701054452_add_ask_how_many_shifts_to_events.rb +++ b/db/migrate/20130701054452_add_ask_how_many_shifts_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAskHowManyShiftsToEvents < ActiveRecord::Migration +class AddAskHowManyShiftsToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :ask_how_many_shifts, :boolean, default: false, null: false end diff --git a/db/migrate/20130702041357_remove_not_null_constraint_from_ticket_request_address.rb b/db/migrate/20130702041357_remove_not_null_constraint_from_ticket_request_address.rb index fcebd776..57dcf1d7 100644 --- a/db/migrate/20130702041357_remove_not_null_constraint_from_ticket_request_address.rb +++ b/db/migrate/20130702041357_remove_not_null_constraint_from_ticket_request_address.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true -class RemoveNotNullConstraintFromTicketRequestAddress < ActiveRecord::Migration +class RemoveNotNullConstraintFromTicketRequestAddress < ActiveRecord::Migration[6.0] def up - execute <<-SQL + execute <<-SQL.squish ALTER TABLE ticket_requests ALTER COLUMN address DROP NOT NULL SQL end def down - execute <<-SQL + execute <<-SQL.squish ALTER TABLE ticket_requests ALTER COLUMN address SET NOT NULL SQL diff --git a/db/migrate/20130707204929_add_donation_to_ticket_requests.rb b/db/migrate/20130707204929_add_donation_to_ticket_requests.rb index 67741d48..819775fd 100644 --- a/db/migrate/20130707204929_add_donation_to_ticket_requests.rb +++ b/db/migrate/20130707204929_add_donation_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddDonationToTicketRequests < ActiveRecord::Migration +class AddDonationToTicketRequests < ActiveRecord::Migration[6.0] def change add_column :ticket_requests, :donation, :decimal, precision: 8, scale: 2, default: 0 end diff --git a/db/migrate/20130707222903_add_allow_donations_to_events.rb b/db/migrate/20130707222903_add_allow_donations_to_events.rb index 79550033..03588868 100644 --- a/db/migrate/20130707222903_add_allow_donations_to_events.rb +++ b/db/migrate/20130707222903_add_allow_donations_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAllowDonationsToEvents < ActiveRecord::Migration +class AddAllowDonationsToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :allow_donations, :boolean, default: false, null: false end diff --git a/db/migrate/20130803212458_add_start_and_end_ticket_sale_times_to_events.rb b/db/migrate/20130803212458_add_start_and_end_ticket_sale_times_to_events.rb index 7afab46f..02c8f7c2 100644 --- a/db/migrate/20130803212458_add_start_and_end_ticket_sale_times_to_events.rb +++ b/db/migrate/20130803212458_add_start_and_end_ticket_sale_times_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddStartAndEndTicketSaleTimesToEvents < ActiveRecord::Migration +class AddStartAndEndTicketSaleTimesToEvents < ActiveRecord::Migration[6.0] def change add_column :events, :ticket_sales_start_time, :datetime add_column :events, :ticket_sales_end_time, :datetime diff --git a/db/migrate/20140428041744_add_explanation_to_payments.rb b/db/migrate/20140428041744_add_explanation_to_payments.rb index 7bbdb152..87c23a83 100644 --- a/db/migrate/20140428041744_add_explanation_to_payments.rb +++ b/db/migrate/20140428041744_add_explanation_to_payments.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddExplanationToPayments < ActiveRecord::Migration +class AddExplanationToPayments < ActiveRecord::Migration[6.0] def change change_table :payments do |t| t.string :explanation, null: true diff --git a/db/migrate/20140428045329_add_role_to_ticket_requests.rb b/db/migrate/20140428045329_add_role_to_ticket_requests.rb index e63be5a0..7b89c17f 100644 --- a/db/migrate/20140428045329_add_role_to_ticket_requests.rb +++ b/db/migrate/20140428045329_add_role_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddRoleToTicketRequests < ActiveRecord::Migration +class AddRoleToTicketRequests < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.string :role, null: false, default: 'volunteer' diff --git a/db/migrate/20140515053804_remove_performer_from_ticket_requests.rb b/db/migrate/20140515053804_remove_performer_from_ticket_requests.rb index 65ccf34e..48cf6b1a 100644 --- a/db/migrate/20140515053804_remove_performer_from_ticket_requests.rb +++ b/db/migrate/20140515053804_remove_performer_from_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class RemovePerformerFromTicketRequests < ActiveRecord::Migration +class RemovePerformerFromTicketRequests < ActiveRecord::Migration[6.0] def change remove_column :ticket_requests, :performer end diff --git a/db/migrate/20140515054433_add_vehicle_camping_requested_to_ticket_requests.rb b/db/migrate/20140515054433_add_vehicle_camping_requested_to_ticket_requests.rb index 11ddca3c..45210026 100644 --- a/db/migrate/20140515054433_add_vehicle_camping_requested_to_ticket_requests.rb +++ b/db/migrate/20140515054433_add_vehicle_camping_requested_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddVehicleCampingRequestedToTicketRequests < ActiveRecord::Migration +class AddVehicleCampingRequestedToTicketRequests < ActiveRecord::Migration[6.0] def change add_column :ticket_requests, :vehicle_camping_requested, :boolean end diff --git a/db/migrate/20140605034909_add_previous_contribution_to_ticket_requests.rb b/db/migrate/20140605034909_add_previous_contribution_to_ticket_requests.rb index 603dd66f..2811e519 100644 --- a/db/migrate/20140605034909_add_previous_contribution_to_ticket_requests.rb +++ b/db/migrate/20140605034909_add_previous_contribution_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddPreviousContributionToTicketRequests < ActiveRecord::Migration +class AddPreviousContributionToTicketRequests < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.string :previous_contribution, limit: 250, null: true diff --git a/db/migrate/20140605045004_extract_address_into_multiple_fields.rb b/db/migrate/20140605045004_extract_address_into_multiple_fields.rb index 944c47e2..9ca359b8 100644 --- a/db/migrate/20140605045004_extract_address_into_multiple_fields.rb +++ b/db/migrate/20140605045004_extract_address_into_multiple_fields.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ExtractAddressIntoMultipleFields < ActiveRecord::Migration +class ExtractAddressIntoMultipleFields < ActiveRecord::Migration[6.0] def change remove_column :ticket_requests, :address diff --git a/db/migrate/20140605052627_remove_volunteer_shifts_from_ticket_requests.rb b/db/migrate/20140605052627_remove_volunteer_shifts_from_ticket_requests.rb index b26201d2..5bbadd7a 100644 --- a/db/migrate/20140605052627_remove_volunteer_shifts_from_ticket_requests.rb +++ b/db/migrate/20140605052627_remove_volunteer_shifts_from_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class RemoveVolunteerShiftsFromTicketRequests < ActiveRecord::Migration +class RemoveVolunteerShiftsFromTicketRequests < ActiveRecord::Migration[6.0] def change remove_column :ticket_requests, :volunteer_shifts end diff --git a/db/migrate/20140605053705_remove_ask_how_many_shifts_from_events.rb b/db/migrate/20140605053705_remove_ask_how_many_shifts_from_events.rb index 1d29ee0a..75ffbe6e 100644 --- a/db/migrate/20140605053705_remove_ask_how_many_shifts_from_events.rb +++ b/db/migrate/20140605053705_remove_ask_how_many_shifts_from_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class RemoveAskHowManyShiftsFromEvents < ActiveRecord::Migration +class RemoveAskHowManyShiftsFromEvents < ActiveRecord::Migration[6.0] def change remove_column :events, :ask_how_many_shifts end diff --git a/db/migrate/20140605060026_add_camping_type_to_ticket_requests.rb b/db/migrate/20140605060026_add_camping_type_to_ticket_requests.rb index accac8de..2bae8863 100644 --- a/db/migrate/20140605060026_add_camping_type_to_ticket_requests.rb +++ b/db/migrate/20140605060026_add_camping_type_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddCampingTypeToTicketRequests < ActiveRecord::Migration +class AddCampingTypeToTicketRequests < ActiveRecord::Migration[6.0] def change remove_column :ticket_requests, :vehicle_camping_requested diff --git a/db/migrate/20140611044708_add_admin_notes_to_ticket_requests.rb b/db/migrate/20140611044708_add_admin_notes_to_ticket_requests.rb index a2c81a87..82c8cc70 100644 --- a/db/migrate/20140611044708_add_admin_notes_to_ticket_requests.rb +++ b/db/migrate/20140611044708_add_admin_notes_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAdminNotesToTicketRequests < ActiveRecord::Migration +class AddAdminNotesToTicketRequests < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.string :admin_notes, limit: 512, null: true diff --git a/db/migrate/20140611051614_add_authentication_token_to_users.rb b/db/migrate/20140611051614_add_authentication_token_to_users.rb index 4096c41c..b61d0483 100644 --- a/db/migrate/20140611051614_add_authentication_token_to_users.rb +++ b/db/migrate/20140611051614_add_authentication_token_to_users.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAuthenticationTokenToUsers < ActiveRecord::Migration +class AddAuthenticationTokenToUsers < ActiveRecord::Migration[6.0] def change change_table :users do |t| t.string :authentication_token, limit: 64, null: true diff --git a/db/migrate/20140616024138_add_camping_type_explanation_to_ticket_requests.rb b/db/migrate/20140616024138_add_camping_type_explanation_to_ticket_requests.rb index ec30516a..141498d1 100644 --- a/db/migrate/20140616024138_add_camping_type_explanation_to_ticket_requests.rb +++ b/db/migrate/20140616024138_add_camping_type_explanation_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddCampingTypeExplanationToTicketRequests < ActiveRecord::Migration +class AddCampingTypeExplanationToTicketRequests < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.string :camping_type_explanation, limit: 200, null: true diff --git a/db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb b/db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb index 326699a5..1d37ed1a 100644 --- a/db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb +++ b/db/migrate/20140616030905_change_camping_type_on_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class ChangeCampingTypeOnTicketRequests < ActiveRecord::Migration +class ChangeCampingTypeOnTicketRequests < ActiveRecord::Migration[6.0] def change remove_column :ticket_requests, :camping_type remove_column :ticket_requests, :camping_type_explanation diff --git a/db/migrate/20140706232217_add_ticket_request_end_time_to_events.rb b/db/migrate/20140706232217_add_ticket_request_end_time_to_events.rb index 2acdac96..7f3faebe 100644 --- a/db/migrate/20140706232217_add_ticket_request_end_time_to_events.rb +++ b/db/migrate/20140706232217_add_ticket_request_end_time_to_events.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddTicketRequestEndTimeToEvents < ActiveRecord::Migration +class AddTicketRequestEndTimeToEvents < ActiveRecord::Migration[6.0] def change change_table :events do |t| t.datetime :ticket_requests_end_time, null: true diff --git a/db/migrate/20150609064608_add_agrees_terms_to_ticket_requests.rb b/db/migrate/20150609064608_add_agrees_terms_to_ticket_requests.rb index 500d4bf4..fa7a5ac4 100644 --- a/db/migrate/20150609064608_add_agrees_terms_to_ticket_requests.rb +++ b/db/migrate/20150609064608_add_agrees_terms_to_ticket_requests.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddAgreesTermsToTicketRequests < ActiveRecord::Migration +class AddAgreesTermsToTicketRequests < ActiveRecord::Migration[6.0] def change add_column :ticket_requests, :agrees_to_terms, :boolean end diff --git a/db/migrate/20160611234315_add_eald_columns.rb b/db/migrate/20160611234315_add_eald_columns.rb index 70b89394..af4262a8 100644 --- a/db/migrate/20160611234315_add_eald_columns.rb +++ b/db/migrate/20160611234315_add_eald_columns.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddEaldColumns < ActiveRecord::Migration +class AddEaldColumns < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.integer :early_arrival_passes, null: false, default: 0 diff --git a/db/migrate/20180527021019_add_guests_to_ticket_request.rb b/db/migrate/20180527021019_add_guests_to_ticket_request.rb index 5b9c73f6..534a4cc1 100644 --- a/db/migrate/20180527021019_add_guests_to_ticket_request.rb +++ b/db/migrate/20180527021019_add_guests_to_ticket_request.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class AddGuestsToTicketRequest < ActiveRecord::Migration +class AddGuestsToTicketRequest < ActiveRecord::Migration[6.0] def change change_table :ticket_requests do |t| t.text :guests, null: true diff --git a/db/structure.sql b/db/structure.sql index b7b344eb..13323600 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -1,10 +1,3 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 14.7 (Homebrew) --- Dumped by pg_dump version 14.7 (Homebrew) - SET statement_timeout = 0; SET lock_timeout = 0; SET idle_in_transaction_session_timeout = 0; @@ -20,21 +13,33 @@ SET default_tablespace = ''; SET default_table_access_method = heap; +-- +-- Name: ar_internal_metadata; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.ar_internal_metadata ( + key character varying NOT NULL, + value character varying, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL +); + + -- -- Name: eald_payments; Type: TABLE; Schema: public; Owner: - -- CREATE TABLE public.eald_payments ( - id integer NOT NULL, - event_id integer, + id bigint NOT NULL, + event_id bigint, stripe_charge_id character varying NOT NULL, amount_charged_cents integer NOT NULL, name character varying(255) NOT NULL, email character varying(255) NOT NULL, early_arrival_passes integer DEFAULT 0 NOT NULL, late_departure_passes integer DEFAULT 0 NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -43,7 +48,6 @@ CREATE TABLE public.eald_payments ( -- CREATE SEQUENCE public.eald_payments_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -63,11 +67,11 @@ ALTER SEQUENCE public.eald_payments_id_seq OWNED BY public.eald_payments.id; -- CREATE TABLE public.event_admins ( - id integer NOT NULL, - event_id integer, - user_id integer, - created_at timestamp without time zone, - updated_at timestamp without time zone + id bigint NOT NULL, + event_id bigint, + user_id bigint, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -76,7 +80,6 @@ CREATE TABLE public.event_admins ( -- CREATE SEQUENCE public.event_admins_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -96,12 +99,12 @@ ALTER SEQUENCE public.event_admins_id_seq OWNED BY public.event_admins.id; -- CREATE TABLE public.events ( - id integer NOT NULL, + id bigint NOT NULL, name character varying, start_time timestamp without time zone, end_time timestamp without time zone, - created_at timestamp without time zone, - updated_at timestamp without time zone, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL, adult_ticket_price numeric(8,2), kid_ticket_price numeric(8,2), cabin_price numeric(8,2), @@ -117,8 +120,8 @@ CREATE TABLE public.events ( ticket_sales_start_time timestamp without time zone, ticket_sales_end_time timestamp without time zone, ticket_requests_end_time timestamp without time zone, - early_arrival_price numeric(8,2) DEFAULT 0, - late_departure_price numeric(8,2) DEFAULT 0 + early_arrival_price numeric(8,2) DEFAULT 0.0, + late_departure_price numeric(8,2) DEFAULT 0.0 ); @@ -127,7 +130,6 @@ CREATE TABLE public.events ( -- CREATE SEQUENCE public.events_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -147,12 +149,12 @@ ALTER SEQUENCE public.events_id_seq OWNED BY public.events.id; -- CREATE TABLE public.jobs ( - id integer NOT NULL, - event_id integer NOT NULL, + id bigint NOT NULL, + event_id bigint NOT NULL, name character varying(100) NOT NULL, description character varying(512) NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -161,7 +163,6 @@ CREATE TABLE public.jobs ( -- CREATE SEQUENCE public.jobs_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -181,12 +182,12 @@ ALTER SEQUENCE public.jobs_id_seq OWNED BY public.jobs.id; -- CREATE TABLE public.payments ( - id integer NOT NULL, + id bigint NOT NULL, ticket_request_id integer NOT NULL, stripe_charge_id character varying(255), status character varying(1) DEFAULT 'P'::character varying NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL, explanation character varying ); @@ -196,7 +197,6 @@ CREATE TABLE public.payments ( -- CREATE SEQUENCE public.payments_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -216,13 +216,13 @@ ALTER SEQUENCE public.payments_id_seq OWNED BY public.payments.id; -- CREATE TABLE public.price_rules ( - id integer NOT NULL, + id bigint NOT NULL, type character varying, - event_id integer, + event_id bigint, price numeric(8,2), trigger_value integer, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -231,7 +231,6 @@ CREATE TABLE public.price_rules ( -- CREATE SEQUENCE public.price_rules_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -260,12 +259,12 @@ CREATE TABLE public.schema_migrations ( -- CREATE TABLE public.shifts ( - id integer NOT NULL, - time_slot_id integer NOT NULL, - user_id integer NOT NULL, + id bigint NOT NULL, + time_slot_id bigint NOT NULL, + user_id bigint NOT NULL, name character varying(70), - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -274,7 +273,6 @@ CREATE TABLE public.shifts ( -- CREATE SEQUENCE public.shifts_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -294,10 +292,10 @@ ALTER SEQUENCE public.shifts_id_seq OWNED BY public.shifts.id; -- CREATE TABLE public.site_admins ( - id integer NOT NULL, + id bigint NOT NULL, user_id integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -306,7 +304,6 @@ CREATE TABLE public.site_admins ( -- CREATE SEQUENCE public.site_admins_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -326,19 +323,19 @@ ALTER SEQUENCE public.site_admins_id_seq OWNED BY public.site_admins.id; -- CREATE TABLE public.ticket_requests ( - id integer NOT NULL, + id bigint NOT NULL, adults integer DEFAULT 1 NOT NULL, kids integer DEFAULT 0 NOT NULL, cabins integer DEFAULT 0 NOT NULL, needs_assistance boolean DEFAULT false NOT NULL, notes character varying(500), status character varying(1) NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL, user_id integer NOT NULL, special_price numeric(8,2), event_id integer NOT NULL, - donation numeric(8,2) DEFAULT 0, + donation numeric(8,2) DEFAULT 0.0, role character varying DEFAULT 'volunteer'::character varying NOT NULL, role_explanation character varying(200), previous_contribution character varying(250), @@ -363,7 +360,6 @@ CREATE TABLE public.ticket_requests ( -- CREATE SEQUENCE public.ticket_requests_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -383,13 +379,13 @@ ALTER SEQUENCE public.ticket_requests_id_seq OWNED BY public.ticket_requests.id; -- CREATE TABLE public.time_slots ( - id integer NOT NULL, - job_id integer NOT NULL, + id bigint NOT NULL, + job_id bigint NOT NULL, start_time timestamp without time zone NOT NULL, end_time timestamp without time zone NOT NULL, slots integer NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL ); @@ -398,7 +394,6 @@ CREATE TABLE public.time_slots ( -- CREATE SEQUENCE public.time_slots_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -418,7 +413,7 @@ ALTER SEQUENCE public.time_slots_id_seq OWNED BY public.time_slots.id; -- CREATE TABLE public.users ( - id integer NOT NULL, + id bigint NOT NULL, email character varying NOT NULL, encrypted_password character varying NOT NULL, reset_password_token character varying, @@ -436,8 +431,8 @@ CREATE TABLE public.users ( failed_attempts integer DEFAULT 0, unlock_token character varying, locked_at timestamp without time zone, - created_at timestamp without time zone, - updated_at timestamp without time zone, + created_at timestamp(6) without time zone NOT NULL, + updated_at timestamp(6) without time zone NOT NULL, name character varying(70) NOT NULL, authentication_token character varying(64) ); @@ -448,7 +443,6 @@ CREATE TABLE public.users ( -- CREATE SEQUENCE public.users_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -540,6 +534,14 @@ ALTER TABLE ONLY public.time_slots ALTER COLUMN id SET DEFAULT nextval('public.t ALTER TABLE ONLY public.users ALTER COLUMN id SET DEFAULT nextval('public.users_id_seq'::regclass); +-- +-- Name: ar_internal_metadata ar_internal_metadata_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.ar_internal_metadata + ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key); + + -- -- Name: eald_payments eald_payments_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -588,6 +590,14 @@ ALTER TABLE ONLY public.price_rules ADD CONSTRAINT price_rules_pkey PRIMARY KEY (id); +-- +-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.schema_migrations + ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version); + + -- -- Name: shifts shifts_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -629,156 +639,155 @@ ALTER TABLE ONLY public.users -- --- Name: index_event_admins_on_event_id_and_user_id; Type: INDEX; Schema: public; Owner: - +-- Name: index_eald_payments_on_event_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX index_event_admins_on_event_id_and_user_id ON public.event_admins USING btree (event_id, user_id); +CREATE INDEX index_eald_payments_on_event_id ON public.eald_payments USING btree (event_id); -- --- Name: index_event_admins_on_user_id; Type: INDEX; Schema: public; Owner: - +-- Name: index_event_admins_on_event_id; Type: INDEX; Schema: public; Owner: - -- -CREATE INDEX index_event_admins_on_user_id ON public.event_admins USING btree (user_id); +CREATE INDEX index_event_admins_on_event_id ON public.event_admins USING btree (event_id); -- --- Name: index_price_rules_on_event_id; Type: INDEX; Schema: public; Owner: - +-- Name: index_event_admins_on_event_id_and_user_id; Type: INDEX; Schema: public; Owner: - -- -CREATE INDEX index_price_rules_on_event_id ON public.price_rules USING btree (event_id); +CREATE UNIQUE INDEX index_event_admins_on_event_id_and_user_id ON public.event_admins USING btree (event_id, user_id); -- --- Name: index_users_on_confirmation_token; Type: INDEX; Schema: public; Owner: - +-- Name: index_event_admins_on_user_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX index_users_on_confirmation_token ON public.users USING btree (confirmation_token); +CREATE INDEX index_event_admins_on_user_id ON public.event_admins USING btree (user_id); -- --- Name: index_users_on_email; Type: INDEX; Schema: public; Owner: - +-- Name: index_event_admins_on_user_id_only; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX index_users_on_email ON public.users USING btree (email); +CREATE INDEX index_event_admins_on_user_id_only ON public.event_admins USING btree (user_id); -- --- Name: index_users_on_reset_password_token; Type: INDEX; Schema: public; Owner: - +-- Name: index_jobs_on_event_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX index_users_on_reset_password_token ON public.users USING btree (reset_password_token); +CREATE INDEX index_jobs_on_event_id ON public.jobs USING btree (event_id); -- --- Name: index_users_on_unlock_token; Type: INDEX; Schema: public; Owner: - +-- Name: index_price_rules_on_event_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX index_users_on_unlock_token ON public.users USING btree (unlock_token); +CREATE INDEX index_price_rules_on_event_id ON public.price_rules USING btree (event_id); -- --- Name: unique_schema_migrations; Type: INDEX; Schema: public; Owner: - +-- Name: index_shifts_on_time_slot_id; Type: INDEX; Schema: public; Owner: - -- -CREATE UNIQUE INDEX unique_schema_migrations ON public.schema_migrations USING btree (version); +CREATE INDEX index_shifts_on_time_slot_id ON public.shifts USING btree (time_slot_id); -- --- PostgreSQL database dump complete +-- Name: index_shifts_on_user_id; Type: INDEX; Schema: public; Owner: - -- -SET search_path TO "$user", public; - -INSERT INTO schema_migrations (version) VALUES ('20130210233501'); - -INSERT INTO schema_migrations (version) VALUES ('20130223202959'); +CREATE INDEX index_shifts_on_user_id ON public.shifts USING btree (user_id); -INSERT INTO schema_migrations (version) VALUES ('20130223204913'); -INSERT INTO schema_migrations (version) VALUES ('20130224204644'); - -INSERT INTO schema_migrations (version) VALUES ('20130225033247'); - -INSERT INTO schema_migrations (version) VALUES ('20130226010856'); - -INSERT INTO schema_migrations (version) VALUES ('20130226221916'); - -INSERT INTO schema_migrations (version) VALUES ('20130228052958'); - -INSERT INTO schema_migrations (version) VALUES ('20130304020307'); - -INSERT INTO schema_migrations (version) VALUES ('20130304021739'); - -INSERT INTO schema_migrations (version) VALUES ('20130304022508'); - -INSERT INTO schema_migrations (version) VALUES ('20130311213508'); - -INSERT INTO schema_migrations (version) VALUES ('20130325024448'); - -INSERT INTO schema_migrations (version) VALUES ('20130325051758'); - -INSERT INTO schema_migrations (version) VALUES ('20130425052112'); - -INSERT INTO schema_migrations (version) VALUES ('20130427054403'); - -INSERT INTO schema_migrations (version) VALUES ('20130507051822'); - -INSERT INTO schema_migrations (version) VALUES ('20130509021514'); - -INSERT INTO schema_migrations (version) VALUES ('20130514035306'); - -INSERT INTO schema_migrations (version) VALUES ('20130616002401'); - -INSERT INTO schema_migrations (version) VALUES ('20130628042018'); - -INSERT INTO schema_migrations (version) VALUES ('20130628050717'); - -INSERT INTO schema_migrations (version) VALUES ('20130701042655'); - -INSERT INTO schema_migrations (version) VALUES ('20130701045629'); - -INSERT INTO schema_migrations (version) VALUES ('20130701054452'); - -INSERT INTO schema_migrations (version) VALUES ('20130702041357'); - -INSERT INTO schema_migrations (version) VALUES ('20130707204929'); - -INSERT INTO schema_migrations (version) VALUES ('20130707222903'); +-- +-- Name: index_time_slots_on_job_id; Type: INDEX; Schema: public; Owner: - +-- -INSERT INTO schema_migrations (version) VALUES ('20130803212458'); +CREATE INDEX index_time_slots_on_job_id ON public.time_slots USING btree (job_id); -INSERT INTO schema_migrations (version) VALUES ('20140428041744'); -INSERT INTO schema_migrations (version) VALUES ('20140428045329'); +-- +-- Name: index_users_on_confirmation_token; Type: INDEX; Schema: public; Owner: - +-- -INSERT INTO schema_migrations (version) VALUES ('20140515053804'); +CREATE UNIQUE INDEX index_users_on_confirmation_token ON public.users USING btree (confirmation_token); -INSERT INTO schema_migrations (version) VALUES ('20140515054433'); -INSERT INTO schema_migrations (version) VALUES ('20140605034909'); +-- +-- Name: index_users_on_email; Type: INDEX; Schema: public; Owner: - +-- -INSERT INTO schema_migrations (version) VALUES ('20140605045004'); +CREATE UNIQUE INDEX index_users_on_email ON public.users USING btree (email); -INSERT INTO schema_migrations (version) VALUES ('20140605052627'); -INSERT INTO schema_migrations (version) VALUES ('20140605053705'); +-- +-- Name: index_users_on_reset_password_token; Type: INDEX; Schema: public; Owner: - +-- -INSERT INTO schema_migrations (version) VALUES ('20140605060026'); +CREATE UNIQUE INDEX index_users_on_reset_password_token ON public.users USING btree (reset_password_token); -INSERT INTO schema_migrations (version) VALUES ('20140611044708'); -INSERT INTO schema_migrations (version) VALUES ('20140611051614'); +-- +-- Name: index_users_on_unlock_token; Type: INDEX; Schema: public; Owner: - +-- -INSERT INTO schema_migrations (version) VALUES ('20140616024138'); +CREATE UNIQUE INDEX index_users_on_unlock_token ON public.users USING btree (unlock_token); -INSERT INTO schema_migrations (version) VALUES ('20140616030905'); -INSERT INTO schema_migrations (version) VALUES ('20140706232217'); +-- +-- PostgreSQL database dump complete +-- -INSERT INTO schema_migrations (version) VALUES ('20150609064608'); +SET search_path TO "$user", public; -INSERT INTO schema_migrations (version) VALUES ('20160611234315'); +INSERT INTO "schema_migrations" (version) VALUES +('20130210233501'), +('20130223202959'), +('20130223204913'), +('20130224204644'), +('20130225033247'), +('20130226010856'), +('20130226221916'), +('20130228052958'), +('20130304020307'), +('20130304021739'), +('20130304022508'), +('20130311213508'), +('20130325024448'), +('20130325051758'), +('20130425052112'), +('20130427054403'), +('20130507051822'), +('20130509021514'), +('20130514035306'), +('20130616002401'), +('20130628042018'), +('20130628050717'), +('20130701042655'), +('20130701045629'), +('20130701054452'), +('20130702041357'), +('20130707204929'), +('20130707222903'), +('20130803212458'), +('20140428041744'), +('20140428045329'), +('20140515053804'), +('20140515054433'), +('20140605034909'), +('20140605045004'), +('20140605052627'), +('20140605053705'), +('20140605060026'), +('20140611044708'), +('20140611051614'), +('20140616024138'), +('20140616030905'), +('20140706232217'), +('20150609064608'), +('20160611234315'), +('20180527021019'); -INSERT INTO schema_migrations (version) VALUES ('20180527021019'); diff --git a/development/config/.psqlrc b/development/config/.psqlrc new file mode 100644 index 00000000..2538479a --- /dev/null +++ b/development/config/.psqlrc @@ -0,0 +1,67 @@ +-- vim: set filetsype=sql +-- don't output commands as we run them + +-- set how to output numbers (this turns on thousdand separators) +\set PSQLRC_VERSION '1.0.2' +\set PSQLRC_RELEASED 'Wed Feb 8 09:17:23 PST 2023' +\set QUIET 1 +\encoding unicode +\timing 0 + +-- Autocomplete keywords (like SELECT) in upper-case, even if you started +-- typing them in lower case. +\set COMP_KEYWORD_CASE upper + +-- If a command is run more than once in a row, only store it once in the history. +\set HISTCONTROL ignoredups + +-- Use a separate history file per-database. +\set HISTFILE ~/.psql_history-:DBNAME + +-- Use automatic horizontal or vertical format depending on the data and terminal width. +-- You can always use horizontal with "\x off" or always vertical with "\x on". +-- Finally, you can use macros ":nowrap" and ":wrap" to either truncate long output strings at the +-- terminal boundary, or wrap them if they don't fit. +\x auto +\set nowrap '\\! tput rmam' +\set wrap '\\! tput smam' + +-- These macros load additional macros that map to various administrative queries about the +-- database or individual tables. +\set m '\\i ~/.psqlrc-macros' +\set macros '\\i ~/.psqlrc-macros' + +-- Verbose error reports. +\set VERBOSITY verbose + +\pset border 0 +\pset tuples_only 1 + +\echo '\033[0;34m' +\echo -n '❯ PostgreSQL Client Version: ' +\! psql --version | cut -d ' ' -f 3 +\echo -n '\033[0;33m' +SELECT '❯ PostgreSQL Server Version: ' || (SELECT regexp_replace(version(), 'PostgreSQL ([\d.]+) .*', '\1', 'g') as current_pg_version); +\echo -n '\033[0;32m' +\echo '┌───────────────────────────────────────────────────────────────────────────────┐' +\echo '│ To load and view macros, type \033[0;34m:macros\033[0;32m (or :m for short) │' +\echo '│ To truncate wide results type \033[0;34m:nowrap\033[0;32m, or :wrap otherwise │' +\echo '│ To layout query results vertically, type \033[0;34m"\\x on|off|auto"\033[0;0m │' +\echo '└───────────────────────────────────────────────────────────────────────────────┘' +\echo '\033[0;0m' + +\pset border 3 +\pset columns 0 +\pset format aligned +\pset linestyle unicode +\pset null '' +\pset pager 0 +\pset tuples_only 1 +\timing 1 +\pset tuples_only 0 + +SET search_path TO public,extensions; +\set QUIET 0 +-- New Prompt, more compact, and works with back editing using readlines +\set PROMPT1 '%[%033[0;30;33m%]%[%033[0;43;30m%] %`date "+%H:%M:%S%p"` %033[0;30;33m%]%033[0;43;37m%]%[%033[0;0;0m%]━%[%033[0;30;32m%]%033[0;42;30m%] %n@%M:%> %033[0;32m%%[%033[3;30;96m%]━%[%033[3;30;106m%]% %[%033[3;30;106m%]%/%x %033[0;96m%%[%033[0m%]\n❯ ' +\set PROMPT2 '%[%033[0;30;33m%] ⤷ %l%[%033[0m% ❯ ' \ No newline at end of file diff --git a/development/config/.psqlrc.macros b/development/config/.psqlrc.macros new file mode 100644 index 00000000..6c9a5578 --- /dev/null +++ b/development/config/.psqlrc.macros @@ -0,0 +1,136 @@ +-- vim: ft=sql +\set QUIET 1 +\timing 0 +\echo '┌───────────────────────────────────────────────────────────────────────────┐' +\echo '│ Loading shortcuts │' +\echo '└───────────────────────────────────────────────────────────────────────────┘' +\echo +\pset border 0 +\set VERBOSITY verbose +\pset tuples_only 1 + +\echo 'Type :version — to see the PostgreSQL version.' +\set version 'SELECT version();' + +\echo 'Type :extensions — to see the available extensions.' +\set extensions 'select * from pg_available_extensions;' + +\echo 'Type :running — to see all currently executing queries' +\set running 'select pid,client_addr,client_port,wait_event_type,wait_event,state, to_char((now() - query_start)::time, ''HH24:MI:SS'') as duration, substring(regexp_replace(substring(query, 0, 200), E''[\\n\\r\\\\s]+'', '' '', ''g'' ), 0, 120) as sql from pg_stat_activity where state != ''idle'' order by query_start asc;' + +\echo 'Type :vacuums — to see the currently running vacuums' +\set vacuums 'select pid,client_addr,client_port,wait_event_type,wait_event,state, to_char(now()::time - query_start::time, ''HH24:MI:SS'') as duration, substring(regexp_replace(substring(query, 0, 200), E''[\\n\\r\\\\s]+'', '' '', ''g'' ), 0, 120) as sql from pg_stat_activity where state != ''idle'' and query like ''%vacuum%'' order by query_start asc;' + +\echo 'Type :vacuuming — to see the progress of the currently running vacuums' +\set vacuuming 'select pa.pid, pa.state, pv.phase, to_char(pv.heap_blks_scanned * 100.0 / pv.heap_blks_total, ''999999999.99'')as completed_pct, to_char((now() - query_start)::time, ''HH24:MI:SS'') as duration, max_dead_tuples - num_dead_tuples, substring(regexp_replace(substring(query, 0, 200), E''[\n\r\\s]+'', '' '', ''g''), 0, 120) as sql from pg_stat_activity pa, pg_stat_progress_vacuum pv where pv.pid = pa.pid and query ilike ''%vacuum%'' and state != ''idle'' and query_start is not null order by query_start asc;' + +\echo 'Type :locks — to see all current database locks' +\set locks 'select pid,client_addr,client_port,wait_event_type,wait_event,state, to_char(now()::time - query_start::time, ''HH24:MI:SS'') as duration, substring(regexp_replace(substring(query, 0, 200), E''[\\n\\r\\\\s]+'', '' '', ''g'' ), 0, 120) as sql from pg_stat_activity where state != ''idle'' and ( wait_event is not null or wait_event_type is not null) order by duration desc;' + +\echo 'Type :locks_detail - to see all current database locks with detail' +\set locks_detail 'WITH RECURSIVE activity AS (SELECT pg_blocking_pids(a.pid) blocked_by, a.*, (CASE WHEN (SELECT 1 FROM pg_locks AS l WHERE locktype = ''advisory'' AND l.pid = a.pid) = 1 THEN TRUE ELSE FALSE END) AS has_advisory, age(clock_timestamp(), a.xact_start)::interval(0) AS tx_age, age(clock_timestamp(), a.state_change)::interval(0) AS state_age FROM pg_stat_activity AS a WHERE state IS DISTINCT FROM ''idle'' ), blockers AS (SELECT array_agg(DISTINCT c ORDER BY c) AS pids FROM (SELECT unnest(blocked_by) FROM activity) AS dt(c) ), tree AS (SELECT activity.*, 1 AS level, activity.pid AS top_blocker_pid, array[activity.pid] AS path, array[activity.pid]::int[] AS all_blockers_above FROM activity, blockers WHERE array[pid] <@ blockers.pids AND blocked_by = ''{}''::int[] UNION ALL SELECT activity.*, tree.level + 1 AS level, tree.top_blocker_pid, path || array[activity.pid] AS path, tree.all_blockers_above || array_agg(activity.pid) over () AS all_blockers_above FROM activity, tree WHERE NOT array[activity.pid] <@ tree.all_blockers_above AND activity.blocked_by <> ''{}''::int[] AND activity.blocked_by <@ tree.all_blockers_above ) SELECT pid, blocked_by, tx_age, state_age, backend_xid AS xid, backend_xmin AS xmin, replace(state, ''idle in transaction'', ''idletx'') AS state, client_addr, usename, wait_event_type || '':'' || wait_event AS wait, (SELECT COUNT(distinct t1.pid) FROM tree t1 WHERE array[tree.pid] <@ t1.path AND t1.pid <> tree.pid) AS blkd, has_advisory, format(''%s %s%s'', lpad(''['' || tree.pid::text || '']'', 7, '' ''), repeat(''.'', level - 1) || CASE WHEN level > 1 THEN '' '' END, left(query, 1000) ) AS query FROM tree ORDER BY top_blocker_pid, level, tree.pid;' + +\echo '——————————————————————————————————————————————————————————————————————————' + +\echo 'Type :dbage — to see frozen transaction ID age by database' +\set dbage 'SELECT datname as database, age(datfrozenxid) as age, current_setting(''autovacuum_freeze_max_age'') as autovacuum_freeze_max_age FROM pg_database ORDER BY 2 DESC;' + +\echo 'Type :oldest LIMIT;' +\echo ' — see top LIMIT tables with the oldest TX wraparound XID' + +\set oldest 'SELECT c.oid::regclass, age(c.relfrozenxid), pg_size_pretty(pg_total_relation_size(c.oid)) FROM pg_class c JOIN pg_namespace n on c.relnamespace = n.oid WHERE relkind IN (''r'', ''t'', ''m'') AND n.nspname NOT IN (''pg_toast'') ORDER BY 2 DESC LIMIT ' + +\echo '——————————————————————————————————————————————————————————————————————————' + +\echo 'Type :top20 — to see top 20 time-consuming queries (shortened)' +\set top20 'select to_char(total_exec_time / 1000.0, ''999,999,999'') total_secs,to_char(total_exec_time / calls / 1000, ''999,999.99'') as average_secs, calls, rows, substring(regexp_replace(query, E''[\\n\\r\\\\s]+'', '' '', ''g''), 0, 140) as sql from pg_stat_statements order by total_exec_time desc limit 20;' + +\echo 'Type :top LIMIT; — to see top LIMIT time-consuming queries (shortened)' +\set top 'select to_char(total_exec_time / 1000.0, ''999,999,999'') total_secs,to_char(total_exec_time / calls / 1000, ''999,999.99'') as average_secs, calls, rows, substring(regexp_replace(query, E''[\\n\\r\\\\s]+'', '' '', ''g''), 0, 140) as sql from pg_stat_statements order by total_exec_time desc limit ' + +\echo 'Type :top30full — to see top 30 time-consuming queries (full)' +\set top30full 'select to_char(total_exec_time / 1000.0, ''999,999,999'') total_secs, to_char(total_exec_time / calls / 1000, ''999,999.99'') as average_secs, calls, rows, substring(regexp_replace(query, E''[\\n\\r\\\\s]+'', '' '', ''g'' ), 0, 1000) as sql from pg_stat_statements order by total_exec_time desc limit 30;' +\echo '——————————————————————————————————————————————————————————————————————————' + +\echo 'Type :st1 — to set statement timeout to 1 hour' +\set st1 'set statement_timeout=''1h'';' + +\echo 'Type :st10 — to set statement timeout to 10 hours' +\set st10 'set statement_timeout=''10h'';' + +\echo '——————————————————————————————————————————————————————————————————————————' + +\echo 'Type :unused — to see unused indexes in this database' +\set unused 'SELECT schemaname || ''.'' || relname AS table, indexrelname AS index, pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size, idx_scan as index_scans FROM pg_stat_user_indexes ui JOIN pg_index i ON ui.indexrelid = i.indexrelid WHERE NOT indisunique AND idx_scan < 50 AND pg_relation_size(relid) > 5 * 8192 ORDER BY pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST, pg_relation_size(i.indexrelid) DESC;' + +\echo 'Type :bigtables — to see the biggest tables in this database' +\set bigtables ' SELECT nspname || ''.'' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (''pg_catalog'', ''information_schema'') and C.relkind in ( ''t'', ''r'' ) and nspname not in (''pg_toast'') ORDER BY pg_relation_size(C.oid) DESC LIMIT 20;' + +\echo 'Type :bigindexes — to see the biggest indexes in this database' +\set bigindexes ' SELECT nspname || ''.'' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (''pg_catalog'', ''information_schema'') and C.relkind = ''i'' ORDER BY pg_relation_size(C.oid) DESC LIMIT 20;' + +\echo 'Type :bigrels — to see the largest tables including indexes' +\set bigrels ' SELECT nspname || ''.'' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (''pg_catalog'', ''information_schema'') AND C.relkind <> ''i'' AND nspname !~ ''^pg_toast'' ORDER BY pg_total_relation_size(C.oid) DESC LIMIT 20;' + +\echo 'Type :bigitems — to see the biggest public tables in this database with indexes' +\set bigitems 'SELECT nspname || ''.'' || relname AS "relation", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname IN (''public'') ORDER BY pg_relation_size(C.oid) DESC LIMIT 10;' + +\echo 'Type :dbsizes — to see the sizes of the databases' +\set dbsizes ' SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner, CASE WHEN pg_catalog.has_database_privilege(d.datname, ''CONNECT'') THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname)) ELSE ''No Access'' END AS SIZE FROM pg_catalog.pg_database d ORDER BY CASE WHEN pg_catalog.has_database_privilege(d.datname, ''CONNECT'') THEN pg_catalog.pg_database_size(d.datname) ELSE NULL END DESC nulls first LIMIT 20;' + +\echo 'Type :hitrate — to get your database cache hit rate ration' +\set hitrate 'SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;' + +\echo '——————————————————————————————————————————————————————————————————————————' +\echo 'Table and Index Stats' + +\echo 'Type :tt ''TABLE''; — Run ":tt ''TABLE'';" to see table stats from pg_stat_user_tables' +\set tt 'select * from pg_stat_user_tables where relname = ' + +\echo 'Type :ti ''TABLE''; — Run ":ti ''TABLE''"; to see table indexes from pg_stat_user_indexes' +\set ti 'select * from pg_stat_user_indexes where relname = ' + +\echo '——————————————————————————————————————————————————————————————————————————' +\echo 'Long Running Queries — Showing them and killing them.' + +\echo 'Type :stuck60s - to print SELECT queries taking longer than 60 seconds'; +\set stuck60s 'SELECT pid, query FROM pg_stat_activity pa WHERE (now() - pa.query_start) > interval ''60 seconds'' and pa.query ilike ''select%'';'; + +\echo 'Type :kill60s - to kill SELECT queries taking longer than 60 seconds'; +\set kill60s 'SELECT pg_terminate_backend(pa.pid) FROM pg_stat_activity pa WHERE (now() - pa.query_start) > interval ''60 seconds'' and pa.query ilike ''select%'';'; + +\echo 'Type :stuck N min''; - to print SELECT queries taking longer than N minutes'; +\echo ' which could be any interval argument, eg 1 hour etc.'; +\set stuck 'SELECT pid, query FROM pg_stat_activity pa WHERE pa.query ilike ''select%'' and (now() - pa.query_start) > interval '''; + +\echo 'Type :killq N min''; - to kill SELECT queries taking longer than N minutes'; +\set killq 'SELECT pg_terminate_backend(pa.pid) FROM pg_stat_activity pa WHERE pa.query ilike ''select%'' and (now() - pa.query_start) > interval '''; + +\echo '——————————————————————————————————————————————————————————————————————————' +\echo 'Prompt Management' +\echo 'Type :p0 - To return to the default prompt (requires Powerline Fonts)' +\set p0 '\\set PROMPT1 ''%[%033[0;30;33m%]%[%033[0;43;30m%] %`date "+%H:%M:%S%p"` %033[0;30;33m%]%033[0;43;37m%]%[%033[0;0;0m%]━%[%033[0;30;32m%]%033[0;42;30m%] %n@%M:%> %033[0;32m%%[%033[3;30;96m%]━%[%033[3;30;106m%]% %[%033[3;30;106m%]%/%x %033[0;96m% %[%033[0m%]\n ❯ ''' +\echo 'Type :p1 - To switch to a simpler prompt theme #1' +\set p1 '\\set PROMPT1 ''%[%033[0;90;47m%] %n@%M:%>->(%/) %[%033[0m%]\\n%# ''' +\echo 'Type :p2 - To switch to a simpler prompt theme #2' +\set p2 '\\set PROMPT1 ''%[%033[0;92;40m%]%n@%M:%>->(%/) %[%033[0;93;40m%] %`date "+%H:%M:%S %p"`\\n%x%[%033[0;0;0m%] ❯ ''' +\echo '——————————————————————————————————————————————————————————————————————————' + +\set pgss 'create extension pg_stat_statements;' +\echo 'Type :pgss to create an extension for pg_stat_statements (assuming its available)' +\echo 'Type \\q to exit. ' +\echo +\echo '┌───────────────────────────────────────────────────────────────────────────┐' +\echo '│ Shortcuts Loaded ✔︎ │' +\echo '└───────────────────────────────────────────────────────────────────────────┘' +\echo +\pset border 3 +\pset columns 0 +\pset format aligned +\pset linestyle unicode +\pset null '' +\pset pager 0 +\pset tuples_only 1 +\timing 1 +\pset tuples_only 0 +\set QUIET 0 \ No newline at end of file diff --git a/development/config/.vim/autoload/plug.vim b/development/config/.vim/autoload/plug.vim new file mode 100644 index 00000000..ab0e0829 --- /dev/null +++ b/development/config/.vim/autoload/plug.vim @@ -0,0 +1,2538 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let use_chcp = executable('sed') + return map([ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (use_chcp ? [ + \ 'for /f "usebackq" %%a in (`chcp ^| sed "s/[^0-9]//gp"`) do set origchcp=%%a', + \ 'chcp 65001 > nul'] : []) + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + (use_chcp ? ['chcp !origchcp! > nul'] : []) + \ + ['endlocal'], + \ 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 1}) + if &shell =~# 'powershell\.exe$' + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win && a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') || has('wsl') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . plug#shellescape(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ plug#shellescape(spec.uri, {'script': 0}), + \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! plug#shellescape(arg, ...) + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\.exe$' + return s:shellesc_cmd(a:arg, script) + elseif shell =~# 'powershell\.exe$' || shell =~# 'pwsh$' + return s:shellesc_ps1(a:arg) + endif + return shellescape(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = 'git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) + if has_key(v, 'rtp') + let cmd .= ' -- '.plug#shellescape(v.rtp) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@ +" Version: 0.2 +" Notes: Originally based on herald by Fabio Cevasco + + +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "evolution" + +set background=dark + +" Set some syntax-related variables +let ruby_operators = 1 + +" -> Text; Miscellaneous +hi Normal guibg=#1F1F1F guifg=#D0D0D0 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=252 + +hi SpecialKey guibg=#1F1F1F guifg=#E783E9 gui=none term=bold cterm=NONE ctermbg=NONE ctermfg=176 +hi VertSplit guibg=#121212 guifg=#121212 gui=none term=reverse cterm=NONE ctermbg=233 ctermfg=233 "alt: guibg=#4d5074 guifg=#4d5074 +hi SignColumn guibg=#1F1F1F guifg=#BF81FA gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=141 +hi NonText guibg=#1F1F1F guifg=#FC6984 gui=none term=bold cterm=NONE ctermbg=NONE ctermfg=204 +hi Directory guibg=#1F1F1F guifg=#FFEE68 gui=none term=bold cterm=bold ctermbg=NONE ctermfg=227 +hi Title guibg=#1F1F1F guifg=#6DF584 gui=bold term=bold cterm=bold ctermbg=NONE ctermfg=84 +hi BadWhitespace guibg=#0ADA7D guifg=fg gui=NONE term=NONE cterm=NONE ctermbg=59 ctermfg=fg + +" -> Cursor +hi Cursor guibg=#FFEE68 guifg=#1F1F1F gui=none term=NONE cterm=reverse ctermbg=8 ctermfg=15 +hi CursorIM guibg=#FFEE68 guifg=#1F1F1F gui=none term=NONE cterm=reverse ctermbg=195 ctermfg=16 +hi CursorColumn guibg=#444444 guifg=fg gui=none term=reverse cterm=reverse ctermbg=238 ctermfg=fg +hi CursorLine guibg=#444444 guifg=fg gui=none term=underline cterm=underline ctermbg=238 ctermfg=fg + + +" -> Folding +hi FoldColumn guibg=#001336 guifg=#003DAD gui=none term=NONE cterm=NONE ctermbg=17 ctermfg=25 +hi Folded guibg=#585858 guifg=#c5dcdc gui=bold term=NONE cterm=bold ctermbg=240 ctermfg=188 + +" -> Line info +"hi LineNr guibg=#121212 guifg=#1F1F1F gui=none term=underline cterm=NONE ctermbg=233 ctermfg=236 +hi LineNr guibg=#121212 guifg=#3F3F3F gui=none term=underline cterm=NONE ctermbg=233 ctermfg=236 +hi StatusLine guibg=#121212 guifg=fg gui=bold term=reverse,bold cterm=reverse,bold ctermbg=60 ctermfg=252 +hi StatusLineNC guibg=#25365a guifg=#696567 gui=none term=reverse cterm=reverse ctermbg=60 ctermfg=53 "alt: guibg=#4d5074 guifg=#5F005F +hi ColorColumn guibg=#121212 guifg=fg gui=none term=reverse cterm=NONE ctermbg=233 ctermfg=fg "alt: guibg=#5F005F guifg=#d0d0d0 + + +" -> Messages +hi ErrorMsg guibg=#A32024 guifg=#D0D0D0 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=252 +hi Question guibg=#1F1F1F guifg=#FFA500 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=214 +hi WarningMsg guibg=#FFA500 guifg=#000000 gui=none term=bold cterm=bold ctermbg=214 ctermfg=16 +hi MoreMsg guibg=#1F1F1F guifg=#FFA500 gui=none term=bold cterm=NONE ctermbg=NONE ctermfg=214 +hi ModeMsg guibg=#1F1F1F guifg=#FFA500 gui=none term=bold cterm=NONE ctermbg=NONE ctermfg=214 + +" -> Search +hi Search guibg=#696567 guifg=#FFEE68 gui=none term=reverse cterm=NONE ctermbg=59 ctermfg=227 +hi IncSearch guibg=#696567 guifg=#FFEE68 gui=none term=reverse cterm=NONE ctermbg=59 ctermfg=227 + +" -> Diff +hi DiffAdd guibg=#006124 guifg=#ED9000 gui=none term=bold cterm=NONE ctermbg=22 ctermfg=208 +hi DiffChange guibg=#0B294A guifg=#A36000 gui=none term=bold cterm=NONE ctermbg=17 ctermfg=130 +hi DiffDelete guibg=#081F38 guifg=#ED9000 gui=none term=bold cterm=NONE ctermbg=17 ctermfg=208 +hi DiffText guibg=#12457D guifg=#ED9000 gui=underline term=reverse cterm=underline ctermbg=24 ctermfg=208 + +" -> Menu +hi Pmenu guibg=#140100 guifg=#660300 gui=none term=NONE cterm=NONE ctermbg=6 ctermfg=52 +hi PmenuSel guibg=#F17A00 guifg=#4C0200 gui=none term=NONE cterm=NONE ctermbg=4 ctermfg=6 +hi PmenuSbar guibg=#430300 guifg=fg gui=none term=NONE cterm=NONE ctermbg=66 ctermfg=fg +hi PmenuThumb guibg=#720300 guifg=fg gui=none term=NONE cterm=NONE ctermbg=52 ctermfg=fg +hi WildMenu guibg=#ffff00 guifg=#000000 gui=NONE term=NONE cterm=NONE ctermbg=226 ctermfg=16 + +" -> Tabs +hi TabLine guibg=#141414 guifg=#1F1F1F gui=none term=underline cterm=underline ctermbg=233 ctermfg=16 +hi TabLineFill guibg=#000000 guifg=fg gui=none term=reverse cterm=reverse ctermbg=NONE ctermfg=fg +hi TabLineSel guibg=#1F1F1F guifg=#D0D0D0 gui=bold term=bold cterm=bold ctermbg=NONE ctermfg=252 +" +" -> Visual Mode +hi Visual guibg=#000000 guifg=#FFB539 gui=none term=reverse cterm=NONE ctermbg=67 ctermfg=16 +hi VisualNOS guibg=#000000 guifg=#696567 gui=none term=bold,underline cterm=NONE ctermbg=NONE ctermfg=59 + +" -> Code +hi Comment guibg=#1F1F1F guifg=#696567 gui=italic term=italic cterm=italic ctermbg=NONE ctermfg=59 "alt: guifg=#5f5f5f +hi Constant guibg=#1F1F1F guifg=#6DF584 gui=none term=underline cterm=NONE ctermbg=NONE ctermfg=83 +hi String guibg=#1F1F1F guifg=#FFB539 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=48 +hi Error guibg=#1F1F1F guifg=#FC4234 gui=none term=reverse cterm=NONE ctermbg=NONE ctermfg=203 "alt: guifg=#0fc416 +hi Identifier guibg=#1F1F1F guifg=#70BDF1 gui=none term=underline cterm=NONE ctermbg=NONE ctermfg=75 +hi Function guibg=#1F1F1F guifg=#90CBF1 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=117 +hi Ignore guibg=#1F1F1F guifg=#1F1F1F gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=16 +hi MatchParen guibg=#226600 guifg=#FFA500 gui=none term=reverse cterm=bold ctermbg=129 ctermfg=16 +hi PreProc guibg=#1F1F1F guifg=#BF81FA gui=none term=underline cterm=NONE ctermbg=NONE ctermfg=141 + +hi Special guibg=#1F1F1F guifg=#FFEE68 gui=none term=bold cterm=bold ctermbg=NONE ctermfg=227 +hi Todo guibg=#1F1F1F guifg=#FC4234 gui=bold term=bold cterm=bold ctermbg=NONE ctermfg=190 "alt guibg=#0f0f0f guifg=#0fc416 +hi Underlined guibg=#1F1F1F guifg=#FC4234 gui=underline term=underline cterm=underline ctermbg=NONE ctermfg=203 +hi Statement guibg=#1F1F1F guifg=#E783E9 gui=none term=bold cterm=bold ctermbg=NONE ctermfg=176 + +hi Operator guibg=#1F1F1F guifg=#FC6984 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=204 +hi Delimiter guibg=#1F1F1F guifg=#FC6984 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=204 +hi Type guibg=#1F1F1F guifg=#FFEE68 gui=none term=underline cterm=NONE ctermbg=NONE ctermfg=46 +hi Exception guibg=#1F1F1F guifg=#FC4234 gui=none term=NONE cterm=NONE ctermbg=NONE ctermfg=203 " alt: guifg=#0fc416 + + +" -> HTML-specific +hi htmlBold guibg=#1F1F1F guifg=#D0D0D0 gui=bold term=NONE cterm=bold ctermbg=NONE ctermfg=252 +hi htmlBoldItalic guibg=#1F1F1F guifg=#D0D0D0 gui=bold,italic term=bold,italic cterm=bold,italic ctermbg=NONE ctermfg=252 +hi htmlBoldUnderline guibg=#1F1F1F guifg=#D0D0D0 gui=bold,underline term=bold,underline cterm=bold,underline ctermbg=NONE ctermfg=252 +hi htmlBoldUnderlineItalic guibg=#1F1F1F guifg=#D0D0D0 gui=bold,underline,italic term=bold,underline,italic cterm=bold,underline,italic ctermbg=NONE ctermfg=252 +hi htmlItalic guibg=#1F1F1F guifg=#D0D0D0 gui=italic term=italic cterm=italic ctermbg=NONE ctermfg=252 +hi htmlUnderline guibg=#1F1F1F guifg=#D0D0D0 gui=underline term=underline cterm=underline ctermbg=NONE ctermfg=252 +hi htmlUnderlineItalic guibg=#1F1F1F guifg=#D0D0D0 gui=underline,italic term=italic,underline cterm=italic,underline ctermbg=NONE ctermfg=252 + + +" -> BBCode links +hi! default link bbcodeBold htmlBold +hi! default link bbcodeBoldItalic htmlBoldItalic +hi! default link bbcodeBoldItalicUnderline htmlBoldUnderlineItalic +hi! default link bbcodeBoldUnderline htmlBoldUnderline +hi! default link bbcodeItalic htmlItalic +hi! default link bbcodeItalicUnderline htmlUnderlineItalic +hi! default link bbcodeUnderline htmlUnderline + +" -> Ruby links +highlight link rubyClass Keyword +highlight link rubyDefine Keyword +highlight link rubyConstant Type +highlight link rubySymbol Constant +highlight link rubyStringDelimiter rubyString +highlight link rubyInclude Keyword +highlight link rubyAttribute Keyword +highlight link rubyInstanceVariable Normal + + + +" Spellcheck formatting +if has("spell") + hi SpellBad guisp=#FC4234 gui=undercurl term=reverse cterm=undercurl ctermbg=NONE ctermfg=203 "alt: guisp=#0fc416 + hi SpellCap guisp=#70BDF1 gui=undercurl term=reverse cterm=undercurl ctermbg=NONE ctermfg=75 + hi SpellLocal guisp=#FFEE68 gui=undercurl term=underline cterm=undercurl ctermbg=NONE ctermfg=227 + hi SpellRare guisp=#6DF584 gui=undercurl term=reverse cterm=undercurl ctermbg=NONE ctermfg=84 +endif + +hi MyTagListFileName guibg=#121212 guifg=#d0d0d0 gui=NONE term=bold cterm=bold ctermbg=53 ctermfg=220 + diff --git a/development/config/.vim/colors/molokai.vim b/development/config/.vim/colors/molokai.vim new file mode 100644 index 00000000..a8894e8f --- /dev/null +++ b/development/config/.vim/colors/molokai.vim @@ -0,0 +1,276 @@ +" Vim color file +" +" Author: Tomas Restrepo +" https://github.com/tomasr/molokai +" +" Note: Based on the Monokai theme for TextMate +" by Wimer Hazenberg and its darker variant +" by Hamish Stuart Macpherson +" + +hi clear + +if version > 580 + " no guarantees for version 5.8 and below, but this makes it stop + " complaining + hi clear + if exists("syntax_on") + syntax reset + endif +endif +let g:colors_name="molokai" + +if exists("g:molokai_original") + let s:molokai_original = g:molokai_original +else + let s:molokai_original = 0 +endif + + +hi Boolean guifg=#AE81FF +hi Character guifg=#E6DB74 +hi Number guifg=#AE81FF +hi String guifg=#E6DB74 +hi Conditional guifg=#F92672 gui=bold +hi Constant guifg=#AE81FF gui=bold +hi Cursor guifg=#000000 guibg=#F8F8F0 +hi iCursor guifg=#000000 guibg=#F8F8F0 +hi Debug guifg=#BCA3A3 gui=bold +hi Define guifg=#66D9EF +hi Delimiter guifg=#8F8F8F +hi DiffAdd guibg=#13354A +hi DiffChange guifg=#89807D guibg=#4C4745 +hi DiffDelete guifg=#960050 guibg=#1E0010 +hi DiffText guibg=#4C4745 gui=italic,bold + +hi Directory guifg=#A6E22E gui=bold +hi Error guifg=#E6DB74 guibg=#1E0010 +hi ErrorMsg guifg=#F92672 guibg=#232526 gui=bold +hi Exception guifg=#A6E22E gui=bold +hi Float guifg=#AE81FF +hi FoldColumn guifg=#465457 guibg=#000000 +hi Folded guifg=#465457 guibg=#000000 +hi Function guifg=#A6E22E +hi Identifier guifg=#FD971F +hi Ignore guifg=#808080 guibg=bg +hi IncSearch guifg=#C4BE89 guibg=#000000 + +hi Keyword guifg=#F92672 gui=bold +hi Label guifg=#E6DB74 gui=none +hi Macro guifg=#C4BE89 gui=italic +hi SpecialKey guifg=#66D9EF gui=italic + +hi MatchParen guifg=#000000 guibg=#FD971F gui=bold +hi ModeMsg guifg=#E6DB74 +hi MoreMsg guifg=#E6DB74 +hi Operator guifg=#F92672 + +" complete menu +hi Pmenu guifg=#66D9EF guibg=#000000 +hi PmenuSel guibg=#808080 +hi PmenuSbar guibg=#080808 +hi PmenuThumb guifg=#66D9EF + +hi PreCondit guifg=#A6E22E gui=bold +hi PreProc guifg=#A6E22E +hi Question guifg=#66D9EF +hi Repeat guifg=#F92672 gui=bold +hi Search guifg=#000000 guibg=#FFE792 +" marks +hi SignColumn guifg=#A6E22E guibg=#232526 +hi SpecialChar guifg=#F92672 gui=bold +hi SpecialComment guifg=#7E8E91 gui=bold +hi Special guifg=#66D9EF guibg=bg gui=italic +if has("spell") + hi SpellBad guisp=#FF0000 gui=undercurl + hi SpellCap guisp=#7070F0 gui=undercurl + hi SpellLocal guisp=#70F0F0 gui=undercurl + hi SpellRare guisp=#FFFFFF gui=undercurl +endif +hi Statement guifg=#F92672 gui=bold +hi StatusLine guifg=#455354 guibg=fg +hi StatusLineNC guifg=#808080 guibg=#080808 +hi StorageClass guifg=#FD971F gui=italic +hi Structure guifg=#66D9EF +hi Tag guifg=#F92672 gui=italic +hi Title guifg=#ef5939 +hi Todo guifg=#FFFFFF guibg=bg gui=bold + +hi Typedef guifg=#66D9EF +hi Type guifg=#66D9EF gui=none +hi Underlined guifg=#808080 gui=underline + +hi VertSplit guifg=#808080 guibg=#080808 gui=bold +hi VisualNOS guibg=#403D3D +hi Visual guibg=#403D3D +hi WarningMsg guifg=#FFFFFF guibg=#333333 gui=bold +hi WildMenu guifg=#66D9EF guibg=#000000 + +hi TabLineFill guifg=#1B1D1E guibg=#1B1D1E +hi TabLine guibg=#1B1D1E guifg=#808080 gui=none + +if s:molokai_original == 1 + hi Normal guifg=#F8F8F2 guibg=#272822 + hi Comment guifg=#75715E + hi CursorLine guibg=#3E3D32 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#3E3D32 + hi ColorColumn guibg=#3B3A32 + hi LineNr guifg=#BCBCBC guibg=#3B3A32 + hi NonText guifg=#75715E + hi SpecialKey guifg=#75715E +else + hi Normal guifg=#F8F8F2 guibg=#1B1D1E + hi Comment guifg=#7E8E91 + hi CursorLine guibg=#293739 + hi CursorLineNr guifg=#FD971F gui=none + hi CursorColumn guibg=#293739 + hi ColorColumn guibg=#232526 + hi LineNr guifg=#465457 guibg=#232526 + hi NonText guifg=#465457 + hi SpecialKey guifg=#465457 +end + +" +" Support for 256-color terminal +" +if &t_Co > 255 + if s:molokai_original == 1 + hi Normal ctermbg=234 + hi CursorLine ctermbg=235 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + else + hi Normal ctermfg=252 ctermbg=233 + hi CursorLine ctermbg=234 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + endif + hi Boolean ctermfg=135 + hi Character ctermfg=144 + hi Number ctermfg=135 + hi String ctermfg=144 + hi Conditional ctermfg=161 cterm=bold + hi Constant ctermfg=135 cterm=bold + hi Cursor ctermfg=16 ctermbg=253 + hi Debug ctermfg=225 cterm=bold + hi Define ctermfg=81 + hi Delimiter ctermfg=241 + + hi DiffAdd ctermbg=24 + hi DiffChange ctermfg=181 ctermbg=239 + hi DiffDelete ctermfg=162 ctermbg=53 + hi DiffText ctermbg=102 cterm=bold + + hi Directory ctermfg=118 cterm=bold + hi Error ctermfg=219 ctermbg=89 + hi ErrorMsg ctermfg=199 ctermbg=16 cterm=bold + hi Exception ctermfg=118 cterm=bold + hi Float ctermfg=135 + hi FoldColumn ctermfg=67 ctermbg=16 + hi Folded ctermfg=67 ctermbg=16 + hi Function ctermfg=118 + hi Identifier ctermfg=208 cterm=none + hi Ignore ctermfg=244 ctermbg=232 + hi IncSearch ctermfg=193 ctermbg=16 + + hi keyword ctermfg=161 cterm=bold + hi Label ctermfg=229 cterm=none + hi Macro ctermfg=193 + hi SpecialKey ctermfg=81 + + hi MatchParen ctermfg=233 ctermbg=208 cterm=bold + hi ModeMsg ctermfg=229 + hi MoreMsg ctermfg=229 + hi Operator ctermfg=161 + + " complete menu + hi Pmenu ctermfg=81 ctermbg=16 + hi PmenuSel ctermfg=255 ctermbg=242 + hi PmenuSbar ctermbg=232 + hi PmenuThumb ctermfg=81 + + hi PreCondit ctermfg=118 cterm=bold + hi PreProc ctermfg=118 + hi Question ctermfg=81 + hi Repeat ctermfg=161 cterm=bold + hi Search ctermfg=0 ctermbg=222 cterm=NONE + + " marks column + hi SignColumn ctermfg=118 ctermbg=235 + hi SpecialChar ctermfg=161 cterm=bold + hi SpecialComment ctermfg=245 cterm=bold + hi Special ctermfg=81 + if has("spell") + hi SpellBad ctermbg=52 + hi SpellCap ctermbg=17 + hi SpellLocal ctermbg=17 + hi SpellRare ctermfg=none ctermbg=none cterm=reverse + endif + hi Statement ctermfg=161 cterm=bold + hi StatusLine ctermfg=238 ctermbg=253 + hi StatusLineNC ctermfg=244 ctermbg=232 + hi StorageClass ctermfg=208 + hi Structure ctermfg=81 + hi Tag ctermfg=161 + hi Title ctermfg=166 + hi Todo ctermfg=231 ctermbg=232 cterm=bold + + hi Typedef ctermfg=81 + hi Type ctermfg=81 cterm=none + hi Underlined ctermfg=244 cterm=underline + + hi VertSplit ctermfg=244 ctermbg=232 cterm=bold + hi VisualNOS ctermbg=238 + hi Visual ctermbg=235 + hi WarningMsg ctermfg=231 ctermbg=238 cterm=bold + hi WildMenu ctermfg=81 ctermbg=16 + + hi Comment ctermfg=59 + hi CursorColumn ctermbg=236 + hi ColorColumn ctermbg=236 + hi LineNr ctermfg=250 ctermbg=236 + hi NonText ctermfg=59 + + hi SpecialKey ctermfg=59 + + if exists("g:rehash256") && g:rehash256 == 1 + hi Normal ctermfg=252 ctermbg=234 + hi CursorLine ctermbg=236 cterm=none + hi CursorLineNr ctermfg=208 cterm=none + + hi Boolean ctermfg=141 + hi Character ctermfg=222 + hi Number ctermfg=141 + hi String ctermfg=222 + hi Conditional ctermfg=197 cterm=bold + hi Constant ctermfg=141 cterm=bold + + hi DiffDelete ctermfg=125 ctermbg=233 + + hi Directory ctermfg=154 cterm=bold + hi Error ctermfg=222 ctermbg=233 + hi Exception ctermfg=154 cterm=bold + hi Float ctermfg=141 + hi Function ctermfg=154 + hi Identifier ctermfg=208 + + hi Keyword ctermfg=197 cterm=bold + hi Operator ctermfg=197 + hi PreCondit ctermfg=154 cterm=bold + hi PreProc ctermfg=154 + hi Repeat ctermfg=197 cterm=bold + + hi Statement ctermfg=197 cterm=bold + hi Tag ctermfg=197 + hi Title ctermfg=203 + hi Visual ctermbg=238 + + hi Comment ctermfg=244 + hi LineNr ctermfg=239 ctermbg=235 + hi NonText ctermfg=239 + hi SpecialKey ctermfg=239 + endif +end + +" Must be at the end, because of ctermbg=234 bug. +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark \ No newline at end of file diff --git a/development/config/.vim/colors/monokai_pro.vim b/development/config/.vim/colors/monokai_pro.vim new file mode 100644 index 00000000..f8322e59 --- /dev/null +++ b/development/config/.vim/colors/monokai_pro.vim @@ -0,0 +1,171 @@ +" Vim color file +" Author: Viet Phan +" Colorscheme Name: monokai pro +" Inspired by https://www.monokai.pro/ + +set background=dark +highlight clear + +if exists("syntax_on") + syntax reset +endif + +let g:colors_name = "monokai_pro" + +" Default group +hi Cursor ctermfg=236 ctermbg=231 cterm=NONE guifg=#2d2a2e guibg=#fcfcfa gui=NONE +hi SignColumn ctermfg=NONE ctermbg=237 cterm=NONE guibg=#3a3a3a guifg=NONE guisp=NONE gui=NONE +hi Visual ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#403e41 gui=NONE +hi CursorLine ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#423f42 gui=NONE +hi CursorColumn ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#423f42 gui=NONE +hi ColorColumn ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#423f42 gui=NONE +hi LineNr ctermfg=246 ctermbg=59 cterm=NONE guifg=#959394 guibg=#423f42 gui=NONE +hi VertSplit ctermfg=59 ctermbg=59 cterm=NONE guifg=#696769 guibg=#696769 gui=NONE +hi MatchParen ctermfg=204 ctermbg=NONE cterm=underline guifg=#ff6188 guibg=NONE gui=underline +hi StatusLine ctermfg=231 ctermbg=59 cterm=bold guifg=#fcfcfa guibg=#696769 gui=bold +hi StatusLineNC ctermfg=231 ctermbg=59 cterm=NONE guifg=#fcfcfa guibg=#696769 gui=NONE +hi Pmenu ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi PmenuSel ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#403e41 gui=NONE +hi IncSearch ctermfg=236 ctermbg=221 cterm=NONE guifg=#2d2a2e guibg=#ffd866 gui=NONE +hi Search ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline +hi Directory ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=NONE +hi Folded ctermfg=189 ctermbg=60 cterm=NONE guifg=#d7d7ff guibg=#5f5f87 gui=NONE +hi Normal ctermfg=231 ctermbg=236 cterm=NONE guifg=#fcfcfa guibg=#2d2a2e gui=NONE +hi Boolean ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Character ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Comment ctermfg=59 ctermbg=NONE cterm=NONE guifg=#727072 guibg=NONE gui=italic +hi Conditional ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi Constant ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Define ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi DiffAdd ctermfg=231 ctermbg=64 cterm=bold guifg=#fcfcfa guibg=#47840e gui=bold +hi DiffDelete ctermfg=88 ctermbg=NONE cterm=NONE guifg=#8c0809 guibg=NONE gui=NONE +hi DiffChange ctermfg=231 ctermbg=23 cterm=NONE guifg=#fcfcfa guibg=#273a5b gui=NONE +hi DiffText ctermfg=231 ctermbg=24 cterm=bold guifg=#fcfcfa guibg=#204a87 gui=bold +hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi Float ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Function ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi Identifier ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=italic +hi Keyword ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi Label ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi NonText ctermfg=240 ctermbg=236 cterm=NONE guifg=#5b595c guibg=#2d2a2e gui=NONE +hi Number ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Special ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi Operator ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi PreProc ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi SpecialKey ctermfg=240 ctermbg=59 cterm=NONE guifg=#5b595c guibg=#423f42 gui=NONE +hi Statement ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi StorageClass ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=italic +hi String ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE +hi Tag ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi Title ctermfg=231 ctermbg=NONE cterm=bold guifg=#fcfcfa guibg=NONE gui=bold +hi Todo ctermfg=231 ctermbg=NONE cterm=inverse,bold guifg=#fcfcfa guibg=NONE gui=inverse,bold,italic +hi Type ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=italic +hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline + +" Color for custom group +" hi EndColons ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +" hi link Braces EndColons +" hi link Parens EndColons +" hi link Brackets EndColons +" hi link Arrow EndColons + +" Custom group +" syn match EndColons /[;,]/ +" syn match Braces /[\[\]]/ +" syn match Parens /[()]/ +" syn match Brackets /[{}]/ +" syn match Arrow /->/ + + +" Ruby +hi rubyClass ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi rubyFunction ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi rubyInterpolationDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubySymbol ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi rubyConstant ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=NONE +hi rubyStringDelimiter ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE +hi rubyBlockParameter ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=italic +hi rubyInstanceVariable ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi rubyInclude ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi rubyGlobalVariable ctermfg=231 ctermbg=NONE cterm=NONE guifg=#fcfcfa guibg=NONE gui=NONE +hi rubyRegexp ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE +hi rubyRegexpDelimiter ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE +hi rubyEscape ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi rubyControl ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi rubyClassVariable ctermfg=231 ctermbg=NONE cterm=NONE guifg=#fcfcfa guibg=NONE gui=NONE +hi rubyOperator ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi rubyException ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi rubyKeywordAsMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi rubyPseudoVariable ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=italic +hi rubyRailsUserClass ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=NONE +hi rubyRailsARAssociationMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi rubyRailsARMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi rubyRailsRenderMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi rubyRailsMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi erubyDelimiter ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=NONE +hi erubyComment ctermfg=59 ctermbg=NONE cterm=NONE guifg=#727072 guibg=NONE gui=italic +hi erubyRailsMethod ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE + +" HTML +hi htmlTag ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlEndTag ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlTagName ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlArg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlSpecialChar ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE + + +" XML +hi XmlTagName ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi XmlTag ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi XmlEndTag ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE + +" YAML +hi yamlKey ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi yamlAnchor ctermfg=231 ctermbg=NONE cterm=NONE guifg=#fcfcfa guibg=NONE gui=NONE +hi yamlAlias ctermfg=231 ctermbg=NONE cterm=NONE guifg=#fcfcfa guibg=NONE gui=NONE +hi yamlDocumentHeader ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE + +" CSS +hi cssURL ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=italic +hi cssFunctionName ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi cssColor ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi cssPseudoClassId ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=italic +hi cssClassName ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi cssValueLength ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi cssCommonAttr ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=NONE +hi cssBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi cssUnitDecorators ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE + +" js +hi javaScriptFunction ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=italic +hi javaScriptRailsFunction ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi javaScriptBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsFuncCall ctermfg=150 ctermbg=NONE cterm=NONE guifg=#a9dc76 guibg=NONE gui=NONE +hi jsFunction ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=NONE +hi jsFuncArgs ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=italic +hi jsObjectKey ctermfg=209 ctermbg=NONE cterm=NONE guifg=#fc9867 guibg=NONE gui=italic +hi jsThis ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE +hi jsGlobalObjects ctermfg=116 ctermbg=NONE cterm=NONE guifg=#78dce8 guibg=NONE gui=NONE +hi jsFuncBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsFuncParens ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsParens ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsIfElseBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsRepeatBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsObjectBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsBrackets ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsModuleBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsNoise ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsObjectSeparator ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE +hi jsLabel ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi jsArrowFunction ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE +hi jsUndefined ctermfg=147 ctermbg=NONE cterm=NONE guifg=#ab9df2 guibg=NONE gui=NONE + +" GraphQL +hi graphqlType ctermfg=231 ctermbg=236 cterm=NONE guifg=#fcfcfa guibg=#2d2a2e gui=NONE +hi graphqlName ctermfg=221 ctermbg=NONE cterm=NONE guifg=#ffd866 guibg=NONE gui=NONE +hi graphqlBraces ctermfg=246 ctermbg=NONE cterm=NONE guifg=#939293 guibg=NONE gui=NONE + +" Typescript +hi typescriptImport ctermfg=204 ctermbg=NONE cterm=NONE guifg=#ff6188 guibg=NONE gui=NONE \ No newline at end of file diff --git a/development/config/.vim/scripts.vim b/development/config/.vim/scripts.vim new file mode 100644 index 00000000..e69de29b diff --git a/development/config/.vim/syntax/bind.vim b/development/config/.vim/syntax/bind.vim new file mode 100644 index 00000000..761cad13 --- /dev/null +++ b/development/config/.vim/syntax/bind.vim @@ -0,0 +1,116 @@ +" Vim syntax file +" Language: BIND zone files (RFC 1035) +" Maintainer: Julian Mehnle +" URL: http://www.mehnle.net/source/odds+ends/vim/syntax/ +" Last Change: Thu 2011-07-16 20:42:00 UTC +" +" Based on an earlier version by Вячеслав Горбанев (Slava Gorbanev), with +" heavy modifications. +" +" $Id: bindzone.vim 12 2011-07-16 21:09:57Z julian $ + +" For version 5.x: Clear all syntax items +" For version 6.x: Quit when a syntax file was already loaded +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn case match + +" Directives +syn region zoneRRecord start=/^/ end=/$/ contains=zoneOwnerName,zoneSpecial,zoneTTL,zoneClass,zoneRRType,zoneRRHashType,zoneComment,zoneUnknown + +syn match zoneDirective /^\$ORIGIN\s\+/ nextgroup=zoneOrigin,zoneUnknown +syn match zoneDirective /^\$TTL\s\+/ nextgroup=zoneTTL,zoneUnknown +syn match zoneDirective /^\$INCLUDE\s\+/ nextgroup=zoneText,zoneUnknown +syn match zoneDirective /^\$GENERATE\s/ + +syn match zoneUnknown contained /\S\+/ + +syn match zoneOwnerName contained /^[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\)\@=/ nextgroup=zoneTTL,zoneClass,zoneRRType,zoneRRHashType skipwhite +syn match zoneOrigin contained /[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\|$\)\@=/ +syn match zoneDomain contained /[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\|$\)\@=/ + +syn match zoneSpecial contained /^[@*.]\s/ +syn match zoneOwnerName contained /^\*\.[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\)\@=/ nextgroup=zoneTTL,zoneClass,zoneRRType,zoneRRHashType skipwhite +syn match zoneTTL contained /\s\@<=\d[0-9WwDdHhMmSs]*\(\s\|$\)\@=/ nextgroup=zoneClass,zoneRRType,zoneRRHashType skipwhite +syn keyword zoneClass contained IN CHAOS nextgroup=zoneRRType,zoneRRHashType,zoneTTL skipwhite +syn keyword zoneRRType contained A AAAA A6 CAA CERT CNAME DNAME HINFO LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR RRSIG SOA SPF SRV TXT nextgroup=zoneRData skipwhite +syn keyword zoneRRHashType contained CERT DNSKEY DS IPSECKEY SSHFP TLSA nextgroup=zoneRHashData skipwhite +syn match zoneRData contained /[^;]*/ contains=zoneDomain,zoneIPAddr,zoneIP6Addr,zoneText,zoneNumber,zoneParen,zoneUnknown +syn match zoneRHashData contained /[^;]*/ contains=zoneHash,zoneUnknown +syn match zoneHash contained /\S\+/ + +syn match zoneIPAddr contained /\<[0-9]\{1,3}\(\.[0-9]\{1,3}\)\{,3}\>/ + +" Plain IPv6 address IPv6-embedded-IPv4 address +" 1111:2:3:4:5:6:7:8 1111:2:3:4:5:6:127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{6}\(\x\{1,4}:\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" ::[...:]8 ::[...:]127.0.0.1 +syn match zoneIP6Addr contained /\s\@<=::\(\(\x\{1,4}:\)\{,6}\x\{1,4}\|\(\x\{1,4}:\)\{,5}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111::[...:]8 1111::[...:]127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{1}:\(\(\x\{1,4}:\)\{,5}\x\{1,4}\|\(\x\{1,4}:\)\{,4}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111:2::[...:]8 1111:2::[...:]127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{2}:\(\(\x\{1,4}:\)\{,4}\x\{1,4}\|\(\x\{1,4}:\)\{,3}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111:2:3::[...:]8 1111:2:3::[...:]127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{3}:\(\(\x\{1,4}:\)\{,3}\x\{1,4}\|\(\x\{1,4}:\)\{,2}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111:2:3:4::[...:]8 1111:2:3:4::[...:]127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{4}:\(\(\x\{1,4}:\)\{,2}\x\{1,4}\|\(\x\{1,4}:\)\{,1}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111:2:3:4:5::[...:]8 1111:2:3:4:5::127.0.0.1 +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{5}:\(\(\x\{1,4}:\)\{,1}\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/ +" 1111:2:3:4:5:6::8 - +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{6}:\x\{1,4}\>/ +" 1111[:...]:: - +syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{1,7}:\(\s\|;\|$\)\@=/ + +syn match zoneText contained /"\([^"\\]\|\\.\)*"\(\s\|;\|$\)\@=/ +syn match zoneNumber contained /\<[0-9]\+\(\s\|;\|$\)\@=/ +syn match zoneSerial contained /\<[0-9]\{9,10}\(\s\|;\|$\)\@=/ + +syn match zoneErrParen /)/ +syn region zoneParen contained start="(" end=")" contains=zoneSerial,zoneTTL,zoneNumber,zoneComment +syn match zoneComment /;.*/ + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_bind_zone_syn_inits") + if version < 508 + let did_bind_zone_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink zoneDirective Macro + + HiLink zoneUnknown Error + + HiLink zoneOrigin Statement + HiLink zoneOwnerName Statement + HiLink zoneDomain Identifier + + HiLink zoneSpecial Special + HiLink zoneTTL Constant + HiLink zoneClass Include + HiLink zoneHash String + HiLink zoneRRType Type + HiLink zoneRRHashType Type + + HiLink zoneIPAddr Number + HiLink zoneIP6Addr Number + HiLink zoneText String + HiLink zoneNumber Number + HiLink zoneSerial Special + + HiLink zoneErrParen Error + HiLink zoneComment Comment + + delcommand HiLink +endif + +let b:current_syntax = "bindzone" + +" vim:sts=2 sw=2 diff --git a/development/config/.vim/syntax/json.vim b/development/config/.vim/syntax/json.vim new file mode 100644 index 00000000..3862b57e --- /dev/null +++ b/development/config/.vim/syntax/json.vim @@ -0,0 +1,143 @@ +" Vim syntax file +" Language: JSON +" Maintainer: Eli Parra +" Last Change: 2014 Aug 23 +" Version: 0.12 + +if !exists("main_syntax") + if version < 600 + syntax clear + elseif exists("b:current_syntax") + finish + endif + let main_syntax = 'json' +endif + +syntax match jsonNoise /\%(:\|,\)/ + +" NOTE that for the concealing to work your conceallevel should be set to 2 + +" Syntax: Strings +" Separated into a match and region because a region by itself is always greedy +syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString +if has('conceal') + syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ concealends contains=jsonEscape contained +else + syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=jsonEscape contained +endif + +" Syntax: JSON does not allow strings with single quotes, unlike JavaScript. +syn region jsonStringSQError oneline start=+'+ skip=+\\\\\|\\"+ end=+'+ + +" Syntax: JSON Keywords +" Separated into a match and region because a region by itself is always greedy +syn match jsonKeywordMatch /"\([^"]\|\\\"\)\+"[[:blank:]\r\n]*\:/ contains=jsonKeyword +if has('conceal') + syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ concealends contained +else + syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ contained +endif + +" Syntax: Escape sequences +syn match jsonEscape "\\["\\/bfnrt]" contained +syn match jsonEscape "\\u\x\{4}" contained + +" Syntax: Numbers +syn match jsonNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>\ze[[:blank:]\r\n]*[,}\]]" + +" ERROR WARNINGS ********************************************** +if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1) + " Syntax: Strings should always be enclosed with quotes. + syn match jsonNoQuotesError "\<[[:alpha:]][[:alnum:]]*\>" + syn match jsonTripleQuotesError /"""/ + + " Syntax: An integer part of 0 followed by other digits is not allowed. + syn match jsonNumError "-\=\<0\d\.\d*\>" + + " Syntax: Decimals smaller than one should begin with 0 (so .1 should be 0.1). + syn match jsonNumError "\:\@<=[[:blank:]\r\n]*\zs\.\d\+" + + " Syntax: No comments in JSON, see http://stackoverflow.com/questions/244777/can-i-comment-a-json-file + syn match jsonCommentError "//.*" + syn match jsonCommentError "\(/\*\)\|\(\*/\)" + + " Syntax: No semicolons in JSON + syn match jsonSemicolonError ";" + + " Syntax: No trailing comma after the last element of arrays or objects + syn match jsonTrailingCommaError ",\_s*[}\]]" + + " Syntax: Watch out for missing commas between elements + syn match jsonMissingCommaError /\("\|\]\|\d\)\zs\_s\+\ze"/ + syn match jsonMissingCommaError /\(\]\|\}\)\_s\+\ze"/ "arrays/objects as values + syn match jsonMissingCommaError /}\_s\+\ze{/ "objects as elements in an array + syn match jsonMissingCommaError /\(true\|false\)\_s\+\ze"/ "true/false as value +endif + +" ********************************************** END OF ERROR WARNINGS +" Allowances for JSONP: function call at the beginning of the file, +" parenthesis and semicolon at the end. +" Function name validation based on +" http://stackoverflow.com/questions/2008279/validate-a-javascript-function-name/2008444#2008444 +syn match jsonPadding "\%^[[:blank:]\r\n]*[_$[:alpha:]][_$[:alnum:]]*[[:blank:]\r\n]*(" +syn match jsonPadding ");[[:blank:]\r\n]*\%$" + +" Syntax: Boolean +syn match jsonBoolean /\(true\|false\)\(\_s\+\ze"\)\@!/ + +" Syntax: Null +syn keyword jsonNull null + +" Syntax: Braces +syn region jsonFold matchgroup=jsonBraces start="{" end=/}\(\_s\+\ze\("\|{\)\)\@!/ transparent fold +syn region jsonFold matchgroup=jsonBraces start="\[" end=/]\(\_s\+\ze"\)\@!/ transparent fold + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_json_syn_inits") + if version < 508 + let did_json_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + HiLink jsonPadding Operator + HiLink jsonString String + HiLink jsonTest Label + HiLink jsonEscape Special + HiLink jsonNumber Number + HiLink jsonBraces Delimiter + HiLink jsonNull Function + HiLink jsonBoolean Boolean + HiLink jsonKeyword Label + + if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1) + HiLink jsonNumError Error + HiLink jsonCommentError Error + HiLink jsonSemicolonError Error + HiLink jsonTrailingCommaError Error + HiLink jsonMissingCommaError Error + HiLink jsonStringSQError Error + HiLink jsonNoQuotesError Error + HiLink jsonTripleQuotesError Error + endif + HiLink jsonQuote Quote + HiLink jsonNoise Noise + delcommand HiLink +endif + +let b:current_syntax = "json" +if main_syntax == 'json' + unlet main_syntax +endif + +" Vim settings +" vim: ts=8 fdm=marker + +" MIT License +" Copyright © 2013, Jeroen Ruigrok van der Werven, Eli Parra +"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +"THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +"See https://twitter.com/elzr/status/294964017926119424 diff --git a/development/config/.vim/syntax/nginx.vim b/development/config/.vim/syntax/nginx.vim new file mode 100644 index 00000000..c8cccb94 --- /dev/null +++ b/development/config/.vim/syntax/nginx.vim @@ -0,0 +1,664 @@ +" Vim syntax file +" Language: nginx.conf + +if exists("b:current_syntax") + finish +end + +setlocal iskeyword+=. +setlocal iskeyword+=/ +setlocal iskeyword+=: + +syn match ngxVariable '\$\w\w*' +syn match ngxVariableBlock '\$\w\w*' contained +syn match ngxVariableString '\$\w\w*' contained +syn region ngxBlock start=+^+ end=+{+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline +syn region ngxString start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=ngxVariableString oneline +syn region ngxString start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=ngxVariableString oneline +syn match ngxComment '\s*#.*$' + +syn keyword ngxBoolean on +syn keyword ngxBoolean off + +syn keyword ngxDirectiveBlock http contained +syn keyword ngxDirectiveBlock mail contained +syn keyword ngxDirectiveBlock events contained +syn keyword ngxDirectiveBlock server contained +syn keyword ngxDirectiveBlock types contained +syn keyword ngxDirectiveBlock location contained +syn keyword ngxDirectiveBlock upstream contained +syn keyword ngxDirectiveBlock charset_map contained +syn keyword ngxDirectiveBlock limit_except contained +syn keyword ngxDirectiveBlock if contained +syn keyword ngxDirectiveBlock geo contained +syn keyword ngxDirectiveBlock map contained + +syn keyword ngxDirectiveImportant include +syn keyword ngxDirectiveImportant root +syn keyword ngxDirectiveImportant server +syn keyword ngxDirectiveImportant server_name +syn keyword ngxDirectiveImportant listen +syn keyword ngxDirectiveImportant internal +syn keyword ngxDirectiveImportant proxy_pass +syn keyword ngxDirectiveImportant memcached_pass +syn keyword ngxDirectiveImportant fastcgi_pass +syn keyword ngxDirectiveImportant try_files + +syn keyword ngxDirectiveControl break +syn keyword ngxDirectiveControl return +syn keyword ngxDirectiveControl rewrite +syn keyword ngxDirectiveControl set + +syn keyword ngxDirectiveError error_page +syn keyword ngxDirectiveError post_action + +syn keyword ngxDirectiveDeprecated connections +syn keyword ngxDirectiveDeprecated imap +syn keyword ngxDirectiveDeprecated open_file_cache_retest +syn keyword ngxDirectiveDeprecated optimize_server_names +syn keyword ngxDirectiveDeprecated satisfy_any + +syn keyword ngxDirective accept_mutex +syn keyword ngxDirective accept_mutex_delay +syn keyword ngxDirective access_log +syn keyword ngxDirective add_after_body +syn keyword ngxDirective add_before_body +syn keyword ngxDirective add_header +syn keyword ngxDirective addition_types +syn keyword ngxDirective aio +syn keyword ngxDirective alias +syn keyword ngxDirective allow +syn keyword ngxDirective ancient_browser +syn keyword ngxDirective ancient_browser_value +syn keyword ngxDirective auth_basic +syn keyword ngxDirective auth_basic_user_file +syn keyword ngxDirective auth_http +syn keyword ngxDirective auth_http_header +syn keyword ngxDirective auth_http_timeout +syn keyword ngxDirective autoindex +syn keyword ngxDirective autoindex_exact_size +syn keyword ngxDirective autoindex_localtime +syn keyword ngxDirective charset +syn keyword ngxDirective charset_types +syn keyword ngxDirective client_body_buffer_size +syn keyword ngxDirective client_body_in_file_only +syn keyword ngxDirective client_body_in_single_buffer +syn keyword ngxDirective client_body_temp_path +syn keyword ngxDirective client_body_timeout +syn keyword ngxDirective client_header_buffer_size +syn keyword ngxDirective client_header_timeout +syn keyword ngxDirective client_max_body_size +syn keyword ngxDirective connection_pool_size +syn keyword ngxDirective create_full_put_path +syn keyword ngxDirective daemon +syn keyword ngxDirective dav_access +syn keyword ngxDirective dav_methods +syn keyword ngxDirective debug_connection +syn keyword ngxDirective debug_points +syn keyword ngxDirective default_type +syn keyword ngxDirective degradation +syn keyword ngxDirective degrade +syn keyword ngxDirective deny +syn keyword ngxDirective devpoll_changes +syn keyword ngxDirective devpoll_events +syn keyword ngxDirective directio +syn keyword ngxDirective directio_alignment +syn keyword ngxDirective empty_gif +syn keyword ngxDirective env +syn keyword ngxDirective epoll_events +syn keyword ngxDirective error_log +syn keyword ngxDirective eventport_events +syn keyword ngxDirective expires +syn keyword ngxDirective fastcgi_bind +syn keyword ngxDirective fastcgi_buffer_size +syn keyword ngxDirective fastcgi_buffers +syn keyword ngxDirective fastcgi_busy_buffers_size +syn keyword ngxDirective fastcgi_cache +syn keyword ngxDirective fastcgi_cache_key +syn keyword ngxDirective fastcgi_cache_methods +syn keyword ngxDirective fastcgi_cache_min_uses +syn keyword ngxDirective fastcgi_cache_path +syn keyword ngxDirective fastcgi_cache_use_stale +syn keyword ngxDirective fastcgi_cache_valid +syn keyword ngxDirective fastcgi_catch_stderr +syn keyword ngxDirective fastcgi_connect_timeout +syn keyword ngxDirective fastcgi_hide_header +syn keyword ngxDirective fastcgi_ignore_client_abort +syn keyword ngxDirective fastcgi_ignore_headers +syn keyword ngxDirective fastcgi_index +syn keyword ngxDirective fastcgi_intercept_errors +syn keyword ngxDirective fastcgi_max_temp_file_size +syn keyword ngxDirective fastcgi_next_upstream +syn keyword ngxDirective fastcgi_param +syn keyword ngxDirective fastcgi_pass_header +syn keyword ngxDirective fastcgi_pass_request_body +syn keyword ngxDirective fastcgi_pass_request_headers +syn keyword ngxDirective fastcgi_read_timeout +syn keyword ngxDirective fastcgi_send_lowat +syn keyword ngxDirective fastcgi_send_timeout +syn keyword ngxDirective fastcgi_split_path_info +syn keyword ngxDirective fastcgi_store +syn keyword ngxDirective fastcgi_store_access +syn keyword ngxDirective fastcgi_temp_file_write_size +syn keyword ngxDirective fastcgi_temp_path +syn keyword ngxDirective fastcgi_upstream_fail_timeout +syn keyword ngxDirective fastcgi_upstream_max_fails +syn keyword ngxDirective flv +syn keyword ngxDirective geoip_city +syn keyword ngxDirective geoip_country +syn keyword ngxDirective google_perftools_profiles +syn keyword ngxDirective gzip +syn keyword ngxDirective gzip_buffers +syn keyword ngxDirective gzip_comp_level +syn keyword ngxDirective gzip_disable +syn keyword ngxDirective gzip_hash +syn keyword ngxDirective gzip_http_version +syn keyword ngxDirective gzip_min_length +syn keyword ngxDirective gzip_no_buffer +syn keyword ngxDirective gzip_proxied +syn keyword ngxDirective gzip_static +syn keyword ngxDirective gzip_types +syn keyword ngxDirective gzip_vary +syn keyword ngxDirective gzip_window +syn keyword ngxDirective if_modified_since +syn keyword ngxDirective ignore_invalid_headers +syn keyword ngxDirective image_filter +syn keyword ngxDirective image_filter_buffer +syn keyword ngxDirective image_filter_jpeg_quality +syn keyword ngxDirective image_filter_transparency +syn keyword ngxDirective imap_auth +syn keyword ngxDirective imap_capabilities +syn keyword ngxDirective imap_client_buffer +syn keyword ngxDirective index +syn keyword ngxDirective ip_hash +syn keyword ngxDirective keepalive_requests +syn keyword ngxDirective keepalive_timeout +syn keyword ngxDirective kqueue_changes +syn keyword ngxDirective kqueue_events +syn keyword ngxDirective large_client_header_buffers +syn keyword ngxDirective limit_conn +syn keyword ngxDirective limit_conn_log_level +syn keyword ngxDirective limit_rate +syn keyword ngxDirective limit_rate_after +syn keyword ngxDirective limit_req +syn keyword ngxDirective limit_req_log_level +syn keyword ngxDirective limit_req_zone +syn keyword ngxDirective limit_zone +syn keyword ngxDirective lingering_time +syn keyword ngxDirective lingering_timeout +syn keyword ngxDirective lock_file +syn keyword ngxDirective log_format +syn keyword ngxDirective log_not_found +syn keyword ngxDirective log_subrequest +syn keyword ngxDirective map_hash_bucket_size +syn keyword ngxDirective map_hash_max_size +syn keyword ngxDirective master_process +syn keyword ngxDirective memcached_bind +syn keyword ngxDirective memcached_buffer_size +syn keyword ngxDirective memcached_connect_timeout +syn keyword ngxDirective memcached_next_upstream +syn keyword ngxDirective memcached_read_timeout +syn keyword ngxDirective memcached_send_timeout +syn keyword ngxDirective memcached_upstream_fail_timeout +syn keyword ngxDirective memcached_upstream_max_fails +syn keyword ngxDirective merge_slashes +syn keyword ngxDirective min_delete_depth +syn keyword ngxDirective modern_browser +syn keyword ngxDirective modern_browser_value +syn keyword ngxDirective msie_padding +syn keyword ngxDirective msie_refresh +syn keyword ngxDirective multi_accept +syn keyword ngxDirective open_file_cache +syn keyword ngxDirective open_file_cache_errors +syn keyword ngxDirective open_file_cache_events +syn keyword ngxDirective open_file_cache_min_uses +syn keyword ngxDirective open_file_cache_valid +syn keyword ngxDirective open_log_file_cache +syn keyword ngxDirective output_buffers +syn keyword ngxDirective override_charset +syn keyword ngxDirective perl +syn keyword ngxDirective perl_modules +syn keyword ngxDirective perl_require +syn keyword ngxDirective perl_set +syn keyword ngxDirective pid +syn keyword ngxDirective pop3_auth +syn keyword ngxDirective pop3_capabilities +syn keyword ngxDirective port_in_redirect +syn keyword ngxDirective postpone_gzipping +syn keyword ngxDirective postpone_output +syn keyword ngxDirective protocol +syn keyword ngxDirective proxy +syn keyword ngxDirective proxy_bind +syn keyword ngxDirective proxy_buffer +syn keyword ngxDirective proxy_buffer_size +syn keyword ngxDirective proxy_buffering +syn keyword ngxDirective proxy_buffers +syn keyword ngxDirective proxy_busy_buffers_size +syn keyword ngxDirective proxy_cache +syn keyword ngxDirective proxy_cache_key +syn keyword ngxDirective proxy_cache_methods +syn keyword ngxDirective proxy_cache_min_uses +syn keyword ngxDirective proxy_cache_path +syn keyword ngxDirective proxy_cache_use_stale +syn keyword ngxDirective proxy_cache_valid +syn keyword ngxDirective proxy_connect_timeout +syn keyword ngxDirective proxy_headers_hash_bucket_size +syn keyword ngxDirective proxy_headers_hash_max_size +syn keyword ngxDirective proxy_hide_header +syn keyword ngxDirective proxy_ignore_client_abort +syn keyword ngxDirective proxy_ignore_headers +syn keyword ngxDirective proxy_intercept_errors +syn keyword ngxDirective proxy_max_temp_file_size +syn keyword ngxDirective proxy_method +syn keyword ngxDirective proxy_next_upstream +syn keyword ngxDirective proxy_pass_error_message +syn keyword ngxDirective proxy_pass_header +syn keyword ngxDirective proxy_pass_request_body +syn keyword ngxDirective proxy_pass_request_headers +syn keyword ngxDirective proxy_read_timeout +syn keyword ngxDirective proxy_redirect +syn keyword ngxDirective proxy_send_lowat +syn keyword ngxDirective proxy_send_timeout +syn keyword ngxDirective proxy_set_body +syn keyword ngxDirective proxy_set_header +syn keyword ngxDirective proxy_ssl_session_reuse +syn keyword ngxDirective proxy_store +syn keyword ngxDirective proxy_store_access +syn keyword ngxDirective proxy_temp_file_write_size +syn keyword ngxDirective proxy_temp_path +syn keyword ngxDirective proxy_timeout +syn keyword ngxDirective proxy_upstream_fail_timeout +syn keyword ngxDirective proxy_upstream_max_fails +syn keyword ngxDirective random_index +syn keyword ngxDirective read_ahead +syn keyword ngxDirective real_ip_header +syn keyword ngxDirective recursive_error_pages +syn keyword ngxDirective request_pool_size +syn keyword ngxDirective reset_timedout_connection +syn keyword ngxDirective resolver +syn keyword ngxDirective resolver_timeout +syn keyword ngxDirective rewrite_log +syn keyword ngxDirective rtsig_overflow_events +syn keyword ngxDirective rtsig_overflow_test +syn keyword ngxDirective rtsig_overflow_threshold +syn keyword ngxDirective rtsig_signo +syn keyword ngxDirective satisfy +syn keyword ngxDirective secure_link_secret +syn keyword ngxDirective send_lowat +syn keyword ngxDirective send_timeout +syn keyword ngxDirective sendfile +syn keyword ngxDirective sendfile_max_chunk +syn keyword ngxDirective server_name_in_redirect +syn keyword ngxDirective server_names_hash_bucket_size +syn keyword ngxDirective server_names_hash_max_size +syn keyword ngxDirective server_tokens +syn keyword ngxDirective set_real_ip_from +syn keyword ngxDirective smtp_auth +syn keyword ngxDirective smtp_capabilities +syn keyword ngxDirective smtp_client_buffer +syn keyword ngxDirective smtp_greeting_delay +syn keyword ngxDirective so_keepalive +syn keyword ngxDirective source_charset +syn keyword ngxDirective ssi +syn keyword ngxDirective ssi_ignore_recycled_buffers +syn keyword ngxDirective ssi_min_file_chunk +syn keyword ngxDirective ssi_silent_errors +syn keyword ngxDirective ssi_types +syn keyword ngxDirective ssi_value_length +syn keyword ngxDirective ssl +syn keyword ngxDirective ssl_certificate +syn keyword ngxDirective ssl_certificate_key +syn keyword ngxDirective ssl_ciphers +syn keyword ngxDirective ssl_client_certificate +syn keyword ngxDirective ssl_crl +syn keyword ngxDirective ssl_dhparam +syn keyword ngxDirective ssl_engine +syn keyword ngxDirective ssl_prefer_server_ciphers +syn keyword ngxDirective ssl_protocols +syn keyword ngxDirective ssl_session_cache +syn keyword ngxDirective ssl_session_timeout +syn keyword ngxDirective ssl_verify_client +syn keyword ngxDirective ssl_verify_depth +syn keyword ngxDirective starttls +syn keyword ngxDirective stub_status +syn keyword ngxDirective sub_filter +syn keyword ngxDirective sub_filter_once +syn keyword ngxDirective sub_filter_types +syn keyword ngxDirective tcp_nodelay +syn keyword ngxDirective tcp_nopush +syn keyword ngxDirective thread_stack_size +syn keyword ngxDirective timeout +syn keyword ngxDirective timer_resolution +syn keyword ngxDirective types_hash_bucket_size +syn keyword ngxDirective types_hash_max_size +syn keyword ngxDirective underscores_in_headers +syn keyword ngxDirective uninitialized_variable_warn +syn keyword ngxDirective use +syn keyword ngxDirective user +syn keyword ngxDirective userid +syn keyword ngxDirective userid_domain +syn keyword ngxDirective userid_expires +syn keyword ngxDirective userid_mark +syn keyword ngxDirective userid_name +syn keyword ngxDirective userid_p3p +syn keyword ngxDirective userid_path +syn keyword ngxDirective userid_service +syn keyword ngxDirective valid_referers +syn keyword ngxDirective variables_hash_bucket_size +syn keyword ngxDirective variables_hash_max_size +syn keyword ngxDirective worker_connections +syn keyword ngxDirective worker_cpu_affinity +syn keyword ngxDirective worker_priority +syn keyword ngxDirective worker_processes +syn keyword ngxDirective worker_rlimit_core +syn keyword ngxDirective worker_rlimit_nofile +syn keyword ngxDirective worker_rlimit_sigpending +syn keyword ngxDirective worker_threads +syn keyword ngxDirective working_directory +syn keyword ngxDirective xclient +syn keyword ngxDirective xml_entities +syn keyword ngxDirective xslt_stylesheet +syn keyword ngxDirective xslt_types + +" 3rd party module list: +" http://wiki.nginx.org/Nginx3rdPartyModules + +" Accept Language Module +" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales. +syn keyword ngxDirectiveThirdParty set_from_accept_language + +" Access Key Module +" Denies access unless the request URL contains an access key. +syn keyword ngxDirectiveThirdParty accesskey +syn keyword ngxDirectiveThirdParty accesskey_arg +syn keyword ngxDirectiveThirdParty accesskey_hashmethod +syn keyword ngxDirectiveThirdParty accesskey_signature + +" Auth PAM Module +" HTTP Basic Authentication using PAM. +syn keyword ngxDirectiveThirdParty auth_pam +syn keyword ngxDirectiveThirdParty auth_pam_service_name + +" Cache Purge Module +" Module adding ability to purge content from FastCGI and proxy caches. +syn keyword ngxDirectiveThirdParty fastcgi_cache_purge +syn keyword ngxDirectiveThirdParty proxy_cache_purge + +" Chunkin Module +" HTTP 1.1 chunked-encoding request body support for Nginx. +syn keyword ngxDirectiveThirdParty chunkin +syn keyword ngxDirectiveThirdParty chunkin_keepalive +syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf +syn keyword ngxDirectiveThirdParty chunkin_resume + +" Circle GIF Module +" Generates simple circle images with the colors and size specified in the URL. +syn keyword ngxDirectiveThirdParty circle_gif +syn keyword ngxDirectiveThirdParty circle_gif_max_radius +syn keyword ngxDirectiveThirdParty circle_gif_min_radius +syn keyword ngxDirectiveThirdParty circle_gif_step_radius + +" Drizzle Module +" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle. +syn keyword ngxDirectiveThirdParty drizzle_connect_timeout +syn keyword ngxDirectiveThirdParty drizzle_dbname +syn keyword ngxDirectiveThirdParty drizzle_keepalive +syn keyword ngxDirectiveThirdParty drizzle_module_header +syn keyword ngxDirectiveThirdParty drizzle_pass +syn keyword ngxDirectiveThirdParty drizzle_query +syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout +syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout +syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout +syn keyword ngxDirectiveThirdParty drizzle_server + +" Echo Module +" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file. +syn keyword ngxDirectiveThirdParty echo +syn keyword ngxDirectiveThirdParty echo_after_body +syn keyword ngxDirectiveThirdParty echo_before_body +syn keyword ngxDirectiveThirdParty echo_blocking_sleep +syn keyword ngxDirectiveThirdParty echo_duplicate +syn keyword ngxDirectiveThirdParty echo_end +syn keyword ngxDirectiveThirdParty echo_exec +syn keyword ngxDirectiveThirdParty echo_flush +syn keyword ngxDirectiveThirdParty echo_foreach_split +syn keyword ngxDirectiveThirdParty echo_location +syn keyword ngxDirectiveThirdParty echo_location_async +syn keyword ngxDirectiveThirdParty echo_read_request_body +syn keyword ngxDirectiveThirdParty echo_request_body +syn keyword ngxDirectiveThirdParty echo_reset_timer +syn keyword ngxDirectiveThirdParty echo_sleep +syn keyword ngxDirectiveThirdParty echo_subrequest +syn keyword ngxDirectiveThirdParty echo_subrequest_async + +" Events Module +" Privides options for start/stop events. +syn keyword ngxDirectiveThirdParty on_start +syn keyword ngxDirectiveThirdParty on_stop + +" EY Balancer Module +" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream. +syn keyword ngxDirectiveThirdParty max_connections +syn keyword ngxDirectiveThirdParty max_connections_max_queue_length +syn keyword ngxDirectiveThirdParty max_connections_queue_timeout + +" Fancy Indexes Module +" Like the built-in autoindex module, but fancier. +syn keyword ngxDirectiveThirdParty fancyindex +syn keyword ngxDirectiveThirdParty fancyindex_exact_size +syn keyword ngxDirectiveThirdParty fancyindex_footer +syn keyword ngxDirectiveThirdParty fancyindex_header +syn keyword ngxDirectiveThirdParty fancyindex_localtime +syn keyword ngxDirectiveThirdParty fancyindex_readme +syn keyword ngxDirectiveThirdParty fancyindex_readme_mode + +" GeoIP Module (DEPRECATED) +" Country code lookups via the MaxMind GeoIP API. +syn keyword ngxDirectiveThirdParty geoip_country_file + +" Headers More Module +" Set and clear input and output headers...more than "add"! +syn keyword ngxDirectiveThirdParty more_clear_headers +syn keyword ngxDirectiveThirdParty more_clear_input_headers +syn keyword ngxDirectiveThirdParty more_set_headers +syn keyword ngxDirectiveThirdParty more_set_input_headers + +" HTTP Push Module +" Turn Nginx into an adept long-polling HTTP Push (Comet) server. +syn keyword ngxDirectiveThirdParty push_buffer_size +syn keyword ngxDirectiveThirdParty push_listener +syn keyword ngxDirectiveThirdParty push_message_timeout +syn keyword ngxDirectiveThirdParty push_queue_messages +syn keyword ngxDirectiveThirdParty push_sender + +" HTTP Redis Module > +" Redis support.> +syn keyword ngxDirectiveThirdParty redis_bind +syn keyword ngxDirectiveThirdParty redis_buffer_size +syn keyword ngxDirectiveThirdParty redis_connect_timeout +syn keyword ngxDirectiveThirdParty redis_next_upstream +syn keyword ngxDirectiveThirdParty redis_pass +syn keyword ngxDirectiveThirdParty redis_read_timeout +syn keyword ngxDirectiveThirdParty redis_send_timeout + +" HTTP JavaScript Module +" Embedding SpiderMonkey. Nearly full port on Perl module. +syn keyword ngxDirectiveThirdParty js +syn keyword ngxDirectiveThirdParty js_filter +syn keyword ngxDirectiveThirdParty js_filter_types +syn keyword ngxDirectiveThirdParty js_load +syn keyword ngxDirectiveThirdParty js_maxmem +syn keyword ngxDirectiveThirdParty js_require +syn keyword ngxDirectiveThirdParty js_set +syn keyword ngxDirectiveThirdParty js_utf8 + +" Log Request Speed +" Log the time it took to process each request. +syn keyword ngxDirectiveThirdParty log_request_speed_filter +syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout + +" Memc Module +" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands. +syn keyword ngxDirectiveThirdParty memc_buffer_size +syn keyword ngxDirectiveThirdParty memc_cmds_allowed +syn keyword ngxDirectiveThirdParty memc_connect_timeout +syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified +syn keyword ngxDirectiveThirdParty memc_next_upstream +syn keyword ngxDirectiveThirdParty memc_pass +syn keyword ngxDirectiveThirdParty memc_read_timeout +syn keyword ngxDirectiveThirdParty memc_send_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout +syn keyword ngxDirectiveThirdParty memc_upstream_max_fails + +" Mogilefs Module +" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS. +syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout +syn keyword ngxDirectiveThirdParty mogilefs_domain +syn keyword ngxDirectiveThirdParty mogilefs_methods +syn keyword ngxDirectiveThirdParty mogilefs_noverify +syn keyword ngxDirectiveThirdParty mogilefs_pass +syn keyword ngxDirectiveThirdParty mogilefs_read_timeout +syn keyword ngxDirectiveThirdParty mogilefs_send_timeout +syn keyword ngxDirectiveThirdParty mogilefs_tracker + +" MP4 Streaming Lite Module +" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL. +syn keyword ngxDirectiveThirdParty mp4 + +" Nginx Notice Module +" Serve static file to POST requests. +syn keyword ngxDirectiveThirdParty notice +syn keyword ngxDirectiveThirdParty notice_type + +" Phusion Passenger +" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers. +syn keyword ngxDirectiveThirdParty passenger_base_uri +syn keyword ngxDirectiveThirdParty passenger_default_user +syn keyword ngxDirectiveThirdParty passenger_enabled +syn keyword ngxDirectiveThirdParty passenger_log_level +syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app +syn keyword ngxDirectiveThirdParty passenger_max_pool_size +syn keyword ngxDirectiveThirdParty passenger_pool_idle_time +syn keyword ngxDirectiveThirdParty passenger_root +syn keyword ngxDirectiveThirdParty passenger_ruby +syn keyword ngxDirectiveThirdParty passenger_use_global_queue +syn keyword ngxDirectiveThirdParty passenger_user_switching +syn keyword ngxDirectiveThirdParty rack_env +syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_env +syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time +syn keyword ngxDirectiveThirdParty rails_spawn_method + +" RDS JSON Module +" Help ngx_drizzle and other DBD modules emit JSON data. +syn keyword ngxDirectiveThirdParty rds_json +syn keyword ngxDirectiveThirdParty rds_json_content_type +syn keyword ngxDirectiveThirdParty rds_json_format +syn keyword ngxDirectiveThirdParty rds_json_ret + +" RRD Graph Module +" This module provides an HTTP interface to RRDtool's graphing facilities. +syn keyword ngxDirectiveThirdParty rrd_graph +syn keyword ngxDirectiveThirdParty rrd_graph_root + +" Secure Download +" Create expiring links. +syn keyword ngxDirectiveThirdParty secure_download +syn keyword ngxDirectiveThirdParty secure_download_fail_location +syn keyword ngxDirectiveThirdParty secure_download_path_mode +syn keyword ngxDirectiveThirdParty secure_download_secret + +" SlowFS Cache Module +" Module adding ability to cache static files. +syn keyword ngxDirectiveThirdParty slowfs_big_file_size +syn keyword ngxDirectiveThirdParty slowfs_cache +syn keyword ngxDirectiveThirdParty slowfs_cache_key +syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses +syn keyword ngxDirectiveThirdParty slowfs_cache_path +syn keyword ngxDirectiveThirdParty slowfs_cache_purge +syn keyword ngxDirectiveThirdParty slowfs_cache_valid +syn keyword ngxDirectiveThirdParty slowfs_temp_path + +" Strip Module +" Whitespace remover. +syn keyword ngxDirectiveThirdParty strip + +" Substitutions Module +" A filter module which can do both regular expression and fixed string substitutions on response bodies. +syn keyword ngxDirectiveThirdParty subs_filter +syn keyword ngxDirectiveThirdParty subs_filter_types + +" Supervisord Module +" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand. +syn keyword ngxDirectiveThirdParty supervisord +syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status +syn keyword ngxDirectiveThirdParty supervisord_name +syn keyword ngxDirectiveThirdParty supervisord_start +syn keyword ngxDirectiveThirdParty supervisord_stop + +" Upload Module +" Parses multipart/form-data allowing arbitrary handling of uploaded files. +syn keyword ngxDirectiveThirdParty upload_aggregate_form_field +syn keyword ngxDirectiveThirdParty upload_buffer_size +syn keyword ngxDirectiveThirdParty upload_cleanup +syn keyword ngxDirectiveThirdParty upload_limit_rate +syn keyword ngxDirectiveThirdParty upload_max_file_size +syn keyword ngxDirectiveThirdParty upload_max_output_body_len +syn keyword ngxDirectiveThirdParty upload_max_part_header_len +syn keyword ngxDirectiveThirdParty upload_pass +syn keyword ngxDirectiveThirdParty upload_pass_args +syn keyword ngxDirectiveThirdParty upload_pass_form_field +syn keyword ngxDirectiveThirdParty upload_set_form_field +syn keyword ngxDirectiveThirdParty upload_store +syn keyword ngxDirectiveThirdParty upload_store_access + +" Upload Progress Module +" Tracks and reports upload progress. +syn keyword ngxDirectiveThirdParty report_uploads +syn keyword ngxDirectiveThirdParty track_uploads +syn keyword ngxDirectiveThirdParty upload_progress +syn keyword ngxDirectiveThirdParty upload_progress_content_type +syn keyword ngxDirectiveThirdParty upload_progress_header +syn keyword ngxDirectiveThirdParty upload_progress_json_output +syn keyword ngxDirectiveThirdParty upload_progress_template + +" Upstream Fair Balancer +" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin. +syn keyword ngxDirectiveThirdParty fair +syn keyword ngxDirectiveThirdParty upstream_fair_shm_size + +" Upstream Consistent Hash +" Select backend based on Consistent hash ring. +syn keyword ngxDirectiveThirdParty consistent_hash + +" Upstream Hash Module +" Provides simple upstream load distribution by hashing a configurable variable. +syn keyword ngxDirectiveThirdParty hash +syn keyword ngxDirectiveThirdParty hash_again + +" XSS Module +" Native support for cross-site scripting (XSS) in an nginx. +syn keyword ngxDirectiveThirdParty xss_callback_arg +syn keyword ngxDirectiveThirdParty xss_get +syn keyword ngxDirectiveThirdParty xss_input_types +syn keyword ngxDirectiveThirdParty xss_output_type + +" highlight + +hi link ngxComment Comment +hi link ngxVariable Identifier +hi link ngxVariableBlock Identifier +hi link ngxVariableString PreProc +hi link ngxBlock Normal +hi link ngxString String + +hi link ngxBoolean Boolean +hi link ngxDirectiveBlock Statement +hi link ngxDirectiveImportant Type +hi link ngxDirectiveControl Keyword +hi link ngxDirectiveError Constant +hi link ngxDirectiveDeprecated Error +hi link ngxDirective Identifier +hi link ngxDirectiveThirdParty Special + +let b:current_syntax = "nginx" diff --git a/development/config/.vim/syntax/nmap.vim b/development/config/.vim/syntax/nmap.vim new file mode 100644 index 00000000..f8321ab8 --- /dev/null +++ b/development/config/.vim/syntax/nmap.vim @@ -0,0 +1,62 @@ +" Vim syntax file +" Language: nmap file +" Maintainer: Pento +" Last change: 2008 Oct 12 + +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syntax sync fromstart +syn match nmapNewHost "^Nmap scan report for " + +syn keyword nmapStatement PORT STATE SERVICE VERSION TRACEROUTE ADDRESS HOP RTT +syn keyword nmapService http https printer ipp jetdirect afp nfs rendezvous cslistener unknown vnc distinct32 utftp finger ssh snmp smtp pop3 telnet rdp ftp ssl domain msrpc microsoft-ds netbios-ssn echo discard daytime c hange +syn match nmapService "netbios-ssn\|microsoft-ds\|ies-lm\|rpcbind" +syn match nmapComment "#.*$" +syn match nmapPort "\d\+/" +syn keyword nmapPortStatus open filtered closed +syn keyword nmapProto hopopt icmp igmp ggp ip st tcp cbt egp igp bbn-rcc-mon nvp-ii pup argus emcon xnet chaos udp mux dcn-meas hmp prm xns -idp trunk-1 trunk-2 leaf-1 leaf-2 rdp irtp iso-tp4 netblt mfe-nsp merit-inp dccp 3pc idpr xtp ddp idpr-cmtp tp++ il ipv6 sdrp ipv6-route i pv6-frag idrp rsvp gre mhrp bna esp ah i-nlsp swipe narp mobile tlsp skip ipv6-icmp ipv6-nonxt ipv6-opts anyhost cftp anylocalnet sat-expak kryptolan rvd ippc anydistribfs sat-mon visa ipcv cpnx cphb wsn pvp br-sat-mon sun-nd wb-mon wb-expak iso-ip vmtp secure-vmtp vines ttp ns fnet-igp dgp tcf eigrp ospfigp sprite-rpc larp mtp ax.25 ipip micp scc-sp etherip encap anyencrypt gmtp ifmp pnni pim aris scps qnx a/n ipc omp snp compaq-peer ipx-in-ip vrrp pgm any0hop l2tp ddx iatp stp srp uti smp sm ptp isis-ipv4 fire crtp crudp sscopmce iplt sps pipe sctp f c rsvp-e2e-ignore mobility-hdr udplite mpls-in-ip experimental1 experimental2 + +syn match nmapResultField "^MAC Address" +syn match nmapResultField "^Device type" +syn match nmapResultField "^Running" +syn match nmapResultField "^OS CPE" +syn match nmapResultField "^OS details" +syn match nmapResultField "^Uptime guess" +syn match nmapResultField "^Network Distance" +syn match nmapResultField "^TCP Sequence Prediction" +syn match nmapResultField "^IP ID Sequence Generation" +syn match nmapResultField "^Aggressive OS guesses" + +syn match nmapResultValue ": .\+$" + +syn match nmapIP "\d\+\.\d\+\.\d\+\.\d\+" +syn match nmapHostName "[a-zA-Z0-9._-]\+\.[a-zA-Z]\{2,3}" + + +if version >= 508 || !exists("did_nmap_syn_inits") +if version <= 508 + let did_w3af_syn_inits = 1 + command -nargs=+ HiLink hi link +else + command -nargs=+ HiLink hi def link +endif +" The default methods for highlighting. Can be overridden later +HiLink nmapResultField Comment +HiLink nmapResultValue Float +HiLink nmapNewHost Underlined +HiLink nmapStatement Constant +HiLink nmapComment Comment +HiLink nmapPortStatus Function +HiLink nmapProto Special +HiLink nmapIP Underlined +HiLink nmapHostName Underlined +HiLink nmapPort Operator +HiLink nmapService Statement +delcommand HiLink +endif + +let b:current_syntax = 'nmap' diff --git a/development/config/.vimrc b/development/config/.vimrc new file mode 100644 index 00000000..67663fc1 --- /dev/null +++ b/development/config/.vimrc @@ -0,0 +1 @@ +export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES \ No newline at end of file diff --git a/development/config/.vimrc.customizations b/development/config/.vimrc.customizations new file mode 100644 index 00000000..40fbc893 --- /dev/null +++ b/development/config/.vimrc.customizations @@ -0,0 +1,262 @@ +" vim: ft=vim + +" Required for operations modifying multiple buffers like rename. +set hidden + +" note that if you are using Plug mapping you should not use `noremap` mappings. +nmap (lcn-menu) +" Or map each action separately +nmap K (lcn-hover) +nmap gd (lcn-definition) +nmap (lcn-rename) + +let g:airline#extensions#sorbet#auto = 0 +function! MyCustomAirlineInit() abort + let g:airline_section_x = airline#section#create(['filetype', g:airline_symbols.space, 'sorbet']) +endfunction + +au User AirlineAfterInit ++once call MyCustomAirlineInit()" + +let g:codeowners_only_dot_github = 1 + +"let g:user_emmet_install_global = 0 +"autocmd FileType html,css EmmetInstall +"let g:user_emmet_leader_key='' + +" Once vim-javascript is installed you enable flow highlighting +let g:javascript_plugin_flow = 1 + +let g:rigel_airline = 1 +let g:airline_theme = 'powerlineish' + +let g:user_emmet_settings = { + \ 'ruby' : { + \ 'extends' : 'html', + \ 'filters' : 'c', + \ }, + \ 'xml' : { + \ 'extends' : 'html', + \ }, + \ 'haml' : { + \ 'extends' : 'html', + \ }, + \} + + +if executable('fzf') + if executable('ag') + let FZF_DEFAULT_COMMAND='ag -p ~/.gitignore -g ""' + endif + " Remap ctrl-P to execute fzf. + nnoremap :Files + " Show previews with fzf window. + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, fzf#vim#with_preview(), 0) + let g:fzf_layout = { 'down': '~40%' } + nmap :FZF +endif + +" Source custom configs (not under version control). +if filereadable(glob("~/.vimrc.local")) + source ~/.vimrc.local +endif + +let g:eruby_default_subtype = "yaml" + +let g:eruby_extensions = { "js": "javascriptreact", "yaml": "yaml" } + +fun! s:DetectRuby() + if getline(1) =~# '^#!.*\(ruby\|rake\)$' + set ft=ruby + endif +endfun +autocmd BufNewFile,BufRead * call s:DetectRuby() + +fun! s:DetectNode() + if getline(1) =~# '^#!.*node$' + set ft=javascript + endif +endfun +autocmd BufNewFile,BufRead * call s:DetectNode() + +fun! s:DetectBash() + " if getline(1) ~ '#!/usr/bin/env bash|#!/bin/bash|#!/bin/sh|#!/bin/zsh|#!/usr/bin/env sh' + if getline(1) =~# '^#!.*\(bash\|sh\)$' + set ft=bash + endif +endfun +autocmd BufNewFile,BufRead * call s:DetectBash() + +let g:rubycomplete_load_paths = ["./app/classes", "./app/models", "./app/controllers", "./lib", "./lib/tasks", "./spec"] + +set t_Co=256 +set termguicolors + +"colorscheme brogrammer +"colorscheme ayu +"colorscheme molokai +colorscheme monokai_pro + + +" CocVim +" +" May need for Vim (not Neovim) since coc.nvim calculates byte offset by count +" utf-8 byte sequence +set encoding=utf-8 +" Some servers have issues with backup files, see #649 +set nobackup +set nowritebackup + +" Having longer updatetime (default is 4000 ms = 4s) leads to noticeable +" delays and poor user experience +set updatetime=300 + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate +" NOTE: There's always complete item selected by default, you may want to enable +" no select by `"suggest.noselect": true` in your configuration file +" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by +" other plugin before putting this into your config +inoremap + \ coc#pum#visible() ? coc#pum#next(1) : + \ CheckBackspace() ? "\" : + \ coc#refresh() +inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" + +" Make to accept selected completion item or notify coc.nvim to format +" u breaks current undo, please make your own choice +inoremap coc#pum#visible() ? coc#pum#confirm() + \: "\u\\=coc#on_enter()\" + +function! CheckBackspace() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion +if has('nvim') + inoremap coc#refresh() +else + inoremap coc#refresh() +endif + +" Use `[g` and `]g` to navigate diagnostics +" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window +nnoremap K :call ShowDocumentation() + +function! ShowDocumentation() + if CocAction('hasProvider', 'hover') + call CocActionAsync('doHover') + else + call feedkeys('K', 'in') + endif +endfunction + +" Highlight the symbol and its references when holding the cursor +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming +nmap rn (coc-rename) + +" Formatting selected code +xmap f (coc-format-selected) +nmap f (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s) + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying code actions to the selected code block +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying code actions at the cursor position +nmap ac (coc-codeaction-cursor) +" Remap keys for apply code actions affect whole buffer +nmap as (coc-codeaction-source) +" Apply the most preferred quickfix action to fix diagnostic on the current line +nmap qf (coc-fix-current) + +" Remap keys for applying refactor code actions +nmap re (coc-codeaction-refactor) +xmap r (coc-codeaction-refactor-selected) +nmap r (coc-codeaction-refactor-selected) + +" Run the Code Lens action on the current line +nmap cl (coc-codelens-action) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server +xmap if (coc-funcobj-i) +omap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap af (coc-funcobj-a) +xmap ic (coc-classobj-i) +omap ic (coc-classobj-i) +xmap ac (coc-classobj-a) +omap ac (coc-classobj-a) + +" Remap and to scroll float windows/popups +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" +endif + +" Use CTRL-S for selections ranges +" Requires 'textDocument/selectionRange' support of language server +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer +command! -nargs=0 Format :call CocActionAsync('format') + +" Add `:Fold` command to fold current buffer +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer +command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" Mappings for CoCList +" Show all diagnostics +nnoremap a :CocList diagnostics +" Manage extensions +nnoremap e :CocList extensions +" Show commands +nnoremap c :CocList commands +" Find symbol of current document +nnoremap o :CocList outline +" Search workspace symbols +nnoremap s :CocList -I symbols +" Do default action for next item +nnoremap j :CocNext +" Do default action for previous item +nnoremap k :CocPrev +" Resume latest coc list +nnoremap p :CocListResume diff --git a/development/config/config.Darwin.arm64 b/development/config/config.Darwin.arm64 new file mode 100644 index 00000000..7c354f09 --- /dev/null +++ b/development/config/config.Darwin.arm64 @@ -0,0 +1,8 @@ +--- +BUNDLE_JOBS: "12" +BUNDLE_BUILD__PG: "--with-pg-config=/opt/homebrew/opt/postgresql@15/bin/pg_config" +BUNDLE_BUILD__LIBV8: "--with-system-v8" +BUNDLE_BUILD__FFI: "--with-v8-dir=/opt/homebrew/opt/v8" +BUNDLE_BUILD__THERUBYRACER: "--with-v8-dir=/opt/homebrew/opt/v8" +BUNDLE_BUILD: "--with-cflags=-Wno-error=implicit-function-declaration --with-cppflags=-Wno-warning=compound-token-split-by-macro" +BUNDLE_GEMFILE: "Gemfile" diff --git a/lib/extensions/time.rb b/lib/extensions/time.rb index 3506eac2..7a65b2e1 100644 --- a/lib/extensions/time.rb +++ b/lib/extensions/time.rb @@ -9,6 +9,6 @@ class Time ) def self.from_picker(datetimepicker_string) - strptime(datetimepicker_string, '%Y/%m/%d %H:%M:%S').to_time unless datetimepicker_string.blank? + strptime(datetimepicker_string, '%Y/%m/%d %H:%M:%S').to_time if datetimepicker_string.present? end end diff --git a/lib/fnf/events.rb b/lib/fnf/events.rb index d1497499..befdc622 100644 --- a/lib/fnf/events.rb +++ b/lib/fnf/events.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true -require_relative 'event_reporter' +require_relative '../../app/classes/fnf/event_reporter' module FnF module Events end end -require_relative 'events/ticket_request_event' -require_relative 'events/ticket_request_approved_event' +require_relative 'events/pp/classes/fnf/ticket_request_event' +require_relative 'events/pp/classes/fnf/ticket_request_approved_event' diff --git a/lib/fnf/html_generator.rb b/lib/fnf/html_generator.rb index 539fc809..8ff67a7a 100644 --- a/lib/fnf/html_generator.rb +++ b/lib/fnf/html_generator.rb @@ -33,7 +33,7 @@ def html_element(method, *args, **opts, &block) options = " #{options}" if options self.print "<#{method}#{options}" if options process_block(block, method) - puts if args.include?(:br) + Rails.logger.debug if args.include?(:br) end HTML_ELEMENTS.each do |element| @@ -44,20 +44,20 @@ def render $stdout.puts(string) end - def generate(&block) - instance_exec(&block) + def generate(&) + instance_exec(&) end private def process_block(block, method) if block - print '>' + Rails.logger.debug '>' result = instance_exec(&block) - print result unless result.nil? - print "" + Rails.logger.debug result unless result.nil? + Rails.logger.debug { "" } else - print '/>' + Rails.logger.debug '/>' end end end diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake new file mode 100644 index 00000000..e96283ea --- /dev/null +++ b/lib/tasks/auto_annotate_models.rake @@ -0,0 +1,59 @@ +# NOTE: only doing this in development as some production environments (Heroku) +# NOTE: are sensitive to local FS writes, and besides -- it's just not proper +# NOTE: to have a dev-mode tool do its thing in production. +if Rails.env.development? + require 'annotate' + task :set_annotation_options do + # You can override any of these by setting an environment variable of the + # same name. + Annotate.set_defaults( + 'active_admin' => 'false', + 'additional_file_patterns' => [], + 'routes' => 'false', + 'models' => 'true', + 'position_in_routes' => 'before', + 'position_in_class' => 'before', + 'position_in_test' => 'before', + 'position_in_fixture' => 'before', + 'position_in_factory' => 'before', + 'position_in_serializer' => 'before', + 'show_foreign_keys' => 'true', + 'show_complete_foreign_keys' => 'false', + 'show_indexes' => 'true', + 'simple_indexes' => 'false', + 'model_dir' => 'app/models', + 'root_dir' => '', + 'include_version' => 'false', + 'require' => '', + 'exclude_tests' => 'false', + 'exclude_fixtures' => 'false', + 'exclude_factories' => 'false', + 'exclude_serializers' => 'false', + 'exclude_scaffolds' => 'true', + 'exclude_controllers' => 'true', + 'exclude_helpers' => 'true', + 'exclude_sti_subclasses' => 'false', + 'ignore_model_sub_dir' => 'false', + 'ignore_columns' => nil, + 'ignore_routes' => nil, + 'ignore_unknown_models' => 'false', + 'hide_limit_column_types' => 'integer,bigint,boolean', + 'hide_default_column_types' => 'json,jsonb,hstore', + 'skip_on_db_migrate' => 'false', + 'format_bare' => 'true', + 'format_rdoc' => 'false', + 'format_yard' => 'false', + 'format_markdown' => 'false', + 'sort' => 'false', + 'force' => 'false', + 'frozen' => 'false', + 'classified_sort' => 'true', + 'trace' => 'false', + 'wrapper_open' => nil, + 'wrapper_close' => nil, + 'with_comment' => 'true' + ) + end + + Annotate.load_tasks +end diff --git a/log/.gitkeep b/log/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/spec/controllers/emails_controller_spec.rb b/spec/controllers/emails_controller_spec.rb index 61f7e646..0675d5dd 100644 --- a/spec/controllers/emails_controller_spec.rb +++ b/spec/controllers/emails_controller_spec.rb @@ -1,12 +1,10 @@ # frozen_string_literal: true -require 'spec_helper' - -describe EmailsController, type: :controller do +describe EmailsController do describe 'GET #index' do let(:email) { nil } - before { get :index, email: email } + before { get :index, params: { email: } } context 'when no email is provided' do it { response.status.should eq 404 } @@ -14,11 +12,13 @@ context 'when non-existent email is provided' do let(:email) { 'thisemailwillneverexist@nowaynohownowhere.com' } + it { response.status.should eq 404 } end context 'when existing email is provided' do let(:email) { User.make!.email } + it { response.status.should eq 200 } end end diff --git a/spec/controllers/events_controller_spec.rb b/spec/controllers/events_controller_spec.rb index 9bb64fad..54b35aad 100644 --- a/spec/controllers/events_controller_spec.rb +++ b/spec/controllers/events_controller_spec.rb @@ -1,14 +1,13 @@ # frozen_string_literal: true -require 'spec_helper' - -describe EventsController, type: :controller do +describe EventsController do let(:event) { Event.make! } let(:viewer) { nil } + before { sign_in viewer if viewer } describe 'GET #show' do - before { get :show, id: event.to_param } + before { get :show, params: { id: event.to_param } } context 'when the user is not signed in' do it { redirects_to new_event_ticket_request_path(event) } @@ -17,11 +16,13 @@ context 'when the user is signed in' do context 'and is not an event admin' do let(:viewer) { User.make! } + it { redirects_to new_event_ticket_request_path(event) } end context 'and is an event admin' do - let(:viewer) { EventAdmin.make!(event: event, user: User.make!).user } + let(:viewer) { EventAdmin.make!(event:, user: User.make!).user } + it { succeeds } end end diff --git a/spec/controllers/ticket_requests_controller_spec.rb b/spec/controllers/ticket_requests_controller_spec.rb index 7dcbb7fe..04c37c23 100644 --- a/spec/controllers/ticket_requests_controller_spec.rb +++ b/spec/controllers/ticket_requests_controller_spec.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true -require 'spec_helper' - -describe TicketRequestsController, type: :controller do +describe TicketRequestsController do let(:viewer) { nil } + before { sign_in viewer if viewer } describe 'GET #index' do let(:event) { Event.make! } let(:ticket_requests) { TicketRequest.make_list! 3 } - before { get :index, event_id: event.to_param } + + before { get :index, params: { event_id: event.to_param } } context 'when viewer not signed in' do it { redirects } @@ -17,27 +17,30 @@ context 'when viewer is a normal user' do let(:viewer) { User.make! } + it { redirects } end context 'when viewer is the event admin' do - let(:viewer) { EventAdmin.make!(event: event).user } + let(:viewer) { EventAdmin.make!(event:).user } + it { succeeds } end context 'when viewer is a site admin' do let(:viewer) { User.make! :site_admin } + it { succeeds } end end describe 'GET #show' do let(:user) { User.make! } - let(:ticket_request) { TicketRequest.make! user: user } + let(:ticket_request) { TicketRequest.make! user: } before do - get :show, event_id: ticket_request.event.to_param, - id: ticket_request.to_param + get :show, params: { event_id: ticket_request.event.to_param, + id: ticket_request.to_param } end context 'when viewer not signed in' do @@ -46,28 +49,33 @@ context 'when viewer is not the owner of the ticket request' do let(:viewer) { User.make! } + it { redirects_to root_path } end context 'when viewer is the owner of the ticket request' do let(:viewer) { user } + it { succeeds } end context 'when viewer is an event admin' do let(:viewer) { EventAdmin.make!(event: ticket_request.event).user } + it { succeeds } end context 'when viewer is a site admin' do let(:viewer) { User.make! :site_admin } + it { succeeds } end end describe 'GET #new' do let(:event) { Event.make! } - before { get :new, event_id: event.to_param } + + before { get :new, params: { event_id: event.to_param } } context 'when viewer not signed in' do it { succeeds } @@ -75,17 +83,18 @@ context 'when viewer signed in' do let(:viewer) { User.make! } + it { succeeds } end end describe 'GET #edit' do let(:user) { User.make! } - let(:ticket_request) { TicketRequest.make! user: user } + let(:ticket_request) { TicketRequest.make! user: } before do - get :edit, event_id: ticket_request.event.to_param, - id: ticket_request.to_param + get :edit, params: { event_id: ticket_request.event.to_param, + id: ticket_request.to_param } end context 'when viewer not signed in' do @@ -94,21 +103,25 @@ context 'when viewer is not owner of the ticket request' do let(:viewer) { User.make! } + it { redirects_to new_event_ticket_request_path(ticket_request.event) } end context 'when viewer is owner of the ticket request' do let(:viewer) { user } + it { succeeds } end context 'when viewer is the event admin' do let(:viewer) { EventAdmin.make!(event: ticket_request.event).user } + it { succeeds } end context 'when viewer is a site admin' do let(:viewer) { User.make! :site_admin } + it { succeeds } end end @@ -118,7 +131,7 @@ let(:valid_params) { TicketRequest.valid_attributes event_id: event.to_param } def make_request - post :create, event_id: event.to_param, ticket_request: valid_params + post :create, params: { event_id: event.to_param, ticket_request: valid_params } end context 'when event ticket sales are closed' do @@ -136,7 +149,7 @@ def make_request let(:viewer) { user } it 'creates a ticket request' do - expect { make_request }.to change { TicketRequest.count }.by(1) + expect { make_request }.to change(TicketRequest, :count).by(1) end it 'assigned the ticket request to the viewer' do @@ -151,33 +164,36 @@ def make_request let(:user_attributes) do { name: Sham.words(2), - email: email, - password: password + email:, + password: } end let(:valid_params) do TicketRequest.valid_attributes event_id: event.to_param, - user_attributes: user_attributes + user_attributes: end - it 'creates a user with the specified email address' do - make_request - User.find_by_email(email).should_not be_nil - end + describe '#create' do + before { make_request } - it 'creates a ticket request' do - expect { make_request }.to change { TicketRequest.count }.by(1) - end + its(:current_user) { is_expected.not_to be_nil } + + it 'creates a ticket request' do + expect { make_request }.to change(TicketRequest, :count).by(1) + end - it 'assigns the ticket request to the created user' do - make_request - User.find_by_email(email).ticket_requests.count.should == 1 + it 'assigns the ticket request to the created user' do + User.find_by(email:).ticket_requests.count.should == 1 + end + + it 'signs in the created user' do + subject.current_user.should == User.find_by(email:) + end end - it 'signs in the created user' do - make_request - subject.current_user.should == User.find_by_email(email) + it 'creates a user with the specified email address' do + User.find_by(email:).should_not be_nil end end end diff --git a/spec/factories/event.rb b/spec/factories/event.rb index 3d07d20c..070bb842 100644 --- a/spec/factories/event.rb +++ b/spec/factories/event.rb @@ -6,21 +6,21 @@ start_time { 1.year.from_now } end_time { 1.year.from_now + 1.day } - adult_ticket_price { Random.rand(0..100) } - kid_ticket_price nil - cabin_price nil + adult_ticket_price { Random.rand(100) } + kid_ticket_price { nil } + cabin_price { nil } max_adult_tickets_per_request { Random.rand(1..4) } - max_kid_tickets_per_request nil - max_cabins_per_request nil - tickets_require_approval true + max_kid_tickets_per_request { nil } + max_cabins_per_request { nil } + tickets_require_approval { true } trait :kids_tickets_available do - kid_ticket_price { Random.rand(0..10) } + kid_ticket_price { Random.rand(10) } end trait :cabins_available do - cabin_price { Random.rand(0..100) } - max_cabins_per_request { Random.rand(1..2) } + cabin_price { Random.rand(100) } + max_cabins_per_request { Random.rand(1...1) } end end end diff --git a/spec/factories/payment.rb b/spec/factories/payment.rb index 7a8c1350..5f51e928 100644 --- a/spec/factories/payment.rb +++ b/spec/factories/payment.rb @@ -3,6 +3,6 @@ FactoryBot.define do factory :payment do ticket_request - status Payment::STATUS_IN_PROGRESS + status { Payment::STATUS_IN_PROGRESS } end end diff --git a/spec/factories/ticket_request.rb b/spec/factories/ticket_request.rb index 6275fb16..a115faa3 100644 --- a/spec/factories/ticket_request.rb +++ b/spec/factories/ticket_request.rb @@ -3,24 +3,25 @@ FactoryBot.define do factory :ticket_request do adults { Random.rand(1..4) } - kids { Random.rand(0..2) } - cabins { Random.rand(0..2) } + kids { Random.rand(2) } + cabins { Random.rand(2) } needs_assistance { [true, false].sample } notes { Sham.words(10) } - agrees_to_terms true - user - event + agrees_to_terms { true } - trait :pending do |_ticket_request| - status TicketRequest::STATUS_PENDING + user { FactoryBot.create(:user) } + event { FactoryBot.create(:event) } + + trait :pending do |*| + status { TicketRequest::STATUS_PENDING } end - trait :approved do |_ticket_request| - status TicketRequest::STATUS_AWAITING_PAYMENT + trait :approved do |*| + status { TicketRequest::STATUS_AWAITING_PAYMENT } end - trait :declined do |_ticket_request| - status TicketRequest::STATUS_DECLINED + trait :declined do |*| + status { TicketRequest::STATUS_DECLINED } end end end diff --git a/spec/factories/user.rb b/spec/factories/user.rb index 6637346d..21a69b03 100644 --- a/spec/factories/user.rb +++ b/spec/factories/user.rb @@ -4,11 +4,11 @@ factory :user do name { Sham.words(2) } email { Sham.email_address } - password 'password' + password { 'password' } trait :site_admin do after :create do |user| - SiteAdmin.make! user: user + SiteAdmin.make! user: end end end diff --git a/spec/lib/fnf/csv_reader_spec.rb b/spec/lib/fnf/csv_reader_spec.rb index 0228fcd4..61076de1 100644 --- a/spec/lib/fnf/csv_reader_spec.rb +++ b/spec/lib/fnf/csv_reader_spec.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require 'spec_helper' require 'fnf/csv_reader' module FnF @@ -23,7 +22,7 @@ def increment! subject { described_class.new(path) } - it 'should yield each line of the CSV' do + it 'yields each line of the CSV' do subject.read { block[] } expect(counter.counter).to eq(19) end diff --git a/spec/lib/fnf/event_reporter_spec.rb b/spec/lib/fnf/event_reporter_spec.rb index 6d2735c6..1f7ec137 100644 --- a/spec/lib/fnf/event_reporter_spec.rb +++ b/spec/lib/fnf/event_reporter_spec.rb @@ -1,16 +1,15 @@ # frozen_string_literal: true -require 'spec_helper' require 'fnf/csv_reader' module FnF RSpec.describe EventReporter do describe '#event_name' do before do - expect(EventReporter).to receive(:metric).once + expect(described_class).to receive(:metric).once end - it 'should invoke metric for all events' do + it 'invokes metric for all events' do Events.set_building_on_fire! end end diff --git a/spec/lib/fnf/events/events_spec.rb b/spec/lib/fnf/events/events_spec.rb index d72ed4c0..2b3dd2a1 100644 --- a/spec/lib/fnf/events/events_spec.rb +++ b/spec/lib/fnf/events/events_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'spec_helper' - class Worker @events = {} @@ -21,16 +19,16 @@ def building_on_fire_event(event) # using FnF::Events::BuildingOnFireEvent @see spec/support/events.rb RSpec.describe 'Observers' do + subject { worker.events } + let(:worker) { Worker } - let(:event) { ::FnF::Events::BuildingOnFireEvent } + let(:event) { FnF::Events::BuildingOnFireEvent } before do event.configure { notifies Worker } - ::FnF::Events.set_building_on_fire! + FnF::Events.set_building_on_fire! end - subject { worker.events } - it { is_expected.not_to be_empty } end diff --git a/spec/lib/fnf/html_generator_spec.rb b/spec/lib/fnf/html_generator_spec.rb index f8aa13ba..a2f436b1 100644 --- a/spec/lib/fnf/html_generator_spec.rb +++ b/spec/lib/fnf/html_generator_spec.rb @@ -1,11 +1,14 @@ # frozen_string_literal: true -require 'spec_helper' require 'fnf/html_generator' module FnF RSpec.describe HTMLGenerator do let(:generator) { described_class.new } + let(:expected) do + '
  1. 0
  2. 1
' + end + before do generator.generate do html do @@ -27,10 +30,6 @@ module FnF end end - let(:expected) do - '
  1. 0
  2. 1
' - end - subject { generator.string } it { is_expected.to eq(expected) } diff --git a/spec/lib/fnf/music_submissions_spec.rb b/spec/lib/fnf/music_submissions_spec.rb index 2a32b893..db5e5d61 100644 --- a/spec/lib/fnf/music_submissions_spec.rb +++ b/spec/lib/fnf/music_submissions_spec.rb @@ -2,9 +2,10 @@ require 'rspec' require 'tempfile' -require 'spec_helper' RSpec.describe 'bin/music-submissions' do + subject { File.read(result) } + let(:pwd) { Dir.pwd } let(:script) { "#{pwd}/bin/music-submission-links" } let(:result) { Tempfile.new('result') } @@ -14,7 +15,5 @@ system("bash -c '#{script} #{pwd}/spec/fixtures/chill_sets.csv > #{result.path}'") end - subject { File.read(result) } - it { is_expected.to eq(expected) } end diff --git a/spec/mailers/payment_mailer_spec.rb b/spec/mailers/payment_mailer_spec.rb index c164eec1..a962853f 100644 --- a/spec/mailers/payment_mailer_spec.rb +++ b/spec/mailers/payment_mailer_spec.rb @@ -1,17 +1,15 @@ # frozen_string_literal: true -require 'spec_helper' - describe PaymentMailer do let(:user) { User.make! } let(:event) { Event.make! name: 'Test Event' } let(:ticket_request) do - TicketRequest.make! event: event, - user: user + TicketRequest.make! event:, + user: end - let(:payment) { Payment.make! ticket_request: ticket_request } + let(:payment) { Payment.make! ticket_request: } describe '#payment_received' do let(:mail) { described_class.payment_received(payment) } diff --git a/spec/mailers/ticket_request_mailer_spec.rb b/spec/mailers/ticket_request_mailer_spec.rb index 4b2b164a..ba9b7139 100644 --- a/spec/mailers/ticket_request_mailer_spec.rb +++ b/spec/mailers/ticket_request_mailer_spec.rb @@ -1,15 +1,13 @@ # frozen_string_literal: true -require 'spec_helper' - describe TicketRequestMailer do let(:user) { User.make! } let(:event) { Event.make! name: 'Test Event' } let(:price) { nil } let(:ticket_request) do - TicketRequest.make! event: event, - user: user, + TicketRequest.make! event:, + user:, special_price: price end diff --git a/spec/models/event_admin_spec.rb b/spec/models/event_admin_spec.rb index 8ca95efa..606bf59e 100644 --- a/spec/models/event_admin_spec.rb +++ b/spec/models/event_admin_spec.rb @@ -1,30 +1,42 @@ # frozen_string_literal: true -require 'spec_helper' - +# == Schema Information +# +# Table name: event_admins +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# event_id :bigint +# user_id :bigint +# +# Indexes +# +# index_event_admins_on_event_id (event_id) +# index_event_admins_on_event_id_and_user_id (event_id,user_id) UNIQUE +# index_event_admins_on_user_id (user_id) +# index_event_admins_on_user_id_only (user_id) +# describe EventAdmin do - it 'has a valid factory' do - EventAdmin.make.should be_valid - end - describe 'validations' do describe '#user' do - it { should accept_values_for(:user_id, User.make!.id) } - it { should_not accept_values_for(:user_id, nil) } + it { is_expected.to accept_values_for(:user_id, User.make!.id) } + it { is_expected.not_to accept_values_for(:user_id, nil) } context 'when the user is already an admin for the event' do + subject { described_class.make event: } + let(:event) { Event.make! } - let(:event_admin) { EventAdmin.make! event: event } + let(:event_admin) { described_class.make! event: } let(:user) { event_admin.user } - subject { EventAdmin.make event: event } - it { should_not accept_values_for(:user_id, user.id) } + it { is_expected.not_to accept_values_for(:user_id, user.id) } end end describe '#event' do - it { should accept_values_for(:event_id, Event.make!.id) } - it { should_not accept_values_for(:event_id, nil) } + it { is_expected.to accept_values_for(:event_id, Event.make!.id) } + it { is_expected.not_to accept_values_for(:event_id, nil) } end end end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index dc76120e..61383f39 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -1,165 +1,206 @@ # frozen_string_literal: true -require 'spec_helper' - +# == Schema Information +# +# Table name: events +# +# id :bigint not null, primary key +# adult_ticket_price :decimal(8, 2) +# allow_donations :boolean default(FALSE), not null +# allow_financial_assistance :boolean default(FALSE), not null +# cabin_price :decimal(8, 2) +# early_arrival_price :decimal(8, 2) default(0.0) +# end_time :datetime +# kid_ticket_price :decimal(8, 2) +# late_departure_price :decimal(8, 2) default(0.0) +# max_adult_tickets_per_request :integer +# max_cabin_requests :integer +# max_cabins_per_request :integer +# max_kid_tickets_per_request :integer +# name :string +# photo :string +# require_mailing_address :boolean default(FALSE), not null +# start_time :datetime +# ticket_requests_end_time :datetime +# ticket_sales_end_time :datetime +# ticket_sales_start_time :datetime +# tickets_require_approval :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# describe Event do it 'has a valid factory' do - Event.make.should be_valid + described_class.make.should be_valid end describe 'normalization' do - it { should normalize(:name) } - it { should normalize(:name).from(' Trim Spaces ').to('Trim Spaces') } - it { should normalize(:name).from('Squish Spaces').to('Squish Spaces') } + it { is_expected.to normalize(:name) } + it { is_expected.to normalize(:name).from(' Trim Spaces ').to('Trim Spaces') } + it { is_expected.to normalize(:name).from('Squish Spaces').to('Squish Spaces') } end describe 'validations' do describe '#name' do - it { should accept_values_for(:name, 'CloudWatch 2013') } - it { should_not accept_values_for(:name, nil, '', Sham.string(101)) } + it { is_expected.to accept_values_for(:name, 'CloudWatch 2013') } + it { is_expected.not_to accept_values_for(:name, nil, '', Sham.string(101)) } end describe '#start_time' do - it { should accept_values_for(:start_time, Time.now) } - it { should_not accept_values_for(:start_time, nil, '') } + it { is_expected.to accept_values_for(:start_time, Time.zone.now) } + it { is_expected.not_to accept_values_for(:start_time, nil, '') } end describe '#end_time' do - it { should accept_values_for(:start_time, Time.now) } - it { should_not accept_values_for(:end_time, nil, '') } + it { is_expected.to accept_values_for(:start_time, Time.zone.now) } + it { is_expected.not_to accept_values_for(:end_time, nil, '') } end context 'when start time is before end time' do - subject { Event.make start_time: Time.now, end_time: 1.day.from_now } - it { should be_valid } + subject { described_class.make start_time: Time.zone.now, end_time: 1.day.from_now } + + it { is_expected.to be_valid } end context 'when start time is after end time' do - subject { Event.make start_time: 1.day.from_now, end_time: Time.now } - it { should_not be_valid } + subject { described_class.make start_time: 1.day.from_now, end_time: Time.zone.now } + + it { is_expected.not_to be_valid } end describe '#ticket_sales_start_time' do - it { should accept_values_for(:ticket_sales_start_time, Time.now, nil, '') } + it { is_expected.to accept_values_for(:ticket_sales_start_time, Time.zone.now, nil, '') } end describe '#ticket_sales_end_time' do - it { should accept_values_for(:ticket_sales_start_time, Time.now, nil, '') } + it { is_expected.to accept_values_for(:ticket_sales_start_time, Time.zone.now, nil, '') } end context 'when ticket sales start time is before end time' do subject do - Event.make ticket_sales_start_time: Time.now, ticket_sales_end_time: 1.day.from_now + described_class.make ticket_sales_start_time: Time.zone.now, ticket_sales_end_time: 1.day.from_now end - it { should be_valid } + it { is_expected.to be_valid } end context 'when ticket sales start time is after end time' do subject do - Event.make ticket_sales_start_time: 1.day.from_now, ticket_sales_end_time: Time.now + described_class.make ticket_sales_start_time: 1.day.from_now, ticket_sales_end_time: Time.zone.now end - it { should_not be_valid } + it { is_expected.not_to be_valid } end describe '#adult_ticket_price' do - it { should accept_values_for(:adult_ticket_price, 0, 50) } - it { should_not accept_values_for(:adult_ticket_price, nil, '', -1) } + it { is_expected.to accept_values_for(:adult_ticket_price, 0, 50) } + it { is_expected.not_to accept_values_for(:adult_ticket_price, nil, '', -1) } end describe '#kid_ticket_price' do - it { should accept_values_for(:kid_ticket_price, nil, '', 0, 50) } - it { should_not accept_values_for(:kid_ticket_price, -1) } + it { is_expected.to accept_values_for(:kid_ticket_price, nil, '', 0, 50) } + it { is_expected.not_to accept_values_for(:kid_ticket_price, -1) } end describe '#cabin_price' do - it { should accept_values_for(:cabin_price, nil, '', 0, 50) } - it { should_not accept_values_for(:cabin_price, -1) } + it { is_expected.to accept_values_for(:cabin_price, nil, '', 0, 50) } + it { is_expected.not_to accept_values_for(:cabin_price, -1) } end describe '#max_adult_tickets_per_request' do - it { should accept_values_for(:max_adult_tickets_per_request, nil, '', 50) } - it { should_not accept_values_for(:max_adult_tickets_per_request, 0, -1) } + it { is_expected.to accept_values_for(:max_adult_tickets_per_request, nil, '', 50) } + it { is_expected.not_to accept_values_for(:max_adult_tickets_per_request, 0, -1) } end describe '#max_kid_tickets_per_request' do context 'when kid_ticket_price is set' do - subject { Event.make kid_ticket_price: 10 } - it { should accept_values_for(:max_kid_tickets_per_request, nil, '', 10) } - it { should_not accept_values_for(:max_kid_tickets_per_request, 0, -1) } + subject { described_class.make kid_ticket_price: 10 } + + it { is_expected.to accept_values_for(:max_kid_tickets_per_request, nil, '', 10) } + it { is_expected.not_to accept_values_for(:max_kid_tickets_per_request, 0, -1) } end context 'when kid_ticket_price is not set' do - subject { Event.make kid_ticket_price: nil } - it { should_not accept_values_for(:max_kid_tickets_per_request, 10) } + subject { described_class.make kid_ticket_price: nil } + + it { is_expected.not_to accept_values_for(:max_kid_tickets_per_request, 10) } end end describe '#max_cabins_per_request' do context 'when cabin_price is set' do - subject { Event.make cabin_price: 10 } - it { should accept_values_for(:max_cabins_per_request, nil, '', 10) } - it { should_not accept_values_for(:max_cabins_per_request, 0, -1) } + subject { described_class.make cabin_price: 10 } + + it { is_expected.to accept_values_for(:max_cabins_per_request, nil, '', 10) } + it { is_expected.not_to accept_values_for(:max_cabins_per_request, 0, -1) } end context 'when cabin_price is not set' do - subject { Event.make cabin_price: nil } - it { should_not accept_values_for(:max_cabins_per_request, 10) } + subject { described_class.make cabin_price: nil } + + it { is_expected.not_to accept_values_for(:max_cabins_per_request, 10) } end end describe '#max_cabin_requests' do context 'when cabin_price is set' do - subject { Event.make cabin_price: 10 } - it { should accept_values_for(:max_cabin_requests, nil, '', 10) } - it { should_not accept_values_for(:max_cabin_requests, 0, -1) } + subject { described_class.make cabin_price: 10 } + + it { is_expected.to accept_values_for(:max_cabin_requests, nil, '', 10) } + it { is_expected.not_to accept_values_for(:max_cabin_requests, 0, -1) } end context 'when cabin_price is not set' do - subject { Event.make cabin_price: nil } - it { should accept_values_for(:max_cabin_requests, nil, '') } - it { should_not accept_values_for(:max_cabin_requests, 10) } + subject { described_class.make cabin_price: nil } + + it { is_expected.to accept_values_for(:max_cabin_requests, nil, '') } + it { is_expected.not_to accept_values_for(:max_cabin_requests, 10) } end end end describe '#admin?' do - let(:event) { Event.make! } subject { event.admin?(user) } + let(:event) { described_class.make! } + context 'when given a normal user' do let(:user) { User.make! } - it { should be false } + + it { is_expected.to be false } end context 'when given a site admin' do let(:user) { User.make! :site_admin } - it { should be true } + + it { is_expected.to be true } end context 'when given an event admin' do - let(:user) { EventAdmin.make!(event: event).user } - it { should be true } + let(:user) { EventAdmin.make!(event:).user } + + it { is_expected.to be true } end context 'when given an admin of another event' do let(:user) { EventAdmin.make!.user } - it { should be false } + + it { is_expected.to be false } end end describe '#cabins_available?' do + subject { event.cabins_available? } + let(:cabin_price) { nil } let(:max_cabin_requests) { nil } let(:event) do - Event.make! cabin_price: cabin_price, max_cabin_requests: max_cabin_requests + described_class.make! cabin_price:, max_cabin_requests: end - subject { event.cabins_available? } context 'when no cabin price is set' do let(:cabin_price) { nil } - it { should be false } + + it { is_expected.to be false } end context 'when cabin price is set' do @@ -167,46 +208,48 @@ context 'when no maximum specified for the number of cabin requests' do let(:max_cabin_requests) { nil } - it { should be true } + + it { is_expected.to be true } end context 'when a maximum is specified for the number of cabin requests' do let(:max_cabin_requests) { 10 } context 'when there are fewer cabins requested than the maximum' do - it { should be true } + it { is_expected.to be true } end context 'when the number of cabins requested has met or exceeded the maximum' do before do - TicketRequest.make! event: event, cabins: max_cabin_requests + TicketRequest.make! event:, cabins: max_cabin_requests end - it { should be false } + it { is_expected.to be false } end end end end describe '#ticket_sales_open?' do + subject { event.ticket_sales_open? } + let(:start_time) { 1.day.from_now } let(:end_time) { 2.days.from_now } let(:ticket_sale_start_time) { nil } let(:ticket_sale_end_time) { nil } let(:event) do - Event.make! start_time: start_time, - end_time: end_time, - ticket_sales_start_time: ticket_sale_start_time, - ticket_sales_end_time: ticket_sale_end_time + described_class.make! start_time:, + end_time:, + ticket_sales_start_time: ticket_sale_start_time, + ticket_sales_end_time: ticket_sale_end_time end - subject { event.ticket_sales_open? } - context 'when the event has ended' do let(:start_time) { 2.days.ago } - let(:end_time) { 1.days.ago } - it { should be false } + let(:end_time) { 1.day.ago } + + it { is_expected.to be false } end context 'when the ticket sale start time is specified' do @@ -214,40 +257,45 @@ let(:ticket_sale_start_time) { 1.day.ago } context 'and the ticket sale end time is not specified' do - it { should be true } + it { is_expected.to be true } end context 'and the ticket sale end time has not passed' do let(:ticket_sale_end_time) { 1.day.from_now } - it { should be true } + + it { is_expected.to be true } end context 'and the ticket sale end time has passed' do let(:ticket_sale_end_time) { 1.hour.ago } - it { should be false } + + it { is_expected.to be false } end end context 'and the start time has not passed' do let(:ticket_sale_start_time) { 1.day.from_now } - it { should be false } + + it { is_expected.to be false } end end context 'when the ticket sale start time is not specified' do context 'and the ticket sale end time is not specified' do - it { should be true } + it { is_expected.to be true } end context 'and the ticket sale end time is specified' do context 'and the ticket sale end time has passed' do let(:ticket_sale_end_time) { 1.day.ago } - it { should be false } + + it { is_expected.to be false } end context 'and the ticket sale end time has not passed' do let(:ticket_sale_end_time) { 1.hour.from_now } - it { should be true } + + it { is_expected.to be true } end end end diff --git a/spec/models/site_admin_spec.rb b/spec/models/site_admin_spec.rb index cf9a9b2e..20c2aa20 100644 --- a/spec/models/site_admin_spec.rb +++ b/spec/models/site_admin_spec.rb @@ -1,21 +1,24 @@ # frozen_string_literal: true -require 'spec_helper' - +# == Schema Information +# +# Table name: site_admins +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# user_id :integer not null +# describe SiteAdmin do - it 'has a valid factory' do - SiteAdmin.make.should be_valid - end - describe 'validations' do describe '#user' do - it { should accept_values_for(:user_id, User.make!.id) } - it { should_not accept_values_for(:user_id, nil) } + it { is_expected.to accept_values_for(:user_id, User.make!.id) } + it { is_expected.not_to accept_values_for(:user_id, nil) } context 'when the user is already a site admin' do let(:user) { User.make! :site_admin } - it { should_not accept_values_for(:user_id, user.id) } + it { is_expected.not_to accept_values_for(:user_id, user.id) } end end end diff --git a/spec/models/ticket_request_spec.rb b/spec/models/ticket_request_spec.rb index e8b71147..3bcb8073 100644 --- a/spec/models/ticket_request_spec.rb +++ b/spec/models/ticket_request_spec.rb @@ -1,163 +1,208 @@ # frozen_string_literal: true -require 'spec_helper' - +# == Schema Information +# +# Table name: ticket_requests +# +# id :bigint not null, primary key +# address_line1 :string(200) +# address_line2 :string(200) +# admin_notes :string(512) +# adults :integer default(1), not null +# agrees_to_terms :boolean +# cabins :integer default(0), not null +# car_camping :boolean +# car_camping_explanation :string(200) +# city :string(50) +# country_code :string(4) +# donation :decimal(8, 2) default(0.0) +# early_arrival_passes :integer default(0), not null +# guests :text +# kids :integer default(0), not null +# late_departure_passes :integer default(0), not null +# needs_assistance :boolean default(FALSE), not null +# notes :string(500) +# previous_contribution :string(250) +# role :string default("volunteer"), not null +# role_explanation :string(200) +# special_price :decimal(8, 2) +# state :string(50) +# status :string(1) not null +# zip_code :string(32) +# created_at :datetime not null +# updated_at :datetime not null +# event_id :integer not null +# user_id :integer not null +# describe TicketRequest do - it 'has a valid factory' do - TicketRequest.make.should be_valid - end - describe 'validations' do subject { ticket_request } describe '#user' do - let(:ticket_request) { TicketRequest.make user: user } + let(:ticket_request) { described_class.make user: } context 'when not present' do let(:user) { nil } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when user exists' do let(:user) { User.make! } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when user is new' do let(:user) { User.make } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when the user has other ticket requests' do let(:event) { Event.make! } let(:user) { User.make! } - let(:ticket_request) { TicketRequest.make event: event, user: user } + let(:ticket_request) { described_class.make event:, user: } context 'and they already have a request for this event' do before do - TicketRequest.make! event: event, user: user + described_class.make! event:, user: end # TODO: Decide whether we would rather allow editing of ticket # requests instead of making multiple requests - it { should be_valid } + it { is_expected.to be_valid } end context 'and they have created requests only for other events' do before do - TicketRequest.make user: user + described_class.make user: end - it { should be_valid } + it { is_expected.to be_valid } end end end describe '#event' do - let(:ticket_request) { TicketRequest.make event: event } + let(:ticket_request) { described_class.make event: } context 'when not present' do let(:event) { nil } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when event exists' do let(:event) { Event.make! } - it { should be_valid } + it { is_expected.to be_valid } end end describe '#adults' do - let(:ticket_request) { TicketRequest.make adults: adults } + let(:ticket_request) { described_class.make adults: } context 'when not present' do let(:adults) { nil } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when not a number' do let(:adults) { 'not a number' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when a number' do let(:adults) { 2 } - it { should be_valid } + + it { is_expected.to be_valid } end end describe '#kids' do - let(:ticket_request) { TicketRequest.make kids: kids } + let(:ticket_request) { described_class.make kids: } context 'when not present' do let(:kids) { nil } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when not a number' do let(:kids) { 'not a number' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when a number' do let(:kids) { 2 } - it { should be_valid } + + it { is_expected.to be_valid } end end describe '#cabins' do - let(:ticket_request) { TicketRequest.make cabins: cabins } + let(:ticket_request) { described_class.make cabins: } context 'when not present' do let(:cabins) { nil } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when not a number' do let(:cabins) { 'not a number' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when a number' do let(:cabins) { 2 } - it { should be_valid } + + it { is_expected.to be_valid } end end describe '#notes' do - let(:ticket_request) { TicketRequest.make notes: notes } + let(:ticket_request) { described_class.make notes: } context 'when not present' do let(:notes) { nil } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when longer than 500 characters' do let(:notes) { Sham.string(501) } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end describe 'normalization' do - subject { TicketRequest.new } - it { should normalize(:notes) } - it { should normalize(:notes).from(' Blah ').to('Blah') } - it { should normalize(:notes).from('Blah Blah').to('Blah Blah') } + subject { described_class.new } + + it { is_expected.to normalize(:notes) } + it { is_expected.to normalize(:notes).from(' Blah ').to('Blah') } + it { is_expected.to normalize(:notes).from('Blah Blah').to('Blah Blah') } end end describe '#special_price' do - let(:ticket_request) { TicketRequest.make special_price: special_price } + let(:ticket_request) { described_class.make special_price: } context 'when not present' do let(:special_price) { nil } - it { should be_valid } + + it { is_expected.to be_valid } end end end describe '#create' do - let(:ticket_request) { TicketRequest.make! event: event } + let(:ticket_request) { described_class.make! event: } context 'when the event requires approval for tickets' do let(:event) { Event.make! tickets_require_approval: true } @@ -177,41 +222,47 @@ end describe '#can_view?' do + subject { described_class.make(user: requester).can_view?(user) } + let(:requester) { User.make! } - subject { TicketRequest.make(user: requester).can_view?(user) } context 'when the user is a site admin' do let(:user) { User.make! :site_admin } - it { should be true } + + it { is_expected.to be true } end context 'when the user is the ticket request creator' do let(:user) { requester } - it { should be true } + + it { is_expected.to be true } end context 'when the user is anybody else' do let(:user) { User.make! } - it { should be false } + + it { is_expected.to be false } end end describe '#pending?' do context 'when the ticket request is pending' do - subject { TicketRequest.make(:pending).pending? } - it { should be true } + subject { described_class.make(:pending).pending? } + + it { is_expected.to be true } end end describe '#approved?' do context 'when the ticket request is approved' do - subject { TicketRequest.make(:approved).approved? } - it { should be true } + subject { described_class.make(:approved).approved? } + + it { is_expected.to be true } end end describe '#approve' do - subject { TicketRequest.make(:pending, special_price: price) } + subject { described_class.make(:pending, special_price: price) } before do subject.approve @@ -219,23 +270,28 @@ context 'when the ticket request has a price of zero dollars' do let(:price) { 0 } - it { should be_completed } + + it { is_expected.to be_completed } end context 'when the ticket request has a price greater than zero dollars' do let(:price) { 10 } - it { should be_approved } + + it { is_expected.to be_approved } end end describe '#declined?' do context 'when the ticket request is declined' do - subject { TicketRequest.make(:declined).declined? } - it { should be true } + subject { described_class.make(:declined).declined? } + + it { is_expected.to be true } end end describe '#price' do + subject { ticket_request.price } + let(:adult_price) { 10 } let(:adults) { 2 } let(:kid_price) { nil } @@ -247,49 +303,53 @@ Event.make!( adult_ticket_price: adult_price, kid_ticket_price: kid_price, - cabin_price: cabin_price + cabin_price: ) end let(:ticket_request) do - TicketRequest.make( - event: event, - adults: adults, - kids: kids, - cabins: cabins, - special_price: special_price + described_class.make( + event:, + adults:, + kids:, + cabins:, + special_price: ) end - subject { ticket_request.price } context 'when kid ticket price is not set on the event' do - it { should == adult_price * adults } + it { is_expected.to == adult_price * adults } end context 'when the ticket request includes kids' do let(:kids) { 2 } let(:kid_price) { 10 } - it { should == (adult_price * adults) + (kid_price * kids) } + + it { is_expected.to == (adult_price * adults) + (kid_price * kids) } end context 'when the ticket request does not include kids' do let(:kids) { nil } - it { should == adult_price * adults } + + it { is_expected.to == adult_price * adults } end context 'when the ticket request includes cabins' do let(:cabins) { 2 } let(:cabin_price) { 100 } - it { should == (adult_price * adults) + (cabin_price * cabins) } + + it { is_expected.to == (adult_price * adults) + (cabin_price * cabins) } end context 'when the ticket request does not include cabins' do let(:cabins) { nil } - it { should == adult_price * adults } + + it { is_expected.to == adult_price * adults } end context 'when a special price is set' do let(:special_price) { BigDecimal(99.99, 10) } - it { should == special_price } + + it { is_expected.to == special_price } end context 'when custom price rules are defined' do @@ -298,26 +358,28 @@ let(:custom_price) { 5 } before do - PriceRule::KidsEqualTo.create! event: event, - trigger_value: trigger_value, + PriceRule::KidsEqualTo.create! event:, + trigger_value:, price: custom_price end context 'and the rule does not apply' do let(:kids) { trigger_value - 1 } - it { should == (adult_price * adults) + (kid_price * kids) } + + it { is_expected.to == (adult_price * adults) + (kid_price * kids) } end context 'and the rule applies' do let(:kids) { trigger_value } - it { should == (adult_price * adults) + 5 } + + it { is_expected.to == (adult_price * adults) + 5 } end end end describe '#total_tickets' do it 'is the sum of the number of adults and children' do - TicketRequest.make(adults: 3, kids: 2).total_tickets == 5 + described_class.make(adults: 3, kids: 2).total_tickets == 5 end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 56fc842b..0d4887fe 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1,45 +1,84 @@ # frozen_string_literal: true -require 'spec_helper' - +# == Schema Information +# +# Table name: users +# +# id :bigint not null, primary key +# authentication_token :string(64) +# confirmation_sent_at :datetime +# confirmation_token :string +# confirmed_at :datetime +# current_sign_in_at :datetime +# current_sign_in_ip :string +# email :string not null +# encrypted_password :string not null +# failed_attempts :integer default(0) +# last_sign_in_at :datetime +# last_sign_in_ip :string +# locked_at :datetime +# name :string(70) not null +# remember_created_at :datetime +# reset_password_sent_at :datetime +# reset_password_token :string +# sign_in_count :integer default(0) +# unconfirmed_email :string +# unlock_token :string +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_users_on_confirmation_token (confirmation_token) UNIQUE +# index_users_on_email (email) UNIQUE +# index_users_on_reset_password_token (reset_password_token) UNIQUE +# index_users_on_unlock_token (unlock_token) UNIQUE +# describe User do it 'has a valid factory' do - User.make.should be_valid + described_class.make.should be_valid end describe 'validation' do describe '#name' do - let(:user) { User.make name: name } subject { user } + let(:user) { described_class.make name: } + context 'when not present' do let(:name) { nil } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when empty' do let(:name) { '' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when longer than 70 characters' do let(:name) { "#{Sham.string(35)} #{Sham.string(35)}" } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when just a first name' do let(:name) { 'John' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when both first and last name' do let(:name) { 'John Smith' } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when first, middle and last name' do let(:name) { 'John Jacob Smith' } - it { should be_valid } + + it { is_expected.to be_valid } end context 'when multiples spaces are between names' do @@ -50,7 +89,7 @@ user.name.should == 'John Smith' end - it { should be_valid } + it { is_expected.to be_valid } end context 'when leading or trailing whitespace exists' do @@ -61,37 +100,43 @@ user.name.should == 'John Smith' end - it { should be_valid } + it { is_expected.to be_valid } end end describe '#email' do - let(:user) { User.make email: email } subject { user } + let(:user) { described_class.make email: } + context 'when not present' do let(:email) { nil } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when empty' do let(:email) { '' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when email longer than 254 characters' do let(:email) { "#{Sham.string(243)}@example.com" } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when not in a valid format' do let(:email) { 'a_fake_email' } - it { should_not be_valid } + + it { is_expected.not_to be_valid } end context 'when in a valid format' do let(:email) { 'email@example.com' } - it { should be_valid } + + it { is_expected.to be_valid } end end end @@ -99,7 +144,7 @@ describe '#first_name' do let(:first_name) { 'John' } let(:last_name) { 'Smith' } - let(:user) { User.make name: [first_name, last_name].join(' ') } + let(:user) { described_class.make name: [first_name, last_name].join(' ') } it 'returns the first name' do user.first_name.should == first_name @@ -108,7 +153,7 @@ describe '#site_admin?' do context 'when user is a site admin' do - let(:user) { User.make! :site_admin } + let(:user) { described_class.make! :site_admin } it 'returns true' do user.should be_site_admin @@ -116,7 +161,7 @@ end context 'when user is not a site admin' do - let(:user) { User.make! } + let(:user) { described_class.make! } it 'returns false' do user.should_not be_site_admin @@ -130,7 +175,7 @@ end context 'when user is a site admin' do - let(:user) { User.make! :site_admin } + let(:user) { described_class.make! :site_admin } let(:site_admin) { user.site_admin } it 'destroys the associated site admin' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f2de9fbb..d32a41b2 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,34 +3,30 @@ ENV['RAILS_ENV'] = 'test' require 'simplecov' -require 'codecov' if ENV['CODECOV_TOKEN'] SimpleCov.start 'rails' require File.expand_path('../config/environment', __dir__) + require 'rspec/rails' require 'accept_values_for' require 'stripe_mock' require 'timeout' -Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f } +Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } def example_with_timeout(example) - ::Timeout.timeout(20) { example.run } -end - -TicketBooth::Application.configure do - config.action_mailer.delivery_method = :test + Timeout.timeout(20) { example.run } end RSpec.configure do |config| - config.before(:each) do + config.before do @stripe_test_helper = StripeMock.create_test_helper StripeMock.start end - config.after(:each) { StripeMock.stop } + config.after { StripeMock.stop } - config.around(:each) { |example| example_with_timeout(example) } + config.around { |example| example_with_timeout(example) } config.expect_with(:rspec) do |c| c.syntax = %i[should expect] diff --git a/spec/support/factory_bot.rb b/spec/support/factory_bot.rb index 2159531b..e630ff5f 100644 --- a/spec/support/factory_bot.rb +++ b/spec/support/factory_bot.rb @@ -13,50 +13,50 @@ module ActiveRecord class Base class << self # Wrapper for FactoryBot.build - def make(*args, &block) - make_with(name.underscore, *args, &block) + def make(...) + make_with(name.underscore, ...) end # Like #make, but allows the caller to explicitly specify a factory name. - def make_with(factory_name, *args, &block) - factory_bot_delegate :build, factory_name, *args, &block + def make_with(factory_name, ...) + factory_bot_delegate(:build, factory_name, ...) end # Wrapper for FactoryBot.build_list - def make_list(count, *args, &block) - factory_bot_delegate :build_list, name.underscore, count, *args, &block + def make_list(count, ...) + factory_bot_delegate(:build_list, name.underscore, count, ...) end # Wrapper for FactoryBot.create - def make!(*args, &block) - make_with!(name.underscore, *args, &block) + def make!(...) + make_with!(name.underscore, ...) end # Like #make!, but allows the caller to explicitly specify a factory name. - def make_with!(factory_name, *args, &block) - factory_bot_delegate :create, factory_name, *args, &block + def make_with!(factory_name, ...) + factory_bot_delegate(:create, factory_name, ...) end # Wrapper for FactoryBot.build_list - def make_list!(count, *args, &block) - factory_bot_delegate :create_list, name.underscore, count, *args, &block + def make_list!(count, ...) + factory_bot_delegate(:create_list, name.underscore, count, ...) end # Wrapper for FactoryBot.attributes_for - def valid_attributes(*args, &block) - valid_attributes_with(name.underscore, *args, &block) + def valid_attributes(...) + valid_attributes_with(name.underscore, ...) end # Like #valid_attributes, but allows the caller to explicitly specify a # factory name. - def valid_attributes_with(factory_name, *args, &block) - factory_bot_delegate :attributes_for, factory_name, *args, &block + def valid_attributes_with(factory_name, ...) + factory_bot_delegate(:attributes_for, factory_name, ...) end private - def factory_bot_delegate(method, factory_name, *args) - object = FactoryBot.__send__(method, factory_name, *args) + def factory_bot_delegate(method, factory_name, *) + object = FactoryBot.__send__(method, factory_name, *) yield object if block_given? object end diff --git a/spec/support/time_extensions.rb b/spec/support/time_extensions.rb index 10d69ab8..0903dbf5 100644 --- a/spec/support/time_extensions.rb +++ b/spec/support/time_extensions.rb @@ -5,14 +5,14 @@ class Time class << self alias old_now now def now - @fake_now && !@fake_now.empty? ? @fake_now.last.dup : old_now + @fake_now.present? ? @fake_now.last.dup : old_now end def now=(_t) raise 'Time.now=() is deprecated, use Time.warp with a block instead' end - def warp(t = Time.now) + def warp(t = Time.zone.now) raise ArgumentError, 'Time.warp requires a block' unless block_given? raise ArgumentError, 'Time.warp passed nil' if t.nil? raise ArgumentError, '`t` must respond to #to_time' unless t.respond_to?(:to_time) @@ -26,7 +26,7 @@ def warp(t = Time.now) end def passes(t) - raise 'Time.passes may only be used inside a Time.warp block' if @fake_now.nil? || @fake_now.empty? + raise 'Time.passes may only be used inside a Time.warp block' if @fake_now.blank? old_fake = @fake_now.pop || old_now @fake_now.push(old_fake + t) From 9390137b926206e04c33a579d700b2282e49de89 Mon Sep 17 00:00:00 2001 From: Konstantin Gredeskoul Date: Thu, 7 Mar 2024 22:51:08 -0800 Subject: [PATCH 2/3] Fixing a bunch of failing specs --- Gemfile.lock | 1 + app/models/eald_payment.rb | 4 ---- app/models/event.rb | 1 - app/models/event_admin.rb | 5 +++++ app/models/price_rule/kids_equal_to.rb | 2 -- app/models/ticket_request.rb | 3 --- spec/models/event_admin_spec.rb | 28 +++++++++++++++++++------- spec/models/ticket_request_spec.rb | 16 +++++++-------- 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1084b572..62f33dce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -383,6 +383,7 @@ GEM PLATFORMS arm64-darwin-21 arm64-darwin-22 + arm64-darwin-23 x86_64-linux DEPENDENCIES diff --git a/app/models/eald_payment.rb b/app/models/eald_payment.rb index de764a29..e5702ed2 100644 --- a/app/models/eald_payment.rb +++ b/app/models/eald_payment.rb @@ -19,10 +19,6 @@ # # index_eald_payments_on_event_id (event_id) # -# Payment for early arrival/late departures passes. -# -# We only associate this with an event, as we want to treat these separately -# from ticket requests. class EaldPayment < ApplicationRecord include PaymentsHelper diff --git a/app/models/event.rb b/app/models/event.rb index edd35be5..dcbf6caa 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -28,7 +28,6 @@ # created_at :datetime not null # updated_at :datetime not null # -# Core object containing all information related to an actual event being held. class Event < ApplicationRecord has_many :event_admins has_many :admins, through: :event_admins, source: :user diff --git a/app/models/event_admin.rb b/app/models/event_admin.rb index 408a2c09..5e1dd4dc 100644 --- a/app/models/event_admin.rb +++ b/app/models/event_admin.rb @@ -25,4 +25,9 @@ class EventAdmin < ApplicationRecord validates :user_id, uniqueness: { scope: :event_id, message: 'already admin for this event' } + + validate do |record| + raise ArgumentError, 'event_id is nil' if record.event_id.nil? + raise ArgumentError, 'user_id is nil' if record.user_id.nil? + end end diff --git a/app/models/price_rule/kids_equal_to.rb b/app/models/price_rule/kids_equal_to.rb index 93521fbb..28be29c9 100644 --- a/app/models/price_rule/kids_equal_to.rb +++ b/app/models/price_rule/kids_equal_to.rb @@ -16,8 +16,6 @@ # # index_price_rules_on_event_id (event_id) # -# Applied when a ticket request has indicated that they are bringing a specific -# number of kids. class PriceRule class KidsEqualTo < PriceRule def calc_price(ticket_request) diff --git a/app/models/ticket_request.rb b/app/models/ticket_request.rb index ba3437a2..dfd5b235 100644 --- a/app/models/ticket_request.rb +++ b/app/models/ticket_request.rb @@ -34,9 +34,6 @@ # event_id :integer not null # user_id :integer not null # -# Individual request for one or more tickets. -# This is intended to capture as much information as possible about the ticket, -# as well as the state of the request. class TicketRequest < ApplicationRecord STATUSES = [ STATUS_PENDING = 'P', diff --git a/spec/models/event_admin_spec.rb b/spec/models/event_admin_spec.rb index 606bf59e..1f64ee5b 100644 --- a/spec/models/event_admin_spec.rb +++ b/spec/models/event_admin_spec.rb @@ -20,8 +20,27 @@ describe EventAdmin do describe 'validations' do describe '#user' do - it { is_expected.to accept_values_for(:user_id, User.make!.id) } - it { is_expected.not_to accept_values_for(:user_id, nil) } + describe 'valid admin' do + subject(:event_admin) { EventAdmin.make! } + + it { is_expected.to be_valid } + end + + describe 'nil user id' do + subject(:event_admin_without_user) { EventAdmin.make!.tap { |ea| ea.user = nil }.validate! } + + it 'invalidates nil user_id' do + expect { event_admin_without_user }.to raise_error(ArgumentError) + end + end + + describe 'nil event id' do + subject(:event_admin_without_event) { EventAdmin.make!.tap { |ea| ea.event = nil }.validate! } + + it 'invalidates nil event_id' do + expect { event_admin_without_event }.to raise_error(ArgumentError) + end + end context 'when the user is already an admin for the event' do subject { described_class.make event: } @@ -33,10 +52,5 @@ it { is_expected.not_to accept_values_for(:user_id, user.id) } end end - - describe '#event' do - it { is_expected.to accept_values_for(:event_id, Event.make!.id) } - it { is_expected.not_to accept_values_for(:event_id, nil) } - end end end diff --git a/spec/models/ticket_request_spec.rb b/spec/models/ticket_request_spec.rb index 3bcb8073..d92705b2 100644 --- a/spec/models/ticket_request_spec.rb +++ b/spec/models/ticket_request_spec.rb @@ -317,39 +317,39 @@ end context 'when kid ticket price is not set on the event' do - it { is_expected.to == adult_price * adults } + it { is_expected.to eql(adult_price * adults) } end context 'when the ticket request includes kids' do let(:kids) { 2 } let(:kid_price) { 10 } - it { is_expected.to == (adult_price * adults) + (kid_price * kids) } + it { is_expected.to eql((adult_price * adults) + (kid_price * kids)) } end context 'when the ticket request does not include kids' do let(:kids) { nil } - it { is_expected.to == adult_price * adults } + it { is_expected.to eql(adult_price * adults) } end context 'when the ticket request includes cabins' do let(:cabins) { 2 } let(:cabin_price) { 100 } - it { is_expected.to == (adult_price * adults) + (cabin_price * cabins) } + it { is_expected.to eql((adult_price * adults) + (cabin_price * cabins)) } end context 'when the ticket request does not include cabins' do let(:cabins) { nil } - it { is_expected.to == adult_price * adults } + it { is_expected.to eql(adult_price * adults) } end context 'when a special price is set' do let(:special_price) { BigDecimal(99.99, 10) } - it { is_expected.to == special_price } + it { is_expected.to eql(special_price) } end context 'when custom price rules are defined' do @@ -366,13 +366,13 @@ context 'and the rule does not apply' do let(:kids) { trigger_value - 1 } - it { is_expected.to == (adult_price * adults) + (kid_price * kids) } + it { is_expected.to eql((adult_price * adults) + (kid_price * kids)) } end context 'and the rule applies' do let(:kids) { trigger_value } - it { is_expected.to == (adult_price * adults) + 5 } + it { is_expected.to eql((adult_price * adults) + 5) } end end end From 986efdc459174f160c7b6f36b2bc725a66b83973 Mon Sep 17 00:00:00 2001 From: Konstantin Gredeskoul Date: Mon, 11 Mar 2024 12:03:42 -0700 Subject: [PATCH 3/3] Fix event_admin specs --- .rubocop.yml | 2 + Brewfile | 4 + Brewfile.lock.json | 584 ++++++++++-------- Gemfile | 2 +- Gemfile.lock | 4 +- app/models/event_admin.rb | 2 - bin/rubocop | 27 + config/initializers/auto_annotate_models.rb | 2 + ..._remove_unused_indexes_from_event_admin.rb | 28 + db/structure.sql | 17 +- lib/tasks/auto_annotate_models.rake | 97 +-- spec/models/event_admin_spec.rb | 54 +- 12 files changed, 488 insertions(+), 335 deletions(-) create mode 100755 bin/rubocop create mode 100644 db/migrate/20240311182346_remove_unused_indexes_from_event_admin.rb diff --git a/.rubocop.yml b/.rubocop.yml index 6a91b93e..04e7d11b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,3 +8,5 @@ require: - rubocop-rake - rubocop-rspec +Style/IfUnlessModifier: + Enabled: false diff --git a/Brewfile b/Brewfile index cf525934..45ddb49d 100644 --- a/Brewfile +++ b/Brewfile @@ -68,6 +68,10 @@ brew 'yq' brew 'zlib' brew 'v8' +# k8s +brew 'minikube' +brew 'kubernetes-cli' + cask 'chromedriver' cask 'github' diff --git a/Brewfile.lock.json b/Brewfile.lock.json index ede91c28..6e9d75b8 100644 --- a/Brewfile.lock.json +++ b/Brewfile.lock.json @@ -2,10 +2,10 @@ "entries": { "tap": { "homebrew/bundle": { - "revision": "2f22c21799744c6b027a0695b36a37185d66a6a6" + "revision": "bb1c80baa7fac67bbffe81a2862c75a5dc7ea4a7" }, "homebrew/services": { - "revision": "404a74488dd9f5e2799f495ba3736dfb604b025b" + "revision": "9d3512ce81d8bda9f9eb909592ca75768f2b051d" }, "heroku/brew": { "revision": "379bc49cf928a18cb0e7dcad4946278ff831e420" @@ -125,45 +125,45 @@ } }, "bash-completion@2": { - "version": "2.11", + "version": "2.12.0", "bottle": { - "rebuild": 1, + "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", - "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329", + "sha256": "a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", - "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329", + "sha256": "a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1", - "sha256": "2327d8eb7f1d32238624d720bd28856c4489fc1992bf3dc48c4a837cb988dfc1" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329", + "sha256": "a89a69189337d02ae9915a7d63f3300a97bfc577a80fb95151b5172d6d8be329" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", - "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a", + "sha256": "c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", - "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a", + "sha256": "c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66", - "sha256": "e0a9d02cb41f262b764f79135ba150948faab51058d20030e118b555b50f0f66" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a", + "sha256": "c8a4c8bd99146abfcd893b273e6a4a53d6a47c3768c169f68296bc3e35d0dc2a" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:ac195162fd4c749460be5eada9042bca58d30646f3eff1371af50cb1fde5714c", - "sha256": "ac195162fd4c749460be5eada9042bca58d30646f3eff1371af50cb1fde5714c" + "url": "https://ghcr.io/v2/homebrew/core/bash-completion/2/blobs/sha256:b4b277dc873ae381d168808461328bf1a0580f9e94288990f14de82756cb4441", + "sha256": "b4b277dc873ae381d168808461328bf1a0580f9e94288990f14de82756cb4441" } } } @@ -311,45 +311,45 @@ } }, "direnv": { - "version": "2.33.0", + "version": "2.34.0", "bottle": { - "rebuild": 1, + "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:b1795e6743e0bb769f92d07aa5d2401c57b7bee715fc68894c2f5d1c95aba013", - "sha256": "b1795e6743e0bb769f92d07aa5d2401c57b7bee715fc68894c2f5d1c95aba013" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:fd210e16bd6764b33cd2e556a7f07ed579453ba19d518ec11de33edcf3c5c2c7", + "sha256": "fd210e16bd6764b33cd2e556a7f07ed579453ba19d518ec11de33edcf3c5c2c7" }, "arm64_ventura": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:1c2d6d8b0bdc071b4344600ec914dd52f521c3d21f9fd38a6e218e65cc50fb36", - "sha256": "1c2d6d8b0bdc071b4344600ec914dd52f521c3d21f9fd38a6e218e65cc50fb36" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:59af7e0d05a50eda59d60a8c2c67eb0a3491c0650a334568ae13988da3b32951", + "sha256": "59af7e0d05a50eda59d60a8c2c67eb0a3491c0650a334568ae13988da3b32951" }, "arm64_monterey": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:1e365c468da6a471f28c21ef11871641f8414d1c45b9710509884a9aa8b6fe78", - "sha256": "1e365c468da6a471f28c21ef11871641f8414d1c45b9710509884a9aa8b6fe78" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:2577f8c5e2c3c7d1ee2f6966e3c92a16853edb9302d78089ddfc4f8ef9efda24", + "sha256": "2577f8c5e2c3c7d1ee2f6966e3c92a16853edb9302d78089ddfc4f8ef9efda24" }, "sonoma": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:cd4b008579b836b43778c197cfa953cb3934505db0e65053ae5a9d4c10155c60", - "sha256": "cd4b008579b836b43778c197cfa953cb3934505db0e65053ae5a9d4c10155c60" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:4148bce1352772af61eb44303877e57e54a8531240cb551ec2c879660ac90c54", + "sha256": "4148bce1352772af61eb44303877e57e54a8531240cb551ec2c879660ac90c54" }, "ventura": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:55781935916235989a46904640a4728a0a3dc24228db7cc9dbac5954b95e52dd", - "sha256": "55781935916235989a46904640a4728a0a3dc24228db7cc9dbac5954b95e52dd" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:b4eefec1b63c6c32713290af5f5e1f2c318d3c64ba052aab786aab0b87c1b437", + "sha256": "b4eefec1b63c6c32713290af5f5e1f2c318d3c64ba052aab786aab0b87c1b437" }, "monterey": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:6b0c4abed5b230f6e3112df41f9019dd8291a5cb3c82e3337471e2b4aa5e28ea", - "sha256": "6b0c4abed5b230f6e3112df41f9019dd8291a5cb3c82e3337471e2b4aa5e28ea" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:41cadfe20ab1913f07376ac5206ee49c3322ac8689ecd9a5dc85c5146850dff2", + "sha256": "41cadfe20ab1913f07376ac5206ee49c3322ac8689ecd9a5dc85c5146850dff2" }, "x86_64_linux": { "cellar": "/home/linuxbrew/.linuxbrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:65deffe8cb70793402e4ac64655d9805b0b84f174fe8a32dd0722d1781bc4a1f", - "sha256": "65deffe8cb70793402e4ac64655d9805b0b84f174fe8a32dd0722d1781bc4a1f" + "url": "https://ghcr.io/v2/homebrew/core/direnv/blobs/sha256:be4b933f8f607bf1a705c13abe75d04a99856f1698c3ebcb71e07e469850e964", + "sha256": "be4b933f8f607bf1a705c13abe75d04a99856f1698c3ebcb71e07e469850e964" } } } @@ -357,43 +357,43 @@ "fzf": { "version": "0.46.1", "bottle": { - "rebuild": 0, + "rebuild": 1, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:aa98d4e9bfcb82ff81f42d23f1944ac56ee3bae5d8e44627a764d0d643fe2a08", - "sha256": "aa98d4e9bfcb82ff81f42d23f1944ac56ee3bae5d8e44627a764d0d643fe2a08" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:69ef5575b142713f6227437765952201b1822980f930a55c21255e2e98bda92b", + "sha256": "69ef5575b142713f6227437765952201b1822980f930a55c21255e2e98bda92b" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:9269ef300b9fbc0fb3e88f9f0dd262602655fb13783bf148d785f9b93624c8ff", - "sha256": "9269ef300b9fbc0fb3e88f9f0dd262602655fb13783bf148d785f9b93624c8ff" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:a7b531802ccb80f14aa7dfe43b1ff3b8730b828439c219f45c45f85dc83afae6", + "sha256": "a7b531802ccb80f14aa7dfe43b1ff3b8730b828439c219f45c45f85dc83afae6" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:928b58a367f41f39f85a211f20c19286f8ea7d05ab1c303c6d749b2e439b95a1", - "sha256": "928b58a367f41f39f85a211f20c19286f8ea7d05ab1c303c6d749b2e439b95a1" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:9926e057dbbf11e9ab026737d62e19f2da742cf59b7026927efb5ce89a218d7e", + "sha256": "9926e057dbbf11e9ab026737d62e19f2da742cf59b7026927efb5ce89a218d7e" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:f267b893cfeb9ffc33c4722c82fff589e40dca418cc8beddc9ff787cf8080bca", - "sha256": "f267b893cfeb9ffc33c4722c82fff589e40dca418cc8beddc9ff787cf8080bca" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:e0f0ab09c4c503702acb75f0e484fb0c5b1c9d1de4134ae5318d75a7e2fafb16", + "sha256": "e0f0ab09c4c503702acb75f0e484fb0c5b1c9d1de4134ae5318d75a7e2fafb16" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:c3bf340555075c036d0df533b845908518c64dbf21d682fb85baf97f178785c0", - "sha256": "c3bf340555075c036d0df533b845908518c64dbf21d682fb85baf97f178785c0" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:8d618a54fbd7a2450f234348888b2042b68e97b6ca3289fc5b54be52f862d3c8", + "sha256": "8d618a54fbd7a2450f234348888b2042b68e97b6ca3289fc5b54be52f862d3c8" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:fb616e6906d5dc39d0e83e5e9197cc0984b4d14a9c5805830f4443a262d5f629", - "sha256": "fb616e6906d5dc39d0e83e5e9197cc0984b4d14a9c5805830f4443a262d5f629" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:11df26d2709d5ec2a08c496b69c92213adbf81cdc3efd64fafc8963a70530e73", + "sha256": "11df26d2709d5ec2a08c496b69c92213adbf81cdc3efd64fafc8963a70530e73" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:1d2690cd2e82cd9c814a33e5dfc1f90bec1b579c5cf2e104626bb1dcfcc2864c", - "sha256": "1d2690cd2e82cd9c814a33e5dfc1f90bec1b579c5cf2e104626bb1dcfcc2864c" + "url": "https://ghcr.io/v2/homebrew/core/fzf/blobs/sha256:75da72028d3f94c4882dc9d264c74515491673eacb6ffa390cf8dee5bcc467bb", + "sha256": "75da72028d3f94c4882dc9d264c74515491673eacb6ffa390cf8dee5bcc467bb" } } } @@ -445,43 +445,43 @@ "glances": { "version": "3.4.0.3", "bottle": { - "rebuild": 3, + "rebuild": 4, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:8975199729672566e15b0ec095cc88b048dcb5eafd1f116debc5c75cd218d404", - "sha256": "8975199729672566e15b0ec095cc88b048dcb5eafd1f116debc5c75cd218d404" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:94cf86e270364b6d5afa586d699740dee8262295ebcc806959807d2980cc4937", + "sha256": "94cf86e270364b6d5afa586d699740dee8262295ebcc806959807d2980cc4937" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:f897e7e780bffb144439713351420078a7e4c8a1c3dc2eb9bf9ec1bcac044440", - "sha256": "f897e7e780bffb144439713351420078a7e4c8a1c3dc2eb9bf9ec1bcac044440" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:e1d27318512abbb5ef932b174efc7b888b021fdfcdb61f60f0ec25b03aed2e80", + "sha256": "e1d27318512abbb5ef932b174efc7b888b021fdfcdb61f60f0ec25b03aed2e80" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:f8e903fffdf03b3e9fb57478a575f3e7ef2ba60b7b291da23c86b86db25da610", - "sha256": "f8e903fffdf03b3e9fb57478a575f3e7ef2ba60b7b291da23c86b86db25da610" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:096de5c73c7f4245a974c96ca2e8e7a86d7b56af37203ede48a38bf551423197", + "sha256": "096de5c73c7f4245a974c96ca2e8e7a86d7b56af37203ede48a38bf551423197" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:354ecf359f2ba52e90068961d8db04797ac4a513f5bd88277fe8364ff23bb795", - "sha256": "354ecf359f2ba52e90068961d8db04797ac4a513f5bd88277fe8364ff23bb795" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:d723a52308c014c5e89a8d9a88ccf41fcf3e0b4e10bb924f4578dd0aea8d0bea", + "sha256": "d723a52308c014c5e89a8d9a88ccf41fcf3e0b4e10bb924f4578dd0aea8d0bea" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:dde228e56d2bd9634e1d80a2f7d786dab00a056aecc1fbe75e24a8213c5f88b4", - "sha256": "dde228e56d2bd9634e1d80a2f7d786dab00a056aecc1fbe75e24a8213c5f88b4" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:9142b4ca73e862ab8e3721ac77925ff28c20ed726d2498289cb3b6d0803ba9e7", + "sha256": "9142b4ca73e862ab8e3721ac77925ff28c20ed726d2498289cb3b6d0803ba9e7" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:0600c2432101a001cd67bfe4b7ee0aded6b149f39a314fb9bcd3c3536d600ebf", - "sha256": "0600c2432101a001cd67bfe4b7ee0aded6b149f39a314fb9bcd3c3536d600ebf" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:b9832aa17005c5eafb2ec44d81e0613ec28da12d7f13f217876521516862d9a0", + "sha256": "b9832aa17005c5eafb2ec44d81e0613ec28da12d7f13f217876521516862d9a0" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:75b17c5577dc5a51614d2abd4c612ce9a692c3295fe98561f3f2786197c2d1d1", - "sha256": "75b17c5577dc5a51614d2abd4c612ce9a692c3295fe98561f3f2786197c2d1d1" + "url": "https://ghcr.io/v2/homebrew/core/glances/blobs/sha256:cefcd43cb168e567d5544477554213c7ffa95b4f2617c042218b3177d74a7a6d", + "sha256": "cefcd43cb168e567d5544477554213c7ffa95b4f2617c042218b3177d74a7a6d" } } } @@ -939,45 +939,45 @@ } }, "libffi": { - "version": "3.4.5", + "version": "3.4.6", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:05b449dea2ce5e3f9d0a68557ab04938dc95c179bd33797e8b455efab7861241", - "sha256": "05b449dea2ce5e3f9d0a68557ab04938dc95c179bd33797e8b455efab7861241" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:e81237234a3e21d5222c1c8baf4017bc2f2ad7e444fbf58ad6b635fc0ace5078", + "sha256": "e81237234a3e21d5222c1c8baf4017bc2f2ad7e444fbf58ad6b635fc0ace5078" }, "arm64_ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:c1f444ded62e9fc4da1179f2f1f18bbf3db6be8d8e3b764f52d3370a6a534ed3", - "sha256": "c1f444ded62e9fc4da1179f2f1f18bbf3db6be8d8e3b764f52d3370a6a534ed3" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:7a6a1d1dffe41d4e9bf117440190be51c432a2a192945ed8e2e10c4bb1f95ad0", + "sha256": "7a6a1d1dffe41d4e9bf117440190be51c432a2a192945ed8e2e10c4bb1f95ad0" }, "arm64_monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:971cbcb1d220e448683bbc76c561e03e41610a8ce4065b9be92e2e7e838c4a07", - "sha256": "971cbcb1d220e448683bbc76c561e03e41610a8ce4065b9be92e2e7e838c4a07" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:eacdfea3b29d48dc8c3fb7578a9a59dbeb9048eca6493b8cd95605c86652e6de", + "sha256": "eacdfea3b29d48dc8c3fb7578a9a59dbeb9048eca6493b8cd95605c86652e6de" }, "sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:70c125b86120c56b00f737b46f207da0b46d54233367d36d53ea774562e39c18", - "sha256": "70c125b86120c56b00f737b46f207da0b46d54233367d36d53ea774562e39c18" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:d783974753df1f7347d8cef16403e157f0625302848e8267626064c4f79a97d8", + "sha256": "d783974753df1f7347d8cef16403e157f0625302848e8267626064c4f79a97d8" }, "ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:4aff209ef6d0aadd8dbc6384deb2cb1173bed527e27838142ab2c5b93a647e76", - "sha256": "4aff209ef6d0aadd8dbc6384deb2cb1173bed527e27838142ab2c5b93a647e76" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:e5adecfb6ddd1a18ccb492c051adfd693eb091c4b24a58ad7b1cecb6afb0a575", + "sha256": "e5adecfb6ddd1a18ccb492c051adfd693eb091c4b24a58ad7b1cecb6afb0a575" }, "monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:7c96a49210ba55ce4473d36c2dbd86192ae33f2c267ee47b5ed0e970aea62093", - "sha256": "7c96a49210ba55ce4473d36c2dbd86192ae33f2c267ee47b5ed0e970aea62093" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:8b3cb29277a584f1684661823c8232659b04234873430164bc80ba484c8aa8da", + "sha256": "8b3cb29277a584f1684661823c8232659b04234873430164bc80ba484c8aa8da" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:ad76b74572cf5792f5160938bd6ae8b934f0d021abd300d45feba51dca1313fc", - "sha256": "ad76b74572cf5792f5160938bd6ae8b934f0d021abd300d45feba51dca1313fc" + "url": "https://ghcr.io/v2/homebrew/core/libffi/blobs/sha256:798c3983a917698d5dd0c60063e7b8c1e5b4fc377d9e11d7cba010725eca1bfb", + "sha256": "798c3983a917698d5dd0c60063e7b8c1e5b4fc377d9e11d7cba010725eca1bfb" } } } @@ -1042,45 +1042,45 @@ } }, "libpq": { - "version": "16.2", + "version": "16.2_1", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:7b741e015bcbdf7405c854315670ecd6467c00e3ca96313296d0b4bf4db4a70d", - "sha256": "7b741e015bcbdf7405c854315670ecd6467c00e3ca96313296d0b4bf4db4a70d" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:34ec05de1540053d140f435b9927edf7e4a4e84ed25253085e55a817b451c0cb", + "sha256": "34ec05de1540053d140f435b9927edf7e4a4e84ed25253085e55a817b451c0cb" }, "arm64_ventura": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:f9bebf61ad6968b16251ef392daffcacadd274a4243e191c728abf62b6c673d1", - "sha256": "f9bebf61ad6968b16251ef392daffcacadd274a4243e191c728abf62b6c673d1" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:81980d2cc07094693afdec5016eb3acf298bfc3c2e19b5e4aa035b5d815a8a86", + "sha256": "81980d2cc07094693afdec5016eb3acf298bfc3c2e19b5e4aa035b5d815a8a86" }, "arm64_monterey": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:d1d138f0aa5445ff1de80c96d768f2f1af8017ab1232a32d839c1be22061b44c", - "sha256": "d1d138f0aa5445ff1de80c96d768f2f1af8017ab1232a32d839c1be22061b44c" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:5b18a17730c5f0707c2e837acb86927e092e3ea997cf8354e5fdcf1de5ab1ac9", + "sha256": "5b18a17730c5f0707c2e837acb86927e092e3ea997cf8354e5fdcf1de5ab1ac9" }, "sonoma": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:33aba502daa1767fc650485a63d671d28bde4312af561b0263582654b7d014f4", - "sha256": "33aba502daa1767fc650485a63d671d28bde4312af561b0263582654b7d014f4" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:b25bcb80440de0301426ec4e9159a49dd5f690aec12e3c0fee4897b8a2a909e7", + "sha256": "b25bcb80440de0301426ec4e9159a49dd5f690aec12e3c0fee4897b8a2a909e7" }, "ventura": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:d992fdf45b62d9bd05e9514ac16c823ed150bab698afebb4f008bdfc6e825b61", - "sha256": "d992fdf45b62d9bd05e9514ac16c823ed150bab698afebb4f008bdfc6e825b61" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:02fde1ff8fb54fe5c2e518d48447707ee2ee5bc90935a7782b877dff58e03b70", + "sha256": "02fde1ff8fb54fe5c2e518d48447707ee2ee5bc90935a7782b877dff58e03b70" }, "monterey": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:a7b72a7f3fcbc65ff857893114205aa79ff354b47f63a492f0dfd77bdd27c282", - "sha256": "a7b72a7f3fcbc65ff857893114205aa79ff354b47f63a492f0dfd77bdd27c282" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:2c38685f2e169b2f3cee5c77128ae77a15144d45ea2b836bd41ebe2c95292eb3", + "sha256": "2c38685f2e169b2f3cee5c77128ae77a15144d45ea2b836bd41ebe2c95292eb3" }, "x86_64_linux": { "cellar": "/home/linuxbrew/.linuxbrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:7a8856e34634895f82b7f041b95ebe82a7644877b00e4476f1eefd617f831bb1", - "sha256": "7a8856e34634895f82b7f041b95ebe82a7644877b00e4476f1eefd617f831bb1" + "url": "https://ghcr.io/v2/homebrew/core/libpq/blobs/sha256:ec1122e7f681a2788b16d614169aadb0ed9b7056af79b8fd380fea4e31e3c6ae", + "sha256": "ec1122e7f681a2788b16d614169aadb0ed9b7056af79b8fd380fea4e31e3c6ae" } } } @@ -1194,45 +1194,45 @@ } }, "libxml2": { - "version": "2.12.5", + "version": "2.12.5_1", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:00b0550e2f1645ea5d850e8ec45b39b3261a21f3cbcbad06c607a221dcc2b632", - "sha256": "00b0550e2f1645ea5d850e8ec45b39b3261a21f3cbcbad06c607a221dcc2b632" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:a9353056b9e9f185d3b3be79477a73e3d7e1717bb8c62c251f64e585684bd94a", + "sha256": "a9353056b9e9f185d3b3be79477a73e3d7e1717bb8c62c251f64e585684bd94a" }, "arm64_ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:03b55a5795abe691eccb3e312e6e263c4e04d285fc55e20b7cc44981115c2a06", - "sha256": "03b55a5795abe691eccb3e312e6e263c4e04d285fc55e20b7cc44981115c2a06" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:781767e1aa6567a936d7feb13fc749f9edd0731fa25b90b30ca875b8ff7edcc3", + "sha256": "781767e1aa6567a936d7feb13fc749f9edd0731fa25b90b30ca875b8ff7edcc3" }, "arm64_monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:b3979ddac33f9937edc6bfa5c4419a6748f34f2949ceaa32e443c55a5d5a4442", - "sha256": "b3979ddac33f9937edc6bfa5c4419a6748f34f2949ceaa32e443c55a5d5a4442" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:ec61e56bb001ac6af9b4850cda84249919d38ba17e6d0cf833266f07de363f19", + "sha256": "ec61e56bb001ac6af9b4850cda84249919d38ba17e6d0cf833266f07de363f19" }, "sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:c3146cf97fd68a928035c0a12ce1b82f46258bab577e5bc347b1631b9351b510", - "sha256": "c3146cf97fd68a928035c0a12ce1b82f46258bab577e5bc347b1631b9351b510" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:3673303347e8019e21ae73d5507d41f9890b739e76b750b88745e3e0f2902fc6", + "sha256": "3673303347e8019e21ae73d5507d41f9890b739e76b750b88745e3e0f2902fc6" }, "ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:0eb3b7e9aa4299e9fad1ab438c86bc398ceea781b6fcb9aac7c769aadacb0d8a", - "sha256": "0eb3b7e9aa4299e9fad1ab438c86bc398ceea781b6fcb9aac7c769aadacb0d8a" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:c4ff529ea45b6bd2ac71b464f41f313d23b74c382d72b954f906664fbc0707bb", + "sha256": "c4ff529ea45b6bd2ac71b464f41f313d23b74c382d72b954f906664fbc0707bb" }, "monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:73939dd8f148fbc0f40ab0fa9ef6e066173ecb47783d55fc6573d76b3c267acf", - "sha256": "73939dd8f148fbc0f40ab0fa9ef6e066173ecb47783d55fc6573d76b3c267acf" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:eb9991b786ff3e759a76ebdd501023af924bd007f37480304ad8a80ad74bf7fc", + "sha256": "eb9991b786ff3e759a76ebdd501023af924bd007f37480304ad8a80ad74bf7fc" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:ff5db5bc23ceab1dc888d3bbd1ebedb2970675cd550c2cdac23f57f224bc4692", - "sha256": "ff5db5bc23ceab1dc888d3bbd1ebedb2970675cd550c2cdac23f57f224bc4692" + "url": "https://ghcr.io/v2/homebrew/core/libxml2/blobs/sha256:e9e882727d625c87f88f8c1f4d8ac392cfa0ca42123e5da44531362cb811a650", + "sha256": "e9e882727d625c87f88f8c1f4d8ac392cfa0ca42123e5da44531362cb811a650" } } } @@ -1513,15 +1513,15 @@ } }, "parallel": { - "version": "20240122", + "version": "20240222", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "all": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/parallel/blobs/sha256:37486dfc46ee2d752d153623aab1caba37501b4e9a7bc1d8781d34891f166415", - "sha256": "37486dfc46ee2d752d153623aab1caba37501b4e9a7bc1d8781d34891f166415" + "url": "https://ghcr.io/v2/homebrew/core/parallel/blobs/sha256:1ad2b37201ae6e03c3bfbe07429422c9e57db2327e12f12a10bba50b86d3bfc6", + "sha256": "1ad2b37201ae6e03c3bfbe07429422c9e57db2327e12f12a10bba50b86d3bfc6" } } } @@ -1719,45 +1719,45 @@ } }, "postgresql@15": { - "version": "15.6", + "version": "15.6_1", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:a09c7f607a65febd03c483c6e9109d253bc7953d16f92959c98910390036c115", - "sha256": "a09c7f607a65febd03c483c6e9109d253bc7953d16f92959c98910390036c115" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:a85110c06097d4cfbc11e0397caf48060d12eac7852556c7eeb99a24885c3fa8", + "sha256": "a85110c06097d4cfbc11e0397caf48060d12eac7852556c7eeb99a24885c3fa8" }, "arm64_ventura": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:273df86364d2b4e7382692f517bedcaeac222acd73d7e322d67e6a27fb32fc06", - "sha256": "273df86364d2b4e7382692f517bedcaeac222acd73d7e322d67e6a27fb32fc06" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:328bcd13c829c6fe759a038e7dfb17c7af75fd242452a09cb77915a78fa233a4", + "sha256": "328bcd13c829c6fe759a038e7dfb17c7af75fd242452a09cb77915a78fa233a4" }, "arm64_monterey": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:a814bbd6163c62e4f622ee03a79dc994b8906db9d5f93b54a95de10710834774", - "sha256": "a814bbd6163c62e4f622ee03a79dc994b8906db9d5f93b54a95de10710834774" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:5c5e76210be1a35306ace4e75cc0683991fb91b3343223a8f774a71309711ac7", + "sha256": "5c5e76210be1a35306ace4e75cc0683991fb91b3343223a8f774a71309711ac7" }, "sonoma": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:f5bc70401ca0f7ba9902366be93fc983bf41cd23b7d1b23c1cf4acbe69cd184f", - "sha256": "f5bc70401ca0f7ba9902366be93fc983bf41cd23b7d1b23c1cf4acbe69cd184f" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:0e2af74b4a53cd4f9411c9b18d75041a7954352aa4ff1efe072233ac6771fe0e", + "sha256": "0e2af74b4a53cd4f9411c9b18d75041a7954352aa4ff1efe072233ac6771fe0e" }, "ventura": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:fa5202cf03a0bf69999b366f82059c6d700f33eb3022eefb0130f17f1b9b7232", - "sha256": "fa5202cf03a0bf69999b366f82059c6d700f33eb3022eefb0130f17f1b9b7232" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:627c40901853c1f97ca21293fcadaaa138cbe2d4b390e0d7fa15d8c335ff1cf9", + "sha256": "627c40901853c1f97ca21293fcadaaa138cbe2d4b390e0d7fa15d8c335ff1cf9" }, "monterey": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:93ba2c2c053e16bc51826a98d5b4825a2e900e80403f25b28a30b68c6a2c2ae8", - "sha256": "93ba2c2c053e16bc51826a98d5b4825a2e900e80403f25b28a30b68c6a2c2ae8" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:5a9687c58bae0fc14730eeb7a8d693c9841a9d58066ae8c90cdbeea510de0a51", + "sha256": "5a9687c58bae0fc14730eeb7a8d693c9841a9d58066ae8c90cdbeea510de0a51" }, "x86_64_linux": { "cellar": "/home/linuxbrew/.linuxbrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:d60903d734f4f66c0636ed698636320da27a0283eba134ab8fb97cc4cb7d67e3", - "sha256": "d60903d734f4f66c0636ed698636320da27a0283eba134ab8fb97cc4cb7d67e3" + "url": "https://ghcr.io/v2/homebrew/core/postgresql/15/blobs/sha256:27403cb27e7201906e1debca1eb01a731637a47eebd3aa56d9bc4dcc4702766f", + "sha256": "27403cb27e7201906e1debca1eb01a731637a47eebd3aa56d9bc4dcc4702766f" } } } @@ -1930,45 +1930,45 @@ } }, "readline": { - "version": "8.2.7", + "version": "8.2.10", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:4b08134e70e90a968bf82227fbec6861b07fdf630e7ab66e6effe95b6721cf36", - "sha256": "4b08134e70e90a968bf82227fbec6861b07fdf630e7ab66e6effe95b6721cf36" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:713fd1fa8544426b7e97eb21d13153195fea4c407db8a174bd183777b81c9192", + "sha256": "713fd1fa8544426b7e97eb21d13153195fea4c407db8a174bd183777b81c9192" }, "arm64_ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:1cbe9a00128c3b5cdf1107419087f00505533c73a60c3a210212e041dd12b3ee", - "sha256": "1cbe9a00128c3b5cdf1107419087f00505533c73a60c3a210212e041dd12b3ee" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:90351660d5ceca72a4c0a287555f2045db95f78aa5f65011b94213429f729cde", + "sha256": "90351660d5ceca72a4c0a287555f2045db95f78aa5f65011b94213429f729cde" }, "arm64_monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:210af83c5ce5ca9fe63a5ef41db95cdd555391656b5f807c23e00a50c3a47b60", - "sha256": "210af83c5ce5ca9fe63a5ef41db95cdd555391656b5f807c23e00a50c3a47b60" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:e58bc8376c36602c3cedf94075bb1097b04b77438c5a946fdbd37bf0eb6579c2", + "sha256": "e58bc8376c36602c3cedf94075bb1097b04b77438c5a946fdbd37bf0eb6579c2" }, "sonoma": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:e1e1f92fcb4d3685d9b074949e7e11543fa8f9e3bf06f6a68674c3f841fcf82a", - "sha256": "e1e1f92fcb4d3685d9b074949e7e11543fa8f9e3bf06f6a68674c3f841fcf82a" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:9796e0ff1cc29ae7e75d8fc1a3e2c5e8ae2aeade8d9d59a16363306bf6c5b8f4", + "sha256": "9796e0ff1cc29ae7e75d8fc1a3e2c5e8ae2aeade8d9d59a16363306bf6c5b8f4" }, "ventura": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:65951f699eed34b0ae5d612b88bed9a5e2f64324d4c19443db492e57c2d6625f", - "sha256": "65951f699eed34b0ae5d612b88bed9a5e2f64324d4c19443db492e57c2d6625f" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:952e2975dffc98bd35673c86474dbb91fadc8d993c0720e4f085597f7a484af9", + "sha256": "952e2975dffc98bd35673c86474dbb91fadc8d993c0720e4f085597f7a484af9" }, "monterey": { "cellar": ":any", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:f87042db256d98a53353dad8e81d567a94f74d766ab2cfc3dc7ecf5a5670fa05", - "sha256": "f87042db256d98a53353dad8e81d567a94f74d766ab2cfc3dc7ecf5a5670fa05" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:3633320dce51662036ea90acfc9adf5bb5e6f1dca7dbdb539839736129c474b0", + "sha256": "3633320dce51662036ea90acfc9adf5bb5e6f1dca7dbdb539839736129c474b0" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:f3eac4b1dedcc5724be3e63f0347a6b5829313022f4e71d3c5dc28904479b579", - "sha256": "f3eac4b1dedcc5724be3e63f0347a6b5829313022f4e71d3c5dc28904479b579" + "url": "https://ghcr.io/v2/homebrew/core/readline/blobs/sha256:65181d2c0a9bd1d91ded6f7ec4a69b1110f65e875b332947e86a30aed7eab20f", + "sha256": "65181d2c0a9bd1d91ded6f7ec4a69b1110f65e875b332947e86a30aed7eab20f" } } } @@ -2116,15 +2116,15 @@ } }, "ruby-build": { - "version": "20240119", + "version": "20240221", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "all": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ruby-build/blobs/sha256:61f4463a727fd0e6434db47da818bc3184c0788cba906e1083743329aa288641", - "sha256": "61f4463a727fd0e6434db47da818bc3184c0788cba906e1083743329aa288641" + "url": "https://ghcr.io/v2/homebrew/core/ruby-build/blobs/sha256:688c401d7956253cbe003c4c842353b7a341fda6d0fb51d18046398219b5bb23", + "sha256": "688c401d7956253cbe003c4c842353b7a341fda6d0fb51d18046398219b5bb23" } } } @@ -2144,45 +2144,45 @@ } }, "shellcheck": { - "version": "0.9.0", + "version": "0.10.0", "bottle": { - "rebuild": 1, + "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:0688df1adf51536205cde96e4910b26c88b10eb2f967a8255c726f9d0cb57d2a", - "sha256": "0688df1adf51536205cde96e4910b26c88b10eb2f967a8255c726f9d0cb57d2a" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:ef742b6992cfcdcd7289718ac64b27174e421d29ce3ad9b81e1856349059b117", + "sha256": "ef742b6992cfcdcd7289718ac64b27174e421d29ce3ad9b81e1856349059b117" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:42ac0d4c4c44a3fd85a52caa0d655c32f28e609713530ba69a52d182b61351e4", - "sha256": "42ac0d4c4c44a3fd85a52caa0d655c32f28e609713530ba69a52d182b61351e4" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:6e60ee03edb09ac5bc852b8eb813849fa654400e21ffb4c746989678172f5a26", + "sha256": "6e60ee03edb09ac5bc852b8eb813849fa654400e21ffb4c746989678172f5a26" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:4d9fc87309f3997d443d5a5e2c6ec72f3586cbeecdeb002f52f64414f106110e", - "sha256": "4d9fc87309f3997d443d5a5e2c6ec72f3586cbeecdeb002f52f64414f106110e" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:d5e8407806dbf757e71930ce2cb9b0d23bae286f0c058d9ff246d851dd7aa871", + "sha256": "d5e8407806dbf757e71930ce2cb9b0d23bae286f0c058d9ff246d851dd7aa871" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:dec4133905b1115275e6ce2d9cd5ef966cbac0e5912fc32e3c89356922ea0ec1", - "sha256": "dec4133905b1115275e6ce2d9cd5ef966cbac0e5912fc32e3c89356922ea0ec1" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:b53cf1e5464406ee49743fc2db84850b6d34d3a2098cf729e629b23f9d6dd6e0", + "sha256": "b53cf1e5464406ee49743fc2db84850b6d34d3a2098cf729e629b23f9d6dd6e0" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:89d1c2a187c42d41e99856895989e2bf57a9f82e8a0265dd30d3f417baf273dd", - "sha256": "89d1c2a187c42d41e99856895989e2bf57a9f82e8a0265dd30d3f417baf273dd" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:15ba88c48a5ae3b08e085791e3c5e514d9d78ce88414c96bd21ed33f29fb4aca", + "sha256": "15ba88c48a5ae3b08e085791e3c5e514d9d78ce88414c96bd21ed33f29fb4aca" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:f1506e3dfd48ac61184f37b5b6cb48328018bc37e415f78dd4348d2730ad9cf7", - "sha256": "f1506e3dfd48ac61184f37b5b6cb48328018bc37e415f78dd4348d2730ad9cf7" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:b3d14cb62e325d0f7221cd24a7fb4533936feae4ed4dce00e8983ec6e55123f8", + "sha256": "b3d14cb62e325d0f7221cd24a7fb4533936feae4ed4dce00e8983ec6e55123f8" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:d0f7c834a0266325e8dab25a04aeadc67664701b767d3ed2529286fb0fb66823", - "sha256": "d0f7c834a0266325e8dab25a04aeadc67664701b767d3ed2529286fb0fb66823" + "url": "https://ghcr.io/v2/homebrew/core/shellcheck/blobs/sha256:6d0867f144686a5caa025cb15ecac49286654b78e7b89979a54eedc9a0cc9b6b", + "sha256": "6d0867f144686a5caa025cb15ecac49286654b78e7b89979a54eedc9a0cc9b6b" } } } @@ -2232,45 +2232,45 @@ } }, "vim": { - "version": "9.1.0100", + "version": "9.1.0150", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:28fb07081aeaefa1864747ed178a513e828be1fb675f05bb17e5d6d906e2c780", - "sha256": "28fb07081aeaefa1864747ed178a513e828be1fb675f05bb17e5d6d906e2c780" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:80e87c79ddaa5ee73fe57e9fe12020e755bb4ef927b6c317340ded3a102f3b30", + "sha256": "80e87c79ddaa5ee73fe57e9fe12020e755bb4ef927b6c317340ded3a102f3b30" }, "arm64_ventura": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:623813f161c1b71dce847ac9d6ace8dd828ae01e7eb485e58601447e170bcdd2", - "sha256": "623813f161c1b71dce847ac9d6ace8dd828ae01e7eb485e58601447e170bcdd2" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:a3aeae2754cfb7ffbbdbf00bb25a03cf9e12f040e355cfce5edfaa33894e64a4", + "sha256": "a3aeae2754cfb7ffbbdbf00bb25a03cf9e12f040e355cfce5edfaa33894e64a4" }, "arm64_monterey": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:719be799ad7c9311a6e46ed612d4bc84b8a32ae374e3588ddc505b65a22708a5", - "sha256": "719be799ad7c9311a6e46ed612d4bc84b8a32ae374e3588ddc505b65a22708a5" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:124262d119609f1fefa4117a870859d3cc83ec65f698f8efdf369a6a0e414caf", + "sha256": "124262d119609f1fefa4117a870859d3cc83ec65f698f8efdf369a6a0e414caf" }, "sonoma": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:1e445120cc5de83923593ebddedbdec362f4e2847c2a86a50e1f088af0686346", - "sha256": "1e445120cc5de83923593ebddedbdec362f4e2847c2a86a50e1f088af0686346" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:4ead12e1fe20113c214e722272a899e40fb92941918fdf112b5b826b9938c43a", + "sha256": "4ead12e1fe20113c214e722272a899e40fb92941918fdf112b5b826b9938c43a" }, "ventura": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:3b7c700ce9c544bdbf0f0b94d3d55e50c0ec265d27d6c5cd8025732a947b00dd", - "sha256": "3b7c700ce9c544bdbf0f0b94d3d55e50c0ec265d27d6c5cd8025732a947b00dd" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:86ac65a10834d85bb99a8c4c1dee7dc11bff11a1e5c24a54ce94eb7a9d7be3af", + "sha256": "86ac65a10834d85bb99a8c4c1dee7dc11bff11a1e5c24a54ce94eb7a9d7be3af" }, "monterey": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:c3d114a5f900e40993fce185b1185e37e8643c80764a36dd0becef97683d030c", - "sha256": "c3d114a5f900e40993fce185b1185e37e8643c80764a36dd0becef97683d030c" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:58fe2f211e476dadf4bc110908c7ce79abc53d4697fe11af557c8a73aca279dc", + "sha256": "58fe2f211e476dadf4bc110908c7ce79abc53d4697fe11af557c8a73aca279dc" }, "x86_64_linux": { "cellar": "/home/linuxbrew/.linuxbrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:1567bc1a19316eb93136b5cfa74ae7da5594703449046ee3d52120609e8e1a8b", - "sha256": "1567bc1a19316eb93136b5cfa74ae7da5594703449046ee3d52120609e8e1a8b" + "url": "https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:e3a16695b8515830d21208ec0aa8b1a9eaa60770447dfb27a500b7b120b5ebec", + "sha256": "e3a16695b8515830d21208ec0aa8b1a9eaa60770447dfb27a500b7b120b5ebec" } } } @@ -2430,43 +2430,43 @@ "yamllint": { "version": "1.35.1", "bottle": { - "rebuild": 0, + "rebuild": 1, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:16120f61c559ec5fd83bb28d110b265d7bfeb38fb5f6ae3958b6edddc3836fde", - "sha256": "16120f61c559ec5fd83bb28d110b265d7bfeb38fb5f6ae3958b6edddc3836fde" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:f4c04876473720910f72e135311c05d3fefe3208bba7d90e7904cbbc2f154051", + "sha256": "f4c04876473720910f72e135311c05d3fefe3208bba7d90e7904cbbc2f154051" }, "arm64_ventura": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:9ede8ae30ddc0615758e87836e91d84e712616801d17c0ff0ae1ebb737f4ae7f", - "sha256": "9ede8ae30ddc0615758e87836e91d84e712616801d17c0ff0ae1ebb737f4ae7f" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:55c913a5745760a8c12f537a3c67fa1e97dd8dbc8e8ceb4ef7bc87d27b116279", + "sha256": "55c913a5745760a8c12f537a3c67fa1e97dd8dbc8e8ceb4ef7bc87d27b116279" }, "arm64_monterey": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:ee60920ab2ac09300844b9a0ddadef8b212d331e77ad00a3a8d163ce4651860a", - "sha256": "ee60920ab2ac09300844b9a0ddadef8b212d331e77ad00a3a8d163ce4651860a" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:2698561d2192e10a5566a2168f6ec3ded2bc5416970967b3667408d144b6e497", + "sha256": "2698561d2192e10a5566a2168f6ec3ded2bc5416970967b3667408d144b6e497" }, "sonoma": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:3a9a0bfa4caf102c09649e2c5ef5d8c33da13ffc0390c167ed6b4b35b8715b5f", - "sha256": "3a9a0bfa4caf102c09649e2c5ef5d8c33da13ffc0390c167ed6b4b35b8715b5f" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:b7b45b6cef591f8f02529e510315543830b33e4de4827fbffb1deed4c8e1c30c", + "sha256": "b7b45b6cef591f8f02529e510315543830b33e4de4827fbffb1deed4c8e1c30c" }, "ventura": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:8d1074f726fc3dce640a3c19542edcac8bfd67676508c43879ed833d919a12b1", - "sha256": "8d1074f726fc3dce640a3c19542edcac8bfd67676508c43879ed833d919a12b1" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:9b3b376d46761939812fb46be383f62dda5370417a6968bef9043ea701dd8be9", + "sha256": "9b3b376d46761939812fb46be383f62dda5370417a6968bef9043ea701dd8be9" }, "monterey": { - "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:9c609546ff7edd2d308ec5dc3e49676eeab8eda9ef9211571aadeeeeee74920b", - "sha256": "9c609546ff7edd2d308ec5dc3e49676eeab8eda9ef9211571aadeeeeee74920b" + "cellar": ":any", + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:abfd6d24311132e574b45598a59b44f07d48dc35f5e383eaad45f793fd49fc04", + "sha256": "abfd6d24311132e574b45598a59b44f07d48dc35f5e383eaad45f793fd49fc04" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:8799f333c63d658c4dd6d87113fab523b23b8e41940e869c50e4205609145bb7", - "sha256": "8799f333c63d658c4dd6d87113fab523b23b8e41940e869c50e4205609145bb7" + "url": "https://ghcr.io/v2/homebrew/core/yamllint/blobs/sha256:07a1c2f2e7b0f719576acf927daf06638605e873bc72ccc862ca3e0bf28faf64", + "sha256": "07a1c2f2e7b0f719576acf927daf06638605e873bc72ccc862ca3e0bf28faf64" } } } @@ -2474,87 +2474,87 @@ "ydiff": { "version": "1.2_2", "bottle": { - "rebuild": 4, + "rebuild": 5, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:19ee8a1c937369430282cbd2f7cf269b9d96f09abf2f1ea8d89347a829ea047e", - "sha256": "19ee8a1c937369430282cbd2f7cf269b9d96f09abf2f1ea8d89347a829ea047e" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:fb25d01f9f13cb4a7b3c0fe4b57e3443d0735bc683f648d613b276ef9973b591", + "sha256": "fb25d01f9f13cb4a7b3c0fe4b57e3443d0735bc683f648d613b276ef9973b591" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:cf4bdaea2c095aeeb6898af0427d933e7ef75d7bdf24e2c4e816c7db6f9dffd1", - "sha256": "cf4bdaea2c095aeeb6898af0427d933e7ef75d7bdf24e2c4e816c7db6f9dffd1" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:0885ed807f5e2f7bfd9fcd36ec44a38a0102adf497be77ceb71e5aa5ae2b55ed", + "sha256": "0885ed807f5e2f7bfd9fcd36ec44a38a0102adf497be77ceb71e5aa5ae2b55ed" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:ebacd80de18c253475b438d029e8e38f0ff14a598dba7129d0685e727b4ea26f", - "sha256": "ebacd80de18c253475b438d029e8e38f0ff14a598dba7129d0685e727b4ea26f" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:4b1bc22276a6eb855f2064baf5dc51f0273e62c0e58fd66cc32cad6a1dc0d5a6", + "sha256": "4b1bc22276a6eb855f2064baf5dc51f0273e62c0e58fd66cc32cad6a1dc0d5a6" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:bdb09bbe71fe3a2a31a39a360b189ab3ec91d88b38f34421e09ad7a97b9c7768", - "sha256": "bdb09bbe71fe3a2a31a39a360b189ab3ec91d88b38f34421e09ad7a97b9c7768" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:dc4c7a731e914f8e4411054a86354601d983f710550f41ceb2b3da6933b3cc94", + "sha256": "dc4c7a731e914f8e4411054a86354601d983f710550f41ceb2b3da6933b3cc94" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:aa35b53ae4de532ac6aac3eeeb9f5cc5147fe2747295f1af2910c4cb72432220", - "sha256": "aa35b53ae4de532ac6aac3eeeb9f5cc5147fe2747295f1af2910c4cb72432220" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:5f2cbff608b7dbc2c1cf6a6ce2e4a15891675ad498f21a6415223785c65e2702", + "sha256": "5f2cbff608b7dbc2c1cf6a6ce2e4a15891675ad498f21a6415223785c65e2702" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:eb9f8a23eb756125eb81cf3c7340c2760ef13ad6581b6745e07ef09ab7fdd74f", - "sha256": "eb9f8a23eb756125eb81cf3c7340c2760ef13ad6581b6745e07ef09ab7fdd74f" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:790098af5d0271224baa53cf67bf8649c6f55ecf33e07e2a55f5e5a876045c2d", + "sha256": "790098af5d0271224baa53cf67bf8649c6f55ecf33e07e2a55f5e5a876045c2d" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:4a516a84269d8f058ff8d271fce358dac1b58da7b49f2942854b829944890c29", - "sha256": "4a516a84269d8f058ff8d271fce358dac1b58da7b49f2942854b829944890c29" + "url": "https://ghcr.io/v2/homebrew/core/ydiff/blobs/sha256:df568445b19a3c7c4931d8ed811befb73b45fad50a0210c52bda2ae3a0ebddb9", + "sha256": "df568445b19a3c7c4931d8ed811befb73b45fad50a0210c52bda2ae3a0ebddb9" } } } }, "yq": { - "version": "4.41.1", + "version": "4.42.1", "bottle": { - "rebuild": 0, + "rebuild": 1, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:c5404881e9aba4d22663971dd620f7e8bbd2bbed07d6623ddcb06b8108eb8271", - "sha256": "c5404881e9aba4d22663971dd620f7e8bbd2bbed07d6623ddcb06b8108eb8271" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:d2647fa4f4e870095cc3075f1949eb56fe13c6465bad94c0026f655341557f26", + "sha256": "d2647fa4f4e870095cc3075f1949eb56fe13c6465bad94c0026f655341557f26" }, "arm64_ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:ab37a388dac49f8aa1dee95154cf840cd4c23cd8756cf394dc629e647d908c8d", - "sha256": "ab37a388dac49f8aa1dee95154cf840cd4c23cd8756cf394dc629e647d908c8d" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:f14ae7b2247a179d9c61dbfe031d6dbeea214382ba9e23dc3b4da2d8ddeb4267", + "sha256": "f14ae7b2247a179d9c61dbfe031d6dbeea214382ba9e23dc3b4da2d8ddeb4267" }, "arm64_monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:8580ba4cd20a0d5610dd253d91689d1fdacb5eb792ec2115713921524b8eb4ad", - "sha256": "8580ba4cd20a0d5610dd253d91689d1fdacb5eb792ec2115713921524b8eb4ad" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:5b46cf4bb92a631ae781d705c04c16d16859f5c65dc251e82eeca01d8b8d5a67", + "sha256": "5b46cf4bb92a631ae781d705c04c16d16859f5c65dc251e82eeca01d8b8d5a67" }, "sonoma": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:db2d0b23fcae3685db08dc78b67c592166ec4311f6058aad40fd984face94e60", - "sha256": "db2d0b23fcae3685db08dc78b67c592166ec4311f6058aad40fd984face94e60" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:d7410aec42a972e19aadb730447e0d5f8e0278e36d42d1288b155656769f1d63", + "sha256": "d7410aec42a972e19aadb730447e0d5f8e0278e36d42d1288b155656769f1d63" }, "ventura": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:823638d8a82d905fcd00c7e88b12cfe6ada9e9e4a9ea627cfb37d55965648354", - "sha256": "823638d8a82d905fcd00c7e88b12cfe6ada9e9e4a9ea627cfb37d55965648354" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:b5c78848aa5b4e4e57fc65c77876905987ee4507e20028a7a62fcfe335f4a569", + "sha256": "b5c78848aa5b4e4e57fc65c77876905987ee4507e20028a7a62fcfe335f4a569" }, "monterey": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:87ff086af7864d8419c519642079d6923cbc7931250faa39dd0df44a58ffcaf9", - "sha256": "87ff086af7864d8419c519642079d6923cbc7931250faa39dd0df44a58ffcaf9" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:6dc69ce9dec49778cc0e98c4bf70070796ed6aa7e5b48053ef51e310699ba93e", + "sha256": "6dc69ce9dec49778cc0e98c4bf70070796ed6aa7e5b48053ef51e310699ba93e" }, "x86_64_linux": { "cellar": ":any_skip_relocation", - "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:2c42c4894c4508bd6af2551dd07e5fe5646fe0ecb25d0a96931a263b5a46fdc1", - "sha256": "2c42c4894c4508bd6af2551dd07e5fe5646fe0ecb25d0a96931a263b5a46fdc1" + "url": "https://ghcr.io/v2/homebrew/core/yq/blobs/sha256:c5cc97ff03d5d07b8f8381e7f282ef0b74b0d9c273df50535985fa0dd81cdaa1", + "sha256": "c5cc97ff03d5d07b8f8381e7f282ef0b74b0d9c273df50535985fa0dd81cdaa1" } } } @@ -2648,45 +2648,45 @@ } }, "gpg2": { - "version": "2.4.4", + "version": "2.4.5", "bottle": { "rebuild": 0, "root_url": "https://ghcr.io/v2/homebrew/core", "files": { "arm64_sonoma": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:eead9f697214f8c9245ca7cb24aecff0ca3e8f46322ddf890c89146396782bc0", - "sha256": "eead9f697214f8c9245ca7cb24aecff0ca3e8f46322ddf890c89146396782bc0" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:06ef66459900967866adbca613753707c6836c7b32b1c1f9d7a647771db88e2a", + "sha256": "06ef66459900967866adbca613753707c6836c7b32b1c1f9d7a647771db88e2a" }, "arm64_ventura": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:e096a8063b3cfbb76deb3afcba2ab5556a6403ca4c31bc1d1683edd3ad77fb70", - "sha256": "e096a8063b3cfbb76deb3afcba2ab5556a6403ca4c31bc1d1683edd3ad77fb70" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:5640c700c6d704a612f849d00dfd00b1361cfb7664ce1e4be14b981044917aef", + "sha256": "5640c700c6d704a612f849d00dfd00b1361cfb7664ce1e4be14b981044917aef" }, "arm64_monterey": { "cellar": "/opt/homebrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:8e7c0ff2b1a73454e093b384aafb71a021c31049219dd4b55fd188a6574fa51e", - "sha256": "8e7c0ff2b1a73454e093b384aafb71a021c31049219dd4b55fd188a6574fa51e" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:74cdf0e0430980129545583496f6a2d908b9f8a8b0e69a4e8484f3aee4e7647d", + "sha256": "74cdf0e0430980129545583496f6a2d908b9f8a8b0e69a4e8484f3aee4e7647d" }, "sonoma": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:10a786c7b9f9eac5c960d303076ea31e1b62e6dd03168948ac6ee32752f97967", - "sha256": "10a786c7b9f9eac5c960d303076ea31e1b62e6dd03168948ac6ee32752f97967" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:bd0eaa9e5cb762f3426380799089831c34fd27dc608cc3bd15a86b0b43df8ce2", + "sha256": "bd0eaa9e5cb762f3426380799089831c34fd27dc608cc3bd15a86b0b43df8ce2" }, "ventura": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:5bf0ac220534eb57328b643cefc17b31d3457e5a3bc0fbad53587e86412c4caa", - "sha256": "5bf0ac220534eb57328b643cefc17b31d3457e5a3bc0fbad53587e86412c4caa" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:3e1ab240be58c5267dbd3bc9cd82a19b09b96507169188a20adf710886733bd3", + "sha256": "3e1ab240be58c5267dbd3bc9cd82a19b09b96507169188a20adf710886733bd3" }, "monterey": { "cellar": "/usr/local/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:6491443b90accbc12ad485d13025fc60d4d5a56e4f4d09e99fe3767f53c3d2b5", - "sha256": "6491443b90accbc12ad485d13025fc60d4d5a56e4f4d09e99fe3767f53c3d2b5" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:9ea477a517f2de40c9bf7a8a335f6f2d7c1c234a31f47596f016305d175de908", + "sha256": "9ea477a517f2de40c9bf7a8a335f6f2d7c1c234a31f47596f016305d175de908" }, "x86_64_linux": { "cellar": "/home/linuxbrew/.linuxbrew/Cellar", - "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:2701069f114e5a3b6b10ce4e6a34bb6df0edcbafdc4a4a7edc69208983d9109f", - "sha256": "2701069f114e5a3b6b10ce4e6a34bb6df0edcbafdc4a4a7edc69208983d9109f" + "url": "https://ghcr.io/v2/homebrew/core/gnupg/blobs/sha256:3d0b4817c65315ef6457feb0e6e26672fc0a91475e64499304ebf5fc5faeb39d", + "sha256": "3d0b4817c65315ef6457feb0e6e26672fc0a91475e64499304ebf5fc5faeb39d" } } } @@ -2694,17 +2694,105 @@ "stripe/stripe-mock/stripe-mock": { "version": "0.182.0", "bottle": false + }, + "minikube": { + "version": "1.32.0", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:2fa25ebc8759ff50e97f915601eeceb9f02dca260b51f9e858bdb1347b656861", + "sha256": "2fa25ebc8759ff50e97f915601eeceb9f02dca260b51f9e858bdb1347b656861" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:a068a5f5bd364df8e8c0b7084332800943084802c57c72560ae1d7499b8838b7", + "sha256": "a068a5f5bd364df8e8c0b7084332800943084802c57c72560ae1d7499b8838b7" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:e2ad2baca95b4267bc3eec3555dd3228337ce37f892adaba37df845a8ccc6499", + "sha256": "e2ad2baca95b4267bc3eec3555dd3228337ce37f892adaba37df845a8ccc6499" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:4a391ddf8cbc68f14cc70441db46ed7a94412475ffdf16c6a72cea353681ed80", + "sha256": "4a391ddf8cbc68f14cc70441db46ed7a94412475ffdf16c6a72cea353681ed80" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:8dd2f235c3886a9a3714436202fdb1638ed32b108bb7ca095357d22f5d298dbf", + "sha256": "8dd2f235c3886a9a3714436202fdb1638ed32b108bb7ca095357d22f5d298dbf" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:6e79f66ab867efbd36a805d92198e1f0843f3be147b94bbc0146d235753c601b", + "sha256": "6e79f66ab867efbd36a805d92198e1f0843f3be147b94bbc0146d235753c601b" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/minikube/blobs/sha256:dc42a6ecd1d3129b76afe2959d5a126eb4aafa34a34815483e85eb001adc1894", + "sha256": "dc42a6ecd1d3129b76afe2959d5a126eb4aafa34a34815483e85eb001adc1894" + } + } + } + }, + "kubernetes-cli": { + "version": "1.29.2", + "bottle": { + "rebuild": 0, + "root_url": "https://ghcr.io/v2/homebrew/core", + "files": { + "arm64_sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:149bb26966ae33f2476068e8a793fcd29443737ddd00f3d35eeca4fb0da58678", + "sha256": "149bb26966ae33f2476068e8a793fcd29443737ddd00f3d35eeca4fb0da58678" + }, + "arm64_ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:fde01001bb1ab9edb9e3b5221a7a694bd012befd13751d2ec509cfd010499741", + "sha256": "fde01001bb1ab9edb9e3b5221a7a694bd012befd13751d2ec509cfd010499741" + }, + "arm64_monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:0668dd2817c46e6396ea7be4eefd56f582846d9d88a8da462ce2ea72b5c03b60", + "sha256": "0668dd2817c46e6396ea7be4eefd56f582846d9d88a8da462ce2ea72b5c03b60" + }, + "sonoma": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:528d24a53f1bf5e3f48fe5b281dc8903c63b2420e8581fda207d33bddc9c79c6", + "sha256": "528d24a53f1bf5e3f48fe5b281dc8903c63b2420e8581fda207d33bddc9c79c6" + }, + "ventura": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:ddf16ce722d3a1e1f5d1405df06b66fd038a522e94c2e9bf643635d6e69a7643", + "sha256": "ddf16ce722d3a1e1f5d1405df06b66fd038a522e94c2e9bf643635d6e69a7643" + }, + "monterey": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:6fa962ab52eb01a0cc2aeb7145288f1659819a8063ef9fdecd178b1eb93dbca5", + "sha256": "6fa962ab52eb01a0cc2aeb7145288f1659819a8063ef9fdecd178b1eb93dbca5" + }, + "x86_64_linux": { + "cellar": ":any_skip_relocation", + "url": "https://ghcr.io/v2/homebrew/core/kubernetes-cli/blobs/sha256:1faa3014c67210d3aec818c4b31d368cf8a8ac95cd68e3fbc8ee1975ee50c8e1", + "sha256": "1faa3014c67210d3aec818c4b31d368cf8a8ac95cd68e3fbc8ee1975ee50c8e1" + } + } + } } }, "cask": { "chromedriver": { - "version": "121.0.6167.85", + "version": "122.0.6261.111", "options": { "full_name": "chromedriver" } }, "github": { - "version": "3.3.8-48bb7059", + "version": "3.3.11-d0de25f5", "options": { "full_name": "github" } @@ -2966,11 +3054,11 @@ "system": { "macos": { "sonoma": { - "HOMEBREW_VERSION": "4.2.8", + "HOMEBREW_VERSION": "4.2.11", "HOMEBREW_PREFIX": "/opt/homebrew", "Homebrew/homebrew-core": "api", - "CLT": "15.1.0.0.1.1700200546", - "Xcode": "15.2", + "CLT": "15.3.0.0.1.1708646388", + "Xcode": "15.3", "macOS": "14.3.1" } } diff --git a/Gemfile b/Gemfile index 373df874..89f25b9c 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ source 'https://rubygems.org' gem 'rails', '~> 6.0.2' +gem 'annotate' gem 'attribute_normalizer' gem 'awesome_print' gem 'bootsnap' @@ -36,7 +37,6 @@ gem 'twitter-bootstrap-rails' gem 'uglifier' gem 'ventable' gem 'yard' -gem 'annotate' group :development, :test do gem 'codecov' diff --git a/Gemfile.lock b/Gemfile.lock index 62f33dce..b2a028ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -138,7 +138,7 @@ GEM thor tilt highline (3.0.1) - i18n (1.14.1) + i18n (1.14.4) concurrent-ruby (~> 1.0) image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) @@ -285,7 +285,7 @@ GEM rspec-expectations (~> 3.10) rspec-mocks (~> 3.10) rspec-support (~> 3.10) - rspec-support (3.13.0) + rspec-support (3.13.1) rubocop (1.60.2) json (~> 2.3) language_server-protocol (>= 3.17.0) diff --git a/app/models/event_admin.rb b/app/models/event_admin.rb index 5e1dd4dc..4cef97f4 100644 --- a/app/models/event_admin.rb +++ b/app/models/event_admin.rb @@ -12,10 +12,8 @@ # # Indexes # -# index_event_admins_on_event_id (event_id) # index_event_admins_on_event_id_and_user_id (event_id,user_id) UNIQUE # index_event_admins_on_user_id (user_id) -# index_event_admins_on_user_id_only (user_id) # class EventAdmin < ApplicationRecord attr_accessible :event_id, :user_id diff --git a/bin/rubocop b/bin/rubocop new file mode 100755 index 00000000..369a05be --- /dev/null +++ b/bin/rubocop @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rubocop' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rubocop", "rubocop") diff --git a/config/initializers/auto_annotate_models.rb b/config/initializers/auto_annotate_models.rb index dc98c888..6c13e27b 100644 --- a/config/initializers/auto_annotate_models.rb +++ b/config/initializers/auto_annotate_models.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + Annotate.set_defaults( 'active_admin' => 'false', 'additional_file_patterns' => [], diff --git a/db/migrate/20240311182346_remove_unused_indexes_from_event_admin.rb b/db/migrate/20240311182346_remove_unused_indexes_from_event_admin.rb new file mode 100644 index 00000000..490598ab --- /dev/null +++ b/db/migrate/20240311182346_remove_unused_indexes_from_event_admin.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +class RemoveUnusedIndexesFromEventAdmin < ActiveRecord::Migration[6.0] + def up + if index_exists?(:event_admins, :user_id, + name: 'index_event_admins_on_user_id_only') + remove_index :event_admins, column: [:user_id], name: 'index_event_admins_on_user_id_only' + end + + if index_exists?(:event_admins, :event_id, name: 'index_event_admins_on_event_id') + remove_index :event_admins, column: [:event_id], name: 'index_event_admins_on_event_id' + end + + execute 'analyze event_admins' + end + + def down + unless index_exists?(:event_admins, :user_id, name: 'index_event_admins_on_user_id_only') + add_index(:event_admins, [:user_id], name: 'index_event_admins_on_user_id_only') + end + + unless index_exists?(:event_admins, :event_id, name: 'index_event_admins_on_event_id') + add_index(:event_admins, [:event_id], name: 'index_event_admins_on_event_id') + end + + execute 'analyze event_admins' + end +end diff --git a/db/structure.sql b/db/structure.sql index 13323600..e190d901 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -645,13 +645,6 @@ ALTER TABLE ONLY public.users CREATE INDEX index_eald_payments_on_event_id ON public.eald_payments USING btree (event_id); --- --- Name: index_event_admins_on_event_id; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_event_admins_on_event_id ON public.event_admins USING btree (event_id); - - -- -- Name: index_event_admins_on_event_id_and_user_id; Type: INDEX; Schema: public; Owner: - -- @@ -666,13 +659,6 @@ CREATE UNIQUE INDEX index_event_admins_on_event_id_and_user_id ON public.event_a CREATE INDEX index_event_admins_on_user_id ON public.event_admins USING btree (user_id); --- --- Name: index_event_admins_on_user_id_only; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX index_event_admins_on_user_id_only ON public.event_admins USING btree (user_id); - - -- -- Name: index_jobs_on_event_id; Type: INDEX; Schema: public; Owner: - -- @@ -788,6 +774,7 @@ INSERT INTO "schema_migrations" (version) VALUES ('20140706232217'), ('20150609064608'), ('20160611234315'), -('20180527021019'); +('20180527021019'), +('20240311182346'); diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake index e96283ea..a9007b6f 100644 --- a/lib/tasks/auto_annotate_models.rake +++ b/lib/tasks/auto_annotate_models.rake @@ -1,59 +1,64 @@ +# frozen_string_literal: true + # NOTE: only doing this in development as some production environments (Heroku) # NOTE: are sensitive to local FS writes, and besides -- it's just not proper # NOTE: to have a dev-mode tool do its thing in production. if Rails.env.development? require 'annotate' - task :set_annotation_options do + + # rubocop: disable Rake/Desc + task set_annotation_options: :environment do # You can override any of these by setting an environment variable of the # same name. Annotate.set_defaults( - 'active_admin' => 'false', - 'additional_file_patterns' => [], - 'routes' => 'false', - 'models' => 'true', - 'position_in_routes' => 'before', - 'position_in_class' => 'before', - 'position_in_test' => 'before', - 'position_in_fixture' => 'before', - 'position_in_factory' => 'before', - 'position_in_serializer' => 'before', - 'show_foreign_keys' => 'true', - 'show_complete_foreign_keys' => 'false', - 'show_indexes' => 'true', - 'simple_indexes' => 'false', - 'model_dir' => 'app/models', - 'root_dir' => '', - 'include_version' => 'false', - 'require' => '', - 'exclude_tests' => 'false', - 'exclude_fixtures' => 'false', - 'exclude_factories' => 'false', - 'exclude_serializers' => 'false', - 'exclude_scaffolds' => 'true', - 'exclude_controllers' => 'true', - 'exclude_helpers' => 'true', - 'exclude_sti_subclasses' => 'false', - 'ignore_model_sub_dir' => 'false', - 'ignore_columns' => nil, - 'ignore_routes' => nil, - 'ignore_unknown_models' => 'false', - 'hide_limit_column_types' => 'integer,bigint,boolean', - 'hide_default_column_types' => 'json,jsonb,hstore', - 'skip_on_db_migrate' => 'false', - 'format_bare' => 'true', - 'format_rdoc' => 'false', - 'format_yard' => 'false', - 'format_markdown' => 'false', - 'sort' => 'false', - 'force' => 'false', - 'frozen' => 'false', - 'classified_sort' => 'true', - 'trace' => 'false', - 'wrapper_open' => nil, - 'wrapper_close' => nil, - 'with_comment' => 'true' + 'active_admin' => 'false', + 'additional_file_patterns' => [], + 'routes' => 'false', + 'models' => 'true', + 'position_in_routes' => 'before', + 'position_in_class' => 'before', + 'position_in_test' => 'before', + 'position_in_fixture' => 'before', + 'position_in_factory' => 'before', + 'position_in_serializer' => 'before', + 'show_foreign_keys' => 'true', + 'show_complete_foreign_keys' => 'false', + 'show_indexes' => 'true', + 'simple_indexes' => 'false', + 'model_dir' => 'app/models', + 'root_dir' => '', + 'include_version' => 'false', + 'require' => '', + 'exclude_tests' => 'false', + 'exclude_fixtures' => 'false', + 'exclude_factories' => 'false', + 'exclude_serializers' => 'false', + 'exclude_scaffolds' => 'true', + 'exclude_controllers' => 'true', + 'exclude_helpers' => 'true', + 'exclude_sti_subclasses' => 'false', + 'ignore_model_sub_dir' => 'false', + 'ignore_columns' => nil, + 'ignore_routes' => nil, + 'ignore_unknown_models' => 'false', + 'hide_limit_column_types' => 'integer,bigint,boolean', + 'hide_default_column_types' => 'json,jsonb,hstore', + 'skip_on_db_migrate' => 'false', + 'format_bare' => 'true', + 'format_rdoc' => 'false', + 'format_yard' => 'false', + 'format_markdown' => 'false', + 'sort' => 'false', + 'force' => 'false', + 'frozen' => 'false', + 'classified_sort' => 'true', + 'trace' => 'false', + 'wrapper_open' => nil, + 'wrapper_close' => nil, + 'with_comment' => 'true' ) end + # rubocop: enable Rake/Desc Annotate.load_tasks end diff --git a/spec/models/event_admin_spec.rb b/spec/models/event_admin_spec.rb index 1f64ee5b..1f3294e4 100644 --- a/spec/models/event_admin_spec.rb +++ b/spec/models/event_admin_spec.rb @@ -12,44 +12,56 @@ # # Indexes # -# index_event_admins_on_event_id (event_id) # index_event_admins_on_event_id_and_user_id (event_id,user_id) UNIQUE # index_event_admins_on_user_id (user_id) -# index_event_admins_on_user_id_only (user_id) # describe EventAdmin do - describe 'validations' do - describe '#user' do - describe 'valid admin' do - subject(:event_admin) { EventAdmin.make! } + subject(:event_admin) { event_admin_maker[nil_method] } - it { is_expected.to be_valid } - end + let(:nil_method) { nil } + let(:event) { event_admin.event } + let(:user) { event_admin.user } - describe 'nil user id' do - subject(:event_admin_without_user) { EventAdmin.make!.tap { |ea| ea.user = nil }.validate! } + let(:event_admin_maker) do + lambda do |nil_method = nil| + described_class.make!.tap { |ea| nil_method ? ea.send("#{nil_method}=", nil) : ea } + end + end + + describe 'validations' do + describe 'valid admin' do + it { is_expected.to be_valid } + end + + describe '#user' do + describe 'nil user' do + subject(:event_admin_no_user) { event_admin_maker.call(:user_id) } it 'invalidates nil user_id' do - expect { event_admin_without_user }.to raise_error(ArgumentError) + expect { event_admin_no_user.validate! }.to raise_error(ArgumentError) end end - describe 'nil event id' do - subject(:event_admin_without_event) { EventAdmin.make!.tap { |ea| ea.event = nil }.validate! } + describe 'nil event' do + subject(:event_admin_without_event) { event_admin_maker.call(:event_id) } - it 'invalidates nil event_id' do - expect { event_admin_without_event }.to raise_error(ArgumentError) + it 'invalidates nil user_id' do + expect { event_admin_without_event.validate! }.to raise_error(ArgumentError) end end - context 'when the user is already an admin for the event' do - subject { described_class.make event: } + describe 'event admin uniqueness' do + it 'has already event_admin for this event' do + expect(described_class.where(event:, user:).count).to eq(1) + end - let(:event) { Event.make! } - let(:event_admin) { described_class.make! event: } - let(:user) { event_admin.user } + describe 'when the user is already an admin for the event' do + subject(:another_event_admin) { described_class.make!(event:, user:) } - it { is_expected.not_to accept_values_for(:user_id, user.id) } + it 'raises validation error' do + expect { another_event_admin }.to raise_error(ActiveRecord::RecordInvalid) + end + end end end end