From 68d95704ef708125859781110b584e4ea3f97aa9 Mon Sep 17 00:00:00 2001 From: mikefinneran <110622959+mikefinneran@users.noreply.github.com> Date: Mon, 29 Jul 2024 11:37:15 -0400 Subject: [PATCH 01/46] feature/appeals-45972 (#21950) * Remove UUID from attrs sent_to metrics. (#21630) * Remove UUID from attrs sent_to metrics. * pushing with some linting issues for visibility. * Change config implementation. * Remove UUID from spec * remove uuid from update_appellant job * diable rubocop for open_telemetry init * OTEL fixes * rescue, errors --------- Co-authored-by: mikefinneran <110622959+mikefinneran@users.noreply.github.com> * add otel reqs * Remove throw * comment out otel file loop * try vendor suggested config * update otel config to match vendor * update pg gem * otel include dt_host file * otel require bundler and rubygems * otel subset of instrumentation * Revert "update pg gem" This reverts commit fc1a45dfeedd3c2b9e299088cf10aea1394bf199. * update redis and minimize otel instrumentation to just rails, rack, and activerecord * otel add use_all except pg and redis * otel require instruments * otel fix typo * otel fix typo * otel comment out net_http * otel silence aws sdk internals * otel silence aws sdk internals * otel add net http * Individually use OTEL instruments (#22082) * Individually use OTEL instruments with options. * disable AwsSdk only. Checking Rack options. * re-require awssdk even while disabled. * disable awssdk * disable datadog for testing * change sequence factory to properly seed * updated opentelemetry and datadog configs * rack context getter initalizer * use one at a time * add curly braces * Revert change * revert change * Revert change * Revert change * Remove gemfile grouping * Remove datadog. * ActionPack and Actionview changes * APPEALS-44287: Excluding disposition held and select that appeal for distribution (#22277) * first run at an SQL query removing duplicate appeals from distribution * code refactor and excluding disposition held and select that appeal for distribution * automated test for the duplicate hearing bug * fix rubocop offense SpaceInsideBlockBraces --------- Co-authored-by: Sean Parker Co-authored-by: samasudhirreddy --------- Co-authored-by: Noelle Adkin <98478937+NoelleAd@users.noreply.github.com> Co-authored-by: Raymond Hughes <131811099+raymond-hughes@users.noreply.github.com> Co-authored-by: Dani Co-authored-by: raymond-hughes Co-authored-by: Craig Reese <109101548+craigrva@users.noreply.github.com> Co-authored-by: Sean Parker Co-authored-by: samasudhirreddy --- Gemfile | 27 ++++- Gemfile.lock | 108 ++++++++++++++++-- .../hearing_request_distribution_query.rb | 10 +- app/services/metrics_service.rb | 5 - config/initializers/datadog.rb | 14 --- config/initializers/open_telemetry.rb | 70 ++++++++++++ config/initializers/rack_context.rb | 22 ++++ .../dockets/hearing_request_docket_spec.rb | 32 ++++++ 8 files changed, 256 insertions(+), 32 deletions(-) delete mode 100644 config/initializers/datadog.rb create mode 100644 config/initializers/open_telemetry.rb create mode 100644 config/initializers/rack_context.rb diff --git a/Gemfile b/Gemfile index 17eec027d43..1f06f9038d7 100644 --- a/Gemfile +++ b/Gemfile @@ -22,8 +22,6 @@ gem "connect_mpi", git: "https://github.com/department-of-veterans-affairs/conne gem "connect_vbms", git: "https://github.com/department-of-veterans-affairs/connect_vbms.git", ref: "9807d9c9f0f3e3494a60b6693dc4f455c1e3e922" gem "console_tree_renderer", git: "https://github.com/department-of-veterans-affairs/console-tree-renderer.git", tag: "v0.1.1" gem "countries" -gem "ddtrace" -gem "dogstatsd-ruby" gem "dry-schema", "~> 1.4" gem "fast_jsonapi" gem "fuzzy_match" @@ -38,6 +36,29 @@ gem "moment_timezone-rails" gem "multiverse" gem "newrelic_rpm" gem "nokogiri", ">= 1.11.0.rc4" + +# gem "opentelemetry-exporter-otlp" +# gem "opentelemetry-instrumentation-all" +# gem "opentelemetry-sdk" + +gem "opentelemetry-sdk", require: false +gem "opentelemetry-exporter-otlp", require: false +gem "opentelemetry-instrumentation-rack", require: false +gem "opentelemetry-instrumentation-rails", require: false +gem "opentelemetry-instrumentation-active_job", require: false +gem "opentelemetry-instrumentation-action_pack", require: false +gem "opentelemetry-instrumentation-active_record", require: false +gem "opentelemetry-instrumentation-action_view", require: false +gem "opentelemetry-instrumentation-active_model_serializers", require: false +gem "opentelemetry-instrumentation-aws_sdk", require: false +gem "opentelemetry-instrumentation-concurrent_ruby", require: false +gem "opentelemetry-instrumentation-faraday", require: false +gem "opentelemetry-instrumentation-http", require: false +gem "opentelemetry-instrumentation-http_client", require: false +gem "opentelemetry-instrumentation-net_http", require: false +# gem "opentelemetry-instrumentation-pg", require: false +# gem "opentelemetry-instrumentation-redis", require: false + gem "paper_trail", "~> 12.0" # Used to speed up reporting gem "parallel" @@ -62,7 +83,7 @@ gem "rainbow" # React gem "react_on_rails", "11.3.0" gem "redis-mutex" -gem "redis-namespace" +gem "redis-namespace", "~> 1.11.0" gem "redis-rails", "~> 5.0.2" gem "request_store" gem "roo", "~> 2.7" diff --git a/Gemfile.lock b/Gemfile.lock index 2239aa22953..91ad56dedca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1529,8 +1529,6 @@ GEM database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) date (3.3.3) - ddtrace (0.34.1) - msgpack debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.14) @@ -1544,7 +1542,6 @@ GEM thor (~> 0.19) diff-lcs (1.3) docile (1.1.5) - dogstatsd-ruby (4.4.0) dotenv (2.7.5) dotenv-rails (2.7.5) dotenv (= 2.7.5) @@ -1615,6 +1612,9 @@ GEM rchardet (~> 1.8) globalid (1.1.0) activesupport (>= 5.0) + google-protobuf (3.25.3) + googleapis-common-protos-types (1.14.0) + google-protobuf (~> 3.18) govdelivery-tms (2.8.4) activesupport faraday @@ -1751,6 +1751,82 @@ GEM faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) open4 (1.3.4) + opentelemetry-api (1.1.0) + opentelemetry-common (0.19.7) + opentelemetry-api (~> 1.0) + opentelemetry-exporter-otlp (0.24.2) + google-protobuf (~> 3.19) + googleapis-common-protos-types (~> 1.3) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.19.6) + opentelemetry-sdk (~> 1.2) + opentelemetry-semantic_conventions + opentelemetry-instrumentation-action_pack (0.5.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-action_view (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.1) + opentelemetry-instrumentation-base (~> 0.20) + opentelemetry-instrumentation-active_job (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-active_model_serializers (0.19.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-active_record (0.5.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + ruby2_keywords + opentelemetry-instrumentation-active_support (0.3.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-aws_sdk (0.3.2) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-base (0.21.1) + opentelemetry-api (~> 1.0) + opentelemetry-registry (~> 0.1) + opentelemetry-instrumentation-concurrent_ruby (0.20.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-faraday (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-http (0.21.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-http_client (0.21.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-net_http (0.21.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rack (0.22.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rails (0.25.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_pack (~> 0.5.0) + opentelemetry-instrumentation-action_view (~> 0.4.0) + opentelemetry-instrumentation-active_job (~> 0.4.0) + opentelemetry-instrumentation-active_record (~> 0.5.0) + opentelemetry-instrumentation-active_support (~> 0.3.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-registry (0.2.0) + opentelemetry-api (~> 1.1) + opentelemetry-sdk (1.2.1) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.19.3) + opentelemetry-registry (~> 0.2) + opentelemetry-semantic_conventions + opentelemetry-semantic_conventions (1.10.0) + opentelemetry-api (~> 1.0) paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) @@ -1840,8 +1916,8 @@ GEM redis-namespace (~> 1.0) redis-mutex (4.0.2) redis-classy (~> 2.0) - redis-namespace (1.6.0) - redis (>= 3.0.4) + redis-namespace (1.11.0) + redis (>= 4) redis-rack (2.0.4) rack (>= 1.5, < 3) redis-store (>= 1.2, < 2) @@ -1918,6 +1994,7 @@ GEM ruby-plsql (0.8.0) ruby-prof (1.4.1) ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) ruby_dep (1.5.0) ruby_parser (3.20.3) sexp_processor (~> 4.16) @@ -2070,10 +2147,8 @@ DEPENDENCIES countries danger (~> 6.2.2) database_cleaner-active_record (= 2.0.0) - ddtrace debase derailed_benchmarks - dogstatsd-ruby dotenv-rails dry-schema (~> 1.4) factory_bot_rails (~> 5.2) @@ -2096,6 +2171,21 @@ DEPENDENCIES multiverse newrelic_rpm nokogiri (>= 1.11.0.rc4) + opentelemetry-exporter-otlp + opentelemetry-instrumentation-action_pack + opentelemetry-instrumentation-action_view + opentelemetry-instrumentation-active_job + opentelemetry-instrumentation-active_model_serializers + opentelemetry-instrumentation-active_record + opentelemetry-instrumentation-aws_sdk + opentelemetry-instrumentation-concurrent_ruby + opentelemetry-instrumentation-faraday + opentelemetry-instrumentation-http + opentelemetry-instrumentation-http_client + opentelemetry-instrumentation-net_http + opentelemetry-instrumentation-rack + opentelemetry-instrumentation-rails + opentelemetry-sdk paper_trail (~> 12.0) parallel paranoia (~> 2.2) @@ -2114,7 +2204,7 @@ DEPENDENCIES rb-readline react_on_rails (= 11.3.0) redis-mutex - redis-namespace + redis-namespace (~> 1.11.0) redis-rails (~> 5.0.2) request_store roo (~> 2.7) @@ -2157,4 +2247,4 @@ DEPENDENCIES ziptz BUNDLED WITH - 2.4.22 + 2.4.19 diff --git a/app/queries/hearing_request_distribution_query.rb b/app/queries/hearing_request_distribution_query.rb index c03c7aa6890..646836cf5f6 100644 --- a/app/queries/hearing_request_distribution_query.rb +++ b/app/queries/hearing_request_distribution_query.rb @@ -53,6 +53,7 @@ def not_genpop_appeals ama_non_aod_hearing_query.or(ama_aod_hearing_query).uniq end + # rubocop:disable Metrics/AbcSize, Metrics/MethodLength def only_genpop_appeals ama_non_aod_hearing_query = generate_ama_only_genpop_non_aod_hearing_query(base_relation) ama_aod_hearing_query = generate_ama_only_genpop_aod_hearing_query(base_relation) @@ -79,9 +80,16 @@ def only_genpop_appeals # the base result is doing an inner join with hearings so it isn't retrieving any appeals that have no hearings # yet, so we add with_no_hearings to retrieve those appeals no_hearings_or_no_held_hearings = with_no_hearings.or(with_no_held_hearings) + no_hearings_or_only_no_held_hearings = [] + no_hearings_or_no_held_hearings.each do |appeal| + if appeal.hearings.blank? || appeal.hearings.pluck(:disposition).exclude?("held") + no_hearings_or_only_no_held_hearings << appeal + end + end - [*result, *no_hearings_or_no_held_hearings].uniq + [*result, *no_hearings_or_only_no_held_hearings].uniq end + # rubocop:enable Metrics/AbcSize, Metrics/MethodLength def generate_ama_not_genpop_non_aod_hearing_query(base_relation) query = diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb index 08c2dbb68c4..fbdbb2a87ee 100644 --- a/app/services/metrics_service.rb +++ b/app/services/metrics_service.rb @@ -1,18 +1,15 @@ # frozen_string_literal: true require "benchmark" -require "datadog/statsd" require "statsd-instrument" # see https://dropwizard.github.io/metrics/3.1.0/getting-started/ for abstractions on metric types class MetricsService - @statsd = Datadog::Statsd.new # :reek:LongParameterList def self.increment_counter(metric_group:, metric_name:, app_name:, attrs: {}, by: 1) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.increment(stat_name, tags: tags, by: by) # Dynatrace statD implementation StatsD.increment(stat_name, tags: tags) @@ -34,7 +31,6 @@ def self.record_runtime(metric_group:, app_name:, start_time: Time.zone.now) def self.emit_gauge(metric_group:, metric_name:, metric_value:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.gauge(stat_name, metric_value, tags: tags) # Dynatrace statD implementation StatsD.gauge(stat_name, metric_value, tags: tags) @@ -45,7 +41,6 @@ def self.emit_gauge(metric_group:, metric_name:, metric_value:, app_name:, attrs def self.histogram(metric_group:, metric_name:, metric_value:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.histogram(stat_name, metric_value, tags: tags) # Dynatrace statD implementation StatsD.histogram(stat_name, metric_value, tags: tags) diff --git a/config/initializers/datadog.rb b/config/initializers/datadog.rb deleted file mode 100644 index 033ae4f776f..00000000000 --- a/config/initializers/datadog.rb +++ /dev/null @@ -1,14 +0,0 @@ -unless Rails.env.test? - Datadog.configure do |c| - options = { analytics_enabled: true } - - c.analytics_enabled = true - c.use :rails, options - c.use :active_record, options - c.use :rack, options - c.use :redis, options - c.use :shoryuken, options - - c.env = ENV['DEPLOY_ENV'] - end -end diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb new file mode 100644 index 00000000000..aec0cc3af93 --- /dev/null +++ b/config/initializers/open_telemetry.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true +require 'rubygems' +require 'bundler/setup' + +# require 'opentelemetry/sdk' +# require 'opentelemetry/exporter/otlp' +# require 'opentelemetry/instrumentation/all' + +require 'opentelemetry/sdk' +require 'opentelemetry/exporter/otlp' +require 'opentelemetry/instrumentation/rack' +require 'opentelemetry/instrumentation/rails' +require 'opentelemetry/instrumentation/active_record' +# require 'opentelemetry/instrumentation/active_job' +require 'opentelemetry/instrumentation/action_pack' +require 'opentelemetry/instrumentation/action_view' +# require 'opentelemetry/instrumentation/active_model_serializers' +# require 'opentelemetry/instrumentation/aws_sdk' +# require 'opentelemetry/instrumentation/concurrent_ruby' +# require 'opentelemetry/instrumentation/faraday' +# require 'opentelemetry/instrumentation/http' +# require 'opentelemetry/instrumentation/http_client' +# require 'opentelemetry/instrumentation/net/http' +# require 'opentelemetry/instrumentation/net_http' +# require 'opentelemetry/instrumentation/pg' +# require 'opentelemetry/instrumentation/redis' + +# rubocop:disable Layout/LineLength + +DT_API_URL = ENV["DT_API_URL"] +DT_API_TOKEN = ENV["DT_API_TOKEN"] + +Rails.logger.info("DT_API_TOKEN is set to #{DT_API_TOKEN}") + +if !Rails.env.development? && !Rails.env.test? && !Rails.env.demo? + OpenTelemetry::SDK.configure do |c| + c.service_name = 'ruby-quickstart' + c.service_version = '1.0.1' + # c.use_all # application will be using all instrumentation provided by OpenTelemetry + # c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + # c.use 'OpenTelemetry::Instrumentation::Rails' + # c.use 'OpenTelemetry::Instrumentation::ActiveRecord' + config = { + 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, + 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, + 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, + 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, + 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + } + c.use_all(config) + + %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| + begin + c.resource = OpenTelemetry::SDK::Resources::Resource.create(Hash[*File.read(name.start_with?("/var") ? name : File.read(name)).split(/[=\n]+/)]) + rescue + end + } + c.add_span_processor( + OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new( + OpenTelemetry::Exporter::OTLP::Exporter.new( + endpoint: DT_API_URL + "/v1/traces", + headers: { + "Authorization": "Api-Token " + DT_API_TOKEN + } + ) + ) + ) + end +end + # rubocop:enable Layout/LineLength diff --git a/config/initializers/rack_context.rb b/config/initializers/rack_context.rb new file mode 100644 index 00000000000..3ac359d4c56 --- /dev/null +++ b/config/initializers/rack_context.rb @@ -0,0 +1,22 @@ +class RackContextGetter < OpenTelemetry::Context::Propagation::RackEnvGetter + def get(carrier, key) + carrier[to_rack_key(key)] || carrier[key] + end + + protected + + def to_rack_key(key) + ret = +"HTTP_#{key}" + ret.tr!('-', '_') + ret.upcase! + ret + end +end + +RACK_ENV_GETTER = RackContextGetter.new + +OpenTelemetry::Common::Propagation.instance_eval do + def rack_env_getter + RACK_ENV_GETTER + end +end diff --git a/spec/models/dockets/hearing_request_docket_spec.rb b/spec/models/dockets/hearing_request_docket_spec.rb index 3650e461b4d..2fce445d47d 100644 --- a/spec/models/dockets/hearing_request_docket_spec.rb +++ b/spec/models/dockets/hearing_request_docket_spec.rb @@ -308,6 +308,38 @@ end end + context "no_held_hearings" do + before { FeatureToggle.enable!(:acd_exclude_from_affinity) } + + let!(:judge_1) { create(:user, :judge, :with_vacols_judge_record) } + let!(:judge_2) { create(:user, :judge, :with_vacols_judge_record) } + + let!(:appeal_1_hearing) do + create(:appeal, + :hearing_docket, + :with_post_intake_tasks, + :held_hearing_and_ready_to_distribute, + tied_judge: judge_1) + end + + let!(:appeal_2_hearing) do + create(:appeal, + :hearing_docket, + :with_post_intake_tasks, + :held_hearing_and_ready_to_distribute, + tied_judge: judge_1) + end + + let!(:hearing) { create(:hearing, :postponed, appeal: appeal_2_hearing) } + + it "appeals with a held hearing aren't distributed to genpop" do + one_result = HearingRequestDocket.new.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge_1, 3) + expect(one_result.count).to eq(2) + two_result = HearingRequestDocket.new.age_of_n_oldest_nonpriority_appeals_available_to_judge(judge_2, 3) + expect(two_result.count).to eq(0) + end + end + context "limit appeals class methods" do let(:appeal_1_week_old) { create_ready_aod_appeal(created_date: 1.week.ago) } let(:appeal_4_weeks_old) { create_ready_aod_appeal(created_date: 4.weeks.ago) } From 2429097793f38fc34c9fb222a871494294cc084b Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 2 Aug 2024 14:04:37 -0400 Subject: [PATCH 02/46] Update bundler to 2.4.22 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 91ad56dedca..37efe2bbd9d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2247,4 +2247,4 @@ DEPENDENCIES ziptz BUNDLED WITH - 2.4.19 + 2.4.22 From eba592c22f9fc083dfd7a6d3874d9978d4ae546b Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Wed, 21 Aug 2024 22:54:32 -0400 Subject: [PATCH 03/46] Updating OTEL to use all and remove new relic gem --- Gemfile | 7 +++-- config/initializers/open_telemetry.rb | 43 +++++++++++++-------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/Gemfile b/Gemfile index 1f06f9038d7..8577eddb860 100644 --- a/Gemfile +++ b/Gemfile @@ -34,15 +34,18 @@ gem "moment_timezone-rails" # Rails 6 has native support for multiple dbs, so prefer that over multiverse after upgrade. # https://github.com/ankane/multiverse#upgrading-to-rails-6 gem "multiverse" -gem "newrelic_rpm" gem "nokogiri", ">= 1.11.0.rc4" +# Testing without new_relic +# gem "newrelic_rpm" + # gem "opentelemetry-exporter-otlp" # gem "opentelemetry-instrumentation-all" # gem "opentelemetry-sdk" -gem "opentelemetry-sdk", require: false gem "opentelemetry-exporter-otlp", require: false +gem "opentelemetry-sdk", require: false + gem "opentelemetry-instrumentation-rack", require: false gem "opentelemetry-instrumentation-rails", require: false gem "opentelemetry-instrumentation-active_job", require: false diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index aec0cc3af93..ea1e66aee92 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -2,26 +2,24 @@ require 'rubygems' require 'bundler/setup' -# require 'opentelemetry/sdk' -# require 'opentelemetry/exporter/otlp' # require 'opentelemetry/instrumentation/all' - require 'opentelemetry/sdk' require 'opentelemetry/exporter/otlp' + require 'opentelemetry/instrumentation/rack' require 'opentelemetry/instrumentation/rails' require 'opentelemetry/instrumentation/active_record' -# require 'opentelemetry/instrumentation/active_job' +require 'opentelemetry/instrumentation/active_job' require 'opentelemetry/instrumentation/action_pack' require 'opentelemetry/instrumentation/action_view' -# require 'opentelemetry/instrumentation/active_model_serializers' -# require 'opentelemetry/instrumentation/aws_sdk' -# require 'opentelemetry/instrumentation/concurrent_ruby' -# require 'opentelemetry/instrumentation/faraday' -# require 'opentelemetry/instrumentation/http' -# require 'opentelemetry/instrumentation/http_client' -# require 'opentelemetry/instrumentation/net/http' -# require 'opentelemetry/instrumentation/net_http' +require 'opentelemetry/instrumentation/active_model_serializers' +require 'opentelemetry/instrumentation/aws_sdk' +require 'opentelemetry/instrumentation/concurrent_ruby' +require 'opentelemetry/instrumentation/faraday' +require 'opentelemetry/instrumentation/http' +require 'opentelemetry/instrumentation/http_client' +require 'opentelemetry/instrumentation/net/http' +require 'opentelemetry/instrumentation/net_http' # require 'opentelemetry/instrumentation/pg' # require 'opentelemetry/instrumentation/redis' @@ -36,18 +34,19 @@ OpenTelemetry::SDK.configure do |c| c.service_name = 'ruby-quickstart' c.service_version = '1.0.1' - # c.use_all # application will be using all instrumentation provided by OpenTelemetry - # c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + c.use_all # application will be using all instrumentation provided by OpenTelemetry + c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + # c.use 'OpenTelemetry::Instrumentation::Rails' # c.use 'OpenTelemetry::Instrumentation::ActiveRecord' - config = { - 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, - 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, - 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, - 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, - 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } - } - c.use_all(config) + # config = { + # 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, + # 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, + # 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, + # 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, + # 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + # } + # c.use_all(config) %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| begin From ce135eb35b985fba0dd245330d940fa519b2e970 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 22 Aug 2024 08:10:41 -0400 Subject: [PATCH 04/46] Remove calls to new relic --- Gemfile.lock | 2 -- app/controllers/api/application_controller.rb | 2 +- app/controllers/application_base_controller.rb | 2 +- app/controllers/dependencies_checks_controller.rb | 2 +- app/controllers/health_checks_controller.rb | 4 ++-- config/initializers/open_telemetry.rb | 2 +- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 37efe2bbd9d..831af459df2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1737,7 +1737,6 @@ GEM timeout net-smtp (0.3.3) net-protocol - newrelic_rpm (6.5.0.357) nio4r (2.5.9) no_proxy_fix (0.1.2) nokogiri (1.15.5) @@ -2169,7 +2168,6 @@ DEPENDENCIES meta_request moment_timezone-rails multiverse - newrelic_rpm nokogiri (>= 1.11.0.rc4) opentelemetry-exporter-otlp opentelemetry-instrumentation-action_pack diff --git a/app/controllers/api/application_controller.rb b/app/controllers/api/application_controller.rb index ea12981e0fc..4f0af0b1557 100644 --- a/app/controllers/api/application_controller.rb +++ b/app/controllers/api/application_controller.rb @@ -3,7 +3,7 @@ class Api::ApplicationController < ActionController::Base protect_from_forgery with: :null_session - include TrackRequestId + # include TrackRequestId force_ssl if: :ssl_enabled? before_action :strict_transport_security diff --git a/app/controllers/application_base_controller.rb b/app/controllers/application_base_controller.rb index 41f55a7fe3b..1b0c41bb6e6 100644 --- a/app/controllers/application_base_controller.rb +++ b/app/controllers/application_base_controller.rb @@ -6,7 +6,7 @@ class ApplicationBaseController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - include TrackRequestId + # include TrackRequestId force_ssl if: :ssl_enabled? before_action :check_out_of_service diff --git a/app/controllers/dependencies_checks_controller.rb b/app/controllers/dependencies_checks_controller.rb index ee42e93b5c8..cc5a0d02bd1 100644 --- a/app/controllers/dependencies_checks_controller.rb +++ b/app/controllers/dependencies_checks_controller.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true class DependenciesChecksController < ApplicationBaseController - newrelic_ignore_apdex + # newrelic_ignore_apdex skip_before_action :check_out_of_service diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 4ee3acc4440..15959acc400 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -2,11 +2,11 @@ # rubocop:disable Rails/ApplicationController class HealthChecksController < ActionController::Base - include TrackRequestId + # include TrackRequestId include CollectCustomMetrics protect_from_forgery with: :exception - newrelic_ignore_apdex + # newrelic_ignore_apdex def show body = { diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index ea1e66aee92..d4db82d988b 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -19,7 +19,7 @@ require 'opentelemetry/instrumentation/http' require 'opentelemetry/instrumentation/http_client' require 'opentelemetry/instrumentation/net/http' -require 'opentelemetry/instrumentation/net_http' +# require 'opentelemetry/instrumentation/net_http' # require 'opentelemetry/instrumentation/pg' # require 'opentelemetry/instrumentation/redis' From 956b1f75ca6cced33abf6136752a8c98650cc93a Mon Sep 17 00:00:00 2001 From: Andrew Hadley Date: Thu, 22 Aug 2024 10:26:03 -0400 Subject: [PATCH 05/46] removed id attrs in metrics service calls that were causing dimension errors --- app/services/geomatch_service.rb | 1 - app/services/hearings/reminder_service.rb | 1 - 2 files changed, 2 deletions(-) diff --git a/app/services/geomatch_service.rb b/app/services/geomatch_service.rb index 0d3e53a13e4..6d8645a5e1a 100644 --- a/app/services/geomatch_service.rb +++ b/app/services/geomatch_service.rb @@ -73,7 +73,6 @@ def record_geomatched_appeal(status) metric_name: "geomatched_appeals", attrs: { status: status, - appeal_external_id: appeal.external_id, hearing_request_type: appeal.current_hearing_request_type } ) diff --git a/app/services/hearings/reminder_service.rb b/app/services/hearings/reminder_service.rb index 936f60aff4c..4076b053f65 100644 --- a/app/services/hearings/reminder_service.rb +++ b/app/services/hearings/reminder_service.rb @@ -51,7 +51,6 @@ def send_to_metrics_service(type) metric_name: "emails.would_be_sent", attrs: { reminder_type: type, - hearing_id: hearing.id, request_type: hearing.hearing_request_type, hearing_type: hearing.class.name } From d1bdeadce4033d12f98eb8a5f43452e764bd0967 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 22 Aug 2024 10:35:50 -0400 Subject: [PATCH 06/46] Update config for otel --- config/initializers/open_telemetry.rb | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index d4db82d988b..378480141ba 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -34,19 +34,15 @@ OpenTelemetry::SDK.configure do |c| c.service_name = 'ruby-quickstart' c.service_version = '1.0.1' - c.use_all # application will be using all instrumentation provided by OpenTelemetry - c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } - # c.use 'OpenTelemetry::Instrumentation::Rails' - # c.use 'OpenTelemetry::Instrumentation::ActiveRecord' - # config = { - # 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, - # 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, - # 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, - # 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, - # 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } - # } - # c.use_all(config) + config = { + 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, + 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, + 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, + 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, + 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + } + c.use_all(config) %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| begin From 407009d0a0266050cfbb03c54d191676702ef2fe Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 22 Aug 2024 11:55:00 -0400 Subject: [PATCH 07/46] Reorder gems to fix linting issues --- Gemfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 8577eddb860..f6e07b70f45 100644 --- a/Gemfile +++ b/Gemfile @@ -46,19 +46,19 @@ gem "nokogiri", ">= 1.11.0.rc4" gem "opentelemetry-exporter-otlp", require: false gem "opentelemetry-sdk", require: false -gem "opentelemetry-instrumentation-rack", require: false -gem "opentelemetry-instrumentation-rails", require: false -gem "opentelemetry-instrumentation-active_job", require: false gem "opentelemetry-instrumentation-action_pack", require: false -gem "opentelemetry-instrumentation-active_record", require: false gem "opentelemetry-instrumentation-action_view", require: false +gem "opentelemetry-instrumentation-active_job", require: false gem "opentelemetry-instrumentation-active_model_serializers", require: false +gem "opentelemetry-instrumentation-active_record", require: false gem "opentelemetry-instrumentation-aws_sdk", require: false gem "opentelemetry-instrumentation-concurrent_ruby", require: false gem "opentelemetry-instrumentation-faraday", require: false gem "opentelemetry-instrumentation-http", require: false gem "opentelemetry-instrumentation-http_client", require: false gem "opentelemetry-instrumentation-net_http", require: false +gem "opentelemetry-instrumentation-rack", require: false +gem "opentelemetry-instrumentation-rails", require: false # gem "opentelemetry-instrumentation-pg", require: false # gem "opentelemetry-instrumentation-redis", require: false From 8ca7d41bd3f916cae4ef4f40e2804eb1f51a34e9 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 22 Aug 2024 20:05:40 -0400 Subject: [PATCH 08/46] Updating config and refactoring verbose gems to add all --- Gemfile | 38 ++++++++----------- Gemfile.lock | 9 +++++ app/controllers/api/application_controller.rb | 2 - .../application_base_controller.rb | 2 - app/controllers/concerns/track_request_id.rb | 13 ------- .../dependencies_checks_controller.rb | 2 - app/controllers/health_checks_controller.rb | 1 - config/initializers/open_telemetry.rb | 36 +++++------------- 8 files changed, 35 insertions(+), 68 deletions(-) delete mode 100644 app/controllers/concerns/track_request_id.rb diff --git a/Gemfile b/Gemfile index f6e07b70f45..9b4062293fa 100644 --- a/Gemfile +++ b/Gemfile @@ -36,29 +36,23 @@ gem "moment_timezone-rails" gem "multiverse" gem "nokogiri", ">= 1.11.0.rc4" -# Testing without new_relic -# gem "newrelic_rpm" +gem "opentelemetry-exporter-otlp" +gem "opentelemetry-instrumentation-all" +gem "opentelemetry-sdk" -# gem "opentelemetry-exporter-otlp" -# gem "opentelemetry-instrumentation-all" -# gem "opentelemetry-sdk" - -gem "opentelemetry-exporter-otlp", require: false -gem "opentelemetry-sdk", require: false - -gem "opentelemetry-instrumentation-action_pack", require: false -gem "opentelemetry-instrumentation-action_view", require: false -gem "opentelemetry-instrumentation-active_job", require: false -gem "opentelemetry-instrumentation-active_model_serializers", require: false -gem "opentelemetry-instrumentation-active_record", require: false -gem "opentelemetry-instrumentation-aws_sdk", require: false -gem "opentelemetry-instrumentation-concurrent_ruby", require: false -gem "opentelemetry-instrumentation-faraday", require: false -gem "opentelemetry-instrumentation-http", require: false -gem "opentelemetry-instrumentation-http_client", require: false -gem "opentelemetry-instrumentation-net_http", require: false -gem "opentelemetry-instrumentation-rack", require: false -gem "opentelemetry-instrumentation-rails", require: false +# gem "opentelemetry-instrumentation-action_pack", require: false +# gem "opentelemetry-instrumentation-action_view", require: false +# gem "opentelemetry-instrumentation-active_job", require: false +# gem "opentelemetry-instrumentation-active_model_serializers", require: false +# gem "opentelemetry-instrumentation-active_record", require: false +# gem "opentelemetry-instrumentation-aws_sdk", require: false +# gem "opentelemetry-instrumentation-concurrent_ruby", require: false +# gem "opentelemetry-instrumentation-faraday", require: false +# gem "opentelemetry-instrumentation-http", require: false +# gem "opentelemetry-instrumentation-http_client", require: false +# gem "opentelemetry-instrumentation-net_http", require: false +# gem "opentelemetry-instrumentation-rack", require: false +# gem "opentelemetry-instrumentation-rails", require: false # gem "opentelemetry-instrumentation-pg", require: false # gem "opentelemetry-instrumentation-redis", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 831af459df2..b1bebb44ae3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1805,6 +1805,9 @@ GEM opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.19.3) opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-pg (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) opentelemetry-instrumentation-rack (0.22.1) opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.19.3) @@ -1817,6 +1820,10 @@ GEM opentelemetry-instrumentation-active_record (~> 0.5.0) opentelemetry-instrumentation-active_support (~> 0.3.0) opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-redis (0.24.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) opentelemetry-registry (0.2.0) opentelemetry-api (~> 1.1) opentelemetry-sdk (1.2.1) @@ -2181,8 +2188,10 @@ DEPENDENCIES opentelemetry-instrumentation-http opentelemetry-instrumentation-http_client opentelemetry-instrumentation-net_http + opentelemetry-instrumentation-pg opentelemetry-instrumentation-rack opentelemetry-instrumentation-rails + opentelemetry-instrumentation-redis opentelemetry-sdk paper_trail (~> 12.0) parallel diff --git a/app/controllers/api/application_controller.rb b/app/controllers/api/application_controller.rb index 4f0af0b1557..9d189fa5a82 100644 --- a/app/controllers/api/application_controller.rb +++ b/app/controllers/api/application_controller.rb @@ -3,8 +3,6 @@ class Api::ApplicationController < ActionController::Base protect_from_forgery with: :null_session - # include TrackRequestId - force_ssl if: :ssl_enabled? before_action :strict_transport_security diff --git a/app/controllers/application_base_controller.rb b/app/controllers/application_base_controller.rb index 1b0c41bb6e6..bfdba59f926 100644 --- a/app/controllers/application_base_controller.rb +++ b/app/controllers/application_base_controller.rb @@ -6,8 +6,6 @@ class ApplicationBaseController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - # include TrackRequestId - force_ssl if: :ssl_enabled? before_action :check_out_of_service before_action :strict_transport_security diff --git a/app/controllers/concerns/track_request_id.rb b/app/controllers/concerns/track_request_id.rb deleted file mode 100644 index 188256c88f0..00000000000 --- a/app/controllers/concerns/track_request_id.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module TrackRequestId - extend ActiveSupport::Concern - - included do - before_action :track_request_id - end - - def track_request_id - ::NewRelic::Agent.add_custom_attributes(request_id: request.uuid) - end -end diff --git a/app/controllers/dependencies_checks_controller.rb b/app/controllers/dependencies_checks_controller.rb index cc5a0d02bd1..a39f57a4be0 100644 --- a/app/controllers/dependencies_checks_controller.rb +++ b/app/controllers/dependencies_checks_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class DependenciesChecksController < ApplicationBaseController - # newrelic_ignore_apdex - skip_before_action :check_out_of_service def show diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 15959acc400..5eeb999313a 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -2,7 +2,6 @@ # rubocop:disable Rails/ApplicationController class HealthChecksController < ActionController::Base - # include TrackRequestId include CollectCustomMetrics protect_from_forgery with: :exception diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 378480141ba..1c6b1b082c5 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -2,26 +2,9 @@ require 'rubygems' require 'bundler/setup' -# require 'opentelemetry/instrumentation/all' require 'opentelemetry/sdk' require 'opentelemetry/exporter/otlp' - -require 'opentelemetry/instrumentation/rack' -require 'opentelemetry/instrumentation/rails' -require 'opentelemetry/instrumentation/active_record' -require 'opentelemetry/instrumentation/active_job' -require 'opentelemetry/instrumentation/action_pack' -require 'opentelemetry/instrumentation/action_view' -require 'opentelemetry/instrumentation/active_model_serializers' -require 'opentelemetry/instrumentation/aws_sdk' -require 'opentelemetry/instrumentation/concurrent_ruby' -require 'opentelemetry/instrumentation/faraday' -require 'opentelemetry/instrumentation/http' -require 'opentelemetry/instrumentation/http_client' -require 'opentelemetry/instrumentation/net/http' -# require 'opentelemetry/instrumentation/net_http' -# require 'opentelemetry/instrumentation/pg' -# require 'opentelemetry/instrumentation/redis' +require 'opentelemetry/instrumentation/all' # rubocop:disable Layout/LineLength @@ -35,14 +18,15 @@ c.service_name = 'ruby-quickstart' c.service_version = '1.0.1' - config = { - 'OpenTelemetry::Instrumentation::Redis' => { enabled: false }, - 'OpenTelemetry::Instrumentation::PG' => { enabled: false }, - 'OpenTelemetry::Instrumentation::AwsSdk' => { enabled: false }, - 'OpenTelemetry::Instrumentation::Net::HTTP' => { enabled: false }, - 'OpenTelemetry::Instrumentation::Rack' => { untraced_endpoints: ['/health-check', '/sample', '/logs'] } - } - c.use_all(config) + c.use 'OpenTelemetry::Instrumentation::ActiveRecord' + c.use 'OpenTelemetry::Instrumentation::AwsSdk' + c.use 'OpenTelemetry::Instrumentation::Net::HTTP' + c.use 'OpenTelemetry::Instrumentation::PG' + c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + c.use 'OpenTelemetry::Instrumentation::Rails' + c.use 'OpenTelemetry::Instrumentation::Redis' + + Rails.logger.info("Loaded instruments") %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| begin From 7086f89602acbc3760befcea6a3841f19f1ceaa9 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 22 Aug 2024 20:22:26 -0400 Subject: [PATCH 09/46] Reinstall gems --- Gemfile | 35 +- Gemfile.lock | 2715 ++++++++++--------- app/controllers/health_checks_controller.rb | 1 - 3 files changed, 1511 insertions(+), 1240 deletions(-) diff --git a/Gemfile b/Gemfile index 9b4062293fa..1be6288e367 100644 --- a/Gemfile +++ b/Gemfile @@ -36,25 +36,24 @@ gem "moment_timezone-rails" gem "multiverse" gem "nokogiri", ">= 1.11.0.rc4" -gem "opentelemetry-exporter-otlp" -gem "opentelemetry-instrumentation-all" -gem "opentelemetry-sdk" +gem "opentelemetry-exporter-otlp", require: false +gem "opentelemetry-sdk", require: false -# gem "opentelemetry-instrumentation-action_pack", require: false -# gem "opentelemetry-instrumentation-action_view", require: false -# gem "opentelemetry-instrumentation-active_job", require: false -# gem "opentelemetry-instrumentation-active_model_serializers", require: false -# gem "opentelemetry-instrumentation-active_record", require: false -# gem "opentelemetry-instrumentation-aws_sdk", require: false -# gem "opentelemetry-instrumentation-concurrent_ruby", require: false -# gem "opentelemetry-instrumentation-faraday", require: false -# gem "opentelemetry-instrumentation-http", require: false -# gem "opentelemetry-instrumentation-http_client", require: false -# gem "opentelemetry-instrumentation-net_http", require: false -# gem "opentelemetry-instrumentation-rack", require: false -# gem "opentelemetry-instrumentation-rails", require: false -# gem "opentelemetry-instrumentation-pg", require: false -# gem "opentelemetry-instrumentation-redis", require: false +gem "opentelemetry-instrumentation-action_pack", require: false +gem "opentelemetry-instrumentation-action_view", require: false +gem "opentelemetry-instrumentation-active_job", require: false +gem "opentelemetry-instrumentation-active_model_serializers", require: false +gem "opentelemetry-instrumentation-active_record", require: false +gem "opentelemetry-instrumentation-aws_sdk", require: false +gem "opentelemetry-instrumentation-concurrent_ruby", require: false +gem "opentelemetry-instrumentation-faraday", require: false +gem "opentelemetry-instrumentation-http", require: false +gem "opentelemetry-instrumentation-http_client", require: false +gem "opentelemetry-instrumentation-net_http", require: false +gem "opentelemetry-instrumentation-pg", require: false +gem "opentelemetry-instrumentation-rack", require: false +gem "opentelemetry-instrumentation-rails", require: false +gem "opentelemetry-instrumentation-redis", require: false gem "paper_trail", "~> 12.0" # Used to speed up reporting diff --git a/Gemfile.lock b/Gemfile.lock index b1bebb44ae3..3fac8dae31a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,3 @@ -GIT - remote: https://github.com/colszowka/simplecov.git - revision: 783c9d7e9995f3ea9baf9fbb517c1d0ceb12acdb - specs: - simplecov (0.15.1) - docile (~> 1.1.0) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - GIT remote: https://github.com/department-of-veterans-affairs/caseflow-commons revision: 716b58caf2116da5fca21c3b3aeea6c9712f3b9d @@ -81,7 +72,7 @@ GIT GIT remote: https://github.com/department-of-veterans-affairs/sniffybara.git - revision: 351560b5789ca638ba7c9b093c2bb1a9a6fda4b3 + revision: bcd5cb8e6dcb595dd111da5b0758f807d8c7525a specs: sniffybara (1.1.0) rainbow @@ -144,8 +135,8 @@ GEM activerecord (6.0.6.1) activemodel (= 6.0.6.1) activesupport (= 6.0.6.1) - activerecord-import (1.0.2) - activerecord (>= 3.2) + activerecord-import (1.7.0) + activerecord (>= 4.2) activerecord-oracle_enhanced-adapter (6.0.6) activerecord (~> 6.0.0) ruby-plsql (>= 0.6.0) @@ -160,797 +151,948 @@ GEM minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - acts_as_tree (2.9.0) + acts_as_tree (2.9.1) activerecord (>= 3.0.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - akami (1.3.1) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + akami (1.3.2) gyoku (>= 0.4.0) nokogiri - amoeba (3.2.0) - activerecord (>= 4.2.0) + amoeba (3.3.0) + activerecord (>= 5.2.0) anbt-sql-formatter (0.1.0) ast (2.4.2) aws-eventstream (1.3.0) - aws-partitions (1.934.0) + aws-partitions (1.968.0) aws-sdk (3.2.0) aws-sdk-resources (~> 3) - aws-sdk-accessanalyzer (1.30.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-account (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-acm (1.52.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-acmpca (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-alexaforbusiness (1.56.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplify (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplifybackend (1.17.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplifyuibuilder (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigateway (1.78.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigatewaymanagementapi (1.30.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigatewayv2 (1.42.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appconfig (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appconfigdata (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appflow (1.28.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appintegrationsservice (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationautoscaling (1.62.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationcostprofiler (1.9.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationdiscoveryservice (1.46.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-applicationinsights (1.31.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appmesh (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appregistry (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-apprunner (1.15.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appstream (1.66.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-appsync (1.53.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-athena (1.56.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-auditmanager (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-augmentedairuntime (1.23.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-autoscaling (1.80.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-autoscalingplans (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-backup (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-backupgateway (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-backupstorage (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-batch (1.63.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-billingconductor (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-braket (1.19.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-budgets (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-chime (1.68.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkidentity (1.9.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmediapipelines (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmeetings (1.14.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-chimesdkmessaging (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloud9 (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudcontrolapi (1.8.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-clouddirectory (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudformation (1.70.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudfront (1.68.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudhsm (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudhsmv2 (1.42.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudsearch (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudsearchdomain (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudtrail (1.52.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatch (1.67.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchevents (1.57.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchevidently (1.8.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchlogs (1.53.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchrum (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codeartifact (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codebuild (1.88.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codecommit (1.51.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codedeploy (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codeguruprofiler (1.24.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codegurureviewer (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codepipeline (1.53.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestar (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestarconnections (1.24.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-codestarnotifications (1.20.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitoidentity (1.40.1) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitoidentityprovider (1.71.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-cognitosync (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-comprehend (1.62.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-comprehendmedical (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-computeoptimizer (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-configservice (1.84.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connect (1.79.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcampaignservice (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcases (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcontactlens (1.11.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectparticipant (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectwisdomservice (1.9.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-controltower (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-core (3.131.0) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.525.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-costandusagereportservice (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-costexplorer (1.78.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-customerprofiles (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-databasemigrationservice (1.72.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-dataexchange (1.27.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-datapipeline (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-datasync (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-dax (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-detective (1.29.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-devicefarm (1.52.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-devopsguru (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-directconnect (1.54.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-directoryservice (1.51.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-dlm (1.52.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-docdb (1.44.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-drs (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-dynamodb (1.77.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-dynamodbstreams (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ebs (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ec2 (1.341.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ec2instanceconnect (1.25.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecr (1.56.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecrpublic (1.12.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ecs (1.103.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-efs (1.54.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-eks (1.77.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticache (1.79.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticbeanstalk (1.51.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticinference (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticloadbalancing (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticloadbalancingv2 (1.80.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticsearchservice (1.66.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-elastictranscoder (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-emr (1.62.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-emrcontainers (1.15.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-emrserverless (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-eventbridge (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-finspace (1.11.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-finspacedata (1.17.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-firehose (1.48.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-fis (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-fms (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-forecastqueryservice (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-forecastservice (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-frauddetector (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-fsx (1.60.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-gamelift (1.58.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-gamesparks (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-glacier (1.46.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-globalaccelerator (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-glue (1.120.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-gluedatabrew (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-greengrass (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-greengrassv2 (1.20.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-groundstation (1.27.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-guardduty (1.60.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-health (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-healthlake (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-honeycode (1.17.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iam (1.71.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-identitystore (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-imagebuilder (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-importexport (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-accessanalyzer (1.54.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-account (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-acm (1.74.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-acmpca (1.76.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-amplify (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-amplifybackend (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-amplifyuibuilder (1.30.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigateway (1.101.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-apigatewaymanagementapi (1.48.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigatewayv2 (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-appconfig (1.51.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-appconfigdata (1.25.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-appfabric (1.14.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-appflow (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-appintegrationsservice (1.37.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationautoscaling (1.90.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationcostprofiler (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationdiscoveryservice (1.71.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationinsights (1.51.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-applicationsignals (1.4.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-appmesh (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-appregistry (1.39.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-apprunner (1.44.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-appstream (1.94.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-appsync (1.82.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-apptest (1.3.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-arczonalshift (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-artifact (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-athena (1.89.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-auditmanager (1.51.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-augmentedairuntime (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-autoscaling (1.115.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-autoscalingplans (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-b2bi (1.14.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-backup (1.73.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-backupgateway (1.24.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-batch (1.95.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-bcmdataexports (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-bedrock (1.16.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-bedrockagent (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-bedrockagentruntime (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-bedrockruntime (1.17.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-billingconductor (1.27.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-braket (1.40.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-budgets (1.71.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chatbot (1.9.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chime (1.89.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkidentity (1.30.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmediapipelines (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmeetings (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkmessaging (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-chimesdkvoice (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cleanrooms (1.27.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cleanroomsml (1.10.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloud9 (1.74.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudcontrolapi (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-clouddirectory (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudformation (1.114.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudfront (1.96.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudfrontkeyvaluestore (1.10.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudhsm (1.58.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudhsmv2 (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudsearch (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudsearchdomain (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudtrail (1.85.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudtraildata (1.16.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatch (1.97.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchevents (1.77.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchevidently (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchlogs (1.88.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cloudwatchrum (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-codeartifact (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codebuild (1.124.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codecatalyst (1.23.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sdk-codecommit (1.72.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codeconnections (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codedeploy (1.72.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codeguruprofiler (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-codegurureviewer (1.52.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codegurusecurity (1.17.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-codepipeline (1.78.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codestarconnections (1.48.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-codestarnotifications (1.39.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitoidentity (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitoidentityprovider (1.100.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-cognitosync (1.55.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-comprehend (1.87.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-comprehendmedical (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-computeoptimizer (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-configservice (1.114.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-connect (1.171.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectcampaignservice (1.21.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcases (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcontactlens (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectparticipant (1.49.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-connectwisdomservice (1.34.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-controlcatalog (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-controltower (1.27.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-core (3.201.5) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.9) + jmespath (~> 1, >= 1.6.1) + aws-sdk-costandusagereportservice (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-costexplorer (1.105.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-costoptimizationhub (1.11.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-customerprofiles (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-databasemigrationservice (1.100.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-dataexchange (1.52.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-datapipeline (1.55.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-datasync (1.83.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-datazone (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-dax (1.58.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-deadline (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-detective (1.53.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-devicefarm (1.72.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-devopsguru (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-directconnect (1.77.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-directoryservice (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-dlm (1.75.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-docdb (1.71.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-docdbelastic (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-drs (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-dynamodb (1.118.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-dynamodbstreams (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ebs (1.46.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ec2 (1.470.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ec2instanceconnect (1.45.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecr (1.80.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecrpublic (1.33.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ecs (1.154.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-efs (1.79.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-eks (1.112.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-eksauth (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticache (1.109.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticbeanstalk (1.73.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticinference (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticloadbalancing (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticloadbalancingv2 (1.109.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elasticsearchservice (1.89.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-elastictranscoder (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-emr (1.92.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-emrcontainers (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-emrserverless (1.30.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-entityresolution (1.16.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-eventbridge (1.65.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-finspace (1.38.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-finspacedata (1.38.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-firehose (1.76.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-fis (1.35.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-fms (1.76.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-forecastqueryservice (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-forecastservice (1.58.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-frauddetector (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-freetier (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-fsx (1.94.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-gamelift (1.85.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-glacier (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-globalaccelerator (1.64.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-glue (1.190.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-gluedatabrew (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-greengrass (1.69.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-greengrassv2 (1.43.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-groundstation (1.53.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-guardduty (1.96.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-health (1.67.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-healthlake (1.33.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iam (1.105.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-identitystore (1.40.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-imagebuilder (1.65.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-importexport (1.49.0) + aws-sdk-core (~> 3, >= 3.201.0) aws-sigv2 (~> 1.0) - aws-sdk-inspector (1.43.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-inspector2 (1.6.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot (1.94.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot1clickdevicesservice (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot1clickprojects (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotanalytics (1.49.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotdataplane (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotdeviceadvisor (1.15.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotevents (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ioteventsdata (1.27.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotfleethub (1.11.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotfleetwise (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotjobsdataplane (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotsecuretunneling (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotsitewise (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotthingsgraph (1.24.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iottwinmaker (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotwireless (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ivs (1.23.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ivschat (1.4.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafka (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafkaconnect (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kendra (1.59.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-keyspaces (1.2.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesis (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisanalytics (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisanalyticsv2 (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideo (1.42.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideoarchivedmedia (1.44.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideomedia (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesisvideosignalingchannels (1.19.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-kms (1.58.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lakeformation (1.27.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lambda (1.85.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lambdapreview (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lex (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexmodelbuildingservice (1.57.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexmodelsv2 (1.28.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lexruntimev2 (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanager (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanagerusersubscriptions (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lightsail (1.69.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-locationservice (1.24.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutequipment (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutforvision (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutmetrics (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-machinelearning (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-macie (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-macie2 (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mainframemodernization (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedblockchain (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedgrafana (1.8.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacecatalog (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacecommerceanalytics (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplaceentitlementservice (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacemetering (1.44.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediaconnect (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediaconvert (1.93.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-medialive (1.90.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackage (1.56.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackagevod (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediastore (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediastoredata (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediatailor (1.55.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-memorydb (1.8.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mgn (1.14.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhub (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubconfig (1.20.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhuborchestrator (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubrefactorspaces (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubstrategyrecommendations (1.4.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mobile (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mq (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mturk (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-mwaa (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptune (1.46.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-networkfirewall (1.19.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-networkmanager (1.25.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-nimblestudio (1.15.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-opensearchservice (1.11.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-opsworks (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-opsworkscm (1.52.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-organizations (1.70.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-outposts (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-panorama (1.9.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalize (1.43.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalizeevents (1.27.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalizeruntime (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pi (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpoint (1.68.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointemail (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointsmsvoice (1.32.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointsmsvoicev2 (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-polly (1.58.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-pricing (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-privatenetworks (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-prometheusservice (1.15.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-proton (1.17.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-qldb (1.25.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-qldbsession (1.22.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-quicksight (1.69.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ram (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-rds (1.156.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-rdsdataservice (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-recyclebin (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshift (1.85.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshiftdataapiservice (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshiftserverless (1.3.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-rekognition (1.70.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-resiliencehub (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourcegroups (1.45.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourcegroupstaggingapi (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-resources (3.143.0) + aws-sdk-inspector (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-inspector2 (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-inspectorscan (1.9.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-internetmonitor (1.23.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot (1.128.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iot1clickdevicesservice (1.55.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot1clickprojects (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotanalytics (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotdataplane (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotdeviceadvisor (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotevents (1.53.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ioteventsdata (1.46.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotfleethub (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotfleetwise (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotjobsdataplane (1.55.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotsecuretunneling (1.40.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotsitewise (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iotthingsgraph (1.43.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-iottwinmaker (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotwireless (1.53.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivs (1.54.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivschat (1.29.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ivsrealtime (1.25.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-kafka (1.77.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-kafkaconnect (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-kendra (1.85.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kendraranking (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-keyspaces (1.24.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesis (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisanalytics (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisanalyticsv2 (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideo (1.67.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideoarchivedmedia (1.64.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideomedia (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideosignalingchannels (1.38.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-kinesisvideowebrtcstorage (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-kms (1.88.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lakeformation (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lambda (1.127.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lambdapreview (1.49.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-launchwizard (1.10.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-lex (1.65.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexmodelbuildingservice (1.76.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexmodelsv2 (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lexruntimev2 (1.38.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-licensemanager (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-licensemanagerlinuxsubscriptions (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-licensemanagerusersubscriptions (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-lightsail (1.96.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-locationservice (1.55.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-lookoutequipment (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lookoutforvision (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-lookoutmetrics (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-machinelearning (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-macie2 (1.73.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mailmanager (1.5.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-mainframemodernization (1.22.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedblockchain (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-managedblockchainquery (1.16.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedgrafana (1.33.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplaceagreement (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplacecatalog (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacecommerceanalytics (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacedeployment (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplaceentitlementservice (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-marketplacemetering (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediaconnect (1.65.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediaconvert (1.134.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-medialive (1.128.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediapackage (1.76.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackagev2 (1.22.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackagevod (1.58.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediastore (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediastoredata (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mediatailor (1.84.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-medicalimaging (1.15.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-memorydb (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mgn (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhub (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-migrationhubconfig (1.40.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-migrationhuborchestrator (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubrefactorspaces (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubstrategyrecommendations (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-mq (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mturk (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-mwaa (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-neptune (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-neptunedata (1.14.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-neptunegraph (1.15.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkfirewall (1.48.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkmanager (1.48.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-networkmonitor (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-nimblestudio (1.34.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-oam (1.20.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-omics (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-opensearchserverless (1.22.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-opensearchservice (1.50.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-opsworks (1.61.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-opsworkscm (1.71.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-organizations (1.95.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-osis (1.20.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-outposts (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-panorama (1.29.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-paymentcryptography (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-paymentcryptographydata (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pcaconnectorad (1.10.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-pcaconnectorscep (1.3.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-personalize (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-personalizeevents (1.49.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-personalizeruntime (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pi (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpoint (1.95.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpointemail (1.54.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pinpointsmsvoice (1.50.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpointsmsvoicev2 (1.21.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pipes (1.24.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-polly (1.90.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-pricing (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-privatenetworks (1.20.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-prometheusservice (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-proton (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-qapps (1.0.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-qbusiness (1.11.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-qconnect (1.14.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-qldb (1.45.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-qldbsession (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-quicksight (1.121.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ram (1.60.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-rds (1.241.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-rdsdataservice (1.57.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-recyclebin (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-redshift (1.119.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-redshiftdataapiservice (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-redshiftserverless (1.33.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-rekognition (1.102.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-repostspace (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-resiliencehub (1.33.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-resourceexplorer2 (1.22.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-resourcegroups (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-resourcegroupstaggingapi (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-resources (3.201.0) aws-sdk-accessanalyzer (~> 1) aws-sdk-account (~> 1) aws-sdk-acm (~> 1) aws-sdk-acmpca (~> 1) - aws-sdk-alexaforbusiness (~> 1) aws-sdk-amplify (~> 1) aws-sdk-amplifybackend (~> 1) aws-sdk-amplifyuibuilder (~> 1) @@ -959,44 +1101,60 @@ GEM aws-sdk-apigatewayv2 (~> 1) aws-sdk-appconfig (~> 1) aws-sdk-appconfigdata (~> 1) + aws-sdk-appfabric (~> 1) aws-sdk-appflow (~> 1) aws-sdk-appintegrationsservice (~> 1) aws-sdk-applicationautoscaling (~> 1) aws-sdk-applicationcostprofiler (~> 1) aws-sdk-applicationdiscoveryservice (~> 1) aws-sdk-applicationinsights (~> 1) + aws-sdk-applicationsignals (~> 1) aws-sdk-appmesh (~> 1) aws-sdk-appregistry (~> 1) aws-sdk-apprunner (~> 1) aws-sdk-appstream (~> 1) aws-sdk-appsync (~> 1) + aws-sdk-apptest (~> 1) + aws-sdk-arczonalshift (~> 1) + aws-sdk-artifact (~> 1) aws-sdk-athena (~> 1) aws-sdk-auditmanager (~> 1) aws-sdk-augmentedairuntime (~> 1) aws-sdk-autoscaling (~> 1) aws-sdk-autoscalingplans (~> 1) + aws-sdk-b2bi (~> 1) aws-sdk-backup (~> 1) aws-sdk-backupgateway (~> 1) - aws-sdk-backupstorage (~> 1) aws-sdk-batch (~> 1) + aws-sdk-bcmdataexports (~> 1) + aws-sdk-bedrock (~> 1) + aws-sdk-bedrockagent (~> 1) + aws-sdk-bedrockagentruntime (~> 1) + aws-sdk-bedrockruntime (~> 1) aws-sdk-billingconductor (~> 1) aws-sdk-braket (~> 1) aws-sdk-budgets (~> 1) + aws-sdk-chatbot (~> 1) aws-sdk-chime (~> 1) aws-sdk-chimesdkidentity (~> 1) aws-sdk-chimesdkmediapipelines (~> 1) aws-sdk-chimesdkmeetings (~> 1) aws-sdk-chimesdkmessaging (~> 1) + aws-sdk-chimesdkvoice (~> 1) + aws-sdk-cleanrooms (~> 1) + aws-sdk-cleanroomsml (~> 1) aws-sdk-cloud9 (~> 1) aws-sdk-cloudcontrolapi (~> 1) aws-sdk-clouddirectory (~> 1) aws-sdk-cloudformation (~> 1) aws-sdk-cloudfront (~> 1) + aws-sdk-cloudfrontkeyvaluestore (~> 1) aws-sdk-cloudhsm (~> 1) aws-sdk-cloudhsmv2 (~> 1) aws-sdk-cloudsearch (~> 1) aws-sdk-cloudsearchdomain (~> 1) aws-sdk-cloudtrail (~> 1) + aws-sdk-cloudtraildata (~> 1) aws-sdk-cloudwatch (~> 1) aws-sdk-cloudwatchevents (~> 1) aws-sdk-cloudwatchevidently (~> 1) @@ -1004,12 +1162,14 @@ GEM aws-sdk-cloudwatchrum (~> 1) aws-sdk-codeartifact (~> 1) aws-sdk-codebuild (~> 1) + aws-sdk-codecatalyst (~> 1) aws-sdk-codecommit (~> 1) + aws-sdk-codeconnections (~> 1) aws-sdk-codedeploy (~> 1) aws-sdk-codeguruprofiler (~> 1) aws-sdk-codegurureviewer (~> 1) + aws-sdk-codegurusecurity (~> 1) aws-sdk-codepipeline (~> 1) - aws-sdk-codestar (~> 1) aws-sdk-codestarconnections (~> 1) aws-sdk-codestarnotifications (~> 1) aws-sdk-cognitoidentity (~> 1) @@ -1025,15 +1185,19 @@ GEM aws-sdk-connectcontactlens (~> 1) aws-sdk-connectparticipant (~> 1) aws-sdk-connectwisdomservice (~> 1) + aws-sdk-controlcatalog (~> 1) aws-sdk-controltower (~> 1) aws-sdk-costandusagereportservice (~> 1) aws-sdk-costexplorer (~> 1) + aws-sdk-costoptimizationhub (~> 1) aws-sdk-customerprofiles (~> 1) aws-sdk-databasemigrationservice (~> 1) aws-sdk-dataexchange (~> 1) aws-sdk-datapipeline (~> 1) aws-sdk-datasync (~> 1) + aws-sdk-datazone (~> 1) aws-sdk-dax (~> 1) + aws-sdk-deadline (~> 1) aws-sdk-detective (~> 1) aws-sdk-devicefarm (~> 1) aws-sdk-devopsguru (~> 1) @@ -1041,6 +1205,7 @@ GEM aws-sdk-directoryservice (~> 1) aws-sdk-dlm (~> 1) aws-sdk-docdb (~> 1) + aws-sdk-docdbelastic (~> 1) aws-sdk-drs (~> 1) aws-sdk-dynamodb (~> 1) aws-sdk-dynamodbstreams (~> 1) @@ -1052,6 +1217,7 @@ GEM aws-sdk-ecs (~> 1) aws-sdk-efs (~> 1) aws-sdk-eks (~> 1) + aws-sdk-eksauth (~> 1) aws-sdk-elasticache (~> 1) aws-sdk-elasticbeanstalk (~> 1) aws-sdk-elasticinference (~> 1) @@ -1062,6 +1228,7 @@ GEM aws-sdk-emr (~> 1) aws-sdk-emrcontainers (~> 1) aws-sdk-emrserverless (~> 1) + aws-sdk-entityresolution (~> 1) aws-sdk-eventbridge (~> 1) aws-sdk-finspace (~> 1) aws-sdk-finspacedata (~> 1) @@ -1071,9 +1238,9 @@ GEM aws-sdk-forecastqueryservice (~> 1) aws-sdk-forecastservice (~> 1) aws-sdk-frauddetector (~> 1) + aws-sdk-freetier (~> 1) aws-sdk-fsx (~> 1) aws-sdk-gamelift (~> 1) - aws-sdk-gamesparks (~> 1) aws-sdk-glacier (~> 1) aws-sdk-globalaccelerator (~> 1) aws-sdk-glue (~> 1) @@ -1084,13 +1251,14 @@ GEM aws-sdk-guardduty (~> 1) aws-sdk-health (~> 1) aws-sdk-healthlake (~> 1) - aws-sdk-honeycode (~> 1) aws-sdk-iam (~> 1) aws-sdk-identitystore (~> 1) aws-sdk-imagebuilder (~> 1) aws-sdk-importexport (~> 1) aws-sdk-inspector (~> 1) aws-sdk-inspector2 (~> 1) + aws-sdk-inspectorscan (~> 1) + aws-sdk-internetmonitor (~> 1) aws-sdk-iot (~> 1) aws-sdk-iot1clickdevicesservice (~> 1) aws-sdk-iot1clickprojects (~> 1) @@ -1109,9 +1277,11 @@ GEM aws-sdk-iotwireless (~> 1) aws-sdk-ivs (~> 1) aws-sdk-ivschat (~> 1) + aws-sdk-ivsrealtime (~> 1) aws-sdk-kafka (~> 1) aws-sdk-kafkaconnect (~> 1) aws-sdk-kendra (~> 1) + aws-sdk-kendraranking (~> 1) aws-sdk-keyspaces (~> 1) aws-sdk-kinesis (~> 1) aws-sdk-kinesisanalytics (~> 1) @@ -1120,15 +1290,18 @@ GEM aws-sdk-kinesisvideoarchivedmedia (~> 1) aws-sdk-kinesisvideomedia (~> 1) aws-sdk-kinesisvideosignalingchannels (~> 1) + aws-sdk-kinesisvideowebrtcstorage (~> 1) aws-sdk-kms (~> 1) aws-sdk-lakeformation (~> 1) aws-sdk-lambda (~> 1) aws-sdk-lambdapreview (~> 1) + aws-sdk-launchwizard (~> 1) aws-sdk-lex (~> 1) aws-sdk-lexmodelbuildingservice (~> 1) aws-sdk-lexmodelsv2 (~> 1) aws-sdk-lexruntimev2 (~> 1) aws-sdk-licensemanager (~> 1) + aws-sdk-licensemanagerlinuxsubscriptions (~> 1) aws-sdk-licensemanagerusersubscriptions (~> 1) aws-sdk-lightsail (~> 1) aws-sdk-locationservice (~> 1) @@ -1136,23 +1309,28 @@ GEM aws-sdk-lookoutforvision (~> 1) aws-sdk-lookoutmetrics (~> 1) aws-sdk-machinelearning (~> 1) - aws-sdk-macie (~> 1) aws-sdk-macie2 (~> 1) + aws-sdk-mailmanager (~> 1) aws-sdk-mainframemodernization (~> 1) aws-sdk-managedblockchain (~> 1) + aws-sdk-managedblockchainquery (~> 1) aws-sdk-managedgrafana (~> 1) + aws-sdk-marketplaceagreement (~> 1) aws-sdk-marketplacecatalog (~> 1) aws-sdk-marketplacecommerceanalytics (~> 1) + aws-sdk-marketplacedeployment (~> 1) aws-sdk-marketplaceentitlementservice (~> 1) aws-sdk-marketplacemetering (~> 1) aws-sdk-mediaconnect (~> 1) aws-sdk-mediaconvert (~> 1) aws-sdk-medialive (~> 1) aws-sdk-mediapackage (~> 1) + aws-sdk-mediapackagev2 (~> 1) aws-sdk-mediapackagevod (~> 1) aws-sdk-mediastore (~> 1) aws-sdk-mediastoredata (~> 1) aws-sdk-mediatailor (~> 1) + aws-sdk-medicalimaging (~> 1) aws-sdk-memorydb (~> 1) aws-sdk-mgn (~> 1) aws-sdk-migrationhub (~> 1) @@ -1160,20 +1338,30 @@ GEM aws-sdk-migrationhuborchestrator (~> 1) aws-sdk-migrationhubrefactorspaces (~> 1) aws-sdk-migrationhubstrategyrecommendations (~> 1) - aws-sdk-mobile (~> 1) aws-sdk-mq (~> 1) aws-sdk-mturk (~> 1) aws-sdk-mwaa (~> 1) aws-sdk-neptune (~> 1) + aws-sdk-neptunedata (~> 1) + aws-sdk-neptunegraph (~> 1) aws-sdk-networkfirewall (~> 1) aws-sdk-networkmanager (~> 1) + aws-sdk-networkmonitor (~> 1) aws-sdk-nimblestudio (~> 1) + aws-sdk-oam (~> 1) + aws-sdk-omics (~> 1) + aws-sdk-opensearchserverless (~> 1) aws-sdk-opensearchservice (~> 1) aws-sdk-opsworks (~> 1) aws-sdk-opsworkscm (~> 1) aws-sdk-organizations (~> 1) + aws-sdk-osis (~> 1) aws-sdk-outposts (~> 1) aws-sdk-panorama (~> 1) + aws-sdk-paymentcryptography (~> 1) + aws-sdk-paymentcryptographydata (~> 1) + aws-sdk-pcaconnectorad (~> 1) + aws-sdk-pcaconnectorscep (~> 1) aws-sdk-personalize (~> 1) aws-sdk-personalizeevents (~> 1) aws-sdk-personalizeruntime (~> 1) @@ -1182,11 +1370,15 @@ GEM aws-sdk-pinpointemail (~> 1) aws-sdk-pinpointsmsvoice (~> 1) aws-sdk-pinpointsmsvoicev2 (~> 1) + aws-sdk-pipes (~> 1) aws-sdk-polly (~> 1) aws-sdk-pricing (~> 1) aws-sdk-privatenetworks (~> 1) aws-sdk-prometheusservice (~> 1) aws-sdk-proton (~> 1) + aws-sdk-qapps (~> 1) + aws-sdk-qbusiness (~> 1) + aws-sdk-qconnect (~> 1) aws-sdk-qldb (~> 1) aws-sdk-qldbsession (~> 1) aws-sdk-quicksight (~> 1) @@ -1198,13 +1390,16 @@ GEM aws-sdk-redshiftdataapiservice (~> 1) aws-sdk-redshiftserverless (~> 1) aws-sdk-rekognition (~> 1) + aws-sdk-repostspace (~> 1) aws-sdk-resiliencehub (~> 1) + aws-sdk-resourceexplorer2 (~> 1) aws-sdk-resourcegroups (~> 1) aws-sdk-resourcegroupstaggingapi (~> 1) aws-sdk-robomaker (~> 1) aws-sdk-rolesanywhere (~> 1) aws-sdk-route53 (~> 1) aws-sdk-route53domains (~> 1) + aws-sdk-route53profiles (~> 1) aws-sdk-route53recoverycluster (~> 1) aws-sdk-route53recoverycontrolconfig (~> 1) aws-sdk-route53recoveryreadiness (~> 1) @@ -1215,11 +1410,15 @@ GEM aws-sdk-sagemaker (~> 1) aws-sdk-sagemakeredgemanager (~> 1) aws-sdk-sagemakerfeaturestoreruntime (~> 1) + aws-sdk-sagemakergeospatial (~> 1) + aws-sdk-sagemakermetrics (~> 1) aws-sdk-sagemakerruntime (~> 1) aws-sdk-savingsplans (~> 1) + aws-sdk-scheduler (~> 1) aws-sdk-schemas (~> 1) aws-sdk-secretsmanager (~> 1) aws-sdk-securityhub (~> 1) + aws-sdk-securitylake (~> 1) aws-sdk-serverlessapplicationrepository (~> 1) aws-sdk-servicecatalog (~> 1) aws-sdk-servicediscovery (~> 1) @@ -1229,6 +1428,7 @@ GEM aws-sdk-shield (~> 1) aws-sdk-signer (~> 1) aws-sdk-simpledb (~> 1) + aws-sdk-simspaceweaver (~> 1) aws-sdk-sms (~> 1) aws-sdk-snowball (~> 1) aws-sdk-snowdevicemanagement (~> 1) @@ -1237,21 +1437,30 @@ GEM aws-sdk-ssm (~> 1) aws-sdk-ssmcontacts (~> 1) aws-sdk-ssmincidents (~> 1) + aws-sdk-ssmquicksetup (~> 1) + aws-sdk-ssmsap (~> 1) aws-sdk-ssoadmin (~> 1) aws-sdk-states (~> 1) aws-sdk-storagegateway (~> 1) + aws-sdk-supplychain (~> 1) aws-sdk-support (~> 1) aws-sdk-supportapp (~> 1) aws-sdk-swf (~> 1) aws-sdk-synthetics (~> 1) + aws-sdk-taxsettings (~> 1) aws-sdk-textract (~> 1) + aws-sdk-timestreaminfluxdb (~> 1) aws-sdk-timestreamquery (~> 1) aws-sdk-timestreamwrite (~> 1) + aws-sdk-tnb (~> 1) aws-sdk-transcribeservice (~> 1) aws-sdk-transcribestreamingservice (~> 1) aws-sdk-transfer (~> 1) aws-sdk-translate (~> 1) + aws-sdk-trustedadvisor (~> 1) + aws-sdk-verifiedpermissions (~> 1) aws-sdk-voiceid (~> 1) + aws-sdk-vpclattice (~> 1) aws-sdk-waf (~> 1) aws-sdk-wafregional (~> 1) aws-sdk-wafv2 (~> 1) @@ -1261,233 +1470,286 @@ GEM aws-sdk-workmail (~> 1) aws-sdk-workmailmessageflow (~> 1) aws-sdk-workspaces (~> 1) + aws-sdk-workspacesthinclient (~> 1) aws-sdk-workspacesweb (~> 1) aws-sdk-xray (~> 1) - aws-sdk-robomaker (1.51.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-rolesanywhere (1.0.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53 (1.65.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53domains (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoverycluster (1.11.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoverycontrolconfig (1.10.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoveryreadiness (1.10.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53resolver (1.37.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.116.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-robomaker (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-rolesanywhere (1.23.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53 (1.96.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53domains (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53profiles (1.7.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoverycluster (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-route53recoverycontrolconfig (1.30.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoveryreadiness (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53resolver (1.64.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.159.0) + aws-sdk-core (~> 3, >= 3.201.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sdk-s3control (1.53.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3outposts (1.13.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemaker (1.147.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakeredgemanager (1.12.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakerfeaturestoreruntime (1.12.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakerruntime (1.43.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-savingsplans (1.26.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-schemas (1.23.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-secretsmanager (1.66.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-securityhub (1.69.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-serverlessapplicationrepository (1.43.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicecatalog (1.72.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicediscovery (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicequotas (1.23.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ses (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sesv2 (1.28.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-shield (1.49.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-signer (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-simpledb (1.35.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3control (1.87.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3outposts (1.35.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemaker (1.257.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakeredgemanager (1.31.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakerfeaturestoreruntime (1.36.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakergeospatial (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemakermetrics (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sagemakerruntime (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-savingsplans (1.46.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-scheduler (1.19.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-schemas (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-secretsmanager (1.102.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-securityhub (1.114.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-securitylake (1.24.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-serverlessapplicationrepository (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-servicecatalog (1.99.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-servicediscovery (1.69.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-servicequotas (1.42.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ses (1.69.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sesv2 (1.56.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-shield (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-signer (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-simpledb (1.51.0) + aws-sdk-core (~> 3, >= 3.201.0) aws-sigv2 (~> 1.0) - aws-sdk-sms (1.40.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-snowball (1.50.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-snowdevicemanagement (1.7.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sns (1.55.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-sqs (1.51.1) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssm (1.142.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmcontacts (1.14.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmincidents (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssoadmin (1.20.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-states (1.48.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-storagegateway (1.68.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-support (1.41.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-supportapp (1.1.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-swf (1.36.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-synthetics (1.28.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-textract (1.38.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-timestreamquery (1.16.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-timestreamwrite (1.14.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-transcribeservice (1.76.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-transcribestreamingservice (1.42.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-transfer (1.60.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-translate (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-voiceid (1.9.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-waf (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-wafregional (1.48.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-wafv2 (1.42.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-wellarchitected (1.17.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-workdocs (1.39.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-worklink (1.33.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-workmail (1.51.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-workmailmessageflow (1.21.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-workspaces (1.73.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-workspacesweb (1.5.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) - aws-sdk-xray (1.47.0) - aws-sdk-core (~> 3, >= 3.127.0) - aws-sigv4 (~> 1.1) + aws-sdk-simspaceweaver (1.20.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-sms (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-snowball (1.73.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-snowdevicemanagement (1.25.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-sns (1.82.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-sqs (1.80.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssm (1.175.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmcontacts (1.34.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmincidents (1.39.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssmquicksetup (1.0.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssmsap (1.24.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-ssoadmin (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-states (1.73.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-storagegateway (1.91.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-supplychain (1.8.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-support (1.64.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-supportapp (1.20.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-swf (1.59.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-synthetics (1.47.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-taxsettings (1.5.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-textract (1.63.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-timestreaminfluxdb (1.6.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-timestreamquery (1.38.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-timestreamwrite (1.34.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-tnb (1.18.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-transcribeservice (1.103.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-transcribestreamingservice (1.64.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-transfer (1.98.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-translate (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-trustedadvisor (1.10.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-verifiedpermissions (1.28.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-voiceid (1.29.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-vpclattice (1.17.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-waf (1.66.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-wafregional (1.68.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-wafv2 (1.88.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-wellarchitected (1.41.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workdocs (1.62.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-worklink (1.52.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workmail (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workmailmessageflow (1.40.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspaces (1.112.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspacesthinclient (1.11.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-workspacesweb (1.26.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.1) + aws-sdk-xray (1.70.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) aws-sigv2 (1.2.0) - aws-sigv4 (1.8.0) + aws-sigv4 (1.9.1) aws-eventstream (~> 1, >= 1.0.2) backport (1.2.0) base64 (0.2.0) - benchmark-ips (2.7.2) - bootsnap (1.7.5) - msgpack (~> 1.0) + benchmark-ips (2.13.0) + bigdecimal (3.1.8) + bootsnap (1.18.4) + msgpack (~> 1.2) bourbon (4.2.7) sass (~> 3.4) thor (~> 0.19) - brakeman (4.7.1) + brakeman (5.4.1) browser (5.3.1) - builder (3.2.4) - bullet (6.0.1) + builder (3.3.0) + bullet (7.2.0) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - bummr (0.5.0) + bummr (1.1.0) rainbow thor - bundler-audit (0.6.1) + bundler-audit (0.7.0.1) bundler (>= 1.2.0, < 3) - thor (~> 0.18) + thor (>= 0.18, < 2) business_time (0.9.3) activesupport (>= 3.2.0) tzinfo byebug (11.1.3) - capybara (3.28.0) + capybara (3.39.2) addressable + matrix mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) - regexp_parser (~> 1.5) + regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - capybara-screenshot (1.0.23) + capybara-screenshot (1.0.26) capybara (>= 1.0, < 4) launchy + childprocess (5.1.0) + logger (~> 1.5) choice (0.2.0) claide (1.1.0) claide-plugins (0.9.2) @@ -1497,19 +1759,17 @@ GEM cliver (0.3.2) coderay (1.1.3) colored2 (3.1.2) - colorize (0.8.1) - concurrent-ruby (1.2.2) - connection_pool (2.2.3) + concurrent-ruby (1.3.4) + connection_pool (2.4.1) cork (0.3.0) colored2 (~> 3.1) - countries (3.0.1) - i18n_data (~> 0.10.0) - sixarm_ruby_unaccent (~> 1.1) - unicode_utils (~> 1.4) - crack (0.4.3) - safe_yaml (~> 1.0.0) + countries (5.7.2) + unaccent (~> 0.3) + crack (1.0.0) + bigdecimal + rexml crass (1.0.6) - d3-rails (7.0.0) + d3-rails (7.8.5) railties (>= 3.1) danger (6.2.2) claide (~> 1.0) @@ -1528,105 +1788,103 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date (3.3.3) + date (3.3.4) + dead_end (4.0.0) debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) - debase-ruby_core_source (0.10.14) - derailed_benchmarks (1.3.6) + debase-ruby_core_source (3.3.1) + derailed_benchmarks (2.1.2) benchmark-ips (~> 2) + dead_end get_process_mem (~> 0) heapy (~> 0) - memory_profiler (~> 0) + memory_profiler (>= 0, < 2) + mini_histogram (>= 0.3.0) rack (>= 1) - rake (> 10, < 13) - thor (~> 0.19) - diff-lcs (1.3) - docile (1.1.5) - dotenv (2.7.5) - dotenv-rails (2.7.5) - dotenv (= 2.7.5) - railties (>= 3.2, < 6.1) - dry-configurable (0.11.5) - concurrent-ruby (~> 1.0) - dry-core (~> 0.4, >= 0.4.7) - dry-equalizer (~> 0.2) - dry-container (0.7.2) + rack-test + rake (> 10, < 14) + ruby-statistics (>= 2.1) + thor (>= 0.19, < 2) + diff-lcs (1.5.1) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) + dry-configurable (1.0.1) + dry-core (~> 1.0, < 2) + zeitwerk (~> 2.6) + dry-core (1.0.0) concurrent-ruby (~> 1.0) - dry-configurable (~> 0.1, >= 0.1.3) - dry-core (0.4.9) + zeitwerk (~> 2.6) + dry-inflector (1.1.0) + dry-initializer (3.1.1) + dry-logic (1.5.0) concurrent-ruby (~> 1.0) - dry-equalizer (0.3.0) - dry-inflector (0.2.0) - dry-initializer (3.0.3) - dry-logic (1.0.6) + dry-core (~> 1.0, < 2) + zeitwerk (~> 2.6) + dry-schema (1.13.4) concurrent-ruby (~> 1.0) - dry-core (~> 0.2) - dry-equalizer (~> 0.2) - dry-schema (1.5.1) - concurrent-ruby (~> 1.0) - dry-configurable (~> 0.8, >= 0.8.3) - dry-core (~> 0.4) - dry-equalizer (~> 0.2) + dry-configurable (~> 1.0, >= 1.0.1) + dry-core (~> 1.0, < 2) dry-initializer (~> 3.0) - dry-logic (~> 1.0) - dry-types (~> 1.4) - dry-types (1.4.0) + dry-logic (>= 1.4, < 2) + dry-types (>= 1.7, < 2) + zeitwerk (~> 2.6) + dry-types (1.7.1) concurrent-ruby (~> 1.0) - dry-container (~> 0.3) - dry-core (~> 0.4, >= 0.4.4) - dry-equalizer (~> 0.3) - dry-inflector (~> 0.1, >= 0.1.2) - dry-logic (~> 1.0, >= 1.0.2) - ecma-re-validator (0.2.1) - regexp_parser (~> 1.2) - erubi (1.12.0) - execjs (2.7.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + ecma-re-validator (0.4.0) + regexp_parser (~> 2.2) + erubi (1.13.0) + execjs (2.9.1) factory_bot (5.2.0) activesupport (>= 4.2.0) factory_bot_rails (5.2.0) factory_bot (~> 5.2.0) railties (>= 4.2.0) - faker (2.15.1) - i18n (>= 1.6, < 2) - faraday (0.15.4) + faker (3.4.2) + i18n (>= 1.8.11, < 2) + faraday (0.17.6) multipart-post (>= 1.2, < 3) - faraday-http-cache (2.4.1) + faraday-http-cache (2.5.1) faraday (>= 0.8) faraday-multipart (1.0.4) multipart-post (~> 2) - faraday_middleware (0.13.1) + faraday_middleware (0.14.0) faraday (>= 0.7.4, < 1.0) fast_jsonapi (1.5) activesupport (>= 4.2) - fasterer (0.6.0) - colorize (~> 0.7) - ruby_parser (>= 3.13.0) - ffi (1.16.3) - foreman (0.87.2) - formatador (0.2.5) + fasterer (0.11.0) + ruby_parser (>= 3.19.1) + ffi (1.17.0-x86_64-darwin) + foreman (0.88.1) + formatador (1.1.0) fuzzy_match (2.1.0) - get_process_mem (0.2.4) + get_process_mem (0.2.7) ffi (~> 1.0) - git (1.13.2) + git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) globalid (1.1.0) activesupport (>= 5.0) - google-protobuf (3.25.3) - googleapis-common-protos-types (1.14.0) - google-protobuf (~> 3.18) + google-protobuf (3.25.4) + googleapis-common-protos-types (1.15.0) + google-protobuf (>= 3.18, < 5.a) govdelivery-tms (2.8.4) activesupport faraday faraday_middleware mime-types - guard (2.14.2) + guard (2.18.1) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) nenv (~> 0.1) notiffany (~> 0.0) - pry (>= 0.9.12) + pry (>= 0.13.0) shellany (~> 0.0) thor (>= 0.18.1) guard-compat (1.2.1) @@ -1634,92 +1892,97 @@ GEM guard (~> 2.1) guard-compat (~> 1.1) rspec (>= 2.99.0, < 4.0) - gyoku (1.3.1) + gyoku (1.4.0) builder (>= 2.1.2) - hana (1.3.6) - hashdiff (1.0.0) - heapy (0.1.4) + rexml (~> 3.0) + hana (1.3.7) + hashdiff (1.1.1) + heapy (0.2.0) + thor holidays (6.6.1) httpclient (2.8.3) - httpi (2.4.4) + httpi (2.5.0) rack socksify - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) - i18n_data (0.10.0) - icalendar (2.6.1) + icalendar (2.10.2) ice_cube (~> 0.16) - ice_cube (0.16.3) + ice_cube (0.17.0) immigrant (0.3.6) activerecord (>= 3.0) - jaro_winkler (1.5.6) - jmespath (1.3.1) - jquery-rails (4.5.1) + jaro_winkler (1.6.0) + jmespath (1.6.2) + jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.3.0) - json-schema (4.3.0) + json-schema (4.3.1) addressable (>= 2.8) - json_schemer (0.2.16) - ecma-re-validator (~> 0.2) + json_schemer (0.2.25) + ecma-re-validator (~> 0.3) hana (~> 1.3) - regexp_parser (~> 1.5) + regexp_parser (~> 2.0) + simpleidn (~> 0.2) uri_template (~> 0.7) - kaminari (1.2.1) + kaminari (1.2.2) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.1) - kaminari-activerecord (= 1.2.1) - kaminari-core (= 1.2.1) - kaminari-actionview (1.2.1) + kaminari-actionview (= 1.2.2) + kaminari-activerecord (= 1.2.2) + kaminari-core (= 1.2.2) + kaminari-actionview (1.2.2) actionview - kaminari-core (= 1.2.1) - kaminari-activerecord (1.2.1) + kaminari-core (= 1.2.2) + kaminari-activerecord (1.2.2) activerecord - kaminari-core (= 1.2.1) - kaminari-core (1.2.1) - knapsack_pro (3.9.0) + kaminari-core (= 1.2.2) + kaminari-core (1.2.2) + knapsack_pro (3.11.0) rake kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - launchy (2.4.3) - addressable (~> 2.3) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) + launchy (3.0.1) + addressable (~> 2.8) + childprocess (~> 5.0) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.6.0) logstasher (2.1.5) activesupport (>= 5.2) request_store - loofah (2.21.3) + loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - lumberjack (1.0.13) + lumberjack (1.2.10) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.2) + marcel (1.0.4) maruku (0.7.3) - memory_profiler (0.9.14) - meta_request (0.7.2) + matrix (0.4.2) + memory_profiler (1.0.2) + meta_request (0.8.2) rack-contrib (>= 1.1, < 3) - railties (>= 3.0.0, < 7) - method_source (1.0.0) - mime-types (3.3) + railties (>= 3.0.0, < 8) + method_source (1.1.0) + mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2019.1009) - mini_mime (1.1.2) - mini_portile2 (2.8.5) - minitest (5.19.0) - moment_timezone-rails (0.5.0) - momentjs-rails (2.29.4.1) + mime-types-data (3.2024.0820) + mini_histogram (0.3.1) + mini_mime (1.1.5) + mini_portile2 (2.8.7) + minitest (5.25.1) + moment_timezone-rails (0.5.14) + momentjs-rails (~> 2.15.1) + momentjs-rails (2.15.1) railties (>= 3.1) - msgpack (1.4.2) - multipart-post (2.1.1) + msgpack (1.7.2) + multipart-post (2.4.1) multiverse (0.2.2) activerecord (>= 4.2) activesupport (>= 4.2) @@ -1728,22 +1991,21 @@ GEM neat (4.0.0) thor (~> 0.19) nenv (0.3.0) - net-imap (0.3.7) + net-imap (0.4.14) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.3.3) + net-smtp (0.5.0) net-protocol - nio4r (2.5.9) + nio4r (2.7.3) no_proxy_fix (0.1.2) - nokogiri (1.15.5) - mini_portile2 (~> 2.8.2) + nokogiri (1.15.6-x86_64-darwin) racc (~> 1.4) nori (2.6.0) - notiffany (0.1.1) + notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) octokit (4.22.0) @@ -1836,32 +2098,35 @@ GEM paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) - parallel (1.23.0) - paranoia (2.4.2) - activerecord (>= 4.0, < 6.1) + parallel (1.26.3) + paranoia (2.6.4) + activerecord (>= 5.1, < 7.2) parser (2.7.2.0) ast (~> 2.4.1) - pdf-forms (1.2.0) + pdf-forms (1.5.1) cliver (~> 0.3.2) + rexml (~> 3.2, >= 3.2.6) safe_shell (>= 1.0.3, < 2.0) - pdfkit (0.8.7.2) - pg (1.1.4) + pdfkit (0.8.7.3) + pg (1.5.7) pluck_to_hash (1.0.2) activerecord (>= 4.0.2) activesupport (>= 4.0.2) pry (0.13.1) coderay (~> 1.1) method_source (~> 1.0) - pry-byebug (3.9.0) + pry-byebug (3.10.1) byebug (~> 11.0) - pry (~> 0.13.0) - public_suffix (4.0.6) + pry (>= 0.13, < 0.15) + public_suffix (5.1.1) puma (5.6.4) nio4r (~> 2.0) - racc (1.7.3) + racc (1.8.1) rack (2.2.6.4) - rack-contrib (2.1.0) - rack (~> 2.0) + rack-contrib (2.5.0) + rack (< 4) + rack-session (1.0.2) + rack (< 3) rack-test (2.1.0) rack (>= 1.3) rails (6.0.6.1) @@ -1879,11 +2144,11 @@ GEM bundler (>= 1.3.0) railties (= 6.0.6.1) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.1.1) + rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-erd (1.6.0) + rails-erd (1.7.2) activerecord (>= 4.2) activesupport (>= 4.2) choice (~> 0.2.0) @@ -1898,9 +2163,9 @@ GEM rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rainbow (3.1.1) - rake (12.3.3) + rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) rb-readline (0.5.5) rchardet (1.8.0) @@ -1910,76 +2175,80 @@ GEM execjs (~> 2.5) rails (>= 3.2) rainbow (~> 3.0) - redis (4.0.1) - redis-actionpack (5.1.0) - actionpack (>= 4.0, < 7) - redis-rack (>= 1, < 3) + redis (5.3.0) + redis-client (>= 0.22.0) + redis-actionpack (5.4.0) + actionpack (>= 5, < 8) + redis-rack (>= 2.1.0, < 4) redis-store (>= 1.1.0, < 2) redis-activesupport (5.3.0) activesupport (>= 3, < 8) redis-store (>= 1.3, < 2) redis-classy (2.4.1) redis-namespace (~> 1.0) + redis-client (0.22.2) + connection_pool redis-mutex (4.0.2) redis-classy (~> 2.0) redis-namespace (1.11.0) redis (>= 4) - redis-rack (2.0.4) - rack (>= 1.5, < 3) + redis-rack (3.0.0) + rack-session (>= 0.2.0) redis-store (>= 1.2, < 2) redis-rails (5.0.2) redis-actionpack (>= 5.0, < 6) redis-activesupport (>= 5.0, < 6) redis-store (>= 1.2, < 2) - redis-store (1.4.1) - redis (>= 2.2, < 5) - regexp_parser (1.6.0) - request_store (1.4.1) + redis-store (1.11.0) + redis (>= 4, < 6) + regexp_parser (2.9.2) + request_store (1.7.0) rack (>= 1.4) reverse_markdown (1.4.0) nokogiri - rexml (3.2.6) - roo (2.8.2) + rexml (3.3.6) + strscan + roo (2.10.1) nokogiri (~> 1) - rubyzip (>= 1.2.1, < 2.0.0) - rspec (3.9.0) - rspec-core (~> 3.9.0) - rspec-expectations (~> 3.9.0) - rspec-mocks (~> 3.9.0) - rspec-core (3.9.1) - rspec-support (~> 3.9.1) - rspec-expectations (3.9.1) + rubyzip (>= 1.3.0, < 3.0.0) + 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.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) + rspec-support (~> 3.13.0) rspec-github (2.4.0) rspec-core (~> 3.0) - rspec-mocks (3.9.1) + rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.9.0) - rspec-rails (4.0.0) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) - rspec-core (~> 3.9) - rspec-expectations (~> 3.9) - rspec-mocks (~> 3.9) - rspec-support (~> 3.9) + 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-retry (0.6.2) rspec-core (> 3.3) - rspec-support (3.9.2) - rspec_junit_formatter (0.4.1) + rspec-support (3.13.1) + rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) - rswag-api (2.13.0) - activesupport (>= 3.1, < 7.2) - railties (>= 3.1, < 7.2) - rswag-specs (2.13.0) - activesupport (>= 3.1, < 7.2) + rswag-api (2.14.0) + activesupport (>= 5.2, < 8.0) + railties (>= 5.2, < 8.0) + rswag-specs (2.14.0) + activesupport (>= 5.2, < 8.0) json-schema (>= 2.2, < 5.0) - railties (>= 3.1, < 7.2) + railties (>= 5.2, < 8.0) rspec-core (>= 2.14) - rswag-ui (2.13.0) - actionpack (>= 3.1, < 7.2) - railties (>= 3.1, < 7.2) + rswag-ui (2.14.0) + actionpack (>= 5.2, < 8.0) + railties (>= 5.2, < 8.0) rubocop (0.83.0) parallel (~> 1.10) parser (>= 2.7.0.1) @@ -1987,26 +2256,27 @@ GEM rexml ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) - rubocop-performance (1.5.2) - rubocop (>= 0.71.0) - rubocop-rails (2.5.0) - activesupport + rubocop-performance (1.7.1) + rubocop (>= 0.82.0) + rubocop-rails (2.6.0) + activesupport (>= 4.2.0) rack (>= 1.1) - rubocop (>= 0.72.0) + rubocop (>= 0.82.0) ruby-debug-ide (0.7.3) rake (>= 0.8.1) - ruby-graphviz (1.2.4) - ruby-oci8 (2.2.7) + ruby-graphviz (1.2.5) + rexml + ruby-oci8 (2.2.14) ruby-plsql (0.8.0) - ruby-prof (1.4.1) + ruby-prof (1.6.3) ruby-progressbar (1.13.0) + ruby-statistics (3.0.2) ruby2_keywords (0.0.5) - ruby_dep (1.5.0) - ruby_parser (3.20.3) + ruby_parser (3.21.1) + racc (~> 1.5) sexp_processor (~> 4.16) - rubyzip (1.3.0) + rubyzip (2.3.2) safe_shell (1.1.0) - safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -2018,14 +2288,15 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - savon (2.12.1) + savon (2.15.0) akami (~> 1.2) builder (>= 2.1.2) gyoku (~> 1.2) - httpi (~> 2.3) + httpi (>= 2.4.5, < 5) + mail (~> 2.5) nokogiri (>= 1.8.1) nori (~> 2.4) - wasabi (~> 3.4) + wasabi (>= 3.7, < 6) sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) @@ -2035,9 +2306,9 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) - sentry-raven (2.11.0) + sentry-raven (2.13.0) faraday (>= 0.7.6, < 1.0) - sexp_processor (4.17.0) + sexp_processor (4.17.2) shellany (0.0.1) shoryuken (3.1.11) aws-sdk-core (>= 2) @@ -2045,9 +2316,8 @@ GEM thor shoulda-matchers (5.3.0) activesupport (>= 5.2.0) - simplecov-html (0.10.2) - single_cov (1.3.2) - sixarm_ruby_unaccent (1.2.0) + simpleidn (0.2.3) + single_cov (1.11.0) socksify (1.7.1) solargraph (0.38.0) backport (~> 1.1) @@ -2061,7 +2331,8 @@ GEM thor (~> 0.19, >= 0.19.4) tilt (~> 2.0) yard (~> 0.9) - sprockets (3.7.2) + sprockets (3.7.3) + base64 concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.4.2) @@ -2069,30 +2340,34 @@ GEM activesupport (>= 5.2) sprockets (>= 3.0.0) sql_tracker (1.3.2) - statsd-instrument (3.7.0) - stringex (2.8.5) - strong_migrations (0.4.1) - activerecord (>= 5) + sqlite3 (1.7.3) + mini_portile2 (~> 2.8.0) + statsd-instrument (3.9.0) + stringex (2.8.6) + strong_migrations (1.8.0) + activerecord (>= 5.2) + strscan (3.1.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - test-prof (0.10.1) + test-prof (1.4.0) thor (0.20.3) thread_safe (0.3.6) - tilt (2.0.8) - timecop (0.9.1) - timeout (0.4.0) + tilt (2.4.0) + timecop (0.9.10) + timeout (0.4.1) tty-tree (0.3.0) tzinfo (1.2.10) thread_safe (~> 0.1) - uglifier (4.1.20) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) + unaccent (0.4.0) unicode-display_width (1.8.0) - unicode_utils (1.4.0) - uniform_notifier (1.12.1) + uniform_notifier (1.16.0) uri_template (0.7.0) - validates_email_format_of (1.6.3) - i18n - wasabi (3.6.1) + validates_email_format_of (1.8.2) + i18n (>= 0.8.0) + simpleidn + wasabi (3.7.0) addressable httpi (~> 2.0) nokogiri (>= 1.4.2) @@ -2104,8 +2379,7 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.7.0) - websocket (1.2.10) + websocket (1.2.11) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -2120,13 +2394,13 @@ GEM nokogiri (~> 1.11) xpath (3.2.0) nokogiri (~> 1.8) - yard (0.9.27) - webrick (~> 1.7.0) - zeitwerk (2.6.12) - ziptz (2.1.6) + yard (0.9.36) + zeitwerk (2.6.17) + ziptz (4.0.2) + sqlite3 (~> 1.6) PLATFORMS - ruby + x86_64-darwin-22 DEPENDENCIES aasm (= 4.11.0) @@ -2235,7 +2509,6 @@ DEPENDENCIES sentry-raven shoryuken (= 3.1.11) shoulda-matchers - simplecov! single_cov sniffybara! solargraph diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 5eeb999313a..4451296b081 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -5,7 +5,6 @@ class HealthChecksController < ActionController::Base include CollectCustomMetrics protect_from_forgery with: :exception - # newrelic_ignore_apdex def show body = { From 7da5c9be83cc0ab4574f553f40526780c280fce5 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 23 Aug 2024 08:34:34 -0400 Subject: [PATCH 10/46] Adding all instruments --- Gemfile | 2 +- config/initializers/open_telemetry.rb | 29 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index 1be6288e367..06e32da836b 100644 --- a/Gemfile +++ b/Gemfile @@ -139,7 +139,7 @@ group :test, :development, :demo do gem "rubocop-performance" gem "rubocop-rails" gem "scss_lint", require: false - gem "simplecov", git: "https://github.com/colszowka/simplecov.git", require: false + # gem "simplecov", git: "https://github.com/colszowka/simplecov.git", require: false gem "single_cov" gem "sniffybara", git: "https://github.com/department-of-veterans-affairs/sniffybara.git" gem "sql_tracker" diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 1c6b1b082c5..94c0de08f3e 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -4,7 +4,22 @@ require 'opentelemetry/sdk' require 'opentelemetry/exporter/otlp' -require 'opentelemetry/instrumentation/all' + +require "opentelemetry-instrumentation-action_pack" +require "opentelemetry-instrumentation-action_view" +require "opentelemetry-instrumentation-active_job" +require "opentelemetry-instrumentation-active_record" +require "opentelemetry-instrumentation-active_support" +require "opentelemetry-instrumentation-aws_sdk" +require "opentelemetry-instrumentation-concurrent_ruby" +require "opentelemetry-instrumentation-faraday" +require "opentelemetry-instrumentation-http_client" +require "opentelemetry-instrumentation-net_http" +require "opentelemetry-instrumentation-pg" +require "opentelemetry-instrumentation-rack" +require "opentelemetry-instrumentation-rails" +require "opentelemetry-instrumentation-rake" +require "opentelemetry-instrumentation-redis" # rubocop:disable Layout/LineLength @@ -18,14 +33,22 @@ c.service_name = 'ruby-quickstart' c.service_version = '1.0.1' + c.use 'OpenTelemetry::Instrumentation::ActionPack' + c.use 'OpenTelemetry::Instrumentation::ActionView' + c.use 'OpenTelemetry::Instrumentation::ActiveJob' c.use 'OpenTelemetry::Instrumentation::ActiveRecord' + c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::AwsSdk' - c.use 'OpenTelemetry::Instrumentation::Net::HTTP' - c.use 'OpenTelemetry::Instrumentation::PG' + c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' + c.use 'OpenTelemetry::Instrumentation::Faraday' + c.use 'OpenTelemetry::Instrumentation::HttpClient' c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } c.use 'OpenTelemetry::Instrumentation::Rails' c.use 'OpenTelemetry::Instrumentation::Redis' + # c.use 'OpenTelemetry::Instrumentation::Net::HTTP' + # c.use 'OpenTelemetry::Instrumentation::PG' + Rails.logger.info("Loaded instruments") %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| From ed7f99b8966b646d1672aecf760be0f4e18bc713 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 23 Aug 2024 08:36:35 -0400 Subject: [PATCH 11/46] Update config to only include basic instruments --- config/initializers/open_telemetry.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 94c0de08f3e..2feed0840c7 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -33,19 +33,19 @@ c.service_name = 'ruby-quickstart' c.service_version = '1.0.1' - c.use 'OpenTelemetry::Instrumentation::ActionPack' - c.use 'OpenTelemetry::Instrumentation::ActionView' - c.use 'OpenTelemetry::Instrumentation::ActiveJob' c.use 'OpenTelemetry::Instrumentation::ActiveRecord' - c.use 'OpenTelemetry::Instrumentation::ActiveSupport' - c.use 'OpenTelemetry::Instrumentation::AwsSdk' - c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' - c.use 'OpenTelemetry::Instrumentation::Faraday' - c.use 'OpenTelemetry::Instrumentation::HttpClient' c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } c.use 'OpenTelemetry::Instrumentation::Rails' - c.use 'OpenTelemetry::Instrumentation::Redis' + # c.use 'OpenTelemetry::Instrumentation::ActionPack' + # c.use 'OpenTelemetry::Instrumentation::ActionView' + # c.use 'OpenTelemetry::Instrumentation::ActiveJob' + # c.use 'OpenTelemetry::Instrumentation::ActiveSupport' + # c.use 'OpenTelemetry::Instrumentation::AwsSdk' + # c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' + # c.use 'OpenTelemetry::Instrumentation::Faraday' + # c.use 'OpenTelemetry::Instrumentation::HttpClient' + # c.use 'OpenTelemetry::Instrumentation::Redis' # c.use 'OpenTelemetry::Instrumentation::Net::HTTP' # c.use 'OpenTelemetry::Instrumentation::PG' From 45ea7f3fe45d0276b5ff1860356779d327bdba6b Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 23 Aug 2024 10:01:00 -0400 Subject: [PATCH 12/46] Update Gemfile.lock --- Gemfile.lock | 2696 ++++++++++++++++++++++---------------------------- 1 file changed, 1205 insertions(+), 1491 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3fac8dae31a..37c881111c0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -72,7 +72,7 @@ GIT GIT remote: https://github.com/department-of-veterans-affairs/sniffybara.git - revision: bcd5cb8e6dcb595dd111da5b0758f807d8c7525a + revision: 351560b5789ca638ba7c9b093c2bb1a9a6fda4b3 specs: sniffybara (1.1.0) rainbow @@ -135,8 +135,8 @@ GEM activerecord (6.0.6.1) activemodel (= 6.0.6.1) activesupport (= 6.0.6.1) - activerecord-import (1.7.0) - activerecord (>= 4.2) + activerecord-import (1.0.2) + activerecord (>= 3.2) activerecord-oracle_enhanced-adapter (6.0.6) activerecord (~> 6.0.0) ruby-plsql (>= 0.6.0) @@ -151,948 +151,797 @@ GEM minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - acts_as_tree (2.9.1) + acts_as_tree (2.9.0) activerecord (>= 3.0.0) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - akami (1.3.2) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + akami (1.3.1) gyoku (>= 0.4.0) nokogiri - amoeba (3.3.0) - activerecord (>= 5.2.0) + amoeba (3.2.0) + activerecord (>= 4.2.0) anbt-sql-formatter (0.1.0) ast (2.4.2) aws-eventstream (1.3.0) - aws-partitions (1.968.0) + aws-partitions (1.934.0) aws-sdk (3.2.0) aws-sdk-resources (~> 3) - aws-sdk-accessanalyzer (1.54.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-account (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-acm (1.74.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-acmpca (1.76.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-amplify (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-amplifybackend (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-amplifyuibuilder (1.30.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigateway (1.101.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-apigatewaymanagementapi (1.48.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-apigatewayv2 (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-appconfig (1.51.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-appconfigdata (1.25.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-appfabric (1.14.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-appflow (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-appintegrationsservice (1.37.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-applicationautoscaling (1.90.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-applicationcostprofiler (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-applicationdiscoveryservice (1.71.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-applicationinsights (1.51.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-applicationsignals (1.4.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-appmesh (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-appregistry (1.39.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-apprunner (1.44.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-appstream (1.94.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-appsync (1.82.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-apptest (1.3.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-arczonalshift (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-artifact (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-athena (1.89.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-auditmanager (1.51.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-augmentedairuntime (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-autoscaling (1.115.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-autoscalingplans (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-b2bi (1.14.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-backup (1.73.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-backupgateway (1.24.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-batch (1.95.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-bcmdataexports (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrock (1.16.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-bedrockagent (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrockagentruntime (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-bedrockruntime (1.17.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-billingconductor (1.27.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-braket (1.40.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-budgets (1.71.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chatbot (1.9.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chime (1.89.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chimesdkidentity (1.30.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chimesdkmediapipelines (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chimesdkmeetings (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chimesdkmessaging (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-chimesdkvoice (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cleanrooms (1.27.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cleanroomsml (1.10.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloud9 (1.74.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudcontrolapi (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-clouddirectory (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudformation (1.114.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudfront (1.96.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudfrontkeyvaluestore (1.10.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudhsm (1.58.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudhsmv2 (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudsearch (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudsearchdomain (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudtrail (1.85.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudtraildata (1.16.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatch (1.97.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudwatchevents (1.77.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudwatchevidently (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-cloudwatchlogs (1.88.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cloudwatchrum (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-codeartifact (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codebuild (1.124.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codecatalyst (1.23.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sdk-codecommit (1.72.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codeconnections (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codedeploy (1.72.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codeguruprofiler (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-codegurureviewer (1.52.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codegurusecurity (1.17.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-codepipeline (1.78.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codestarconnections (1.48.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-codestarnotifications (1.39.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cognitoidentity (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cognitoidentityprovider (1.100.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-cognitosync (1.55.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-comprehend (1.87.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-comprehendmedical (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-computeoptimizer (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-configservice (1.114.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-connect (1.171.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-connectcampaignservice (1.21.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcases (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-connectcontactlens (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-connectparticipant (1.49.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-connectwisdomservice (1.34.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-controlcatalog (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-controltower (1.27.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-core (3.201.5) - aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.9) - jmespath (~> 1, >= 1.6.1) - aws-sdk-costandusagereportservice (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-costexplorer (1.105.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-costoptimizationhub (1.11.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-customerprofiles (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-databasemigrationservice (1.100.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-dataexchange (1.52.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-datapipeline (1.55.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-datasync (1.83.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-datazone (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-dax (1.58.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-deadline (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-detective (1.53.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-devicefarm (1.72.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-devopsguru (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-directconnect (1.77.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-directoryservice (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-dlm (1.75.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-docdb (1.71.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-docdbelastic (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-drs (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-dynamodb (1.118.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-dynamodbstreams (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ebs (1.46.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ec2 (1.470.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ec2instanceconnect (1.45.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ecr (1.80.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ecrpublic (1.33.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ecs (1.154.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-efs (1.79.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-eks (1.112.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-eksauth (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-elasticache (1.109.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elasticbeanstalk (1.73.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elasticinference (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elasticloadbalancing (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elasticloadbalancingv2 (1.109.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elasticsearchservice (1.89.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-elastictranscoder (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-emr (1.92.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-emrcontainers (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-emrserverless (1.30.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-entityresolution (1.16.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-eventbridge (1.65.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-finspace (1.38.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-finspacedata (1.38.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-firehose (1.76.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-fis (1.35.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-fms (1.76.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-forecastqueryservice (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-forecastservice (1.58.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-frauddetector (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-freetier (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-fsx (1.94.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-gamelift (1.85.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-glacier (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-globalaccelerator (1.64.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-glue (1.190.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-gluedatabrew (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-greengrass (1.69.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-greengrassv2 (1.43.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-groundstation (1.53.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-guardduty (1.96.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-health (1.67.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-healthlake (1.33.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iam (1.105.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-identitystore (1.40.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-imagebuilder (1.65.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-importexport (1.49.0) - aws-sdk-core (~> 3, >= 3.201.0) + aws-sdk-accessanalyzer (1.30.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-account (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-acm (1.52.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-acmpca (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-alexaforbusiness (1.56.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-amplify (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-amplifybackend (1.17.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-amplifyuibuilder (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigateway (1.78.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigatewaymanagementapi (1.30.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-apigatewayv2 (1.42.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appconfig (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appconfigdata (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appflow (1.28.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appintegrationsservice (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-applicationautoscaling (1.62.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-applicationcostprofiler (1.9.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-applicationdiscoveryservice (1.46.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-applicationinsights (1.31.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appmesh (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appregistry (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-apprunner (1.15.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appstream (1.66.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-appsync (1.53.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-athena (1.56.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-auditmanager (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-augmentedairuntime (1.23.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-autoscaling (1.80.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-autoscalingplans (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-backup (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-backupgateway (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-backupstorage (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-batch (1.63.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-billingconductor (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-braket (1.19.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-budgets (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-chime (1.68.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-chimesdkidentity (1.9.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-chimesdkmediapipelines (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-chimesdkmeetings (1.14.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-chimesdkmessaging (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloud9 (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudcontrolapi (1.8.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-clouddirectory (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudformation (1.70.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudfront (1.68.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudhsm (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudhsmv2 (1.42.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudsearch (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudsearchdomain (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudtrail (1.52.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatch (1.67.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchevents (1.57.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchevidently (1.8.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchlogs (1.53.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cloudwatchrum (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codeartifact (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codebuild (1.88.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codecommit (1.51.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codedeploy (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codeguruprofiler (1.24.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codegurureviewer (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codepipeline (1.53.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codestar (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codestarconnections (1.24.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-codestarnotifications (1.20.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cognitoidentity (1.40.1) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cognitoidentityprovider (1.71.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-cognitosync (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-comprehend (1.62.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-comprehendmedical (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-computeoptimizer (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-configservice (1.84.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connect (1.79.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcampaignservice (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcases (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectcontactlens (1.11.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectparticipant (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-connectwisdomservice (1.9.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-controltower (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-core (3.131.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.525.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-costandusagereportservice (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-costexplorer (1.78.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-customerprofiles (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-databasemigrationservice (1.72.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-dataexchange (1.27.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-datapipeline (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-datasync (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-dax (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-detective (1.29.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-devicefarm (1.52.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-devopsguru (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-directconnect (1.54.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-directoryservice (1.51.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-dlm (1.52.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-docdb (1.44.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-drs (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-dynamodb (1.77.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-dynamodbstreams (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ebs (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ec2 (1.341.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ec2instanceconnect (1.25.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ecr (1.56.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ecrpublic (1.12.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ecs (1.103.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-efs (1.54.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-eks (1.77.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticache (1.79.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticbeanstalk (1.51.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticinference (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticloadbalancing (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticloadbalancingv2 (1.80.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elasticsearchservice (1.66.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-elastictranscoder (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-emr (1.62.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-emrcontainers (1.15.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-emrserverless (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-eventbridge (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-finspace (1.11.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-finspacedata (1.17.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-firehose (1.48.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-fis (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-fms (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-forecastqueryservice (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-forecastservice (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-frauddetector (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-fsx (1.60.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-gamelift (1.58.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-gamesparks (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-glacier (1.46.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-globalaccelerator (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-glue (1.120.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-gluedatabrew (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-greengrass (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-greengrassv2 (1.20.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-groundstation (1.27.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-guardduty (1.60.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-health (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-healthlake (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-honeycode (1.17.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iam (1.71.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-identitystore (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-imagebuilder (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-importexport (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) aws-sigv2 (~> 1.0) - aws-sdk-inspector (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-inspector2 (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-inspectorscan (1.9.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-internetmonitor (1.23.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot (1.128.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iot1clickdevicesservice (1.55.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-iot1clickprojects (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotanalytics (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotdataplane (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotdeviceadvisor (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotevents (1.53.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ioteventsdata (1.46.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotfleethub (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotfleetwise (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotjobsdataplane (1.55.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotsecuretunneling (1.40.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotsitewise (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iotthingsgraph (1.43.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-iottwinmaker (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-iotwireless (1.53.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ivs (1.54.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ivschat (1.29.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ivsrealtime (1.25.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafka (1.77.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-kafkaconnect (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-kendra (1.85.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kendraranking (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-keyspaces (1.24.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-kinesis (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisanalytics (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisanalyticsv2 (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisvideo (1.67.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisvideoarchivedmedia (1.64.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisvideomedia (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisvideosignalingchannels (1.38.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-kinesisvideowebrtcstorage (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-kms (1.88.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lakeformation (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lambda (1.127.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lambdapreview (1.49.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-launchwizard (1.10.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-lex (1.65.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lexmodelbuildingservice (1.76.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lexmodelsv2 (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lexruntimev2 (1.38.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-licensemanager (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-licensemanagerlinuxsubscriptions (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-licensemanagerusersubscriptions (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-lightsail (1.96.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-locationservice (1.55.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-lookoutequipment (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lookoutforvision (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-lookoutmetrics (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-machinelearning (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-macie2 (1.73.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mailmanager (1.5.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-mainframemodernization (1.22.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedblockchain (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-managedblockchainquery (1.16.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-managedgrafana (1.33.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplaceagreement (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplacecatalog (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-marketplacecommerceanalytics (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-marketplacedeployment (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-marketplaceentitlementservice (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-marketplacemetering (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mediaconnect (1.65.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mediaconvert (1.134.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-medialive (1.128.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mediapackage (1.76.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackagev2 (1.22.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediapackagevod (1.58.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-mediastore (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mediastoredata (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mediatailor (1.84.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-medicalimaging (1.15.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-memorydb (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mgn (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhub (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-migrationhubconfig (1.40.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-migrationhuborchestrator (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubrefactorspaces (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-migrationhubstrategyrecommendations (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-mq (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mturk (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-mwaa (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptune (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-neptunedata (1.14.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-neptunegraph (1.15.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-networkfirewall (1.48.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-networkmanager (1.48.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-networkmonitor (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-nimblestudio (1.34.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-oam (1.20.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-omics (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-opensearchserverless (1.22.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-opensearchservice (1.50.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-opsworks (1.61.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-opsworkscm (1.71.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-organizations (1.95.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-osis (1.20.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-outposts (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-panorama (1.29.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-paymentcryptography (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-paymentcryptographydata (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pcaconnectorad (1.10.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-pcaconnectorscep (1.3.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-personalize (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-personalizeevents (1.49.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-personalizeruntime (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pi (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pinpoint (1.95.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pinpointemail (1.54.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pinpointsmsvoice (1.50.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-pinpointsmsvoicev2 (1.21.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pipes (1.24.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-polly (1.90.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-pricing (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-privatenetworks (1.20.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-prometheusservice (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-proton (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-qapps (1.0.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-qbusiness (1.11.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-qconnect (1.14.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-qldb (1.45.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-qldbsession (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-quicksight (1.121.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ram (1.60.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-rds (1.241.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-rdsdataservice (1.57.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-recyclebin (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-redshift (1.119.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-redshiftdataapiservice (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-redshiftserverless (1.33.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-rekognition (1.102.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-repostspace (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-resiliencehub (1.33.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-resourceexplorer2 (1.22.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-resourcegroups (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-resourcegroupstaggingapi (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-resources (3.201.0) + aws-sdk-inspector (1.43.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-inspector2 (1.6.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot (1.94.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot1clickdevicesservice (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iot1clickprojects (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotanalytics (1.49.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotdataplane (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotdeviceadvisor (1.15.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotevents (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ioteventsdata (1.27.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotfleethub (1.11.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotfleetwise (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotjobsdataplane (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotsecuretunneling (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotsitewise (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotthingsgraph (1.24.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iottwinmaker (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-iotwireless (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ivs (1.23.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ivschat (1.4.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kafka (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kafkaconnect (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kendra (1.59.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-keyspaces (1.2.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesis (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisanalytics (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisanalyticsv2 (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisvideo (1.42.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisvideoarchivedmedia (1.44.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisvideomedia (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kinesisvideosignalingchannels (1.19.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-kms (1.58.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lakeformation (1.27.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lambda (1.85.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lambdapreview (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lex (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lexmodelbuildingservice (1.57.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lexmodelsv2 (1.28.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lexruntimev2 (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-licensemanager (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-licensemanagerusersubscriptions (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lightsail (1.69.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-locationservice (1.24.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lookoutequipment (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lookoutforvision (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-lookoutmetrics (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-machinelearning (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-macie (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-macie2 (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mainframemodernization (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedblockchain (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-managedgrafana (1.8.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplacecatalog (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplacecommerceanalytics (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplaceentitlementservice (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-marketplacemetering (1.44.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediaconnect (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediaconvert (1.93.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-medialive (1.90.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackage (1.56.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediapackagevod (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediastore (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediastoredata (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mediatailor (1.55.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-memorydb (1.8.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mgn (1.14.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhub (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubconfig (1.20.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhuborchestrator (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubrefactorspaces (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-migrationhubstrategyrecommendations (1.4.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mobile (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mq (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mturk (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-mwaa (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-neptune (1.46.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-networkfirewall (1.19.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-networkmanager (1.25.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-nimblestudio (1.15.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-opensearchservice (1.11.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-opsworks (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-opsworkscm (1.52.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-organizations (1.70.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-outposts (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-panorama (1.9.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-personalize (1.43.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-personalizeevents (1.27.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-personalizeruntime (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pi (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpoint (1.68.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpointemail (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpointsmsvoice (1.32.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pinpointsmsvoicev2 (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-polly (1.58.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-pricing (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-privatenetworks (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-prometheusservice (1.15.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-proton (1.17.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-qldb (1.25.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-qldbsession (1.22.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-quicksight (1.69.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ram (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-rds (1.156.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-rdsdataservice (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-recyclebin (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-redshift (1.85.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-redshiftdataapiservice (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-redshiftserverless (1.3.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-rekognition (1.70.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-resiliencehub (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-resourcegroups (1.45.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-resourcegroupstaggingapi (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-resources (3.143.0) aws-sdk-accessanalyzer (~> 1) aws-sdk-account (~> 1) aws-sdk-acm (~> 1) aws-sdk-acmpca (~> 1) + aws-sdk-alexaforbusiness (~> 1) aws-sdk-amplify (~> 1) aws-sdk-amplifybackend (~> 1) aws-sdk-amplifyuibuilder (~> 1) @@ -1101,60 +950,44 @@ GEM aws-sdk-apigatewayv2 (~> 1) aws-sdk-appconfig (~> 1) aws-sdk-appconfigdata (~> 1) - aws-sdk-appfabric (~> 1) aws-sdk-appflow (~> 1) aws-sdk-appintegrationsservice (~> 1) aws-sdk-applicationautoscaling (~> 1) aws-sdk-applicationcostprofiler (~> 1) aws-sdk-applicationdiscoveryservice (~> 1) aws-sdk-applicationinsights (~> 1) - aws-sdk-applicationsignals (~> 1) aws-sdk-appmesh (~> 1) aws-sdk-appregistry (~> 1) aws-sdk-apprunner (~> 1) aws-sdk-appstream (~> 1) aws-sdk-appsync (~> 1) - aws-sdk-apptest (~> 1) - aws-sdk-arczonalshift (~> 1) - aws-sdk-artifact (~> 1) aws-sdk-athena (~> 1) aws-sdk-auditmanager (~> 1) aws-sdk-augmentedairuntime (~> 1) aws-sdk-autoscaling (~> 1) aws-sdk-autoscalingplans (~> 1) - aws-sdk-b2bi (~> 1) aws-sdk-backup (~> 1) aws-sdk-backupgateway (~> 1) + aws-sdk-backupstorage (~> 1) aws-sdk-batch (~> 1) - aws-sdk-bcmdataexports (~> 1) - aws-sdk-bedrock (~> 1) - aws-sdk-bedrockagent (~> 1) - aws-sdk-bedrockagentruntime (~> 1) - aws-sdk-bedrockruntime (~> 1) aws-sdk-billingconductor (~> 1) aws-sdk-braket (~> 1) aws-sdk-budgets (~> 1) - aws-sdk-chatbot (~> 1) aws-sdk-chime (~> 1) aws-sdk-chimesdkidentity (~> 1) aws-sdk-chimesdkmediapipelines (~> 1) aws-sdk-chimesdkmeetings (~> 1) aws-sdk-chimesdkmessaging (~> 1) - aws-sdk-chimesdkvoice (~> 1) - aws-sdk-cleanrooms (~> 1) - aws-sdk-cleanroomsml (~> 1) aws-sdk-cloud9 (~> 1) aws-sdk-cloudcontrolapi (~> 1) aws-sdk-clouddirectory (~> 1) aws-sdk-cloudformation (~> 1) aws-sdk-cloudfront (~> 1) - aws-sdk-cloudfrontkeyvaluestore (~> 1) aws-sdk-cloudhsm (~> 1) aws-sdk-cloudhsmv2 (~> 1) aws-sdk-cloudsearch (~> 1) aws-sdk-cloudsearchdomain (~> 1) aws-sdk-cloudtrail (~> 1) - aws-sdk-cloudtraildata (~> 1) aws-sdk-cloudwatch (~> 1) aws-sdk-cloudwatchevents (~> 1) aws-sdk-cloudwatchevidently (~> 1) @@ -1162,14 +995,12 @@ GEM aws-sdk-cloudwatchrum (~> 1) aws-sdk-codeartifact (~> 1) aws-sdk-codebuild (~> 1) - aws-sdk-codecatalyst (~> 1) aws-sdk-codecommit (~> 1) - aws-sdk-codeconnections (~> 1) aws-sdk-codedeploy (~> 1) aws-sdk-codeguruprofiler (~> 1) aws-sdk-codegurureviewer (~> 1) - aws-sdk-codegurusecurity (~> 1) aws-sdk-codepipeline (~> 1) + aws-sdk-codestar (~> 1) aws-sdk-codestarconnections (~> 1) aws-sdk-codestarnotifications (~> 1) aws-sdk-cognitoidentity (~> 1) @@ -1185,19 +1016,15 @@ GEM aws-sdk-connectcontactlens (~> 1) aws-sdk-connectparticipant (~> 1) aws-sdk-connectwisdomservice (~> 1) - aws-sdk-controlcatalog (~> 1) aws-sdk-controltower (~> 1) aws-sdk-costandusagereportservice (~> 1) aws-sdk-costexplorer (~> 1) - aws-sdk-costoptimizationhub (~> 1) aws-sdk-customerprofiles (~> 1) aws-sdk-databasemigrationservice (~> 1) aws-sdk-dataexchange (~> 1) aws-sdk-datapipeline (~> 1) aws-sdk-datasync (~> 1) - aws-sdk-datazone (~> 1) aws-sdk-dax (~> 1) - aws-sdk-deadline (~> 1) aws-sdk-detective (~> 1) aws-sdk-devicefarm (~> 1) aws-sdk-devopsguru (~> 1) @@ -1205,7 +1032,6 @@ GEM aws-sdk-directoryservice (~> 1) aws-sdk-dlm (~> 1) aws-sdk-docdb (~> 1) - aws-sdk-docdbelastic (~> 1) aws-sdk-drs (~> 1) aws-sdk-dynamodb (~> 1) aws-sdk-dynamodbstreams (~> 1) @@ -1217,7 +1043,6 @@ GEM aws-sdk-ecs (~> 1) aws-sdk-efs (~> 1) aws-sdk-eks (~> 1) - aws-sdk-eksauth (~> 1) aws-sdk-elasticache (~> 1) aws-sdk-elasticbeanstalk (~> 1) aws-sdk-elasticinference (~> 1) @@ -1228,7 +1053,6 @@ GEM aws-sdk-emr (~> 1) aws-sdk-emrcontainers (~> 1) aws-sdk-emrserverless (~> 1) - aws-sdk-entityresolution (~> 1) aws-sdk-eventbridge (~> 1) aws-sdk-finspace (~> 1) aws-sdk-finspacedata (~> 1) @@ -1238,9 +1062,9 @@ GEM aws-sdk-forecastqueryservice (~> 1) aws-sdk-forecastservice (~> 1) aws-sdk-frauddetector (~> 1) - aws-sdk-freetier (~> 1) aws-sdk-fsx (~> 1) aws-sdk-gamelift (~> 1) + aws-sdk-gamesparks (~> 1) aws-sdk-glacier (~> 1) aws-sdk-globalaccelerator (~> 1) aws-sdk-glue (~> 1) @@ -1251,14 +1075,13 @@ GEM aws-sdk-guardduty (~> 1) aws-sdk-health (~> 1) aws-sdk-healthlake (~> 1) + aws-sdk-honeycode (~> 1) aws-sdk-iam (~> 1) aws-sdk-identitystore (~> 1) aws-sdk-imagebuilder (~> 1) aws-sdk-importexport (~> 1) aws-sdk-inspector (~> 1) aws-sdk-inspector2 (~> 1) - aws-sdk-inspectorscan (~> 1) - aws-sdk-internetmonitor (~> 1) aws-sdk-iot (~> 1) aws-sdk-iot1clickdevicesservice (~> 1) aws-sdk-iot1clickprojects (~> 1) @@ -1277,11 +1100,9 @@ GEM aws-sdk-iotwireless (~> 1) aws-sdk-ivs (~> 1) aws-sdk-ivschat (~> 1) - aws-sdk-ivsrealtime (~> 1) aws-sdk-kafka (~> 1) aws-sdk-kafkaconnect (~> 1) aws-sdk-kendra (~> 1) - aws-sdk-kendraranking (~> 1) aws-sdk-keyspaces (~> 1) aws-sdk-kinesis (~> 1) aws-sdk-kinesisanalytics (~> 1) @@ -1290,18 +1111,15 @@ GEM aws-sdk-kinesisvideoarchivedmedia (~> 1) aws-sdk-kinesisvideomedia (~> 1) aws-sdk-kinesisvideosignalingchannels (~> 1) - aws-sdk-kinesisvideowebrtcstorage (~> 1) aws-sdk-kms (~> 1) aws-sdk-lakeformation (~> 1) aws-sdk-lambda (~> 1) aws-sdk-lambdapreview (~> 1) - aws-sdk-launchwizard (~> 1) aws-sdk-lex (~> 1) aws-sdk-lexmodelbuildingservice (~> 1) aws-sdk-lexmodelsv2 (~> 1) aws-sdk-lexruntimev2 (~> 1) aws-sdk-licensemanager (~> 1) - aws-sdk-licensemanagerlinuxsubscriptions (~> 1) aws-sdk-licensemanagerusersubscriptions (~> 1) aws-sdk-lightsail (~> 1) aws-sdk-locationservice (~> 1) @@ -1309,28 +1127,23 @@ GEM aws-sdk-lookoutforvision (~> 1) aws-sdk-lookoutmetrics (~> 1) aws-sdk-machinelearning (~> 1) + aws-sdk-macie (~> 1) aws-sdk-macie2 (~> 1) - aws-sdk-mailmanager (~> 1) aws-sdk-mainframemodernization (~> 1) aws-sdk-managedblockchain (~> 1) - aws-sdk-managedblockchainquery (~> 1) aws-sdk-managedgrafana (~> 1) - aws-sdk-marketplaceagreement (~> 1) aws-sdk-marketplacecatalog (~> 1) aws-sdk-marketplacecommerceanalytics (~> 1) - aws-sdk-marketplacedeployment (~> 1) aws-sdk-marketplaceentitlementservice (~> 1) aws-sdk-marketplacemetering (~> 1) aws-sdk-mediaconnect (~> 1) aws-sdk-mediaconvert (~> 1) aws-sdk-medialive (~> 1) aws-sdk-mediapackage (~> 1) - aws-sdk-mediapackagev2 (~> 1) aws-sdk-mediapackagevod (~> 1) aws-sdk-mediastore (~> 1) aws-sdk-mediastoredata (~> 1) aws-sdk-mediatailor (~> 1) - aws-sdk-medicalimaging (~> 1) aws-sdk-memorydb (~> 1) aws-sdk-mgn (~> 1) aws-sdk-migrationhub (~> 1) @@ -1338,30 +1151,20 @@ GEM aws-sdk-migrationhuborchestrator (~> 1) aws-sdk-migrationhubrefactorspaces (~> 1) aws-sdk-migrationhubstrategyrecommendations (~> 1) + aws-sdk-mobile (~> 1) aws-sdk-mq (~> 1) aws-sdk-mturk (~> 1) aws-sdk-mwaa (~> 1) aws-sdk-neptune (~> 1) - aws-sdk-neptunedata (~> 1) - aws-sdk-neptunegraph (~> 1) aws-sdk-networkfirewall (~> 1) aws-sdk-networkmanager (~> 1) - aws-sdk-networkmonitor (~> 1) aws-sdk-nimblestudio (~> 1) - aws-sdk-oam (~> 1) - aws-sdk-omics (~> 1) - aws-sdk-opensearchserverless (~> 1) aws-sdk-opensearchservice (~> 1) aws-sdk-opsworks (~> 1) aws-sdk-opsworkscm (~> 1) aws-sdk-organizations (~> 1) - aws-sdk-osis (~> 1) aws-sdk-outposts (~> 1) aws-sdk-panorama (~> 1) - aws-sdk-paymentcryptography (~> 1) - aws-sdk-paymentcryptographydata (~> 1) - aws-sdk-pcaconnectorad (~> 1) - aws-sdk-pcaconnectorscep (~> 1) aws-sdk-personalize (~> 1) aws-sdk-personalizeevents (~> 1) aws-sdk-personalizeruntime (~> 1) @@ -1370,15 +1173,11 @@ GEM aws-sdk-pinpointemail (~> 1) aws-sdk-pinpointsmsvoice (~> 1) aws-sdk-pinpointsmsvoicev2 (~> 1) - aws-sdk-pipes (~> 1) aws-sdk-polly (~> 1) aws-sdk-pricing (~> 1) aws-sdk-privatenetworks (~> 1) aws-sdk-prometheusservice (~> 1) aws-sdk-proton (~> 1) - aws-sdk-qapps (~> 1) - aws-sdk-qbusiness (~> 1) - aws-sdk-qconnect (~> 1) aws-sdk-qldb (~> 1) aws-sdk-qldbsession (~> 1) aws-sdk-quicksight (~> 1) @@ -1390,16 +1189,13 @@ GEM aws-sdk-redshiftdataapiservice (~> 1) aws-sdk-redshiftserverless (~> 1) aws-sdk-rekognition (~> 1) - aws-sdk-repostspace (~> 1) aws-sdk-resiliencehub (~> 1) - aws-sdk-resourceexplorer2 (~> 1) aws-sdk-resourcegroups (~> 1) aws-sdk-resourcegroupstaggingapi (~> 1) aws-sdk-robomaker (~> 1) aws-sdk-rolesanywhere (~> 1) aws-sdk-route53 (~> 1) aws-sdk-route53domains (~> 1) - aws-sdk-route53profiles (~> 1) aws-sdk-route53recoverycluster (~> 1) aws-sdk-route53recoverycontrolconfig (~> 1) aws-sdk-route53recoveryreadiness (~> 1) @@ -1410,15 +1206,11 @@ GEM aws-sdk-sagemaker (~> 1) aws-sdk-sagemakeredgemanager (~> 1) aws-sdk-sagemakerfeaturestoreruntime (~> 1) - aws-sdk-sagemakergeospatial (~> 1) - aws-sdk-sagemakermetrics (~> 1) aws-sdk-sagemakerruntime (~> 1) aws-sdk-savingsplans (~> 1) - aws-sdk-scheduler (~> 1) aws-sdk-schemas (~> 1) aws-sdk-secretsmanager (~> 1) aws-sdk-securityhub (~> 1) - aws-sdk-securitylake (~> 1) aws-sdk-serverlessapplicationrepository (~> 1) aws-sdk-servicecatalog (~> 1) aws-sdk-servicediscovery (~> 1) @@ -1428,7 +1220,6 @@ GEM aws-sdk-shield (~> 1) aws-sdk-signer (~> 1) aws-sdk-simpledb (~> 1) - aws-sdk-simspaceweaver (~> 1) aws-sdk-sms (~> 1) aws-sdk-snowball (~> 1) aws-sdk-snowdevicemanagement (~> 1) @@ -1437,30 +1228,21 @@ GEM aws-sdk-ssm (~> 1) aws-sdk-ssmcontacts (~> 1) aws-sdk-ssmincidents (~> 1) - aws-sdk-ssmquicksetup (~> 1) - aws-sdk-ssmsap (~> 1) aws-sdk-ssoadmin (~> 1) aws-sdk-states (~> 1) aws-sdk-storagegateway (~> 1) - aws-sdk-supplychain (~> 1) aws-sdk-support (~> 1) aws-sdk-supportapp (~> 1) aws-sdk-swf (~> 1) aws-sdk-synthetics (~> 1) - aws-sdk-taxsettings (~> 1) aws-sdk-textract (~> 1) - aws-sdk-timestreaminfluxdb (~> 1) aws-sdk-timestreamquery (~> 1) aws-sdk-timestreamwrite (~> 1) - aws-sdk-tnb (~> 1) aws-sdk-transcribeservice (~> 1) aws-sdk-transcribestreamingservice (~> 1) aws-sdk-transfer (~> 1) aws-sdk-translate (~> 1) - aws-sdk-trustedadvisor (~> 1) - aws-sdk-verifiedpermissions (~> 1) aws-sdk-voiceid (~> 1) - aws-sdk-vpclattice (~> 1) aws-sdk-waf (~> 1) aws-sdk-wafregional (~> 1) aws-sdk-wafv2 (~> 1) @@ -1470,286 +1252,233 @@ GEM aws-sdk-workmail (~> 1) aws-sdk-workmailmessageflow (~> 1) aws-sdk-workspaces (~> 1) - aws-sdk-workspacesthinclient (~> 1) aws-sdk-workspacesweb (~> 1) aws-sdk-xray (~> 1) - aws-sdk-robomaker (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-rolesanywhere (1.23.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-route53 (1.96.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-route53domains (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-route53profiles (1.7.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoverycluster (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-route53recoverycontrolconfig (1.30.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53recoveryreadiness (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-route53resolver (1.64.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.159.0) - aws-sdk-core (~> 3, >= 3.201.0) + aws-sdk-robomaker (1.51.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-rolesanywhere (1.0.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53 (1.65.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53domains (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoverycluster (1.11.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoverycontrolconfig (1.10.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53recoveryreadiness (1.10.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-route53resolver (1.37.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.116.0) + aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.5) - aws-sdk-s3control (1.87.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-s3outposts (1.35.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sagemaker (1.257.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sagemakeredgemanager (1.31.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sagemakerfeaturestoreruntime (1.36.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sagemakergeospatial (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-sagemakermetrics (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sagemakerruntime (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-savingsplans (1.46.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-scheduler (1.19.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-schemas (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-secretsmanager (1.102.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-securityhub (1.114.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-securitylake (1.24.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-serverlessapplicationrepository (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-servicecatalog (1.99.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-servicediscovery (1.69.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-servicequotas (1.42.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ses (1.69.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sesv2 (1.56.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-shield (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-signer (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-simpledb (1.51.0) - aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.4) + aws-sdk-s3control (1.53.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3outposts (1.13.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemaker (1.147.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemakeredgemanager (1.12.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemakerfeaturestoreruntime (1.12.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sagemakerruntime (1.43.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-savingsplans (1.26.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-schemas (1.23.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-secretsmanager (1.66.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-securityhub (1.69.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-serverlessapplicationrepository (1.43.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-servicecatalog (1.72.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-servicediscovery (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-servicequotas (1.23.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ses (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sesv2 (1.28.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-shield (1.49.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-signer (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-simpledb (1.35.0) + aws-sdk-core (~> 3, >= 3.127.0) aws-sigv2 (~> 1.0) - aws-sdk-simspaceweaver (1.20.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-sms (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-snowball (1.73.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-snowdevicemanagement (1.25.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-sns (1.82.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-sqs (1.80.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ssm (1.175.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ssmcontacts (1.34.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ssmincidents (1.39.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-ssmquicksetup (1.0.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ssmsap (1.24.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-ssoadmin (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-states (1.73.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-storagegateway (1.91.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-supplychain (1.8.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-support (1.64.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-supportapp (1.20.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-swf (1.59.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-synthetics (1.47.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-taxsettings (1.5.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-textract (1.63.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-timestreaminfluxdb (1.6.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-timestreamquery (1.38.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-timestreamwrite (1.34.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-tnb (1.18.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-transcribeservice (1.103.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-transcribestreamingservice (1.64.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-transfer (1.98.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-translate (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-trustedadvisor (1.10.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-verifiedpermissions (1.28.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-voiceid (1.29.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-vpclattice (1.17.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-waf (1.66.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-wafregional (1.68.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-wafv2 (1.88.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-wellarchitected (1.41.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workdocs (1.62.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-worklink (1.52.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workmail (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workmailmessageflow (1.40.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workspaces (1.112.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workspacesthinclient (1.11.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) - aws-sdk-workspacesweb (1.26.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.1) - aws-sdk-xray (1.70.0) - aws-sdk-core (~> 3, >= 3.201.0) - aws-sigv4 (~> 1.5) + aws-sdk-sms (1.40.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-snowball (1.50.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-snowdevicemanagement (1.7.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sns (1.55.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-sqs (1.51.1) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssm (1.142.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssmcontacts (1.14.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssmincidents (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-ssoadmin (1.20.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-states (1.48.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-storagegateway (1.68.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-support (1.41.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-supportapp (1.1.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-swf (1.36.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-synthetics (1.28.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-textract (1.38.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-timestreamquery (1.16.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-timestreamwrite (1.14.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-transcribeservice (1.76.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-transcribestreamingservice (1.42.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-transfer (1.60.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-translate (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-voiceid (1.9.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-waf (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-wafregional (1.48.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-wafv2 (1.42.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-wellarchitected (1.17.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-workdocs (1.39.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-worklink (1.33.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-workmail (1.51.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-workmailmessageflow (1.21.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-workspaces (1.73.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-workspacesweb (1.5.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) + aws-sdk-xray (1.47.0) + aws-sdk-core (~> 3, >= 3.127.0) + aws-sigv4 (~> 1.1) aws-sigv2 (1.2.0) - aws-sigv4 (1.9.1) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) backport (1.2.0) base64 (0.2.0) - benchmark-ips (2.13.0) - bigdecimal (3.1.8) - bootsnap (1.18.4) - msgpack (~> 1.2) + benchmark-ips (2.7.2) + bootsnap (1.7.5) + msgpack (~> 1.0) bourbon (4.2.7) sass (~> 3.4) thor (~> 0.19) - brakeman (5.4.1) + brakeman (4.7.1) browser (5.3.1) - builder (3.3.0) - bullet (7.2.0) + builder (3.2.4) + bullet (6.0.1) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) - bummr (1.1.0) + bummr (0.5.0) rainbow thor - bundler-audit (0.7.0.1) + bundler-audit (0.6.1) bundler (>= 1.2.0, < 3) - thor (>= 0.18, < 2) + thor (~> 0.18) business_time (0.9.3) activesupport (>= 3.2.0) tzinfo byebug (11.1.3) - capybara (3.39.2) + capybara (3.28.0) addressable - matrix mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) - regexp_parser (>= 1.5, < 3.0) + regexp_parser (~> 1.5) xpath (~> 3.2) - capybara-screenshot (1.0.26) + capybara-screenshot (1.0.23) capybara (>= 1.0, < 4) launchy - childprocess (5.1.0) - logger (~> 1.5) choice (0.2.0) claide (1.1.0) claide-plugins (0.9.2) @@ -1759,17 +1488,19 @@ GEM cliver (0.3.2) coderay (1.1.3) colored2 (3.1.2) - concurrent-ruby (1.3.4) - connection_pool (2.4.1) + colorize (0.8.1) + concurrent-ruby (1.2.2) + connection_pool (2.2.3) cork (0.3.0) colored2 (~> 3.1) - countries (5.7.2) - unaccent (~> 0.3) - crack (1.0.0) - bigdecimal - rexml + countries (3.0.1) + i18n_data (~> 0.10.0) + sixarm_ruby_unaccent (~> 1.1) + unicode_utils (~> 1.4) + crack (0.4.3) + safe_yaml (~> 1.0.0) crass (1.0.6) - d3-rails (7.8.5) + d3-rails (7.0.0) railties (>= 3.1) danger (6.2.2) claide (~> 1.0) @@ -1788,84 +1519,85 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date (3.3.4) - dead_end (4.0.0) + date (3.3.3) debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) - debase-ruby_core_source (3.3.1) - derailed_benchmarks (2.1.2) + debase-ruby_core_source (0.10.14) + derailed_benchmarks (1.3.6) benchmark-ips (~> 2) - dead_end get_process_mem (~> 0) heapy (~> 0) - memory_profiler (>= 0, < 2) - mini_histogram (>= 0.3.0) + memory_profiler (~> 0) rack (>= 1) - rack-test - rake (> 10, < 14) - ruby-statistics (>= 2.1) - thor (>= 0.19, < 2) - diff-lcs (1.5.1) - dotenv (2.8.1) - dotenv-rails (2.8.1) - dotenv (= 2.8.1) - railties (>= 3.2) - dry-configurable (1.0.1) - dry-core (~> 1.0, < 2) - zeitwerk (~> 2.6) - dry-core (1.0.0) + rake (> 10, < 13) + thor (~> 0.19) + diff-lcs (1.3) + dotenv (2.7.5) + dotenv-rails (2.7.5) + dotenv (= 2.7.5) + railties (>= 3.2, < 6.1) + dry-configurable (0.11.5) + concurrent-ruby (~> 1.0) + dry-core (~> 0.4, >= 0.4.7) + dry-equalizer (~> 0.2) + dry-container (0.7.2) concurrent-ruby (~> 1.0) - zeitwerk (~> 2.6) - dry-inflector (1.1.0) - dry-initializer (3.1.1) - dry-logic (1.5.0) + dry-configurable (~> 0.1, >= 0.1.3) + dry-core (0.4.9) concurrent-ruby (~> 1.0) - dry-core (~> 1.0, < 2) - zeitwerk (~> 2.6) - dry-schema (1.13.4) + dry-equalizer (0.3.0) + dry-inflector (0.2.0) + dry-initializer (3.0.3) + dry-logic (1.0.6) concurrent-ruby (~> 1.0) - dry-configurable (~> 1.0, >= 1.0.1) - dry-core (~> 1.0, < 2) + dry-core (~> 0.2) + dry-equalizer (~> 0.2) + dry-schema (1.5.1) + concurrent-ruby (~> 1.0) + dry-configurable (~> 0.8, >= 0.8.3) + dry-core (~> 0.4) + dry-equalizer (~> 0.2) dry-initializer (~> 3.0) - dry-logic (>= 1.4, < 2) - dry-types (>= 1.7, < 2) - zeitwerk (~> 2.6) - dry-types (1.7.1) + dry-logic (~> 1.0) + dry-types (~> 1.4) + dry-types (1.4.0) concurrent-ruby (~> 1.0) - dry-core (~> 1.0) - dry-inflector (~> 1.0) - dry-logic (~> 1.4) - zeitwerk (~> 2.6) - ecma-re-validator (0.4.0) - regexp_parser (~> 2.2) - erubi (1.13.0) - execjs (2.9.1) + dry-container (~> 0.3) + dry-core (~> 0.4, >= 0.4.4) + dry-equalizer (~> 0.3) + dry-inflector (~> 0.1, >= 0.1.2) + dry-logic (~> 1.0, >= 1.0.2) + ecma-re-validator (0.2.1) + regexp_parser (~> 1.2) + erubi (1.12.0) + execjs (2.7.0) factory_bot (5.2.0) activesupport (>= 4.2.0) factory_bot_rails (5.2.0) factory_bot (~> 5.2.0) railties (>= 4.2.0) - faker (3.4.2) - i18n (>= 1.8.11, < 2) - faraday (0.17.6) + faker (2.15.1) + i18n (>= 1.6, < 2) + faraday (0.15.4) multipart-post (>= 1.2, < 3) - faraday-http-cache (2.5.1) + faraday-http-cache (2.4.1) faraday (>= 0.8) faraday-multipart (1.0.4) multipart-post (~> 2) - faraday_middleware (0.14.0) + faraday_middleware (0.13.1) faraday (>= 0.7.4, < 1.0) fast_jsonapi (1.5) activesupport (>= 4.2) - fasterer (0.11.0) - ruby_parser (>= 3.19.1) - ffi (1.17.0-x86_64-darwin) - foreman (0.88.1) - formatador (1.1.0) + fasterer (0.6.0) + colorize (~> 0.7) + ruby_parser (>= 3.13.0) + ffi (1.16.3) + foreman (0.87.2) + formatador (0.2.5) fuzzy_match (2.1.0) - get_process_mem (0.2.7) + get_process_mem (0.2.4) ffi (~> 1.0) - git (1.19.1) + git (1.13.2) addressable (~> 2.8) rchardet (~> 1.8) globalid (1.1.0) @@ -1878,13 +1610,13 @@ GEM faraday faraday_middleware mime-types - guard (2.18.1) + guard (2.14.2) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) nenv (~> 0.1) notiffany (~> 0.0) - pry (>= 0.13.0) + pry (>= 0.9.12) shellany (~> 0.0) thor (>= 0.18.1) guard-compat (1.2.1) @@ -1892,97 +1624,91 @@ GEM guard (~> 2.1) guard-compat (~> 1.1) rspec (>= 2.99.0, < 4.0) - gyoku (1.4.0) + gyoku (1.3.1) builder (>= 2.1.2) - rexml (~> 3.0) - hana (1.3.7) - hashdiff (1.1.1) - heapy (0.2.0) - thor + hana (1.3.6) + hashdiff (1.0.0) + heapy (0.1.4) holidays (6.6.1) httpclient (2.8.3) - httpi (2.5.0) + httpi (2.4.4) rack socksify - i18n (1.14.5) + i18n (1.14.1) concurrent-ruby (~> 1.0) - icalendar (2.10.2) + i18n_data (0.10.0) + icalendar (2.6.1) ice_cube (~> 0.16) - ice_cube (0.17.0) + ice_cube (0.16.3) immigrant (0.3.6) activerecord (>= 3.0) - jaro_winkler (1.6.0) - jmespath (1.6.2) - jquery-rails (4.6.0) + jaro_winkler (1.5.6) + jmespath (1.3.1) + jquery-rails (4.5.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json-schema (4.3.1) + json-schema (4.3.0) addressable (>= 2.8) - json_schemer (0.2.25) - ecma-re-validator (~> 0.3) + json_schemer (0.2.16) + ecma-re-validator (~> 0.2) hana (~> 1.3) - regexp_parser (~> 2.0) - simpleidn (~> 0.2) + regexp_parser (~> 1.5) uri_template (~> 0.7) - kaminari (1.2.2) + kaminari (1.2.1) activesupport (>= 4.1.0) - kaminari-actionview (= 1.2.2) - kaminari-activerecord (= 1.2.2) - kaminari-core (= 1.2.2) - kaminari-actionview (1.2.2) + kaminari-actionview (= 1.2.1) + kaminari-activerecord (= 1.2.1) + kaminari-core (= 1.2.1) + kaminari-actionview (1.2.1) actionview - kaminari-core (= 1.2.2) - kaminari-activerecord (1.2.2) + kaminari-core (= 1.2.1) + kaminari-activerecord (1.2.1) activerecord - kaminari-core (= 1.2.2) - kaminari-core (1.2.2) - knapsack_pro (3.11.0) + kaminari-core (= 1.2.1) + kaminari-core (1.2.1) + knapsack_pro (3.9.0) rake kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - launchy (3.0.1) - addressable (~> 2.8) - childprocess (~> 5.0) - listen (3.9.0) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - logger (1.6.0) + launchy (2.4.3) + addressable (~> 2.3) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) logstasher (2.1.5) activesupport (>= 5.2) request_store - loofah (2.22.0) + loofah (2.21.3) crass (~> 1.0.2) nokogiri (>= 1.12.0) - lumberjack (1.2.10) + lumberjack (1.0.13) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.4) + marcel (1.0.2) maruku (0.7.3) - matrix (0.4.2) - memory_profiler (1.0.2) - meta_request (0.8.2) + memory_profiler (0.9.14) + meta_request (0.7.2) rack-contrib (>= 1.1, < 3) - railties (>= 3.0.0, < 8) - method_source (1.1.0) - mime-types (3.5.2) + railties (>= 3.0.0, < 7) + method_source (1.0.0) + mime-types (3.3) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0820) - mini_histogram (0.3.1) - mini_mime (1.1.5) - mini_portile2 (2.8.7) - minitest (5.25.1) - moment_timezone-rails (0.5.14) - momentjs-rails (~> 2.15.1) - momentjs-rails (2.15.1) + mime-types-data (3.2019.1009) + mini_mime (1.1.2) + mini_portile2 (2.8.5) + minitest (5.19.0) + moment_timezone-rails (0.5.0) + momentjs-rails (2.29.4.1) railties (>= 3.1) - msgpack (1.7.2) - multipart-post (2.4.1) + msgpack (1.4.2) + multipart-post (2.1.1) multiverse (0.2.2) activerecord (>= 4.2) activesupport (>= 4.2) @@ -1991,21 +1717,22 @@ GEM neat (4.0.0) thor (~> 0.19) nenv (0.3.0) - net-imap (0.4.14) + net-imap (0.3.7) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.2) + net-protocol (0.2.1) timeout - net-smtp (0.5.0) + net-smtp (0.3.3) net-protocol - nio4r (2.7.3) + nio4r (2.5.9) no_proxy_fix (0.1.2) - nokogiri (1.15.6-x86_64-darwin) + nokogiri (1.15.5) + mini_portile2 (~> 2.8.2) racc (~> 1.4) nori (2.6.0) - notiffany (0.1.3) + notiffany (0.1.1) nenv (~> 0.1) shellany (~> 0.0) octokit (4.22.0) @@ -2098,35 +1825,32 @@ GEM paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) - parallel (1.26.3) - paranoia (2.6.4) - activerecord (>= 5.1, < 7.2) + parallel (1.23.0) + paranoia (2.4.2) + activerecord (>= 4.0, < 6.1) parser (2.7.2.0) ast (~> 2.4.1) - pdf-forms (1.5.1) + pdf-forms (1.2.0) cliver (~> 0.3.2) - rexml (~> 3.2, >= 3.2.6) safe_shell (>= 1.0.3, < 2.0) - pdfkit (0.8.7.3) - pg (1.5.7) + pdfkit (0.8.7.2) + pg (1.1.4) pluck_to_hash (1.0.2) activerecord (>= 4.0.2) activesupport (>= 4.0.2) pry (0.13.1) coderay (~> 1.1) method_source (~> 1.0) - pry-byebug (3.10.1) + pry-byebug (3.9.0) byebug (~> 11.0) - pry (>= 0.13, < 0.15) - public_suffix (5.1.1) + pry (~> 0.13.0) + public_suffix (4.0.6) puma (5.6.4) nio4r (~> 2.0) - racc (1.8.1) + racc (1.7.3) rack (2.2.6.4) - rack-contrib (2.5.0) - rack (< 4) - rack-session (1.0.2) - rack (< 3) + rack-contrib (2.1.0) + rack (~> 2.0) rack-test (2.1.0) rack (>= 1.3) rails (6.0.6.1) @@ -2144,11 +1868,11 @@ GEM bundler (>= 1.3.0) railties (= 6.0.6.1) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.2.0) + rails-dom-testing (2.1.1) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-erd (1.7.2) + rails-erd (1.6.0) activerecord (>= 4.2) activesupport (>= 4.2) choice (~> 0.2.0) @@ -2163,9 +1887,9 @@ GEM rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rainbow (3.1.1) - rake (13.2.1) + rake (12.3.3) rb-fsevent (0.11.2) - rb-inotify (0.11.1) + rb-inotify (0.10.1) ffi (~> 1.0) rb-readline (0.5.5) rchardet (1.8.0) @@ -2175,80 +1899,76 @@ GEM execjs (~> 2.5) rails (>= 3.2) rainbow (~> 3.0) - redis (5.3.0) - redis-client (>= 0.22.0) - redis-actionpack (5.4.0) - actionpack (>= 5, < 8) - redis-rack (>= 2.1.0, < 4) + redis (4.0.1) + redis-actionpack (5.1.0) + actionpack (>= 4.0, < 7) + redis-rack (>= 1, < 3) redis-store (>= 1.1.0, < 2) redis-activesupport (5.3.0) activesupport (>= 3, < 8) redis-store (>= 1.3, < 2) redis-classy (2.4.1) redis-namespace (~> 1.0) - redis-client (0.22.2) - connection_pool redis-mutex (4.0.2) redis-classy (~> 2.0) redis-namespace (1.11.0) redis (>= 4) - redis-rack (3.0.0) - rack-session (>= 0.2.0) + redis-rack (2.0.4) + rack (>= 1.5, < 3) redis-store (>= 1.2, < 2) redis-rails (5.0.2) redis-actionpack (>= 5.0, < 6) redis-activesupport (>= 5.0, < 6) redis-store (>= 1.2, < 2) - redis-store (1.11.0) - redis (>= 4, < 6) - regexp_parser (2.9.2) - request_store (1.7.0) + redis-store (1.4.1) + redis (>= 2.2, < 5) + regexp_parser (1.6.0) + request_store (1.4.1) rack (>= 1.4) reverse_markdown (1.4.0) nokogiri - rexml (3.3.6) - strscan - roo (2.10.1) + rexml (3.2.6) + roo (2.8.2) nokogiri (~> 1) - rubyzip (>= 1.3.0, < 3.0.0) - 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.2) + rubyzip (>= 1.2.1, < 2.0.0) + rspec (3.9.0) + rspec-core (~> 3.9.0) + rspec-expectations (~> 3.9.0) + rspec-mocks (~> 3.9.0) + rspec-core (3.9.1) + rspec-support (~> 3.9.1) + rspec-expectations (3.9.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.13.0) + rspec-support (~> 3.9.0) rspec-github (2.4.0) rspec-core (~> 3.0) - rspec-mocks (3.13.1) + rspec-mocks (3.9.1) diff-lcs (>= 1.2.0, < 2.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.9.0) + rspec-rails (4.0.0) + actionpack (>= 4.2) + activesupport (>= 4.2) + railties (>= 4.2) + rspec-core (~> 3.9) + rspec-expectations (~> 3.9) + rspec-mocks (~> 3.9) + rspec-support (~> 3.9) rspec-retry (0.6.2) rspec-core (> 3.3) - rspec-support (3.13.1) - rspec_junit_formatter (0.6.0) + rspec-support (3.9.2) + rspec_junit_formatter (0.4.1) rspec-core (>= 2, < 4, != 2.12.0) - rswag-api (2.14.0) - activesupport (>= 5.2, < 8.0) - railties (>= 5.2, < 8.0) - rswag-specs (2.14.0) - activesupport (>= 5.2, < 8.0) + rswag-api (2.13.0) + activesupport (>= 3.1, < 7.2) + railties (>= 3.1, < 7.2) + rswag-specs (2.13.0) + activesupport (>= 3.1, < 7.2) json-schema (>= 2.2, < 5.0) - railties (>= 5.2, < 8.0) + railties (>= 3.1, < 7.2) rspec-core (>= 2.14) - rswag-ui (2.14.0) - actionpack (>= 5.2, < 8.0) - railties (>= 5.2, < 8.0) + rswag-ui (2.13.0) + actionpack (>= 3.1, < 7.2) + railties (>= 3.1, < 7.2) rubocop (0.83.0) parallel (~> 1.10) parser (>= 2.7.0.1) @@ -2256,27 +1976,26 @@ GEM rexml ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) - rubocop-performance (1.7.1) - rubocop (>= 0.82.0) - rubocop-rails (2.6.0) - activesupport (>= 4.2.0) + rubocop-performance (1.5.2) + rubocop (>= 0.71.0) + rubocop-rails (2.5.0) + activesupport rack (>= 1.1) - rubocop (>= 0.82.0) + rubocop (>= 0.72.0) ruby-debug-ide (0.7.3) rake (>= 0.8.1) - ruby-graphviz (1.2.5) - rexml - ruby-oci8 (2.2.14) + ruby-graphviz (1.2.4) + ruby-oci8 (2.2.7) ruby-plsql (0.8.0) - ruby-prof (1.6.3) + ruby-prof (1.4.1) ruby-progressbar (1.13.0) - ruby-statistics (3.0.2) ruby2_keywords (0.0.5) - ruby_parser (3.21.1) - racc (~> 1.5) + ruby_dep (1.5.0) + ruby_parser (3.20.3) sexp_processor (~> 4.16) - rubyzip (2.3.2) + rubyzip (1.3.0) safe_shell (1.1.0) + safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -2288,15 +2007,14 @@ GEM sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - savon (2.15.0) + savon (2.12.1) akami (~> 1.2) builder (>= 2.1.2) gyoku (~> 1.2) - httpi (>= 2.4.5, < 5) - mail (~> 2.5) + httpi (~> 2.3) nokogiri (>= 1.8.1) nori (~> 2.4) - wasabi (>= 3.7, < 6) + wasabi (~> 3.4) sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) @@ -2306,9 +2024,9 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) - sentry-raven (2.13.0) + sentry-raven (2.11.0) faraday (>= 0.7.6, < 1.0) - sexp_processor (4.17.2) + sexp_processor (4.17.0) shellany (0.0.1) shoryuken (3.1.11) aws-sdk-core (>= 2) @@ -2316,8 +2034,8 @@ GEM thor shoulda-matchers (5.3.0) activesupport (>= 5.2.0) - simpleidn (0.2.3) - single_cov (1.11.0) + single_cov (1.3.2) + sixarm_ruby_unaccent (1.2.0) socksify (1.7.1) solargraph (0.38.0) backport (~> 1.1) @@ -2331,8 +2049,7 @@ GEM thor (~> 0.19, >= 0.19.4) tilt (~> 2.0) yard (~> 0.9) - sprockets (3.7.3) - base64 + sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.4.2) @@ -2340,34 +2057,30 @@ GEM activesupport (>= 5.2) sprockets (>= 3.0.0) sql_tracker (1.3.2) - sqlite3 (1.7.3) - mini_portile2 (~> 2.8.0) - statsd-instrument (3.9.0) - stringex (2.8.6) - strong_migrations (1.8.0) - activerecord (>= 5.2) - strscan (3.1.0) + statsd-instrument (3.7.0) + stringex (2.8.5) + strong_migrations (0.4.1) + activerecord (>= 5) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - test-prof (1.4.0) + test-prof (0.10.1) thor (0.20.3) thread_safe (0.3.6) - tilt (2.4.0) - timecop (0.9.10) - timeout (0.4.1) + tilt (2.0.8) + timecop (0.9.1) + timeout (0.4.0) tty-tree (0.3.0) tzinfo (1.2.10) thread_safe (~> 0.1) - uglifier (4.2.0) + uglifier (4.1.20) execjs (>= 0.3.0, < 3) - unaccent (0.4.0) unicode-display_width (1.8.0) - uniform_notifier (1.16.0) + unicode_utils (1.4.0) + uniform_notifier (1.12.1) uri_template (0.7.0) - validates_email_format_of (1.8.2) - i18n (>= 0.8.0) - simpleidn - wasabi (3.7.0) + validates_email_format_of (1.6.3) + i18n + wasabi (3.6.1) addressable httpi (~> 2.0) nokogiri (>= 1.4.2) @@ -2379,7 +2092,8 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - websocket (1.2.11) + webrick (1.7.0) + websocket (1.2.10) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -2394,13 +2108,13 @@ GEM nokogiri (~> 1.11) xpath (3.2.0) nokogiri (~> 1.8) - yard (0.9.36) - zeitwerk (2.6.17) - ziptz (4.0.2) - sqlite3 (~> 1.6) + yard (0.9.27) + webrick (~> 1.7.0) + zeitwerk (2.6.12) + ziptz (2.1.6) PLATFORMS - x86_64-darwin-22 + ruby DEPENDENCIES aasm (= 4.11.0) From 8dae0cab1a9283d2d1c2676982a97ff61b04189e Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 23 Aug 2024 10:30:29 -0400 Subject: [PATCH 13/46] Adding rake to gemfile --- Gemfile | 1 + Gemfile.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index 06e32da836b..57b617a5247 100644 --- a/Gemfile +++ b/Gemfile @@ -53,6 +53,7 @@ gem "opentelemetry-instrumentation-net_http", require: false gem "opentelemetry-instrumentation-pg", require: false gem "opentelemetry-instrumentation-rack", require: false gem "opentelemetry-instrumentation-rails", require: false +gem "opentelemetry-instrumentation-rake", require: false gem "opentelemetry-instrumentation-redis", require: false gem "paper_trail", "~> 12.0" diff --git a/Gemfile.lock b/Gemfile.lock index 37c881111c0..9ae0abf1834 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1809,6 +1809,9 @@ GEM opentelemetry-instrumentation-active_record (~> 0.5.0) opentelemetry-instrumentation-active_support (~> 0.3.0) opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rake (0.1.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) opentelemetry-instrumentation-redis (0.24.1) opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.19.3) @@ -2179,6 +2182,7 @@ DEPENDENCIES opentelemetry-instrumentation-pg opentelemetry-instrumentation-rack opentelemetry-instrumentation-rails + opentelemetry-instrumentation-rake opentelemetry-instrumentation-redis opentelemetry-sdk paper_trail (~> 12.0) From 9c24ee07d17b9f87fda9c51272fc0db43023ce28 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Sat, 24 Aug 2024 15:00:06 -0400 Subject: [PATCH 14/46] Adding instruments --- config/initializers/open_telemetry.rb | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 2feed0840c7..248acbfb589 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -38,16 +38,17 @@ c.use 'OpenTelemetry::Instrumentation::Rails' # c.use 'OpenTelemetry::Instrumentation::ActionPack' - # c.use 'OpenTelemetry::Instrumentation::ActionView' - # c.use 'OpenTelemetry::Instrumentation::ActiveJob' - # c.use 'OpenTelemetry::Instrumentation::ActiveSupport' - # c.use 'OpenTelemetry::Instrumentation::AwsSdk' - # c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' - # c.use 'OpenTelemetry::Instrumentation::Faraday' - # c.use 'OpenTelemetry::Instrumentation::HttpClient' - # c.use 'OpenTelemetry::Instrumentation::Redis' - # c.use 'OpenTelemetry::Instrumentation::Net::HTTP' - # c.use 'OpenTelemetry::Instrumentation::PG' + + c.use 'OpenTelemetry::Instrumentation::ActionView' + c.use 'OpenTelemetry::Instrumentation::ActiveJob' + c.use 'OpenTelemetry::Instrumentation::ActiveSupport' + c.use 'OpenTelemetry::Instrumentation::AwsSdk' + c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' + c.use 'OpenTelemetry::Instrumentation::Faraday' + c.use 'OpenTelemetry::Instrumentation::HttpClient' + c.use 'OpenTelemetry::Instrumentation::Redis' + c.use 'OpenTelemetry::Instrumentation::Net::HTTP' + c.use 'OpenTelemetry::Instrumentation::PG' Rails.logger.info("Loaded instruments") From 0875c7b32ef7381288128af6fe6016be9e56c9e9 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 10:57:54 -0400 Subject: [PATCH 15/46] Comment out PG and ActiveSupport --- config/initializers/open_telemetry.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 248acbfb589..61cf7420750 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -38,17 +38,17 @@ c.use 'OpenTelemetry::Instrumentation::Rails' # c.use 'OpenTelemetry::Instrumentation::ActionPack' + # c.use 'OpenTelemetry::Instrumentation::ActiveSupport' + # c.use 'OpenTelemetry::Instrumentation::PG' c.use 'OpenTelemetry::Instrumentation::ActionView' c.use 'OpenTelemetry::Instrumentation::ActiveJob' - c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::AwsSdk' c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' c.use 'OpenTelemetry::Instrumentation::Faraday' c.use 'OpenTelemetry::Instrumentation::HttpClient' c.use 'OpenTelemetry::Instrumentation::Redis' c.use 'OpenTelemetry::Instrumentation::Net::HTTP' - c.use 'OpenTelemetry::Instrumentation::PG' Rails.logger.info("Loaded instruments") From 0f56e9b295d0a1239817dfe4f31f262b37ad453f Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 11:01:32 -0400 Subject: [PATCH 16/46] Suppress AWS logs --- config/initializers/open_telemetry.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 61cf7420750..2e5dab52399 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -43,7 +43,7 @@ c.use 'OpenTelemetry::Instrumentation::ActionView' c.use 'OpenTelemetry::Instrumentation::ActiveJob' - c.use 'OpenTelemetry::Instrumentation::AwsSdk' + c.use 'OpenTelemetry::Instrumentation::AwsSdk', { suppress_internal_instrumentation: true } c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' c.use 'OpenTelemetry::Instrumentation::Faraday' c.use 'OpenTelemetry::Instrumentation::HttpClient' From 97cecb7fd834fa5d5ac554822fd981138f355dc4 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 11:51:20 -0400 Subject: [PATCH 17/46] Remove redis and turn on actionview --- config/initializers/open_telemetry.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 2e5dab52399..3667553e37e 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -37,17 +37,17 @@ c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } c.use 'OpenTelemetry::Instrumentation::Rails' - # c.use 'OpenTelemetry::Instrumentation::ActionPack' - # c.use 'OpenTelemetry::Instrumentation::ActiveSupport' # c.use 'OpenTelemetry::Instrumentation::PG' + # c.use 'OpenTelemetry::Instrumentation::Redis' + c.use 'OpenTelemetry::Instrumentation::ActionPack' c.use 'OpenTelemetry::Instrumentation::ActionView' + c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::ActiveJob' c.use 'OpenTelemetry::Instrumentation::AwsSdk', { suppress_internal_instrumentation: true } c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' c.use 'OpenTelemetry::Instrumentation::Faraday' c.use 'OpenTelemetry::Instrumentation::HttpClient' - c.use 'OpenTelemetry::Instrumentation::Redis' c.use 'OpenTelemetry::Instrumentation::Net::HTTP' Rails.logger.info("Loaded instruments") From 39031d9edb9bbb5bfaa43225d0e5771105a8644c Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 11:52:07 -0400 Subject: [PATCH 18/46] Turn actionview off --- config/initializers/open_telemetry.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 3667553e37e..a721cb067ec 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -37,11 +37,11 @@ c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } c.use 'OpenTelemetry::Instrumentation::Rails' + # c.use 'OpenTelemetry::Instrumentation::ActionPack' + # c.use 'OpenTelemetry::Instrumentation::ActionView' # c.use 'OpenTelemetry::Instrumentation::PG' # c.use 'OpenTelemetry::Instrumentation::Redis' - c.use 'OpenTelemetry::Instrumentation::ActionPack' - c.use 'OpenTelemetry::Instrumentation::ActionView' c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::ActiveJob' c.use 'OpenTelemetry::Instrumentation::AwsSdk', { suppress_internal_instrumentation: true } From f165d45a94de26f7c86a48ac91bb21be7045ccfc Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 12:41:48 -0400 Subject: [PATCH 19/46] Add Redis instrumentation back --- config/initializers/open_telemetry.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index a721cb067ec..0ef575f8c39 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -38,9 +38,8 @@ c.use 'OpenTelemetry::Instrumentation::Rails' # c.use 'OpenTelemetry::Instrumentation::ActionPack' - # c.use 'OpenTelemetry::Instrumentation::ActionView' # c.use 'OpenTelemetry::Instrumentation::PG' - # c.use 'OpenTelemetry::Instrumentation::Redis' + # c.use 'OpenTelemetry::Instrumentation::ActionView' c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::ActiveJob' @@ -49,6 +48,7 @@ c.use 'OpenTelemetry::Instrumentation::Faraday' c.use 'OpenTelemetry::Instrumentation::HttpClient' c.use 'OpenTelemetry::Instrumentation::Net::HTTP' + c.use 'OpenTelemetry::Instrumentation::Redis' Rails.logger.info("Loaded instruments") From efa14f266b5e1f4ac76601aac2a6dc47471a67d8 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 12:45:47 -0400 Subject: [PATCH 20/46] Turn ActionPack back on --- config/initializers/open_telemetry.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 0ef575f8c39..9857047fe74 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -37,10 +37,10 @@ c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } c.use 'OpenTelemetry::Instrumentation::Rails' - # c.use 'OpenTelemetry::Instrumentation::ActionPack' # c.use 'OpenTelemetry::Instrumentation::PG' # c.use 'OpenTelemetry::Instrumentation::ActionView' + c.use 'OpenTelemetry::Instrumentation::ActionPack' c.use 'OpenTelemetry::Instrumentation::ActiveSupport' c.use 'OpenTelemetry::Instrumentation::ActiveJob' c.use 'OpenTelemetry::Instrumentation::AwsSdk', { suppress_internal_instrumentation: true } From 9a582f4d9878350ba3e2ceb34c2f14d1e7479685 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Mon, 26 Aug 2024 12:46:55 -0400 Subject: [PATCH 21/46] Disable Redis --- config/initializers/open_telemetry.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 9857047fe74..17a0ac3991f 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -39,6 +39,7 @@ # c.use 'OpenTelemetry::Instrumentation::PG' # c.use 'OpenTelemetry::Instrumentation::ActionView' + # c.use 'OpenTelemetry::Instrumentation::Redis' c.use 'OpenTelemetry::Instrumentation::ActionPack' c.use 'OpenTelemetry::Instrumentation::ActiveSupport' @@ -48,7 +49,6 @@ c.use 'OpenTelemetry::Instrumentation::Faraday' c.use 'OpenTelemetry::Instrumentation::HttpClient' c.use 'OpenTelemetry::Instrumentation::Net::HTTP' - c.use 'OpenTelemetry::Instrumentation::Redis' Rails.logger.info("Loaded instruments") From 3ffb2dc2b1368588f3a56b0f3b86c7ef8d14244e Mon Sep 17 00:00:00 2001 From: alex-guanipatin Date: Tue, 27 Aug 2024 11:33:58 -0400 Subject: [PATCH 22/46] Remove mentions of Datadog --- app/jobs/caseflow_job.rb | 1 - app/jobs/update_cached_appeals_attributes_job.rb | 3 --- app/jobs/virtual_hearings/create_conference_job.rb | 6 +++--- app/models/metric.rb | 1 - app/services/collectors/stats_collector.rb | 6 +++--- app/services/metrics_service.rb | 1 - config/initializers/vacols_request_spy.rb | 2 -- spec/services/metrics_service_spec.rb | 2 +- 8 files changed, 7 insertions(+), 15 deletions(-) diff --git a/app/jobs/caseflow_job.rb b/app/jobs/caseflow_job.rb index b9717f403b0..c03e375a05c 100644 --- a/app/jobs/caseflow_job.rb +++ b/app/jobs/caseflow_job.rb @@ -7,7 +7,6 @@ class CaseflowJob < ApplicationJob job.start_time = Time.zone.now end - # Automatically report runtime to DataDog if job does not explicitly report to DataDog. # Note: This block is not called if an error occurs when `perform` is executed -- # see https://stackoverflow.com/questions/50263787/does-active-job-call-after-perform-when-perform-raises-an-error after_perform do |job| diff --git a/app/jobs/update_cached_appeals_attributes_job.rb b/app/jobs/update_cached_appeals_attributes_job.rb index 3bf31ad2eff..ad78ee9e564 100644 --- a/app/jobs/update_cached_appeals_attributes_job.rb +++ b/app/jobs/update_cached_appeals_attributes_job.rb @@ -124,9 +124,6 @@ def log_error(start_time, err) # We do not log every job failure since we expect the job to occasionally fail when we lose # database connections. Since this job runs regularly, we will continue to cache appeals and we # have set up alerts to notify us if we have cached too few appeals over the past day: - # * (Too little Postgres data cached) https://app.datadoghq.com/monitors/41421962 - # * (Too little VACOLS data cached) https://app.datadoghq.com/monitors/41234223 - # * (Job has not succeeded in the past day) https://app.datadoghq.com/monitors/41423568 record_error_in_metrics_service metrics_service_report_runtime(metric_group_name: METRIC_GROUP_NAME) diff --git a/app/jobs/virtual_hearings/create_conference_job.rb b/app/jobs/virtual_hearings/create_conference_job.rb index e88973d77c0..0c390164315 100644 --- a/app/jobs/virtual_hearings/create_conference_job.rb +++ b/app/jobs/virtual_hearings/create_conference_job.rb @@ -123,7 +123,7 @@ def log_virtual_hearing_state(virtual_hearing) Rails.logger.info("Establishment Updated At: (#{virtual_hearing.establishment.updated_at})") end - def create_conference_datadog_tags + def create_conference_tags custom_metric_info.merge(attrs: { hearing_id: virtual_hearing.hearing_id }) end @@ -149,12 +149,12 @@ def create_conference virtual_hearing.establishment.update_error!(error_display) - MetricsService.increment_counter(metric_name: "created_conference.failed", **create_conference_datadog_tags) + MetricsService.increment_counter(metric_name: "created_conference.failed", **create_conference_tags) fail pexip_response.error end - MetricsService.increment_counter(metric_name: "created_conference.successful", **create_conference_datadog_tags) + MetricsService.increment_counter(metric_name: "created_conference.successful", **create_conference_tags) virtual_hearing.update(conference_id: pexip_response.data[:conference_id]) end diff --git a/app/models/metric.rb b/app/models/metric.rb index 3e3f515bfa2..ecdf62164b4 100644 --- a/app/models/metric.rb +++ b/app/models/metric.rb @@ -7,7 +7,6 @@ class Metric < CaseflowRecord METRIC_TYPES = { error: "error", log: "log", performance: "performance", info: "info" }.freeze LOG_SYSTEMS = { dynatrace: "dynatrace", - datadog: "datadog", rails_console: "rails_console", javascript_console: "javascript_console" }.freeze diff --git a/app/services/collectors/stats_collector.rb b/app/services/collectors/stats_collector.rb index 5eebb3a2ad5..f3148196c5c 100644 --- a/app/services/collectors/stats_collector.rb +++ b/app/services/collectors/stats_collector.rb @@ -11,7 +11,7 @@ def flatten_stats(metric_name_prefix, stats_hash) stats_hash.each do |metric_name, counts_hash| unless valid_metric_name?(metric_name) fail "Invalid metric name #{metric_name}; "\ - "see https://docs.datadoghq.com/developers/metrics/#naming-custom-metrics" + "see https://docs.dynatrace.com/docs/extend-dynatrace/extend-metrics/reference/custom-metric-metadata" end stats.concat add_tags_to_group_counts(metric_name_prefix, metric_name, counts_hash) @@ -29,7 +29,7 @@ def add_tags_to_group_counts(prefix, metric_name, group_counts) end end - # See valid tag name rules at https://docs.datadoghq.com/tagging/#defining-tags + # See valid tag name rules at https://docs.dynatrace.com/docs/manage/tags-and-metadata/setup/how-to-define-tags def to_valid_tag(name) name.gsub(/[^a-zA-Z_\-\:\.\d\/]/, "__") end @@ -41,7 +41,7 @@ def to_valid_tag_key(name) end def valid_metric_name?(metric_name) - # Actual limit is 200 but since the actual metric name in DataDog has + # Actual limit is 200 but since the actual metric name has # "dsva_appeals.stats_collector_job." prepended, let's just stick with a 150 character limit. return false if metric_name.length > 150 diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb index fbdbb2a87ee..c8d1135d671 100644 --- a/app/services/metrics_service.rb +++ b/app/services/metrics_service.rb @@ -93,7 +93,6 @@ def self.record(description, service: nil, name: "unknown", caller: nil) } MetricsService.emit_gauge(sent_to_info) - sent_to << Metric::LOG_SYSTEMS[:datadog] sent_to << Metric::LOG_SYSTEMS[:dynatrace] end diff --git a/config/initializers/vacols_request_spy.rb b/config/initializers/vacols_request_spy.rb index 939f77dac4b..d79b92df7d6 100644 --- a/config/initializers/vacols_request_spy.rb +++ b/config/initializers/vacols_request_spy.rb @@ -32,8 +32,6 @@ def simulate_vacols_latency # $> REACT_ON_RAILS_ENV=HOT SIMULATE_VACOLS_LATENCY=true bundle exec rails s -p 3000 return unless ENV["SIMULATE_VACOLS_LATENCY"] - # Default determined from metrics sent to Datadog: - # https://app.datadoghq.com/dashboard/54w-efy-r5d/va-systems?fullscreen_widget=399796003 latency = ENV["VACOLS_DELAY_MS"] || 80 sleep(latency / 1000.0) end diff --git a/spec/services/metrics_service_spec.rb b/spec/services/metrics_service_spec.rb index 9b349e84ebe..da2df30db23 100644 --- a/spec/services/metrics_service_spec.rb +++ b/spec/services/metrics_service_spec.rb @@ -63,7 +63,7 @@ service: service, endpoint: name }, - sent_to: [["rails_console"], "datadog", "dynatrace"], + sent_to: [["rails_console"], "dynatrace"], sent_to_info: { metric_group: "service", metric_name: "request_latency", From 2115400fea2b445c9539e283a6d5b25cf75c5917 Mon Sep 17 00:00:00 2001 From: alex-guanipatin Date: Thu, 29 Aug 2024 09:46:29 -0400 Subject: [PATCH 23/46] Removed extra mentions of Datadog --- Dockerfile | 4 ---- docker-bin/build.sh | 3 --- docker-bin/startup.sh | 6 ------ 3 files changed, 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index 16d641ac7ce..a774e7e8943 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,10 +66,6 @@ RUN apt install -y ${CASEFLOW} && \ # install jemalloc RUN apt install -y --no-install-recommends libjemalloc-dev - -# install datadog agent -RUN DD_INSTALL_ONLY=true DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=$(cat config/datadog.key) bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)" - RUN rm -rf /var/lib/apt/lists/* # Installing the version of bundler that corresponds to the Gemfile.lock diff --git a/docker-bin/build.sh b/docker-bin/build.sh index 797ebaff5ab..435d00482d5 100755 --- a/docker-bin/build.sh +++ b/docker-bin/build.sh @@ -41,8 +41,6 @@ fi cd ../../ printf "commit: `git rev-parse HEAD`\ndate: `git log -1 --format=%cd`" > config/build_version.yml -credstash -t appeals-credstash get datadog.api.key > config/datadog.key - cp /etc/ssl/certs/ca-certificates.crt docker-bin/ca-certs/cacert.pem # Build Docker @@ -50,7 +48,6 @@ echo -e "\tCreating Caseflow App Docker Image" docker build -t caseflow . result=$? echo -e "\tCleaning Up..." -rm -rf config/datadog.key rm -rf docker-bin/oracle_libs if [ $result == 0 ]; then echo -e "\tBuilding Caseflow Docker App: Completed" diff --git a/docker-bin/startup.sh b/docker-bin/startup.sh index 97a73eeae4e..5a62bfce5c5 100644 --- a/docker-bin/startup.sh +++ b/docker-bin/startup.sh @@ -8,12 +8,6 @@ source $THIS_SCRIPT_DIR/env.sh echo "Start DBus" dbus-daemon --system -echo "Start Datadog" -nohup /opt/datadog-agent/bin/agent/agent run -p /opt/datadog-agent/run/agent.pid > dd-agent.out & -nohup /opt/datadog-agent/embedded/bin/trace-agent --config /etc/datadog-agent/datadog.yaml --pid /opt/datadog-agent/run/trace-agent.pid > dd-trace.out & -nohup /opt/datadog-agent/embedded/bin/system-probe --config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/system-probe.pid > dd-probe.out & -nohup /opt/datadog-agent/embedded/bin/process-agent --config=/etc/datadog-agent/datadog.yaml --sysprobe-config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/process-agent.pid > dd-system-probe.out & - echo "Waiting for dependencies to properly start up - 240 seconds" date sleep 240 From b4b7753545f59ae8dce747c6850c86936b08f4a4 Mon Sep 17 00:00:00 2001 From: Andrew Hadley Date: Thu, 29 Aug 2024 12:23:45 -0400 Subject: [PATCH 24/46] removed newrelic references and yml file --- README.md | 7 ---- app/views/layouts/_head.html.erb | 1 - app/views/layouts/_head_new_relic.html.erb | 13 ------ newrelic.yml | 49 ---------------------- 4 files changed, 70 deletions(-) delete mode 100644 app/views/layouts/_head_new_relic.html.erb delete mode 100644 newrelic.yml diff --git a/README.md b/README.md index a9f82e9f92d..281703aa1e2 100644 --- a/README.md +++ b/README.md @@ -137,13 +137,6 @@ See debugging steps as well as more information about FACOLS in our [wiki](https Review the [FACOLS documentation](docs/FACOLS.md) for details. ## Monitoring ####################################################### -We use NewRelic to monitor the app. By default, it's disabled locally. To enable it, do: - -``` -NEW_RELIC_LICENSE_KEY='' NEW_RELIC_AGENT_ENABLED=true bundle exec foreman start -``` - -You may wish to do this if you are debugging our NewRelic integration, for instance. --- diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index e4ff3f7ebcc..cd70a9523b1 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -12,7 +12,6 @@ <%= render "layouts/head_sentry" %> diff --git a/app/views/layouts/_head_new_relic.html.erb b/app/views/layouts/_head_new_relic.html.erb deleted file mode 100644 index 067774b1547..00000000000 --- a/app/views/layouts/_head_new_relic.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - // To avoid sending PII to New Relic, we will disable its error logging functionality. - // In anecdotal testing, the error logging functionality didn't even seem to work - // particularly well. - // - // We wrap this in a conditional because newrelic will not be defined when browser - // monitoring is not enabled. This will occur in local development when the - // NEW_RELIC_AGENT_ENABLED env var is not set, for instance. - if (window.newrelic) { - window.newrelic.setErrorHandler(function() { - return true; - }); - } diff --git a/newrelic.yml b/newrelic.yml deleted file mode 100644 index c074e6089ed..00000000000 --- a/newrelic.yml +++ /dev/null @@ -1,49 +0,0 @@ -# -# Generated November 03, 2017 -# -# For full documentation of agent configuration options, please refer to -# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration -common: &default_settings - app_name: Caseflow - - # Logging level for log/newrelic_agent.log - log_level: info - - # Exception messages may have PII, so we won't send them. - # If we are sure that certain exceptions will not have PII, then we can whitelist them in this config file. - strip_exception_messages.enabled: true - - # To avoid sending PII, we explicitly deny all headers and parameters. We then whitelist known safe attributes. - attributes.exclude: [response.headers.*, request.headers.*, request.parameters.*] - attributes.include: [ - response.headers.contentType, - response.headers.contentLength, - request.headers.userAgent, - request.headers.accept, - request.headers.host, - request.headers.contentType, - ] - -# Environment-specific settings are in this section. -# RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment. -# If your application has other named environments, configure them here. -development: - <<: *default_settings - app_name: Caseflow (Local Dev) - agent_enabled: false - -demo: - <<: *default_settings - app_name: Caseflow (Demo) - -test: - <<: *default_settings - # It doesn't make sense to report to New Relic from automated test runs. - monitor_mode: false - -staging: - <<: *default_settings - app_name: Caseflow (Staging) - -production: - <<: *default_settings From a0e92e223dbcffe618d75c8638366f519393d71d Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 13:53:38 -0400 Subject: [PATCH 25/46] Test updating workflow --- .github/workflows/workflow.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index c33f56c9b6a..f5d49e0b533 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -237,7 +237,9 @@ jobs: - name: Rename examples.txt if: success() || failure() - run: mv ./tmp/examples.txt ./tmp/examples-${{matrix.ci_node_index}}.txt + run: | + touch ./tmp/examples.txt + mv ./tmp/examples.txt ./tmp/examples-${{matrix.ci_node_index}}.txt - uses: actions/upload-artifact@v3 if: success() || failure() name: Upload tmp/examples.txt From c2278893a737ab7ed037b3b8aad18f0948e32f4a Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 14:06:12 -0400 Subject: [PATCH 26/46] Revert workflow change --- .github/workflows/workflow.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index f5d49e0b533..c33f56c9b6a 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -237,9 +237,7 @@ jobs: - name: Rename examples.txt if: success() || failure() - run: | - touch ./tmp/examples.txt - mv ./tmp/examples.txt ./tmp/examples-${{matrix.ci_node_index}}.txt + run: mv ./tmp/examples.txt ./tmp/examples-${{matrix.ci_node_index}}.txt - uses: actions/upload-artifact@v3 if: success() || failure() name: Upload tmp/examples.txt From ea78a3bcd03e265074e286bda26d1ee9a3212fcc Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 14:29:09 -0400 Subject: [PATCH 27/46] Adding simplecov back --- Gemfile | 2 +- Gemfile.lock | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 57b617a5247..f31caf065f4 100644 --- a/Gemfile +++ b/Gemfile @@ -140,7 +140,7 @@ group :test, :development, :demo do gem "rubocop-performance" gem "rubocop-rails" gem "scss_lint", require: false - # gem "simplecov", git: "https://github.com/colszowka/simplecov.git", require: false + gem "simplecov", require: false gem "single_cov" gem "sniffybara", git: "https://github.com/department-of-veterans-affairs/sniffybara.git" gem "sql_tracker" diff --git a/Gemfile.lock b/Gemfile.lock index 9ae0abf1834..0384e4b5889 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1532,6 +1532,7 @@ GEM rake (> 10, < 13) thor (~> 0.19) diff-lcs (1.3) + docile (1.4.0) dotenv (2.7.5) dotenv-rails (2.7.5) dotenv (= 2.7.5) @@ -2037,6 +2038,12 @@ GEM thor shoulda-matchers (5.3.0) activesupport (>= 5.2.0) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov_json_formatter (0.1.4) single_cov (1.3.2) sixarm_ruby_unaccent (1.2.0) socksify (1.7.1) @@ -2227,6 +2234,7 @@ DEPENDENCIES sentry-raven shoryuken (= 3.1.11) shoulda-matchers + simplecov single_cov sniffybara! solargraph From 2911c86a28967687bd4e91262ca3cf1ccc956bbc Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 15:43:22 -0400 Subject: [PATCH 28/46] Fixing linting error --- app/services/metrics_service.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb index c8d1135d671..82fff42f6d9 100644 --- a/app/services/metrics_service.rb +++ b/app/services/metrics_service.rb @@ -5,9 +5,8 @@ # see https://dropwizard.github.io/metrics/3.1.0/getting-started/ for abstractions on metric types class MetricsService - # :reek:LongParameterList - def self.increment_counter(metric_group:, metric_name:, app_name:, attrs: {}, by: 1) + def self.increment_counter(metric_group:, metric_name:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) From efff3a723c4d23b9dfed25a48cef29088b8cc3d5 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 22:54:46 -0400 Subject: [PATCH 29/46] Removing by: attribute after removing keyword in metric service --- .../virtual_hearings/delete_conferences_job.rb | 4 ++-- .../delete_conferences_job_spec.rb | 18 ++++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/app/jobs/virtual_hearings/delete_conferences_job.rb b/app/jobs/virtual_hearings/delete_conferences_job.rb index fcc77df526f..9f713c64cf5 100644 --- a/app/jobs/virtual_hearings/delete_conferences_job.rb +++ b/app/jobs/virtual_hearings/delete_conferences_job.rb @@ -117,13 +117,13 @@ def count_deleted_and_log(enumerable) if removed > 0 MetricsService.increment_counter( - metric_name: "deleted_conferences.successful", by: removed, ** custom_metric_info + metric_name: "deleted_conferences.successful", ** custom_metric_info ) end if failed > 0 MetricsService.increment_counter( - metric_name: "deleted_conferences.failed", by: failed, ** custom_metric_info + metric_name: "deleted_conferences.failed", ** custom_metric_info ) end end diff --git a/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb b/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb index 527fda1e772..55bf82f74b1 100644 --- a/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb +++ b/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb @@ -188,8 +188,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -213,8 +212,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -241,8 +239,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -270,8 +267,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -295,16 +291,14 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) From d9f80b7f9ae299f667e664d7911f1f2385b08fc5 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Thu, 29 Aug 2024 23:25:01 -0400 Subject: [PATCH 30/46] Adding simplecov lcov gem and updating workflow --- .github/workflows/workflow.yml | 6 ++++++ Gemfile | 1 + Gemfile.lock | 2 ++ spec/spec_helper.rb | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index c33f56c9b6a..e5a5c406c63 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -221,6 +221,12 @@ jobs: # --tty forces Rspec to produce color # circleci is the USER + - name: Add code coverage comment + uses: romeovs/lcov-reporter-action@v0.2.16 + with: + lcov-file: ./coverage/lcov/ruby-simplecov.lcov + github-token: ${{ secrets.GITHUB_TOKEN }} + # Artifacts --- circleci is the USER - run: (cd /home/circleci && tar -zcvf coverage-${{matrix.ci_node_index}}.tar.gz coverage-${{matrix.ci_node_index}}) - uses: actions/upload-artifact@v3 diff --git a/Gemfile b/Gemfile index f31caf065f4..351f2d03457 100644 --- a/Gemfile +++ b/Gemfile @@ -141,6 +141,7 @@ group :test, :development, :demo do gem "rubocop-rails" gem "scss_lint", require: false gem "simplecov", require: false + gem "simplecov-lcov", require: false gem "single_cov" gem "sniffybara", git: "https://github.com/department-of-veterans-affairs/sniffybara.git" gem "sql_tracker" diff --git a/Gemfile.lock b/Gemfile.lock index 0384e4b5889..9930164e7b1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2043,6 +2043,7 @@ GEM simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) simplecov-html (0.12.3) + simplecov-lcov (0.8.0) simplecov_json_formatter (0.1.4) single_cov (1.3.2) sixarm_ruby_unaccent (1.2.0) @@ -2235,6 +2236,7 @@ DEPENDENCIES shoryuken (= 3.1.11) shoulda-matchers simplecov + simplecov-lcov single_cov sniffybara! solargraph diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9d3821aa06f..2fc46a20d8d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,6 +9,10 @@ else # default is aggregate via simplecov for CI require "simplecov" + require 'simplecov-lcov' + SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true + SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter + SimpleCov.start end if ENV["CI"] require "rspec/retry" From 56fc8ddb3b39174158f2b344046f9bc04e9a7500 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 30 Aug 2024 00:16:31 -0400 Subject: [PATCH 31/46] Update workflow --- .github/workflows/workflow.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index e5a5c406c63..fe42c1956dc 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -221,12 +221,6 @@ jobs: # --tty forces Rspec to produce color # circleci is the USER - - name: Add code coverage comment - uses: romeovs/lcov-reporter-action@v0.2.16 - with: - lcov-file: ./coverage/lcov/ruby-simplecov.lcov - github-token: ${{ secrets.GITHUB_TOKEN }} - # Artifacts --- circleci is the USER - run: (cd /home/circleci && tar -zcvf coverage-${{matrix.ci_node_index}}.tar.gz coverage-${{matrix.ci_node_index}}) - uses: actions/upload-artifact@v3 @@ -234,6 +228,12 @@ jobs: with: path: /home/circleci/coverage-${{matrix.ci_node_index}}.tar.gz #circleci is the USER + - name: Add code coverage comment + uses: romeovs/lcov-reporter-action@v0.2.16 + with: + lcov-file: ./coverage/lcov/caseflow.lcov + github-token: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/upload-artifact@v3 # Run even if there is a failure in the previous steps, but not if the run is cancelled if: success() || failure() From 25df424fc39ff23229567f9066b78891da6a400c Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 30 Aug 2024 00:24:40 -0400 Subject: [PATCH 32/46] Updating simplecov --- .github/workflows/workflow.yml | 4 ++++ spec/spec_helper.rb | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index fe42c1956dc..2fc8ba42c70 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -234,6 +234,10 @@ jobs: lcov-file: ./coverage/lcov/caseflow.lcov github-token: ${{ secrets.GITHUB_TOKEN }} + - uses: joshmfrankel/simplecov-check-action@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/upload-artifact@v3 # Run even if there is a failure in the previous steps, but not if the run is cancelled if: success() || failure() diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2fc46a20d8d..0c7d03e0515 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,10 +9,18 @@ else # default is aggregate via simplecov for CI require "simplecov" - require 'simplecov-lcov' + require "simplecov-lcov" SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter - SimpleCov.start + + SimpleCov.start do + add_filter "lib/fakes" + add_filter "config/initializers" + add_filter "spec/support" + add_filter "app/jobs" + + SimpleCov.minimum_coverage_by_file 75 + end end if ENV["CI"] require "rspec/retry" From 609f3ac99d2583c8d50768cf132f4b85916dc6a5 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 30 Aug 2024 07:57:15 -0400 Subject: [PATCH 33/46] Revert simple cov --- .github/workflows/workflow.yml | 10 ---------- spec/spec_helper.rb | 12 ------------ 2 files changed, 22 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 2fc8ba42c70..c33f56c9b6a 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -228,16 +228,6 @@ jobs: with: path: /home/circleci/coverage-${{matrix.ci_node_index}}.tar.gz #circleci is the USER - - name: Add code coverage comment - uses: romeovs/lcov-reporter-action@v0.2.16 - with: - lcov-file: ./coverage/lcov/caseflow.lcov - github-token: ${{ secrets.GITHUB_TOKEN }} - - - uses: joshmfrankel/simplecov-check-action@main - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/upload-artifact@v3 # Run even if there is a failure in the previous steps, but not if the run is cancelled if: success() || failure() diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 0c7d03e0515..9d3821aa06f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,18 +9,6 @@ else # default is aggregate via simplecov for CI require "simplecov" - require "simplecov-lcov" - SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true - SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter - - SimpleCov.start do - add_filter "lib/fakes" - add_filter "config/initializers" - add_filter "spec/support" - add_filter "app/jobs" - - SimpleCov.minimum_coverage_by_file 75 - end end if ENV["CI"] require "rspec/retry" From 06f1852c6753b67931ddf4233804f3c691cce46e Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Fri, 30 Aug 2024 08:32:38 -0400 Subject: [PATCH 34/46] Adding featureenvy skip for reek --- config/initializers/rack_context.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config/initializers/rack_context.rb b/config/initializers/rack_context.rb index 3ac359d4c56..974951fd6ed 100644 --- a/config/initializers/rack_context.rb +++ b/config/initializers/rack_context.rb @@ -1,4 +1,6 @@ class RackContextGetter < OpenTelemetry::Context::Propagation::RackEnvGetter + + # :reek:FeatureEnvy def get(carrier, key) carrier[to_rack_key(key)] || carrier[key] end From e1a23c2fc0fb2105b276126b1b76b273ad164e08 Mon Sep 17 00:00:00 2001 From: AimanK Date: Wed, 17 Jul 2024 11:21:42 -0400 Subject: [PATCH 35/46] Add restricted_statuses solution and initial RSpec test file --- .../work_queue/appeal_search_serializer.rb | 12 ++- .../appeal_search_serializer_spec.rb | 93 +++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 spec/models/serializers/work_queue/appeal_search_serializer_spec.rb diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index 90be5a6f498..39046b73ed0 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -4,6 +4,16 @@ class WorkQueue::AppealSearchSerializer include FastJsonapi::ObjectSerializer extend Helpers::AppealHearingHelper + restricted_statuses = + [ + :distributed_to_judge, + :ready_for_signature, + :on_hold, + :misc, + :unknown, + :assigned_to_attorney + ] + set_type :appeal attribute :contested_claim, &:contested_claim? @@ -73,7 +83,7 @@ class WorkQueue::AppealSearchSerializer attribute :veteran_appellant_deceased, &:veteran_appellant_deceased? attribute :assigned_to_location do |object, params| - if object&.status&.status == :distributed_to_judge + if restricted_statuses.include?(object&.status&.status) if params[:user]&.judge? || params[:user]&.attorney? || User.list_hearing_coordinators.include?(params[:user]) object.assigned_to_location end diff --git a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb new file mode 100644 index 00000000000..d0dbf10d193 --- /dev/null +++ b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe WorkQueue::AppealSearchSerializer, :all_dbs do + describe "#assigned_to_location" do + context "when appeal status is restricted" do + let(:appeal) { create(:appeal, :at_attorney_drafting) } + let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } + + before do + User.authenticate!(user: judge_user) + end + + subject { described_class.new(appeal, params: { user: judge_user }) } + + context "and user is a board judge" do + it "shows CSS ID" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + end + end + + context "when appeal status is restricted" do + let(:appeal) { create(:appeal, :at_attorney_drafting) } + let!(:attorney_user) { create(:user) } + let!(:vacols_atty) { create(:staff, :attorney_role, sdomainid: attorney_user.css_id) } + + before do + User.authenticate!(user: attorney_user) + end + + subject { described_class.new(appeal, params: { user: attorney_user }) } + + context "and user is a board attorney" do + it "shows CSS ID" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + end + end + end + + context "when appeal status is restricted" do + let(:appeal) { create(:appeal, :at_attorney_drafting) } + let!(:hearings_coordinator_user) do + coordinator = create(:hearings_coordinator) + HearingsManagement.singleton.add_user(coordinator) + coordinator + end + + before do + User.authenticate!(user: hearings_coordinator_user) + end + + subject { described_class.new(appeal, params: { user: hearings_coordinator_user }) } + + context "and user is a hearings coordinator" do + it "shows CSS ID" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + end + end + end + + context "when user is a vso representative" do + let(:appeal) { create(:appeal, :at_attorney_drafting) } + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + end + + context "when appeal status is not restricted" do + let(:appeal) { create(:appeal, :with_pre_docket_task) } + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "shows CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + end + end + end +end From 99b3f75fefc5421e4d3aaa81fe61737306ee3ca4 Mon Sep 17 00:00:00 2001 From: AimanK Date: Wed, 17 Jul 2024 11:26:32 -0400 Subject: [PATCH 36/46] Fix positioning of restricted_statuses array to under set_type --- app/models/serializers/work_queue/appeal_search_serializer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index 39046b73ed0..cbc0845f9f0 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -4,6 +4,8 @@ class WorkQueue::AppealSearchSerializer include FastJsonapi::ObjectSerializer extend Helpers::AppealHearingHelper + set_type :appeal + restricted_statuses = [ :distributed_to_judge, @@ -14,8 +16,6 @@ class WorkQueue::AppealSearchSerializer :assigned_to_attorney ] - set_type :appeal - attribute :contested_claim, &:contested_claim? attribute :mst, &:mst? From 1ae489543a78f5ad91059887a0d8e47262dd1444 Mon Sep 17 00:00:00 2001 From: AimanK Date: Wed, 17 Jul 2024 13:05:55 -0400 Subject: [PATCH 37/46] Make modification that only prevents non-board users from viewing the assigned_to_location CSS IDs --- app/models/serializers/work_queue/appeal_search_serializer.rb | 3 ++- .../serializers/work_queue/appeal_search_serializer_spec.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index cbc0845f9f0..a2602926381 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -84,9 +84,10 @@ class WorkQueue::AppealSearchSerializer attribute :assigned_to_location do |object, params| if restricted_statuses.include?(object&.status&.status) - if params[:user]&.judge? || params[:user]&.attorney? || User.list_hearing_coordinators.include?(params[:user]) + unless params[:user]&.non_board_employee? object.assigned_to_location end + # if not in a restricted status, show CSS ID to all users else object.assigned_to_location end diff --git a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb index d0dbf10d193..cfc4cb303da 100644 --- a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb +++ b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb @@ -5,7 +5,7 @@ describe WorkQueue::AppealSearchSerializer, :all_dbs do describe "#assigned_to_location" do context "when appeal status is restricted" do - let(:appeal) { create(:appeal, :at_attorney_drafting) } + let(:appeal) { create(:appeal, :assigned_to_judge) } let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } before do From 6b6b9ffe192b0d4ed3224902cf074f8fb85f1ee0 Mon Sep 17 00:00:00 2001 From: AimanK Date: Wed, 17 Jul 2024 13:26:01 -0400 Subject: [PATCH 38/46] Only prevent vso employees/Private attorneys from viewing CSS IDs in restricted status state --- .../work_queue/appeal_search_serializer.rb | 2 +- .../work_queue/appeal_search_serializer_spec.rb | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index a2602926381..cf304b16167 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -84,7 +84,7 @@ class WorkQueue::AppealSearchSerializer attribute :assigned_to_location do |object, params| if restricted_statuses.include?(object&.status&.status) - unless params[:user]&.non_board_employee? + unless params[:user]&.vso_employee? object.assigned_to_location end # if not in a restricted status, show CSS ID to all users diff --git a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb index cfc4cb303da..7e0a69eee1c 100644 --- a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb +++ b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb @@ -16,7 +16,8 @@ context "and user is a board judge" do it "shows CSS ID" do - expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]) + .to eq(appeal.assigned_to_location) end end @@ -33,7 +34,8 @@ context "and user is a board attorney" do it "shows CSS ID" do - expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]) + .to eq(appeal.assigned_to_location) end end end @@ -54,7 +56,8 @@ context "and user is a hearings coordinator" do it "shows CSS ID" do - expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]) + .to eq(appeal.assigned_to_location) end end end @@ -86,7 +89,8 @@ subject { described_class.new(appeal, params: { user: vso_user }) } it "shows CSS ID to VSO user" do - expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to eq(appeal.assigned_to_location) + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]) + .to eq(appeal.assigned_to_location) end end end From 814b88ce7402630a6c97fd4538550d8909b85226 Mon Sep 17 00:00:00 2001 From: AimanK Date: Wed, 17 Jul 2024 14:09:26 -0400 Subject: [PATCH 39/46] Refactor comment to better explain what is happening, and add proper staging to RSpec file --- .../serializers/work_queue/appeal_search_serializer.rb | 2 +- .../serializers/work_queue/appeal_search_serializer_spec.rb | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index cf304b16167..94b0d34c26f 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -87,7 +87,7 @@ class WorkQueue::AppealSearchSerializer unless params[:user]&.vso_employee? object.assigned_to_location end - # if not in a restricted status, show CSS ID to all users + # if not in a restricted status, show assigned location to all users else object.assigned_to_location end diff --git a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb index 7e0a69eee1c..a068534ce6c 100644 --- a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb +++ b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb @@ -5,8 +5,8 @@ describe WorkQueue::AppealSearchSerializer, :all_dbs do describe "#assigned_to_location" do context "when appeal status is restricted" do - let(:appeal) { create(:appeal, :assigned_to_judge) } let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } + let(:appeal) { create(:appeal, :assigned_to_judge, associated_judge: judge_user) } before do User.authenticate!(user: judge_user) @@ -41,7 +41,8 @@ end context "when appeal status is restricted" do - let(:appeal) { create(:appeal, :at_attorney_drafting) } + let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } + let(:appeal) { create(:appeal, :at_judge_review, associated_judge: judge_user) } let!(:hearings_coordinator_user) do coordinator = create(:hearings_coordinator) HearingsManagement.singleton.add_user(coordinator) From d5897086170ee7bdba983f2baa8fcb03a9cecd62 Mon Sep 17 00:00:00 2001 From: AimanK Date: Thu, 18 Jul 2024 14:57:42 -0400 Subject: [PATCH 40/46] Make restricted statuses array immutable --- .../serializers/work_queue/appeal_search_serializer.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/serializers/work_queue/appeal_search_serializer.rb b/app/models/serializers/work_queue/appeal_search_serializer.rb index 94b0d34c26f..320c5bdb075 100644 --- a/app/models/serializers/work_queue/appeal_search_serializer.rb +++ b/app/models/serializers/work_queue/appeal_search_serializer.rb @@ -6,7 +6,7 @@ class WorkQueue::AppealSearchSerializer set_type :appeal - restricted_statuses = + RESTRICTED_STATUSES = [ :distributed_to_judge, :ready_for_signature, @@ -14,7 +14,7 @@ class WorkQueue::AppealSearchSerializer :misc, :unknown, :assigned_to_attorney - ] + ].freeze attribute :contested_claim, &:contested_claim? @@ -83,7 +83,7 @@ class WorkQueue::AppealSearchSerializer attribute :veteran_appellant_deceased, &:veteran_appellant_deceased? attribute :assigned_to_location do |object, params| - if restricted_statuses.include?(object&.status&.status) + if RESTRICTED_STATUSES.include?(object&.status&.status) unless params[:user]&.vso_employee? object.assigned_to_location end From ef1e71307587e609511520dc21199afb6972861a Mon Sep 17 00:00:00 2001 From: AimanK Date: Thu, 18 Jul 2024 15:42:29 -0400 Subject: [PATCH 41/46] Add more extensive test coverage (every restricted status type) --- .../appeal_search_serializer_spec.rb | 93 ++++++++++++++++++- 1 file changed, 89 insertions(+), 4 deletions(-) diff --git a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb index a068534ce6c..686d9e68074 100644 --- a/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb +++ b/spec/models/serializers/work_queue/appeal_search_serializer_spec.rb @@ -4,7 +4,7 @@ describe WorkQueue::AppealSearchSerializer, :all_dbs do describe "#assigned_to_location" do - context "when appeal status is restricted" do + context "when appeal status is distributed to judge" do let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } let(:appeal) { create(:appeal, :assigned_to_judge, associated_judge: judge_user) } @@ -21,7 +21,7 @@ end end - context "when appeal status is restricted" do + context "when appeal status is assigned to attorney" do let(:appeal) { create(:appeal, :at_attorney_drafting) } let!(:attorney_user) { create(:user) } let!(:vacols_atty) { create(:staff, :attorney_role, sdomainid: attorney_user.css_id) } @@ -40,7 +40,7 @@ end end - context "when appeal status is restricted" do + context "when appeal status is ready for signature" do let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } let(:appeal) { create(:appeal, :at_judge_review, associated_judge: judge_user) } let!(:hearings_coordinator_user) do @@ -63,7 +63,92 @@ end end - context "when user is a vso representative" do + context "when status is distributed to judge" do + let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } + let(:appeal) { create(:appeal, :assigned_to_judge, associated_judge: judge_user) } + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + + context "when status is ready for signature" do + let!(:judge_user) { create(:user, :with_vacols_judge_record, full_name: "Judge Judy", css_id: "JUDGE_J") } + let(:appeal) { create(:appeal, :at_judge_review, associated_judge: judge_user) } + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + + context "when status is on hold" do + let(:appeal) do + create(:appeal).tap do |appeal| + create(:timed_hold_task, parent: create(:root_task, appeal: appeal)) + end + end + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + + context "when status is misc" do + let(:appeal) do + create(:appeal).tap do |appeal| + create(:ama_judge_dispatch_return_task, parent: create(:root_task, appeal: appeal)) + end + end + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + + context "when status is unknown" do + let(:appeal) { create(:appeal) } + let(:vso_user) { create(:user, :vso_role) } + + before do + User.authenticate!(user: vso_user) + end + + subject { described_class.new(appeal, params: { user: vso_user }) } + + it "does not show CSS ID to VSO user" do + expect(subject.serializable_hash[:data][:attributes][:assigned_to_location]).to be_nil + end + end + + context "when status is assigned to attorney" do let(:appeal) { create(:appeal, :at_attorney_drafting) } let(:vso_user) { create(:user, :vso_role) } From a05be1e12e1aef273628c51f43c45175912259f6 Mon Sep 17 00:00:00 2001 From: Ryan Messner Date: Tue, 21 May 2024 16:18:17 -0400 Subject: [PATCH 42/46] APPEALS-23420 Add search query service for the api response for the `/search` page --- .../idt/api/v2/appeals_controller.rb | 4 +- app/decorators/appeal_status_api_decorator.rb | 12 +- app/models/appeal.rb | 16 +- app/models/task.rb | 6 +- .../tasks/evidence_submission_window_task.rb | 2 +- app/services/bva_appeal_status.rb | 75 ++-- app/services/search_query_service.rb | 69 ++++ .../search_query_service/api_response.rb | 3 + .../search_query_service/appeal_row.rb | 162 ++++++++ .../search_query_service/attributes.rb | 29 ++ .../search_query_service/legacy_appeal_row.rb | 139 +++++++ .../search_query_service/legacy_attributes.rb | 24 ++ .../search_query_service/queried_appeal.rb | 133 +++++++ .../search_query_service/queried_hearing.rb | 33 ++ .../queried_legacy_appeal.rb | 41 ++ app/services/search_query_service/query.rb | 376 ++++++++++++++++++ .../search_query_service/search_response.rb | 9 + .../vso_user_search_results.rb | 68 ++++ app/workflows/case_search_results_base.rb | 118 ++++-- ..._search_results_for_caseflow_veteran_id.rb | 12 + .../case_search_results_for_docket_number.rb | 6 +- ..._search_results_for_veteran_file_number.rb | 20 + spec/feature/queue/search_spec.rb | 6 +- spec/fixes/assigned_to_search_results_spec.rb | 6 +- spec/fixes/backfill_early_ama_appeal_spec.rb | 4 +- spec/services/bva_appeal_status_spec.rb | 2 +- spec/services/search_query_service_spec.rb | 282 +++++++++++++ 27 files changed, 1557 insertions(+), 100 deletions(-) create mode 100644 app/services/search_query_service.rb create mode 100644 app/services/search_query_service/api_response.rb create mode 100644 app/services/search_query_service/appeal_row.rb create mode 100644 app/services/search_query_service/attributes.rb create mode 100644 app/services/search_query_service/legacy_appeal_row.rb create mode 100644 app/services/search_query_service/legacy_attributes.rb create mode 100644 app/services/search_query_service/queried_appeal.rb create mode 100644 app/services/search_query_service/queried_hearing.rb create mode 100644 app/services/search_query_service/queried_legacy_appeal.rb create mode 100644 app/services/search_query_service/query.rb create mode 100644 app/services/search_query_service/search_response.rb create mode 100644 app/services/search_query_service/vso_user_search_results.rb create mode 100644 spec/services/search_query_service_spec.rb diff --git a/app/controllers/idt/api/v2/appeals_controller.rb b/app/controllers/idt/api/v2/appeals_controller.rb index 74884231964..b93cf8179dc 100644 --- a/app/controllers/idt/api/v2/appeals_controller.rb +++ b/app/controllers/idt/api/v2/appeals_controller.rb @@ -14,11 +14,11 @@ def details result = if docket_number?(case_search) CaseSearchResultsForDocketNumber.new( docket_number: case_search, user: current_user - ).call + ).api_call else CaseSearchResultsForVeteranFileNumber.new( file_number_or_ssn: case_search, user: current_user - ).call + ).api_call end render_search_results_as_json(result) diff --git a/app/decorators/appeal_status_api_decorator.rb b/app/decorators/appeal_status_api_decorator.rb index a93ed1b9bbf..7be8e8e75aa 100644 --- a/app/decorators/appeal_status_api_decorator.rb +++ b/app/decorators/appeal_status_api_decorator.rb @@ -3,6 +3,12 @@ # Extends the Appeal model with methods for the Appeals Status API class AppealStatusApiDecorator < ApplicationDecorator + def initialize(appeal, scheduled_hearing = nil) + super(appeal) + + @scheduled_hearing = scheduled_hearing + end + def appeal_status_id "A#{id}" end @@ -162,11 +168,11 @@ def remanded_sc_decision_issues end def open_pre_docket_task? - tasks.open.any? { |task| task.is_a?(PreDocketTask) } + open_tasks.any? { |task| task.is_a?(PreDocketTask) } end def pending_schedule_hearing_task? - tasks.open.where(type: ScheduleHearingTask.name).any? + pending_schedule_hearing_tasks.any? end def hearing_pending? @@ -174,7 +180,7 @@ def hearing_pending? end def evidence_submission_hold_pending? - tasks.open.where(type: EvidenceSubmissionWindowTask.name).any? + evidence_submission_hold_pending_tasks.any? end def at_vso? diff --git a/app/models/appeal.rb b/app/models/appeal.rb index 00876e8100e..abf9703fe2c 100644 --- a/app/models/appeal.rb +++ b/app/models/appeal.rb @@ -304,6 +304,18 @@ def decorated_with_status AppealStatusApiDecorator.new(self) end + def open_tasks + tasks.open + end + + def pending_schedule_hearing_tasks + tasks.open.where(type: ScheduleHearingTask.name) + end + + def evidence_submission_hold_pending_tasks + tasks.open.where(type: EvidenceSubmissionWindowTask.name) + end + # :reek:RepeatedConditionals def active_request_issues_or_decision_issues decision_issues.empty? ? active_request_issues : fetch_all_decision_issues @@ -629,7 +641,7 @@ def direct_review_docket? end def active? - tasks.open.of_type(:RootTask).any? + open_tasks.of_type(:RootTask).any? end def ready_for_distribution? @@ -744,7 +756,7 @@ def substitutions end def status - @status ||= BVAAppealStatus.new(appeal: self) + @status ||= BVAAppealStatus.new(tasks: tasks) end def previously_selected_for_quality_review diff --git a/app/models/task.rb b/app/models/task.rb index f74de948c52..aa9b5744e89 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -101,7 +101,7 @@ class << self; undef_method :open; end # Equivalent to .reject(&:hide_from_queue_table_view) but offloads that to the database. scope :visible_in_queue_table_view, lambda { where.not( - type: Task.descendants.select(&:hide_from_queue_table_view).map(&:name) + type: hidden_task_classes ) } @@ -138,6 +138,10 @@ class << self # With taks that are likely to need Reader to complete READER_PRIORITY_TASK_TYPES = [JudgeAssignTask.name, JudgeDecisionReviewTask.name].freeze + def hidden_task_classes + Task.descendants.select(&:hide_from_queue_table_view).map(&:name) + end + def reader_priority_task_types READER_PRIORITY_TASK_TYPES end diff --git a/app/models/tasks/evidence_submission_window_task.rb b/app/models/tasks/evidence_submission_window_task.rb index 7c9cdb5f8fa..0028fc54366 100644 --- a/app/models/tasks/evidence_submission_window_task.rb +++ b/app/models/tasks/evidence_submission_window_task.rb @@ -11,7 +11,7 @@ class EvidenceSubmissionWindowTask < Task before_validation :set_assignee - def initialize(args) + def initialize(args = {}) @end_date = args&.fetch(:end_date, nil) super(args&.except(:end_date)) end diff --git a/app/services/bva_appeal_status.rb b/app/services/bva_appeal_status.rb index 6fd66d36048..512059b6d45 100644 --- a/app/services/bva_appeal_status.rb +++ b/app/services/bva_appeal_status.rb @@ -3,7 +3,7 @@ # Determine the BVA workflow status of an Appeal (symbol and string) based on its Tasks. class BVAAppealStatus - attr_reader :status + attr_reader :status, :tasks SORT_KEYS = { not_distributed: 1, @@ -69,8 +69,18 @@ def attorney_task_names end end - def initialize(appeal:) - @appeal = appeal + Tasks = Struct.new( + :open, + :active, + :in_progress, + :cancelled, + :completed, + :assigned, + keyword_init: true + ) + + def initialize(tasks:) + @tasks = tasks @status = compute end @@ -86,15 +96,12 @@ def to_i SORT_KEYS[status] end - def as_json(_args) + def as_json(_args = nil) to_sym end private - attr_reader :appeal - - delegate :tasks, to: :appeal # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength def compute if open_pre_docket_task? @@ -113,7 +120,7 @@ def compute :ready_for_signature elsif active_sign_task? :signed - elsif completed_dispatch_task? && open_tasks.empty? + elsif completed_dispatch_task? && tasks.open.empty? :dispatched elsif completed_dispatch_task? :post_dispatch @@ -133,84 +140,60 @@ def compute end # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength - def open_tasks - @open_tasks ||= tasks.open - end - - def active_tasks - @active_tasks ||= tasks.active - end - - def assigned_tasks - @assigned_tasks ||= tasks.assigned - end - - def in_progress_tasks - @in_progress_tasks ||= tasks.in_progress - end - - def cancelled_tasks - @cancelled_tasks ||= tasks.cancelled - end - - def completed_tasks - @completed_tasks ||= tasks.completed - end - def open_pre_docket_task? - open_tasks.any? { |task| task.is_a?(PreDocketTask) } + tasks.open.any? { |task| task.type == "PreDocketTask" } end def open_distribution_task? - open_tasks.any? { |task| task.is_a?(DistributionTask) } + tasks.open.any? { |task| task.type == "DistributionTask" } end def open_timed_hold_task? - open_tasks.any? { |task| task.is_a?(TimedHoldTask) } + tasks.open.any? { |task| task.type == "TimedHoldTask" } end def active_judge_assign_task? - active_tasks.any? { |task| task.is_a?(JudgeAssignTask) } + tasks.active.any? { |task| task.type == "JudgeAssignTask" } end def assigned_attorney_task? - assigned_tasks.any? { |task| self.class.attorney_task_names.include?(task.type) } + tasks.assigned.any? { |task| self.class.attorney_task_names.include?(task.type) } end def active_colocated_task? - active_tasks.any? { |task| self.class.colocated_task_names.include?(task.type) } + tasks.active.any? { |task| self.class.colocated_task_names.include?(task.type) } end def attorney_task_in_progress? - in_progress_tasks.any? { |task| self.class.attorney_task_names.include?(task.type) } + tasks.in_progress.any? { |task| self.class.attorney_task_names.include?(task.type) } end def active_judge_decision_review_task? - active_tasks.any? { |task| task.is_a?(JudgeDecisionReviewTask) } + tasks.active.any? { |task| task.type == "JudgeDecisionReviewTask" } end def active_sign_task? - active_tasks.any? { |task| %w[BvaDispatchTask QualityReviewTask].include?(task.type) } + tasks.active.any? { |task| %w[BvaDispatchTask QualityReviewTask].include?(task.type) } end def completed_dispatch_task? - completed_tasks.any? { |task| task.is_a?(BvaDispatchTask) } + tasks.completed.any? { |task| task.type == "BvaDispatchTask" } end def docket_switched? # TODO: this should be updated to check that there are no active tasks once the task handling is implemented - completed_tasks.any? { |task| task.is_a?(DocketSwitchGrantedTask) } + tasks.completed.any? { |task| task.type == "DocketSwitchGrantedTask" } end def cancelled_root_task? - cancelled_tasks.any? { |task| task.is_a?(RootTask) } + tasks.cancelled.any? { |task| task.type == "RootTask" } end def misc_task? - active_tasks.any? { |task| self.class.misc_task_names.include?(task.type) } + tasks.active.any? { |task| self.class.misc_task_names.include?(task.type) } end def active_specialty_case_team_assign_task? - active_tasks.any? { |task| task.is_a?(SpecialtyCaseTeamAssignTask) } + tasks.active.any? { |task| task.type == "SpecialtyCaseTeamAssignTask" } end end diff --git a/app/services/search_query_service.rb b/app/services/search_query_service.rb new file mode 100644 index 00000000000..75b0364fa19 --- /dev/null +++ b/app/services/search_query_service.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +class SearchQueryService + def initialize(file_number: nil, docket_number: nil) + @docket_number = docket_number + @file_number = file_number + @queries = SearchQueryService::Query.new + end + + def search_by_veteran_file_number + search_results.map do |row| + if row["type"] != "legacy_appeal" + AppealRow.new(row).search_response + else + vacols_row = vacols_results.find { |result| result["vacols_id"] == row["external_id"] } + LegacyAppealRow.new(row, vacols_row).search_response + end + end + end + + def search_by_docket_number + results = ActiveRecord::Base.connection.exec_query( + sanitize([queries.docket_number_query, docket_number]) + ) + + results.map do |row| + AppealRow.new(row).search_response + end + end + + private + + attr_reader :docket_number, :file_number, :queries + + def vacols_ids + legacy_results.map { |result| result["external_id"] } + end + + def legacy_results + search_results.select { |result| result["type"] == "legacy_appeal" } + end + + def search_results + @search_results = ActiveRecord::Base + .connection + .exec_query(file_number_or_ssn_query) + .uniq { |result| result["external_id"] } + end + + def file_number_or_ssn_query + sanitize( + [ + queries.veteran_file_number_query, + *[file_number].cycle(queries.veteran_file_number_num_params).to_a + ] + ) + end + + def vacols_results + @vacols_results ||= begin + vacols_query = VACOLS::Record.sanitize_sql_array([queries.vacols_query, vacols_ids]) + VACOLS::Record.connection.exec_query(vacols_query) + end + end + + def sanitize(values) + ActiveRecord::Base.sanitize_sql_array(values) + end +end diff --git a/app/services/search_query_service/api_response.rb b/app/services/search_query_service/api_response.rb new file mode 100644 index 00000000000..76a216b678e --- /dev/null +++ b/app/services/search_query_service/api_response.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +SearchQueryService::ApiResponse = Struct.new(:id, :type, :attributes, keyword_init: true) diff --git a/app/services/search_query_service/appeal_row.rb b/app/services/search_query_service/appeal_row.rb new file mode 100644 index 00000000000..96532dfd6ae --- /dev/null +++ b/app/services/search_query_service/appeal_row.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +class SearchQueryService::AppealRow + def initialize(query_row) + @query_row = query_row + end + + def search_response + SearchQueryService::SearchResponse.new( + queried_appeal, + :appeal, + SearchQueryService::ApiResponse.new( + id: query_row["id"], + type: "appeal", + attributes: attributes + ) + ) + end + + private + + attr_reader :query_row + + # rubocop:disable Metrics/MethodLength + def attributes + SearchQueryService::Attributes.new( + aod: query_row["aod_granted_for_person"].present?, + appellant_full_name: appellant_full_name, + assigned_to_location: queried_appeal.assigned_to_location, + assigned_attorney: assigned_attorney, + caseflow_veteran_id: query_row["veteran_id"], + contested_claim: contested_claim, + decision_date: decision_date, + decision_issues: decision_issues, + docket_name: query_row["docket_type"], + docket_number: docket_number, + external_id: query_row["external_id"], + hearings: hearings, + issues: issues, + mst: mst_status, + pact: pact_status, + paper_case: false, + status: queried_appeal.status, + type: stream_type, + veteran_appellant_deceased: veteran_appellant_deceased, + veteran_file_number: veteran_file_number, + veteran_full_name: veteran_full_name, + withdrawn: withdrawn + ) + end + # rubocop:enable Metrics/MethodLength + + def decision_issues + json_array("decision_issues") + end + + def docket_number + attrs, = JSON.parse query_row["appeal"] + attrs["stream_docket_number"] + end + + def decision_date + Date.parse(query_row["decision_date"]) + rescue TypeError, Date::Error + nil + end + + def appellant_full_name + FullName.new(query_row["person_first_name"], "", query_row["person_last_name"]).to_s + end + + def veteran_full_name + FullName.new(query_row["veteran_first_name"], "", query_row["veteran_last_name"]).to_s + end + + def veteran_file_number + attrs, = JSON.parse(query_row["appeal"]) + attrs["veteran_file_number"] + end + + def issue(attributes) + unless FeatureToggle.enabled?(:pact_identification) + attributes.delete("pact_status") + end + unless FeatureToggle.enabled?(:mst_identification) + attributes.delete("mst_status") + end + end + + def issues + json_array("request_issues").map do |attributes| + attributes.tap do |attrs| + issue(attrs) + end + end + end + + def hearings + json_array("hearings") + end + + def withdrawn + WithdrawnDecisionReviewPolicy.new( + Struct.new( + :active_request_issues, + :withdrawn_request_issues + ).new( + json_array("active_request_issues"), + json_array("active_request_issues") + ) + ).satisfied? + end + + def stream_type + (query_row["stream_type"] || "Original").titleize + end + + def contested_claim + json_array("active_request_issues").any? do |issue| + %w(Contested Apportionment).any? do |code| + category = issue["nonrating_issue_category"] || "" + category.include?(code) + end + end + end + + def veteran_appellant_deceased + !!query_row["date_of_death"] && !json_array("appeal").first["veteran_is_not_claimant"] + end + + def pact_status + json_array("decision_issues").any? do |issue| + issue["pact_status"] + end + end + + def mst_status + json_array("decision_issues").any? do |issue| + issue["mst_status"] + end + end + + def queried_appeal + @queried_appeal ||= begin + appeal_attrs, = JSON.parse query_row["appeal"] + + SearchQueryService::QueriedAppeal.new( + attributes: appeal_attrs, + tasks_attributes: json_array("tasks"), + hearings_attributes: json_array("hearings") + ) + end + end + + def assigned_attorney + json_array("assigned_attorney").first + end + + def json_array(key) + JSON.parse(query_row[key] || "[]") + end +end diff --git a/app/services/search_query_service/attributes.rb b/app/services/search_query_service/attributes.rb new file mode 100644 index 00000000000..1fa66ed08f3 --- /dev/null +++ b/app/services/search_query_service/attributes.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +SearchQueryService::Attributes = Struct.new( + :aod, + :power_of_attorney, + :appellant_full_name, + :assigned_attorney, + :assigned_judge, + :assigned_to_location, + :caseflow_veteran_id, + :decision_date, + :decision_issues, + :docket_name, + :docket_number, + :external_id, + :hearings, + :issues, + :mst, + :pact, + :paper_case, + :status, + :type, + :veteran_appellant_deceased, + :veteran_file_number, + :veteran_full_name, + :contested_claim, + :withdrawn, + keyword_init: true +) diff --git a/app/services/search_query_service/legacy_appeal_row.rb b/app/services/search_query_service/legacy_appeal_row.rb new file mode 100644 index 00000000000..c82461a8e54 --- /dev/null +++ b/app/services/search_query_service/legacy_appeal_row.rb @@ -0,0 +1,139 @@ +# frozen_string_literal: true + +class SearchQueryService::LegacyAppealRow + def initialize(search_row, vacols_row) + @search_row = search_row + @vacols_row = vacols_row + end + + def search_response + SearchQueryService::SearchResponse.new( + legacy_appeal, + :legacy_appeal, + SearchQueryService::ApiResponse.new( + id: search_row["id"], + type: "legacy_appeal", + attributes: attributes + ) + ) + end + + private + + attr_reader :search_row, :vacols_row + + def attributes + SearchQueryService::LegacyAttributes.new( + aod: aod, + appellant_full_name: appellant_full_name, + assigned_to_location: vacols_row["bfcurloc"], + caseflow_veteran_id: search_row["veteran_id"], + decision_date: decision_date, + docket_name: "legacy", + docket_number: vacols_row["tinum"], + external_id: vacols_row["vacols_id"], + hearings: hearings, + issues: [{}] * vacols_row["issues_count"], + mst: mst, + pact: pact, + paper_case: paper_case, + status: status, + type: stream_type, + veteran_appellant_deceased: veteran_appellant_deceased, + veteran_file_number: search_row["veteran_file_number"], + veteran_full_name: veteran_full_name + ) + end + + def hearings + vacols_json_array("hearings").map do |attrs| + HearingAttributes.new(attrs).call + end + end + + class HearingAttributes + def initialize(attributes) + @attributes = attributes + end + + def call + { + disposition: VACOLS::CaseHearing::HEARING_DISPOSITIONS[attributes["disposition"].try(:to_sym)], + request_type: attributes["type"], + appeal_type: VACOLS::Case::TYPES[attributes["bfac"]], + external_id: attributes["external_id"], + date: HearingMapper.datetime_based_on_type( + datetime: attributes["date"], + regional_office: regional_office(attributes["venue"]), + type: attributes["type"] + ) + } + end + + private + + attr_reader :attributes + + def regional_office(ro_key) + RegionalOffice.find!(ro_key) + rescue NotFoundError + nil + end + end + + def vacols_json_array(key) + JSON.parse(vacols_row[key] || "[]") + end + + def veteran_appellant_deceased + search_row["date_of_death"].present? && + search_row["person_first_name"].present? + end + + def stream_type + VACOLS::Case::TYPES[vacols_row["bfac"]] + end + + def status + VACOLS::Case::STATUS[vacols_row["bfmpro"]] + end + + def paper_case + folder = Struct.new(:tivbms, :tisubj2).new( + vacols_row["tivbms"], + vacols_row["tisubj2"] + ) + AppealRepository.folder_type_from(folder) + end + + def mst + vacols_row["issues_mst_count"] > 0 + end + + def pact + vacols_row["issues_pact_count"] > 0 + end + + def appellant_full_name + FullName.new(vacols_row["sspare2"], "", vacols_row["sspare1"]).to_s + end + + def veteran_full_name + FullName.new(vacols_row["snamef"], "", vacols_row["snamel"]).to_s + end + + def aod + vacols_row["aod"] == 1 + end + + def decision_date + AppealRepository.normalize_vacols_date(vacols_row["bfddec"]) + end + + def legacy_appeal + @legacy_appeal ||= begin + appeal_attrs, = JSON.parse search_row["appeal"] + SearchQueryService::QueriedLegacyAppeal.new(attributes: appeal_attrs) + end + end +end diff --git a/app/services/search_query_service/legacy_attributes.rb b/app/services/search_query_service/legacy_attributes.rb new file mode 100644 index 00000000000..029030954c5 --- /dev/null +++ b/app/services/search_query_service/legacy_attributes.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +SearchQueryService::LegacyAttributes = Struct.new( + :aod, + :appellant_full_name, + :assigned_to_location, + :caseflow_veteran_id, + :decision_date, + :docket_name, + :docket_number, + :external_id, + :hearings, + :issues, + :mst, + :pact, + :paper_case, + :status, + :type, + :veteran_appellant_deceased, + :veteran_file_number, + :veteran_full_name, + :withdrawn, + keyword_init: true +) diff --git a/app/services/search_query_service/queried_appeal.rb b/app/services/search_query_service/queried_appeal.rb new file mode 100644 index 00000000000..297ad46cdcf --- /dev/null +++ b/app/services/search_query_service/queried_appeal.rb @@ -0,0 +1,133 @@ +# frozen_string_literal: true + +class SearchQueryService::QueriedAppeal < SimpleDelegator + def initialize(attributes:, tasks_attributes:, hearings_attributes:) + @attributes = OpenStruct.new( + appeal: attributes, + tasks: tasks_attributes, + hearings: hearings_attributes, + root_task: attributes.delete("root_task") || {}, + claimants: attributes.delete("claimants") || [] + ) + + super(appeal) + end + + def assigned_to_location + return COPY::CASE_LIST_TABLE_POST_DECISION_LABEL if root_task&.status == Constants.TASK_STATUSES.completed + + return most_recently_updated_visible_task.assigned_to_label if most_recently_updated_visible_task + + # this condition is no longer needed since we only want active or on hold tasks + return most_recently_updated_task&.assigned_to_label if most_recently_updated_task.present? + + fetch_api_status + end + + def claimant_participant_ids + claimants.map(&:participant_id) + end + + def claimants + @claimants ||= begin + attributes.claimants.map do |attrs| + Struct.new(:participant_id).new(attrs["participant_id"]) + end + end + end + + def root_task + @root_task ||= begin + if attributes.root_task.present? + Task.new.tap do |task| + task.assign_attributes attributes.root_task + end + end + end + end + + def open_tasks + @open_tasks ||= tasks.select do |task| + Task.open_statuses.include?(task.status) + end + end + + def active? + Task.active_statuses.include?(attributes.root_task["status"]) + end + + def pending_schedule_hearing_tasks + open_tasks.select { |task| task.type == "ScheduleHearingTask" } + end + + def evidence_submission_hold_pending_tasks + open_tasks.select { |task| task.type == "EvidenceSubmissionWindowTask" } + end + + def status + BVAAppealStatus.new( + tasks: BVAAppealStatus::Tasks.new( + open: tasks.select(&:open?), + active: tasks.select(&:active?), + in_progress: tasks.select(&:in_progress?), + cancelled: tasks.select(&:cancelled?), + completed: tasks.select(&:completed?), + assigned: tasks.select(&:assigned?) + ) + ).status + end + + private + + attr_reader :attributes + + def appeal + @appeal ||= Appeal.new.tap do |appeal| + appeal.assign_attributes(attributes.appeal) + end + end + + def most_recently_updated_visible_task + visible_tasks.select { |task| Task.active_statuses.include?(task.status) }.max_by(&:updated_at) || + visible_tasks.select { |task| task.status == "on_hold" }.max_by(&:updated_at) + end + + def visible_tasks + @visible_tasks ||= tasks.reject do |task| + Task.hidden_task_classes.include?(task.type) + end + end + + def most_recently_updated_task + tasks.max_by(&:updated_at) + end + + def tasks + @tasks ||= begin + attributes.tasks.map do |attrs| + attrs["type"].constantize.new.tap do |task| + task.assign_attributes attrs + end + end + end + end + + def fetch_api_status + AppealStatusApiDecorator.new( + self, + scheduled_hearing + ).fetch_status.to_s.titleize.to_sym + end + + def scheduled_hearing + @scheduled_hearing ||= begin + hearings = attributes.hearings.map do |attrs| + SearchQueryService::QueriedHearing.new(attrs) + end + + hearings.reject(&:disposition).find do |hearing| + hearing.scheduled_for >= Time.zone.today + end + end + end +end diff --git a/app/services/search_query_service/queried_hearing.rb b/app/services/search_query_service/queried_hearing.rb new file mode 100644 index 00000000000..efd16b8d187 --- /dev/null +++ b/app/services/search_query_service/queried_hearing.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class SearchQueryService::QueriedHearing < SimpleDelegator + def initialize(attributes) + @attributes = attributes + manage_attributes + + super(hearing) + end + + def hearing_day + OpenStruct.new(hearing_day_attributes) + end + + def updated_by + OpenStruct.new(updated_by_attributes) + end + + private + + attr_reader :attributes, :hearing_day_attributes, :updated_by_attributes + + def manage_attributes + @hearing_day_attributes = attributes.delete("hearing_day") + @updated_by_attributes = attributes.delete("updated_by") + end + + def hearing + Hearing.new.tap do |hearing| + hearing.assign_attributes attributes + end + end +end diff --git a/app/services/search_query_service/queried_legacy_appeal.rb b/app/services/search_query_service/queried_legacy_appeal.rb new file mode 100644 index 00000000000..50aaab31a7f --- /dev/null +++ b/app/services/search_query_service/queried_legacy_appeal.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +class SearchQueryService::QueriedLegacyAppeal < SimpleDelegator + def initialize(attributes:) + @attributes = attributes + @root_task_attributes = attributes.delete("root_task") + @veteran_attributes = attributes.delete("veteran") + + super(legacy_appeal) + end + + def veteran + @veteran ||= Veteran.new.tap do |veteran| + veteran.assign_attributes veteran_attributes + end + end + + def root_task + @root_task ||= begin + if root_task_attributes + RootTask.new.tap do |root_task| + root_task.assign_attributes root_task_attributes + end + end + end + end + + def claimant_participant_ids + veteran.participant_id + end + + private + + attr_reader :attributes, :root_task_attributes, :veteran_attributes + + def legacy_appeal + @legacy_appeal ||= LegacyAppeal.new.tap do |appeal| + appeal.assign_attributes(attributes) + end + end +end diff --git a/app/services/search_query_service/query.rb b/app/services/search_query_service/query.rb new file mode 100644 index 00000000000..aa2510f400f --- /dev/null +++ b/app/services/search_query_service/query.rb @@ -0,0 +1,376 @@ +# frozen_string_literal: true + +class SearchQueryService::Query + def docket_number_query + <<-SQL + #{appeals_internal_query} + where a.stream_docket_number=?; + SQL + end + + def veteran_file_number_num_params + 4 + end + + def veteran_file_number_query + <<-SQL + ( + #{appeals_internal_query} + where v.ssn=? or v.file_number=? + ) + UNION + ( + #{legacy_appeals_internal_query} + where v.ssn=? or v.file_number=? + ) + SQL + end + + def vacols_query + <<-SQL + select + aod, + "cases".bfkey vacols_id, + "cases".bfcurloc, + "cases".bfddec, + "cases".bfmpro, + "cases".bfac, + "cases".bfcorlid, + "correspondents".snamef, + "correspondents".snamel, + "correspondents".sspare1, + "correspondents".sspare2, + "correspondents".slogid, + "folders".tinum, + "folders".tivbms, + "folders".tisubj2, + (select + JSON_ARRAYAGG(JSON_OBJECT( + 'venue' value #{case_hearing_venue_select}, + 'external_id' value "h".hearing_pkseq, + 'type' value "h".hearing_type, + 'disposition' value "h".hearing_disp, + 'date' value "h".hearing_date + )) + from hearsched "h" + where "h".folder_nr="cases".bfkey + ) hearings, + (select count("issues".isskey) from issues "issues" where "issues".isskey="cases".bfkey) issues_count, + (select count("hearings".hearing_pkseq) from hearsched "hearings" where "hearings".folder_nr="cases".bfkey) hearing_count, + (select count("issues".isskey) from issues "issues" where "issues".isskey="cases".bfkey and "issues".issmst='Y') issues_mst_count, + (select count("issues".isskey) from issues "issues" where "issues".isskey="cases".bfkey and "issues".isspact='Y') issues_pact_count + from + brieff "cases" + left join folder "folders" + on "cases".bfkey="folders".ticknum + left join corres "correspondents" + on "cases".bfcorkey="correspondents".stafkey + #{VACOLS::Case::JOIN_AOD} + where + "cases".bfkey in (?) + SQL + end + + private + + def case_hearing_venue_select + <<-SQL + case + when "h".hearing_type='#{VACOLS::CaseHearing::HEARING_TYPE_LOOKUP[:video]}' AND + "h".hearing_date < '#{VACOLS::CaseHearing::VACOLS_VIDEO_HEARINGS_END_DATE}' + then #{Rails.application.config.vacols_db_name}.HEARING_VENUE("h".vdkey) + else "cases".bfregoff + end + SQL + end + + def legacy_appeals_internal_query + <<-SQL + select + a.id, + a.vacols_id external_id, + 'legacy_appeal' type, + null aod_granted_for_person, + 'legacy' docket_type, + ( + select + jsonb_agg(la2) + from + ( + select + la.*, + ( + select + row_to_json(t.*) + from tasks t + where + t.appeal_id=a.id and + t.type='RootTask' and + t.appeal_type='Appeal' + order by t.updated_at desc + limit 1 + ) root_task, + (select row_to_json(v.*)) veteran + from legacy_appeals la + where la.id=a.id + ) la2 + ) appeal, + dd.decision_date, + wm.overtime, + pp.first_name person_first_name, + pp.last_name person_last_name, + v.id veteran_id, + v.first_name veteran_first_name, + v.last_name veteran_last_name, + v.file_number as veteran_file_number, + v.date_of_death, + ( + select jsonb_agg(u2) from + ( + select + u.* + from tasks t + left join users u on + t.assigned_to_id=u.id and + t.assigned_to_type='User' + where + t.appeal_type = 'LegacyAppeal' and + t.appeal_id=a.id and + t.type='AttorneyTask' and + t.status != '#{Constants.TASK_STATUSES.cancelled}' + order by t.created_at desc + limit 1 + ) u2 + ) assigned_attorney, + null request_issues, + null active_request_issues, + null withdrawn_request_issues, + null decision_issues, + null hearings_count, + '[]' hearings, + ( + select jsonb_agg(t2) from + ( + select + t.* + from tasks t + left join organizations o on o.id=t.assigned_to_id + left join users u on u.id=t.assigned_to_id + where + t.appeal_id=a.id and + t.appeal_type='LegacyAppeal' + order by updated_at desc + ) t2 + ) tasks + from legacy_appeals a + left join claimants cl on cl.decision_review_id=a.id and cl.decision_review_type='LegacyAppeal' + left join people pp on cl.participant_id=pp.participant_id + left join work_modes wm on wm.appeal_id=a.id and wm.appeal_type='LegacyAppeal' + left join decision_documents dd on dd.appeal_id=a.id and dd.appeal_type='LegacyAppeal' + left join veterans v on v.file_number=( + select + case + when right(a.vbms_id, 1) = 'C' then lpad(regexp_replace(a.vbms_id, '[^0-9]+', '', 'g'), 8, '0') + else regexp_replace(a.vbms_id, '[^0-9]+', '', 'g') + end + ) or v.ssn=( + select + case + when right(a.vbms_id, 1) = 'C' then lpad(regexp_replace(a.vbms_id, '[^0-9]+', '', 'g'), 8, '0') + else regexp_replace(a.vbms_id, '[^0-9]+', '', 'g') + end + ) + SQL + end + + def appeals_internal_query + <<-SQL + select + a.id, + a.uuid::varchar external_id, + a.stream_type type, + aod.id aod_granted_for_person, + a.docket_type, + ( + select jsonb_agg(a2) + from + ( + select + appeals.*, + ( + select + row_to_json(t.*) + from tasks t + where + t.appeal_id=a.id and + t.type='RootTask' and + t.appeal_type='Appeal' + order by updated_at desc + limit 1 + ) root_task, + ( + select jsonb_agg(c2) from + ( + select + c.id, + c.participant_id + from claimants c + where + c.decision_review_type = 'Appeal' and + c.decision_review_id=a.id + ) c2 + ) claimants + from appeals + where id=a.id + ) a2 + ) appeal, + dd.decision_date, + wm.overtime, + pp.first_name person_first_name, + pp.last_name person_last_name, + v.id veteran_id, + v.first_name veteran_first_name, + v.last_name veteran_last_name, + v.file_number as veteran_file_number, + v.date_of_death, + ( + select jsonb_agg(u2) from + ( + select + u.* + from tasks t + left join users u on + t.assigned_to_id=u.id and + t.assigned_to_type='User' + where + t.appeal_type = 'Appeal' and + t.appeal_id=a.id and + t.type='AttorneyTask' and + t.status != '#{Constants.TASK_STATUSES.cancelled}' + order by t.created_at desc + limit 1 + ) u2 + ) assigned_attorney, + ( + select jsonb_agg(ri2) from + ( + select + ri.id, + ri.benefit_type program, + ri.notes, + ri.decision_date, + ri.nonrating_issue_category, + ri.mst_status, + ri.pact_status, + ri.mst_status_update_reason_notes mst_justification, + ri.pact_status_update_reason_notes pact_justification + from request_issues ri + where + ri.decision_review_type='Appeal' and + ri.decision_review_id=a.id + ) ri2 + ) request_issues, + ( + select jsonb_agg(ri2) from + ( + select + nonrating_issue_category + from request_issues ri + where + ri.ineligible_reason is null and + ri.closed_at is null and + (ri.split_issue_status is null or ri.split_issue_status = 'in_progress') and + ri.decision_review_type='Appeal' and + ri.decision_review_id=a.id + ) ri2 + ) active_request_issues, + ( + select jsonb_agg(ri2) from + ( + select + nonrating_issue_category + from request_issues ri + where + ri.ineligible_reason is null and + ri.closed_status = 'widthrawn' and + ri.decision_review_type='Appeal' and + ri.decision_review_id=a.id + ) ri2 + ) withdrawn_request_issues, + ( + select jsonb_agg(di2) from + ( + select + di.id, + di.disposition, + di.description, + di.benefit_type, + di.diagnostic_code, + di.mst_status, + di.pact_status, + array( + select rdi.id + from request_decision_issues rdi + where rdi.decision_issue_id=di.id + ) request_issue_ids, + array( + select rr2 from + ( + select + rr.id, + rr.code, + rr.post_aoj + from remand_reasons rr + where rr.decision_issue_id=di.id + ) rr2 + ) remand_reasons + from decision_issues di + where + di.decision_review_type='Appeal' and + di.decision_review_id = a.id + ) di2 + ) decision_issues, + (select count(id) from hearings h where h.appeal_id=a.id) hearings_count, + ( + select jsonb_agg(h2) from + ( + select + h.*, + ( + select row_to_json(ub) + from (select * from users u where u.id=h.updated_by_id limit 1) ub + ) updated_by, + ( + select row_to_json(hd2) + from (select * from hearing_days hd where hd.id=h.hearing_day_id limit 1) hd2 + ) hearing_day + from + hearings h + where + h.appeal_id=a.id + ) h2 + ) hearings, + ( + select jsonb_agg(t2) from + ( + select + t.* + from tasks t + left join organizations o on o.id=t.assigned_to_id + left join users u on u.id=t.assigned_to_id + where + t.appeal_id=a.id and + t.appeal_type='Appeal' + order by updated_at desc + ) t2 + ) tasks + from appeals a + left join claimants cl on cl.decision_review_id=a.id and cl.decision_review_type='Appeal' + left join people pp on cl.participant_id=pp.participant_id + left join work_modes wm on wm.appeal_id=a.id and wm.appeal_type='Appeal' + left join decision_documents dd on dd.appeal_id=a.id and dd.appeal_type='Appeal' + left join advance_on_docket_motions aod on aod.appeal_id=a.id and aod.person_id=pp.id and aod.appeal_type='Appeal' + left join veterans v on a.veteran_file_number=v.file_number or a.veteran_file_number=v.ssn + SQL + end +end diff --git a/app/services/search_query_service/search_response.rb b/app/services/search_query_service/search_response.rb new file mode 100644 index 00000000000..09ca32c022e --- /dev/null +++ b/app/services/search_query_service/search_response.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +SearchQueryService::SearchResponse = Struct.new(:appeal, :type, :api_response) do + def filter_restricted_info!(statuses) + if statuses.include?(api_response.attributes.status) + api_response.attributes.assigned_to_location = nil + end + end +end diff --git a/app/services/search_query_service/vso_user_search_results.rb b/app/services/search_query_service/vso_user_search_results.rb new file mode 100644 index 00000000000..7b7e313b29e --- /dev/null +++ b/app/services/search_query_service/vso_user_search_results.rb @@ -0,0 +1,68 @@ +# frozen_string_literal: true + +class SearchQueryService::VsoUserSearchResults + def initialize(search_results:, user:) + @user = user + @search_results = search_results + + filter_restricted_results! + end + + def call + established_results.select do |result| + if result.type == :appeal + result.appeal.claimants.any? do |claimant| + vso_participant_ids.include?(poas.dig(claimant.participant_id, :participant_id)) + end + else + vso_participant_ids.include?(poas.dig(result.appeal.veteran.participant_id, :participant_id)) + end + end + end + + private + + attr_reader :search_results, :user + + RESTRICTED_STATUSES = + [ + :distributed_to_judge, + :ready_for_signature, + :on_hold, + :misc, + :unknown, + :assigned_to_attorney + ].freeze + + def filter_restricted_results! + search_results.map do |result| + result.filter_restricted_info!(RESTRICTED_STATUSES) + end + end + + def vso_participant_ids + @vso_participant_ids ||= user.vsos_user_represents.map { |poa| poa[:participant_id] } + end + + def established_results + @established_results ||= search_results.select do |result| + result.type == :legacy_appeal || result.appeal.established_at.present? + end + end + + def claimant_participant_ids + @claimant_participant_ids ||= established_results.flat_map do |result| + result.appeal.claimant_participant_ids + end.uniq + end + + def poas + Rails.logger.info "BGS Called `fetch_poas_by_participant_ids` with \"#{claimant_participant_ids.join('"')}\"" + + @poas ||= bgs.fetch_poas_by_participant_ids(claimant_participant_ids) + end + + def bgs + @bgs ||= BGSService.new + end +end diff --git a/app/workflows/case_search_results_base.rb b/app/workflows/case_search_results_base.rb index ea30ccd739e..23cd70299dd 100644 --- a/app/workflows/case_search_results_base.rb +++ b/app/workflows/case_search_results_base.rb @@ -33,16 +33,52 @@ def search_call ) end + def api_call + @success = valid? + + api_search_results if success + + FormResponse.new( + success: success, + errors: errors.messages[:workflow], + extra: error_status_or_api_search_results + ) + end + protected attr_reader :status, :user - def current_user_is_vso_employee? - user.vso_employee? + def search_page_json_appeals(appeals) + ama_appeals, legacy_appeals = appeals.partition { |appeal| appeal.is_a?(Appeal) } + + ama_hash = WorkQueue::AppealSearchSerializer.new( + ama_appeals, is_collection: true, params: { user: user } + ).serializable_hash + + legacy_hash = WorkQueue::LegacyAppealSearchSerializer.new( + legacy_appeals, is_collection: true, params: { user: user } + ).serializable_hash + + ama_hash[:data].concat(legacy_hash[:data]) end - def appeals - AppealFinder.new(user: user).find_appeals_for_veterans(veterans_user_can_access) + def json_appeals(appeals) + ama_appeals, legacy_appeals = appeals.partition { |appeal| appeal.is_a?(Appeal) } + + ama_hash = WorkQueue::AppealSerializer.new( + ama_appeals, is_collection: true, params: { user: user } + ).serializable_hash + + legacy_hash = WorkQueue::LegacyAppealSerializer.new( + legacy_appeals, is_collection: true, params: { user: user } + ).serializable_hash + + ama_hash[:data].concat(legacy_hash[:data]) + end + + def current_user_is_vso_employee? + user.vso_employee? end def claim_reviews @@ -54,10 +90,14 @@ def veterans [] end + def appeals + [] + end + # Users may also view appeals with appellants whom they represent. # We use this to add these appeals back into results when the user is not on the veteran's poa. def additional_appeals_user_can_access - appeals.filter do |appeal| + appeals.map(&:appeal).filter do |appeal| appeal.veteran_is_not_claimant && user.organizations.any? do |uo| appeal.representatives.include?(uo) @@ -69,40 +109,16 @@ def veterans_user_can_access @veterans_user_can_access ||= veterans.select { |veteran| access?(veteran.file_number) } end - def json_appeals(appeals) - ama_appeals, legacy_appeals = appeals.partition { |appeal| appeal.is_a?(Appeal) } - - ama_hash = WorkQueue::AppealSerializer.new( - ama_appeals, is_collection: true, params: { user: user } - ).serializable_hash - - legacy_hash = WorkQueue::LegacyAppealSerializer.new( - legacy_appeals, is_collection: true, params: { user: user } - ).serializable_hash - - ama_hash[:data].concat(legacy_hash[:data]) - end - - def search_page_json_appeals(appeals) - ama_appeals, legacy_appeals = appeals.partition { |appeal| appeal.is_a?(Appeal) } - - ama_hash = WorkQueue::AppealSearchSerializer.new( - ama_appeals, is_collection: true, params: { user: user } - ).serializable_hash - - legacy_hash = WorkQueue::LegacyAppealSearchSerializer.new( - legacy_appeals, is_collection: true, params: { user: user } - ).serializable_hash - - ama_hash[:data].concat(legacy_hash[:data]) - end - private attr_reader :success def access?(file_number) - !current_user_is_vso_employee? || bgs.can_access?(file_number) + return true if !current_user_is_vso_employee? + + Rails.logger.info "BGS Called `can_access?` with \"#{file_number}\"" + + bgs.can_access?(file_number) end def bgs @@ -128,10 +144,40 @@ def error_status_or_case_search_results case_search_results end + def error_status_or_api_search_results + return { status: status } unless success + + api_search_results + end + + def error_status_or_api_case_search_results + return { status: status } unless success + + api_case_search_results + end + + def api_search_results + @api_search_results ||= { + search_results: { + appeals: json_appeals(appeal_finder_appeals), + claim_reviews: claim_reviews.map(&:search_table_ui_hash) + } + } + end + + def api_case_search_results + @api_case_search_results ||= { + case_search_results: { + appeals: search_page_json_appeals(appeal_finder_appeals), + claim_reviews: claim_reviews.map(&:search_table_ui_hash) + } + } + end + def search_results @search_results ||= { search_results: { - appeals: json_appeals(appeals), + appeals: appeals.map(&:api_response), claim_reviews: claim_reviews.map(&:search_table_ui_hash) } } @@ -140,7 +186,7 @@ def search_results def case_search_results @case_search_results ||= { case_search_results: { - appeals: search_page_json_appeals(appeals), + appeals: appeals.map(&:api_response), claim_reviews: claim_reviews.map(&:search_table_ui_hash) } } diff --git a/app/workflows/case_search_results_for_caseflow_veteran_id.rb b/app/workflows/case_search_results_for_caseflow_veteran_id.rb index 986b3dfdd4d..f835e0bb102 100644 --- a/app/workflows/case_search_results_for_caseflow_veteran_id.rb +++ b/app/workflows/case_search_results_for_caseflow_veteran_id.rb @@ -18,6 +18,18 @@ def veterans attr_reader :caseflow_veteran_ids + def appeal_finder_appeals + AppealFinder.new(user: user).find_appeals_for_veterans(veterans_user_can_access) + end + + def case_search_results + api_case_search_results + end + + def search_results + api_search_result + end + def not_found_error { "title": "Veteran not found", diff --git a/app/workflows/case_search_results_for_docket_number.rb b/app/workflows/case_search_results_for_docket_number.rb index af8ace8a2fb..7f4a6525f11 100644 --- a/app/workflows/case_search_results_for_docket_number.rb +++ b/app/workflows/case_search_results_for_docket_number.rb @@ -15,6 +15,10 @@ def claim_reviews end def appeals + SearchQueryService.new(docket_number: docket_number).search_by_docket_number + end + + def appeal_finder_appeals AppealFinder.find_appeals_by_docket_number(docket_number) end @@ -31,7 +35,7 @@ def not_found_error def veterans # Determine vet that corresponds to docket number so we can validate user can access - @file_numbers_for_appeals ||= appeals.map(&:veteran_file_number) + @file_numbers_for_appeals ||= appeals.map(&:api_response).map(&:attributes).map(&:veteran_file_number) @veterans ||= VeteranFinder.find_or_create_all(@file_numbers_for_appeals) end end diff --git a/app/workflows/case_search_results_for_veteran_file_number.rb b/app/workflows/case_search_results_for_veteran_file_number.rb index 63cd79983b1..1cafc792160 100644 --- a/app/workflows/case_search_results_for_veteran_file_number.rb +++ b/app/workflows/case_search_results_for_veteran_file_number.rb @@ -14,6 +14,26 @@ def initialize(file_number_or_ssn:, user:) attr_reader :file_number_or_ssn + def appeals + if user.vso_employee? + vso_user_search_results + else + search_results + end + end + + def vso_user_search_results + SearchQueryService::VsoUserSearchResults.new(user: user, search_results: search_results).call + end + + def search_results + @search_results ||= SearchQueryService.new(file_number: file_number_or_ssn).search_by_veteran_file_number + end + + def appeal_finder_appeals + AppealFinder.new(user: user).find_appeals_for_veterans(veterans_user_can_access) + end + def file_number_or_ssn_presence return if file_number_or_ssn diff --git a/spec/feature/queue/search_spec.rb b/spec/feature/queue/search_spec.rb index 7be69b901dd..02e393a7350 100644 --- a/spec/feature/queue/search_spec.rb +++ b/spec/feature/queue/search_spec.rb @@ -612,7 +612,9 @@ def perform_search(docket_number = appeal.docket_number) context "when backend returns non-serialized error" do it "displays generic server error message" do - allow(LegacyAppeal).to receive(:fetch_appeals_by_file_number).and_raise(StandardError) + allow_any_instance_of(SearchQueryService).to( + receive(:search_by_veteran_file_number).and_raise(StandardError) + ) visit "/search" fill_in "searchBarEmptyList", with: appeal.sanitized_vbms_id click_on "Search" @@ -655,7 +657,7 @@ def perform_search it "shows 'Withdrawn' text on search results page" do policy = instance_double(WithdrawnDecisionReviewPolicy) - allow(WithdrawnDecisionReviewPolicy).to receive(:new).with(caseflow_appeal).and_return policy + allow(WithdrawnDecisionReviewPolicy).to receive(:new).and_return policy allow(policy).to receive(:satisfied?).and_return true perform_search diff --git a/spec/fixes/assigned_to_search_results_spec.rb b/spec/fixes/assigned_to_search_results_spec.rb index 75765fdddd3..1ef26f380a1 100644 --- a/spec/fixes/assigned_to_search_results_spec.rb +++ b/spec/fixes/assigned_to_search_results_spec.rb @@ -29,7 +29,7 @@ end it "creates tasks and other records associated with a dispatched appeal" do - expect(BVAAppealStatus.new(appeal: appeal).status).to eq :unknown # We will fix this + expect(BVAAppealStatus.new(tasks: appeal.tasks).status).to eq :unknown # We will fix this expect(appeal.root_task.status).to eq "on_hold" visit "/search?veteran_ids=#{appeal.veteran.id}" @@ -57,7 +57,7 @@ } visit "/search?veteran_ids=#{appeal.veteran.id}" expect(page).to have_content("Signed") # in the "Appellant Name" column - expect(BVAAppealStatus.new(appeal: appeal).status).to eq :signed + expect(BVAAppealStatus.new(tasks: appeal.tasks).status).to eq :signed bva_dispatcher = org_dispatch_task.children.first.assigned_to expect(page).to have_content(bva_dispatcher.css_id) # in the "Assigned To" column expect(appeal.assigned_to_location).to eq bva_dispatcher.css_id @@ -65,7 +65,7 @@ BvaDispatchTask.outcode(appeal, params, bva_dispatcher) visit "/search?veteran_ids=#{appeal.veteran.id}" expect(page).to have_content("Dispatched") # in the "Appellant Name" column - expect(BVAAppealStatus.new(appeal: appeal).status).to eq :dispatched + expect(BVAAppealStatus.new(tasks: appeal.tasks).status).to eq :dispatched expect(page).to have_content("Post-decision") # in the "Assigned To" column expect(appeal.assigned_to_location).to eq "Post-decision" expect(appeal.root_task.status).to eq "completed" diff --git a/spec/fixes/backfill_early_ama_appeal_spec.rb b/spec/fixes/backfill_early_ama_appeal_spec.rb index e1ed3774706..e26da3bfe4d 100644 --- a/spec/fixes/backfill_early_ama_appeal_spec.rb +++ b/spec/fixes/backfill_early_ama_appeal_spec.rb @@ -28,7 +28,7 @@ let(:atty_draft_date) { dispatch_date - 2.hours } it "creates tasks and other records associated with a dispatched appeal" do - expect(BVAAppealStatus.new(appeal: appeal).status).to eq :unknown # We will fix this + expect(BVAAppealStatus.new(tasks: appeal.tasks).status).to eq :unknown # We will fix this expect(appeal.root_task.status).to eq "completed" # 1. Create tasks to associate appeal with a judge and attorney @@ -134,7 +134,7 @@ decision_doc = DecisionDocument.create!(params) expect(appeal.decision_document).to eq decision_doc - expect(BVAAppealStatus.new(appeal: appeal).status).to eq :dispatched + expect(BVAAppealStatus.new(tasks: appeal.tasks).status).to eq :dispatched end end end diff --git a/spec/services/bva_appeal_status_spec.rb b/spec/services/bva_appeal_status_spec.rb index 5bdb70c2929..8effec2eb4a 100644 --- a/spec/services/bva_appeal_status_spec.rb +++ b/spec/services/bva_appeal_status_spec.rb @@ -18,7 +18,7 @@ status = pair.first sort_key = pair.last appeal = Appeal.find(appeal_id) - appeal_status = described_class.new(appeal: appeal) + appeal_status = described_class.new(tasks: appeal.tasks) expect(appeal_status.to_s).to eq(status) expect(appeal_status.to_i).to eq(sort_key.to_i + 1) # our sort keys are 1-based diff --git a/spec/services/search_query_service_spec.rb b/spec/services/search_query_service_spec.rb new file mode 100644 index 00000000000..acdd068f880 --- /dev/null +++ b/spec/services/search_query_service_spec.rb @@ -0,0 +1,282 @@ +# frozen_string_literal: true + +describe "SearchQueryService" do + let(:ssn) { "146600001" } + let(:dob) { Faker::Date.in_date_period(year: 1960) } + + let(:uuid) { SecureRandom.uuid } + let(:veteran_first_name) { Faker::Name.first_name } + let(:veteran_last_name) { Faker::Name.last_name } + let(:claimant_first_name) { Faker::Name.first_name } + let(:claimant_last_name) { Faker::Name.last_name } + let(:veteran_full_name) { FullName.new(veteran_first_name, "", veteran_last_name).to_s } + let(:claimant_full_name) { FullName.new(claimant_first_name, "", claimant_last_name).to_s } + let(:docket_type) { "hearing" } + let(:docket_number) { "240111-1111" } + + let(:descision_document_attrs) do + { + decision_date: Faker::Date.between(from: 2.years.ago, to: 1.year.ago) + } + end + + context "all data in caseflow" do + context "veteran is claimant" do + let(:veteran_attrs) do + { + ssn: ssn, + file_number: ssn, + date_of_birth: dob, + date_of_death: nil, + first_name: veteran_first_name, + middle_name: nil, + last_name: veteran_last_name + } + end + + let(:veteran) { FactoryBot.create(:veteran, veteran_attrs) } + + let(:appeal_attributes) do + { + aod_based_on_age: false, + stream_docket_number: docket_number, + veteran_file_number: ssn, + veteran: veteran, + stream_type: Constants.AMA_STREAM_TYPES.original, + uuid: uuid + } + end + + let(:judge) { create(:user, :judge) } + + let!(:appeal) do + FactoryBot.create( + :appeal, + # has hearing(s) + :hearing_docket, + :held_hearing, + :tied_to_judge, + # has decision document + :dispatched, + # has issue(s) + :with_request_issues, + :with_decision_issue, + { + associated_judge: judge, + tied_judge: judge + }.merge(appeal_attributes) + ).tap do |appeal| + appeal.decision_issues.first.update( + mst_status: true, + pact_status: true + ) + appeal.hearings.first.update(updated_by: judge) + # create work mode + appeal.overtime = true + AdvanceOnDocketMotion.create( + person: appeal.claimants.first.person, + appeal: appeal + ) + end.reload + end + + context "finds by docket number" do + subject { SearchQueryService.new(docket_number: appeal.stream_docket_number) } + + it "finds by docket number" do + expect(appeal).to be_persisted + + search_results = subject.search_by_docket_number + + expect(search_results.length).to eq(1) + + result = search_results.first.api_response + + expect(result.id).to be + expect(result.type).to eq "appeal" + + attributes = result.attributes + + expect(attributes.aod).to be_truthy + expect(attributes.appellant_full_name).to eq veteran_full_name + expect(attributes.assigned_to_location).to eq appeal.assigned_to_location + expect(attributes.caseflow_veteran_id).to eq veteran.id + expect(attributes.decision_date).to eq appeal.decision_document.decision_date + expect(attributes.docket_name).to eq appeal.docket_type + expect(attributes.docket_number).to eq appeal.stream_docket_number + expect(attributes.external_id).to eq appeal.uuid + expect(attributes.hearings.length).to eq appeal.hearings.length + expect(attributes.issues.length).to eq(appeal.request_issues.length) + expect(attributes.mst).to eq appeal.decision_issues.any?(&:mst_status) + expect(attributes.pact).to eq appeal.decision_issues.any?(&:pact_status) + expect(attributes.paper_case).to be_falsy + expect(attributes.status).to eq Appeal.find(appeal.id).status.status + expect(attributes.veteran_appellant_deceased).to be_falsy + expect(attributes.veteran_file_number).to eq ssn + expect(attributes.veteran_full_name).to eq veteran_full_name + expect(attributes.contested_claim).to be_falsy + expect(attributes.withdrawn).to eq(false) + end + end + + context "finds by file number" do + subject { SearchQueryService.new(file_number: ssn) } + + it "finds by veteran file number" do + expect(appeal).to be_persisted + + search_results = subject.search_by_veteran_file_number + + expect(search_results.length).to eq(1) + + result = search_results.first.api_response + + expect(result.id).to be + expect(result.type).to eq "appeal" + end + end + end + end + + let(:veteran_address) do + { + addrs_one_txt: nil, + addrs_two_txt: nil, + addrs_three_txt: nil, + city_nm: nil, + cntry_nm: nil, + postal_cd: nil, + zip_prefix_nbr: nil, + ptcpnt_addrs_type_nm: nil + } + end + + let(:legacy_appeal) do + create( + :legacy_appeal, + vbms_id: ssn, + vacols_case: vacols_case, + veteran_address: veteran_address + ) + end + + # must be created first for legacy_appeal factory to find it + let!(:veteran) do + create( + :veteran, + file_number: ssn, + first_name: veteran_first_name, + last_name: veteran_last_name + ) + end + + let(:vacols_decision_date) { 2.weeks.ago } + let(:vacols_case_attrs) do + { + bfkey: ssn, + bfcorkey: ssn, + bfac: "1", + bfcorlid: "100000099", + bfcurloc: "CASEFLOW", + bfddec: vacols_decision_date, + bfmpro: "ACT" + + # bfregoff: "RO18", + # bfdloout: "2024-03-26T11:13:32.000Z", + # bfcallup: "", + # bfhr: "2", + # bfdocind: "T", + } + end + + let(:issues_count) { 5 } + let(:vacols_case_issues) do + create_list( + :case_issue, + issues_count, + isspact: "Y", + issmst: "Y" + ) + end + + let(:hearings_count) { 5 } + let(:vacols_case_hearings) do + create_list( + :case_hearing, + hearings_count + ) + end + + let(:vacols_correspondent) do + create(:correspondent, vacols_correspondent_attrs) + end + + let(:vacols_folder) do + build(:folder) + end + + let(:vacols_case) do + create( + :case, + { + correspondent: vacols_correspondent, + case_issues: vacols_case_issues, + case_hearings: vacols_case_hearings, + folder: vacols_folder + }.merge(vacols_case_attrs) + ) + end + + context "when appeal is a legacy appeal with data in vacols and caseflow" do + context "when veteran is claimant" do + let(:vacols_correspondent_attrs) do + { + sspare2: veteran_first_name, + sspare1: veteran_last_name, + snamel: veteran_last_name, + snamef: veteran_first_name, + stafkey: ssn + } + end + + let!(:claimant) do + create( + :claimant, + type: "VeteranClaimant", + decision_review: legacy_appeal + ) + end + + subject { SearchQueryService.new(file_number: ssn) } + + it "finds by file number" do + search_results = subject.search_by_veteran_file_number + result = search_results.first.api_response + + expect(result.id).to be + expect(result.type).to eq "legacy_appeal" + + attributes = result.attributes + expect(attributes.docket_name).to eq "legacy" + expect(attributes.aod).to be_falsy + expect(attributes.appellant_full_name).to eq veteran_full_name + expect(attributes.assigned_to_location).to eq legacy_appeal.assigned_to_location + expect(attributes.caseflow_veteran_id).to eq veteran.id + expect(attributes.decision_date).to eq AppealRepository.normalize_vacols_date(vacols_decision_date) + expect(attributes.docket_name).to eq "legacy" + expect(attributes.docket_number).to eq vacols_folder.tinum + expect(attributes.external_id).to eq vacols_case.id + expect(attributes.hearings.length).to eq hearings_count + expect(attributes.issues.length).to eq issues_count + expect(attributes.mst).to be_truthy + expect(attributes.pact).to be_truthy + expect(attributes.paper_case).to eq "Paper" + expect(attributes.status).to eq "Active" + expect(attributes.veteran_appellant_deceased).to be_falsy + expect(attributes.veteran_file_number).to eq ssn + expect(attributes.veteran_full_name).to eq veteran_full_name + expect(attributes.withdrawn).to be_falsy + end + end + end +end From 4e12263f83f4b96a531e51ccff670a7478d97be2 Mon Sep 17 00:00:00 2001 From: Noelle Adkin <98478937+NoelleAd@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:14:25 -0400 Subject: [PATCH 43/46] Update service name. (#22762) --- config/initializers/open_telemetry.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb index 17a0ac3991f..1eaf079c9e9 100644 --- a/config/initializers/open_telemetry.rb +++ b/config/initializers/open_telemetry.rb @@ -30,7 +30,7 @@ if !Rails.env.development? && !Rails.env.test? && !Rails.env.demo? OpenTelemetry::SDK.configure do |c| - c.service_name = 'ruby-quickstart' + c.service_name = 'caseflow' c.service_version = '1.0.1' c.use 'OpenTelemetry::Instrumentation::ActiveRecord' From 1dc11a560e56482de278da3d399e4a68abccba79 Mon Sep 17 00:00:00 2001 From: Jeremy Croteau Date: Tue, 10 Sep 2024 14:28:11 -0400 Subject: [PATCH 44/46] feature/APPEALS-34124-43428-29105-28925-33581 - Rails 6.1 upgrade (release) (#22776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔧 Assume defaults for `config.action_dispatch.use_cookies_with_metadata` and `config.action_mailer.delivery_job` The following config settings are not backwards compatible: - config.action_dispatch.use_cookies_with_metadata - config.action_mailer.delivery_job Now that Rails 6.0 is stable on production, we can assume their default values going forward. * ✅ Fix flakey spec * 🔧 Assume default for `config.action_dispatch.use_authenticated_cookie_encryption` Since we are making other cookie configuration changes in this PR for Rails 6.0, this is an opportune time to migrate this Rails 5.2 cookie setting to its default value as well. * ⏪️ Restore overrides for `config.action_dispatch.use_authenticated_cookie_encryption` and `config.action_dispatch.use_cookies_with_metadata` While testing in PreProd, we discovered that, without these cookie config overrides, re-authentication was broken -- after logging out, a user could not log back in. Since the default settings are still optional going forward, we can restore these overrides and devise a solution to migrate cookies later. For more details, see Jira story APPEALS-54897: https://jira.devops.va.gov/browse/APPEALS-54897 * ✨ Add new utility module for adding DB indexes concurrently Introduces `Caseflow::Migrations::AddIndexConcurrently` as a replacement for `Caseflow::Migration` for migrations on ActiveRecord 6.0 and beyond, since `Caseflow::Migration` is forever coupled to ActiveRecord 5.1 due to its extensive use on legacy migrations and should be deprecated moving forward. * 🗑️ Deprecate `Caseflow::Migration` * 🔧 Add instructive error message for non-concurrent `add_index` migrations * 🚨 Address linter / codeclimate complaints * ✨ Introduce `SslRedirectExclusionPolicy` To be used in the environment configuration settings for excluding exempt request paths from SSL redirects when `config. force_ssl = true` * ♻️ Replace deprecated controller-level `force_ssl` Replace deprecated controller-level `force_ssl` with equivalent configuration settings in preparation for the Rails 6.1 upgrade. * 🔥 Remove deprecated config setting `config.active_record.sqlite3.represent_boolean_as_integer` This will have no implications for Caseflow, since we are only using the `sqlite3` adapter nominally for the `demo_vacols` database, which is not actually being used in our demo environments (demo environments are deployed as `development` envs). * ⬆️ Update `caseflow-commons` to resolve sub-dependency conflicts Removes unneeded gems `bourbon` and `neat`, which had a sub-dependency conflict on `thor`. * ⬆️ Update rails and other gems as necessary * 🐛 Fix 'uninitialized constant' error when loading app * ⬆️ bin/rails app:update - Apply relevant changes * 🔧 Override default for `config.active_record.has_many_inversing` * 🔧 Assume default for `config.active_storage.track_variants` We're not currently using ActiveStorage in Caseflow, so it is safe to just assume the default here. * 🔧 Override default for `config.active_job.retry_jitter` The default jitter is probably safe, however, I'm not 100% sure that we don't have any jobs that need to be requeued with exact wait times. So we let's override this for now to stay on the safe side. * 🔧 Assume default for `config.active_job.skip_after_callbacks_if_terminated` We're not currently using `throw :abort` within any `before_enqueue`/`before_perform`  callbacks on existing Caseflow jobs, so the default should be fine here. For more background, see https://lilyreile.medium.com/rails-6-1-new-framework-defaults-what-they-do-and-how-to-safely-uncomment-them-c546b70f0c5e#4c60 * 🔧 Assume default for `config.action_dispatch.cookies_same_site_protection` This setting controls the `SameSite` optional attribute for the `Set-Cookie` header. `SameSite=Lax` means that the cookie is not sent on cross-site requests, such as on requests to load images or frames, but is sent when a user is navigating to the origin site from an external site (for example, when following a link). This is the default behavior if the SameSite attribute is not specified. `Lax` is currently the default assumed by both Chrome and Edge browsers when this attribute is left unspecified, so assuming this value should be sensible. It allows us to have our cake (blocking CSRF attacks) and eat it too (providing a logged-in experience when users navigate to Caseflow across origins). For more background, see - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value - https://lilyreile.medium.com/rails-6-1-new-framework-defaults-what-they-do-and-how-to-safely-uncomment-them-c546b70f0c5e#1f15 * 🔧 Assume default for `config.action_controller.urlsafe_csrf_tokens` * 🔧 Assume default for `ActiveSupport.utc_to_local_returns_utc_offset_times` We're not using `ActiveSupport::TimeZone.utc_to_local` anywhere, so the default is safe to assume here. * 🔧 Assume default for `config.action_dispatch.ssl_default_redirect_status` The default is safe to assume. For more background, see https://lilyreile.medium.com/rails-6-1-new-framework-defaults-what-they-do-and-how-to-safely-uncomment-them-c546b70f0c5e#4c3e * 🔧 Assume default for `config.active_record.legacy_connection_handling` The default should be safe to assume here, as we do not do any role or shard switching on database connections. For more background, see https://lilyreile.medium.com/rails-6-1-new-framework-defaults-what-they-do-and-how-to-safely-uncomment-them-c546b70f0c5e#8007 * 🔧 Assume default for `config.action_view.form_with_generates_remote_forms` We don't use the `form_with` helper anywhere, so this behavior change is inconsequential for us, and we can safely assume the new default. * 🔧 Assume default for `config.active_storage.queues.analysis` We do not use ActiveStorage, so the default is safe to assume here. * 🔧 Assume default for `config.active_storage.queues.purge` We do not use ActiveStorage, so the default is safe to assume here. * 🔧 Assume default for `config.action_mailbox.queues.incineration` We don't use ActionMailbox, so the new default is safe to assume here. * 🔧 Assume default for `config.action_mailbox.queues.routing` We do not use ActionMailbox, so the default is safe to assume here. * 🔧 Assume default for `config.action_mailer.deliver_later_queue_name` We're not using `ActionMailer::MessageDelivery #deliver_later` anywhere, so the default is safe to assume. * 🔧 Assume default for `config.action_view.preload_links_header` This flag can be safely uncommented. Browsers that support Link headers will get a performance boost. Browsers that don’t will ignore them. We override in `development` environments to avoid an edge case leading to an HTTP response header overflow. For more background, see https://lilyreile.medium.com/rails-6-1-new-framework-defaults-what-they-do-and-how-to-safely-uncomment-them-c546b70f0c5e#3679 * 🔥 Remove 'new_framework_defaults_6_1.rb' * 🔧 Load defaults for Rails 6.1 * ♻️ Extract constant * ♻️ Migrate to new Rails deprecation config where applicable * ♻️ Push members down now that there is only one subclass * 🩹 Add forgotten disallowed deprecation warning This deprecation warning was addressed by the following PR, but we forgot to add it to the list of disallowed deprecation warnings: https://github.com/department-of-veterans-affairs/caseflow/pull/21614 * 💡 Update comment Task `rake routes` has been replaced with `rails routes` * ✅ Update test to account for change to `ActionDispatch::Response#content_type`  `ActionDispatch::Response#content_type` now returns the full Content-Type header * 🚨 Exclude 'config.ru' from Rubocop cops * 🚚 Move 'db/etl/migrate' to 'db/etl_migrate' * 🚚 Move 'db/etl/schema.rb' to 'db/etl_schema.rb' * ♻️ Arrange 'database.yml' configs by environment Group DB configs by environment in anticipation of reformatting for Rails 6+ multi-DB configuration. * 🔧 Reformat 'database.yml' to Rails 6+ multi-DB conventions * 🔧 Add etl migration paths to DB config * 🔧 Update DB connection names in 'database_cleaner' config * ♻️ Use new database-specific rake tasks After migrating to the Rails 6+ native multi-database configuration, the behavior of some DB management tasks, such as `rake db:migrate` changed such that they now act on ALL databases and not just the primary database. So we must replace the invocations of these tasks with their new, database-specific counterparts. * ➖ Remove 'multiverse' gem Now that we have fiully transitioned to Rails-native multi-database support, we are no longer reliant on the 'multiverse' gem and can remove it. * 🗃️ Prohibit execution of vacols DB and non-DB-specific rake tasks After transitioning to Rails-native multi-DB support, the behavior of some DB tasks changed such that they will now act on ALL databases and not just the primary database (ex. `rake db:migrate` will now migrate ALL databases). To avoid accidents, we re-define these tasks here to no-op and output a helpful message to redirect developers toward using their new database-specific counterparts instead. * ♻️ Create new environment for GH workflow 'Make-docs-to-webpage' Instead of performing a bunch of hard-to-maintain `sed` gymnastics to modify the existing 'test' environment, let's create a new 'make_docs' environment (based off of 'test') and configure it appropriately for use by the 'Make-docs-to-webpage' GH workflow. * 💚 Remove redundant DB migrations from CI workflow Task `db:schema:load` already loads the checked in schema, so there should be no need to run `db:migrate` afterwards. * 🐛 Fix `spec/mailers/hearing_mailer_spec.rb` - `NoMethodError` Addresses the following error: NoMethodError: undefined method `build_lookup_context' for ActionView::Base:Class * 🐛 Fix `spec/workflows/post_decision_motion_updater_spec.rb` - `FrozenError` Addresses the following error: FrozenError: can't modify frozen Hash: {} * ✅ Add test for `RoSchedulePeriod` * 🐛 Fix `spec/models/schedule_period_spec.rb` - `ActiveRecord::RecordInvalid` Apparently, there were some changes to the inner workings of `ActiveModel::Errors` in Rails 6.1, causing a model to be considered invalid in the case that `errors[:base] == [[]]`. This makes sense, as `[[]]` is not considered "empty". Unfortunately, this was causing `RoSchedulePeriod #validate_spreadsheet` to inadvertently mark the model as invalid upon creation. `HearingSchedule::ValidateRoSpreadsheet #validate` returns an empty array (`[]`) when valid, which gets pushes onto the `RoSchedulePeriod` `errors[:base]` array, resulting in a non-empty array (`[[]]`) and an erroneously invalid disposition. Furthermore, calling `<<` to an `ActiveModel::Errors` message array in order to add an error is a deprecated, so we can take this opportunity to use the new `#add` API to hit two birds with one stone. The change implemented here is not a pure refactoring, however the end-user experience is unchanged in terms of how errors are presented when attempting to upload a spreadsheet with multiple non-conformities. Down the road, we may want to consider moving `HearingSchedule::ValidateRoSpreadsheet` toward using `ActiveModel::Validations` in order to leverage the full `ActiveModel::Errors` API and construct the errors object in the prescribed manner. For more details see - https://api.rubyonrails.org/v6.1.7.7/classes/ActiveModel/Validations.html - https://api.rubyonrails.org/v6.1.7.7/classes/ActiveModel/Errors.html * 🐛 Fix `spec/mailers/hearing_mailer_spec.rb` - `ActionView::Template::Error` * ✅ Fix `spec/models/veteran_spec.rb` * ✅ Fix `spec/sql/ama_cases_sql_spec.rb` Addresses failures such as the below: 0) AMA Cases Tableau data source expected report calculates age and AOD based on person.dob Failure/Error: expect(aod_case["aod_veteran.age"]).to eq("76") expected: "76" got: 0.76e2 * ✅ Fix multiple specs - `Minitest::UnexpectedError` Test helper method `#perform_enqueued_jobs` now wraps exceptions in an `Minitest::UnexpectedError`: https://github.com/rails/rails/blob/914caca2d31bd753f47f9168f2a375921d9e91cc/activejob/lib/active_job/test_helper.rb#L591 So, to assert that a specific exception is raised during execution of the `#perform_enqueued_jobs` block, we must rescue the `Minitest::UnexpectedError` and make the assertion on its error message instead. * ✅ Fix `spec/lib/helpers/association_wrapper_spec.rb` * ✅ Fix `spec/controllers/api/v1/jobs_controller_spec.rb` In Rails 6.1, `ActiveJob #perform_now` was changed to behave as it did once before (at the behest of GitHub), returning the value fo the job instead of true/false. See related GH issue: https://github.com/rails/rails/issues/38040 * 🐛 Fix `spec/controllers/appeals_controller_spec.rb` - `NoMethodError` Addresses error: NoMethodError: undefined method `workflow' for # 0) AppealsController GET appeals when current user is a System Admin when request header does not contain Veteran ID responds with an error Failure/Error: errors: errors.messages[:workflow], NoMethodError: undefined method `workflow' for # # ./app/workflows/case_search_results_base.rb:31:in `search_call' * 🐛 Fix `CaseSearchResultsBase` validations Addresses test failures in `spec/controllers/appeals_controller_spec.rb` similar to the below: AppealsController GET appeals when current user is a System Admin when request header does not contain Veteran ID responds with an error Failure/Error: expect(response_body["errors"][0]["title"]).to eq "Veteran file number missing" expected: "Veteran file number missing" got: nil Using `ActiveModel::Errors` to store error data in an arbitrary format may have been somewhat permissible in the past, but it is an abuse of the object's intended use and is also proving incompatible with the more formalized `ActiveModels::Errors` API in Rails 6.1. In order to preserve the existing response shape of the affected JSON endpoints, we need to move away from the `ActiveModel::Validations` implementation on `CaseSearchResultsBase` (and its descendent classes) to a more bespoke method of performing validations and aggregating errors, since Rails 6.1 `ActiveModel::Errors` is no longer appropriate for our needs here. * ✅ Fix `spec/controllers/application_controller_spec.rb` -- Cache-Control error Addresses the test failure below: ApplicationController no cache headers when toggle set sets Cache-Control etc Failure/Error: expect(response.headers["Cache-Control"]).to eq "no-cache, no-store" expected: "no-cache, no-store" got: "no-store" (compared using ==) # ./spec/controllers/application_controller_spec.rb:59:in `block (4 levels) in ' In Rails 6.1, the `no-store` directive is exclusive of any others that are set on the `Cache-Control` header, which makes sense given the specification https://datatracker.ietf.org/doc/html/rfc7234#section-3 This change was implemented in PR https://github.com/rails/rails/pull/39461 Since it no longer makese sense to set both `no-store` and `no-cache` directives, we will only set `no-store` here, as that is the stronger of the two. * 🐛 Fix multiple specs - `ActiveRecord::EagerLoadPolymorphicError` Addresses multiple test failures caused by the error below: QueueConfig.to_hash title when assigned to an org is formatted as expected Failure/Error: tasks.with_assignees.group("assignees.display_name").count(:all).each_pair.map do |option, count| label = self.class.format_option_label(option, count) self.class.filter_option_hash(option, label) end ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :appeal # ./app/models/queue_column.rb:110:in `assignee_options' * 🐛 Fix `spec/models/task_spec.rb` - `update_all` clears query cache In Rails 6.1.7.7, the method `ActiveRecord::Relation #update_all` will now clear any records cached by the calling relation. This was altering the behavior of `Task #cancel_task_and_child_subtasks` and causing the following test failure: Task#cancel_task_and_child_subtasks cancels all tasks and child subtasks Failure/Error: expect(second_level_tasks[0].versions.count).to eq(initial_versions + 2) expected: 3 got: 2 (compared using ==) # ./spec/models/task_spec.rb:368:in `block (3 levels) in ' To remedy, we will now cache the necessary Task records in an Array, which can be used for generating PaperTrail versions both before and after the `update_all`. * 🐛 Fix `spec/services/hearings/calendar_service_spec.rb` - template rendering error Addresses the following test failure: Hearings::CalendarService.confirmation_calendar_invite returns appropriate iCalendar event Failure/Error: expect(ical_event.description).to eq(expected_description) expected: "You're scheduled for a virtual hearing with a Veterans Law Judge of the Board of Veterans' Appeals.\...to reschedule or cancel your virtual hearing, contact us by email at bvahearingteamhotline@va.gov\n" got: # * 🐛 Fix YAML syntax error caused by whitespace in ENV var Address the following error, found during demo deployment: rake aborted! Cannot load database configuration: YAML syntax error occurred while parsing /caseflow/config/database.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Error: (): could not find expected ':' while scanning a simple key at line 49 column 5 * ⬆️ Update `caseflow-commons` dependency to latest ref Removes `bourbon` and `neat` dependencies. --- .codeclimate.yml | 3 + .github/workflows/make-docs.yml | 34 +- .github/workflows/workflow.yml | 4 +- .reek.yml | 2 +- .rubocop.yml | 1 + Dangerfile | 6 +- Gemfile | 17 +- Gemfile.lock | 219 ++++++------- MAC_INTEL.md | 4 +- MAC_M1.md | 4 +- Makefile.example | 15 +- Rakefile | 3 +- WINDOWS_11.md | 4 +- app/controllers/api/application_controller.rb | 5 - .../application_base_controller.rb | 5 - app/controllers/application_controller.rb | 2 +- app/controllers/users_controller.rb | 2 +- app/models/etl/record.rb | 2 +- app/models/queue_column.rb | 2 +- app/models/ro_schedule_period.rb | 5 +- app/models/task.rb | 5 +- app/models/vacols/record.rb | 2 +- app/policies/ssl_redirect_exclusion_policy.rb | 27 ++ .../deprecation_warnings/base_handler.rb | 23 -- .../development_handler.rb | 24 -- .../production_handler.rb | 23 +- .../deprecation_warnings/test_handler.rb | 24 -- app/services/hearings/calendar_service.rb | 27 +- app/workflows/case_search_results_base.rb | 48 ++- ..._search_results_for_caseflow_veteran_id.rb | 6 +- .../case_search_results_for_docket_number.rb | 6 +- ..._search_results_for_veteran_file_number.rb | 10 +- app/workflows/post_decision_motion_updater.rb | 8 +- bin/rails | 4 +- bin/rake | 4 +- bin/setup | 8 +- bin/spring | 16 - bin/yarn | 12 +- config.ru | 5 +- config/application.rb | 40 ++- config/boot.rb | 4 +- config/database.yml | 207 ++++++------ config/environment.rb | 2 +- config/environments/development.rb | 30 +- config/environments/make_docs.rb | 152 +++++++++ config/environments/production.rb | 25 +- config/environments/test.rb | 19 +- config/initializers/backtrace_silencers.rb | 7 +- .../initializers/deprecation_warnings.rb | 22 +- .../initializers/filter_parameter_logging.rb | 4 +- config/initializers/permissions_policy.rb | 11 + config/initializers/strong_migrations.rb | 18 ++ config/initializers/warmup_vacols.rb | 2 +- config/puma.rb | 7 +- config/routes.rb | 2 - .../20191111164808_create_etl_appeals.rb | 0 .../20191119204827_create_etl_users.rb | 0 .../20191120184256_create_etl_tasks.rb | 0 .../20191120213930_create_etl_people.rb | 0 ...20191120213941_create_etl_organizations.rb | 0 ...1126164353_remove_users_vacols_not_null.rb | 0 .../20191126203511_add_appeal_timestamps.rb | 0 .../20191209162326_add_appeal_status_sort.rb | 0 .../20191212221851_org_status_change.rb | 0 .../20191212222617_org_status_default.rb | 0 .../20191213194037_add_task_id_index.rb | 0 ...1217193046_create_attorney_case_reviews.rb | 0 .../20191217202614_create_decision_issues.rb | 0 ...8214351_add_more_cached_user_attributes.rb | 0 ...91223213954_add_email_address_to_person.rb | 0 .../20200114201144_add_aod_due_to_age.rb | 0 ...00116215235_add_claimant_dob_to_appeals.rb | 0 ...0121221718_add_appeals_claimant_indexes.rb | 0 .../20200212205344_add_etl_build_tables.rb | 0 .../20200303223155_add_etl_users_index.rb | 0 ...00429152715_create_vha_decision_reviews.rb | 0 .../20200429164923_create_hearings.rb | 0 .../20200430152234_add_hearing_type.rb | 0 ...200501211351_change_hearing_day_id_null.rb | 0 .../20200504133723_change_css_limit.rb | 0 .../20200504204154_remove_null_hearings.rb | 0 ...41923_drop_legacy_hearing_scheduled_for.rb | 0 ...20200517021335_create_etl_remand_reason.rb | 0 ...ha_decision_reviews_to_decision_reviews.rb | 0 ...214159_change_decision_reviews_comments.rb | 0 ...9214329_change_decision_reviews_indices.rb | 0 ...221508_add_decision_issue_benefit_index.rb | 0 .../20200520220924_add_person_ssn.rb | 0 ...xt_and_percent_number_to_decision_issue.rb | 0 ...iority_pushed_cases_to_etl_organization.rb | 0 ...rity_pushed_cases_index_on_organization.rb | 0 ...124530_remove_etl_decision_issues_index.rb | 0 ...cision_issues_rating_issue_ref_id_index.rb | 0 ...0810115309_create_etl_judge_case_review.rb | 0 ...0810115459_create_etl_decision_document.rb | 0 ...0818172716_add_ama_only_to_organization.rb | 0 ...n_null_constraint_on_appeal_docket_type.rb | 0 ..._null_constraint_on_appeal_receipt_date.rb | 0 ..._appeals_from_affinity_to_organizations.rb | 0 ...6_add_scheduled_in_timezone_to_hearings.rb | 0 db/{etl/schema.rb => etl_schema.rb} | 0 docker-bin/env.sh | 3 +- docker-bin/startup.sh | 3 +- lib/caseflow/migration.rb | 21 +- .../migrations/add_index_concurrently.rb | 101 ++++++ lib/tasks/db.rake | 300 ++++++++++++++++++ lib/tasks/local/build.rake | 4 +- lib/tasks/local/destroy.rake | 2 +- lib/tasks/spec.rake | 2 +- scripts/squash.sh | 2 +- .../api/v1/jobs_controller_spec.rb | 2 +- .../application_controller_spec.rb | 2 +- .../decision_reviews_controller_spec.rb | 2 +- spec/factories/ro_schedule_period.rb | 2 +- spec/feature/non_comp/report_page_spec.rb | 9 +- spec/lib/helpers/association_wrapper_spec.rb | 2 +- spec/lib/tasks/db_spec.rb | 295 +++++++++++++++++ spec/models/ro_schedule_period_spec.rb | 22 ++ spec/models/veteran_spec.rb | 103 ++++-- spec/requests/ssl_redirects_spec.rb | 75 +++++ .../development_handler_spec.rb | 46 --- .../production_handler_spec.rb | 6 - .../deprecation_warnings/test_handler_spec.rb | 38 --- spec/sql/ama_cases_sql_spec.rb | 4 +- spec/support/database_cleaner.rb | 40 ++- spec/workflows/ama_appeal_dispatch_spec.rb | 5 +- spec/workflows/legacy_appeal_dispatch_spec.rb | 5 +- 127 files changed, 1599 insertions(+), 670 deletions(-) create mode 100644 app/policies/ssl_redirect_exclusion_policy.rb delete mode 100644 app/services/deprecation_warnings/base_handler.rb delete mode 100644 app/services/deprecation_warnings/development_handler.rb delete mode 100644 app/services/deprecation_warnings/test_handler.rb delete mode 100755 bin/spring create mode 100644 config/environments/make_docs.rb rename app/services/deprecation_warnings/disallowed_deprecations.rb => config/initializers/deprecation_warnings.rb (64%) create mode 100644 config/initializers/permissions_policy.rb rename db/{etl/migrate => etl_migrate}/20191111164808_create_etl_appeals.rb (100%) rename db/{etl/migrate => etl_migrate}/20191119204827_create_etl_users.rb (100%) rename db/{etl/migrate => etl_migrate}/20191120184256_create_etl_tasks.rb (100%) rename db/{etl/migrate => etl_migrate}/20191120213930_create_etl_people.rb (100%) rename db/{etl/migrate => etl_migrate}/20191120213941_create_etl_organizations.rb (100%) rename db/{etl/migrate => etl_migrate}/20191126164353_remove_users_vacols_not_null.rb (100%) rename db/{etl/migrate => etl_migrate}/20191126203511_add_appeal_timestamps.rb (100%) rename db/{etl/migrate => etl_migrate}/20191209162326_add_appeal_status_sort.rb (100%) rename db/{etl/migrate => etl_migrate}/20191212221851_org_status_change.rb (100%) rename db/{etl/migrate => etl_migrate}/20191212222617_org_status_default.rb (100%) rename db/{etl/migrate => etl_migrate}/20191213194037_add_task_id_index.rb (100%) rename db/{etl/migrate => etl_migrate}/20191217193046_create_attorney_case_reviews.rb (100%) rename db/{etl/migrate => etl_migrate}/20191217202614_create_decision_issues.rb (100%) rename db/{etl/migrate => etl_migrate}/20191218214351_add_more_cached_user_attributes.rb (100%) rename db/{etl/migrate => etl_migrate}/20191223213954_add_email_address_to_person.rb (100%) rename db/{etl/migrate => etl_migrate}/20200114201144_add_aod_due_to_age.rb (100%) rename db/{etl/migrate => etl_migrate}/20200116215235_add_claimant_dob_to_appeals.rb (100%) rename db/{etl/migrate => etl_migrate}/20200121221718_add_appeals_claimant_indexes.rb (100%) rename db/{etl/migrate => etl_migrate}/20200212205344_add_etl_build_tables.rb (100%) rename db/{etl/migrate => etl_migrate}/20200303223155_add_etl_users_index.rb (100%) rename db/{etl/migrate => etl_migrate}/20200429152715_create_vha_decision_reviews.rb (100%) rename db/{etl/migrate => etl_migrate}/20200429164923_create_hearings.rb (100%) rename db/{etl/migrate => etl_migrate}/20200430152234_add_hearing_type.rb (100%) rename db/{etl/migrate => etl_migrate}/20200501211351_change_hearing_day_id_null.rb (100%) rename db/{etl/migrate => etl_migrate}/20200504133723_change_css_limit.rb (100%) rename db/{etl/migrate => etl_migrate}/20200504204154_remove_null_hearings.rb (100%) rename db/{etl/migrate => etl_migrate}/20200508141923_drop_legacy_hearing_scheduled_for.rb (100%) rename db/{etl/migrate => etl_migrate}/20200517021335_create_etl_remand_reason.rb (100%) rename db/{etl/migrate => etl_migrate}/20200519213755_change_vha_decision_reviews_to_decision_reviews.rb (100%) rename db/{etl/migrate => etl_migrate}/20200519214159_change_decision_reviews_comments.rb (100%) rename db/{etl/migrate => etl_migrate}/20200519214329_change_decision_reviews_indices.rb (100%) rename db/{etl/migrate => etl_migrate}/20200519221508_add_decision_issue_benefit_index.rb (100%) rename db/{etl/migrate => etl_migrate}/20200520220924_add_person_ssn.rb (100%) rename db/{etl/migrate => etl_migrate}/20200526054515_add_subject_text_and_percent_number_to_decision_issue.rb (100%) rename db/{etl/migrate => etl_migrate}/20200715110034_add_accepts_priority_pushed_cases_to_etl_organization.rb (100%) rename db/{etl/migrate => etl_migrate}/20200715110603_add_accepts_priority_pushed_cases_index_on_organization.rb (100%) rename db/{etl/migrate => etl_migrate}/20210729124530_remove_etl_decision_issues_index.rb (100%) rename db/{etl/migrate => etl_migrate}/20210729130353_add_etl_decision_issues_rating_issue_ref_id_index.rb (100%) rename db/{etl/migrate => etl_migrate}/20210810115309_create_etl_judge_case_review.rb (100%) rename db/{etl/migrate => etl_migrate}/20210810115459_create_etl_decision_document.rb (100%) rename db/{etl/migrate => etl_migrate}/20210818172716_add_ama_only_to_organization.rb (100%) rename db/{etl/migrate => etl_migrate}/20220107125705_remove_non_null_constraint_on_appeal_docket_type.rb (100%) rename db/{etl/migrate => etl_migrate}/20220110143457_remove_non_null_constraint_on_appeal_receipt_date.rb (100%) rename db/{etl/migrate => etl_migrate}/20240129200527_add_exclude_appeals_from_affinity_to_organizations.rb (100%) rename db/{etl/migrate => etl_migrate}/20240617205006_add_scheduled_in_timezone_to_hearings.rb (100%) rename db/{etl/schema.rb => etl_schema.rb} (100%) create mode 100644 lib/caseflow/migrations/add_index_concurrently.rb create mode 100644 lib/tasks/db.rake create mode 100644 spec/lib/tasks/db_spec.rb create mode 100644 spec/requests/ssl_redirects_spec.rb delete mode 100644 spec/services/deprecation_warnings/development_handler_spec.rb delete mode 100644 spec/services/deprecation_warnings/test_handler_spec.rb diff --git a/.codeclimate.yml b/.codeclimate.yml index ff4076a1126..f16d7d860f0 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -52,6 +52,7 @@ plugins: mass_threshold: 81 exclude_patterns: - 'db/migrate/*' + - 'db/etl_migrate/*' - 'app/controllers/idt/api/v2/appeals_controller.rb' - 'spec/controllers/idt/api/v2/appeals_controller_spec.rb' - 'spec/controllers/idt/api/appeals_controller_spec.rb' @@ -79,6 +80,7 @@ plugins: enabled: false exclude_patterns: - 'db/migrate/*' + - 'db/etl_migrate/*' - 'app/jobs/dispatch_email_job.rb' - 'app/mailers/dispatch_mailer.rb' rubocop: @@ -115,6 +117,7 @@ plugins: exclude_patterns: - 'db/schema.rb' + - 'db/etl_schema.rb' - 'db/seeds.rb' - 'db/scripts/*' - 'node_modules/**/*' diff --git a/.github/workflows/make-docs.yml b/.github/workflows/make-docs.yml index 3dccd6568ed..7d4516d5621 100644 --- a/.github/workflows/make-docs.yml +++ b/.github/workflows/make-docs.yml @@ -40,32 +40,6 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - # Since installing a client to Oracle DB is a pain and setting up the VACOLS DB is not necessary, let's skip it. - - name: Remove references to VACOLS Oracle DB - run: | - sed '/ruby-oci8/d' -i Gemfile - sed '/activerecord-oracle_enhanced-adapter/d' -i Gemfile - - # Would like to run `bundle lock --update` to update Gemfile.lock without installing gems (to be done in next step) - # but bundler is not installed yet, so manually modify it: - sed '/ruby-oci8/d' -i Gemfile.lock - sed '/^ activerecord-oracle_enhanced-adapter/,/^ [a-z]/{/^ activerecord-oracle_enhanced-adapter/!{/^ [a-z]/!d}}' -i Gemfile.lock - sed '/activerecord-oracle_enhanced-adapter/d' -i Gemfile.lock - sed '/ruby-plsql/d' -i Gemfile.lock - - # Remove VACOLS database configuration - # https://stackoverflow.com/questions/6287755/using-sed-to-delete-all-lines-between-two-matching-patterns - sed '/_vacols:$/,/^$/{/^_vacols:$/!{/^$/!d}}' -i config/database.yml - - # Even though it won't be used in this script, Rails expects a 'test_vacols' configuration due to "#{Rails.env}_vacols" - echo '# Copied from demo_vacols configuration - test_vacols: - adapter: postgresql - pool: 1 - timeout: 5000 - database: test-vacols - ' >> config/database.yml - - name: Setup Ruby and install gems uses: ruby/setup-ruby@v1 with: @@ -73,17 +47,17 @@ jobs: - name: Setup test database env: - RAILS_ENV: test + RAILS_ENV: make_docs POSTGRES_HOST: localhost POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres run: | echo "::group::Set up Caseflow DB" - bin/rails db:create && bin/rails db:schema:load + bin/rails db:create:primary && bin/rails db:schema:load:primary echo "::endgroup::" echo "::group::Set up Caseflow ETL DB" - DB=etl bundle exec rake db:create db:schema:load + bundle exec rake db:create:etl db:schema:load:etl echo "::endgroup::" # Skipping VACOLS since Oracle DB is not set up @@ -95,7 +69,7 @@ jobs: - name: Create DB schema documentation env: - RAILS_ENV: test + RAILS_ENV: make_docs POSTGRES_HOST: localhost POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index c33f56c9b6a..f2dec46dfae 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -193,8 +193,8 @@ jobs: - name: Database setup run: | - ./ci-bin/capture-log "DB=etl bundle exec rake db:create db:schema:load db:migrate" - ./ci-bin/capture-log "bundle exec rake db:create db:schema:load db:migrate" + ./ci-bin/capture-log "bundle exec rake db:create:etl db:schema:load:etl" + ./ci-bin/capture-log "bundle exec rake db:create:primary db:schema:load:primary" ./ci-bin/capture-log "make -f Makefile.example external-db-create" # added line to create external table(s) that are needed for tests diff --git a/.reek.yml b/.reek.yml index 727b53e049b..cd12f9cc576 100644 --- a/.reek.yml +++ b/.reek.yml @@ -291,5 +291,5 @@ directories: # Directories and files below will not be scanned at all exclude_paths: - db/migrate - - db/etl/migrate + - db/etl_migrate - spec diff --git a/.rubocop.yml b/.rubocop.yml index 8773441a13f..68a4a88ff03 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -6,6 +6,7 @@ AllCops: Exclude: - 'bin/**/*' - 'db/**/*' + - 'config.ru' - 'config/**/*' - 'script/**/*' - 'vendor/**/*' diff --git a/Dangerfile b/Dangerfile index 21b9e8bb4c3..1fb8280ddae 100644 --- a/Dangerfile +++ b/Dangerfile @@ -35,19 +35,19 @@ if git.modified_files.grep(/db\/schema.rb/).any? warn("This PR changes the schema. Please use the PR template checklist.") end -if git.modified_files.grep(/db\/etl\/schema.rb/).any? +if git.modified_files.grep(/db\/etl_schema.rb/).any? warn("This PR changes the etl schema. Please use the PR template checklist.") end new_db_migrations = git.modified_files.grep(/db\/migrate\//).any? -new_etl_migrations = git.modified_files.grep(/db\/etl\/migrate\//).any? +new_etl_migrations = git.modified_files.grep(/db\/etl_migrate\//).any? # migration without migrating if new_db_migrations && git.modified_files.grep(/db\/schema.rb/).none? warn("This PR contains db migrations, but the schema.rb is not modified. Did you forget to run 'make migrate'?") end -if new_etl_migrations && git.modified_files.grep(/db\/etl\/schema.rb/).none? +if new_etl_migrations && git.modified_files.grep(/db\/etl_schema.rb/).none? warn("This PR contains etl migrations, but the etl schema.rb is not modified. Did you forget to run 'make migrate'?") end diff --git a/Gemfile b/Gemfile index 17eec027d43..92e60188bc8 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ source ENV["GEM_SERVER_URL"] || "https://rubygems.org" # State machine gem "aasm", "4.11.0" -gem "activerecord-import" +gem "activerecord-import", "1.0.3" gem "acts_as_tree" # amoeba gem for cloning appeals @@ -17,7 +17,7 @@ gem "bgs", git: "https://github.com/department-of-veterans-affairs/ruby-bgs.git" gem "bootsnap", require: false gem "browser" gem "business_time", "~> 0.9.3" -gem "caseflow", git: "https://github.com/department-of-veterans-affairs/caseflow-commons", ref: "716b58caf2116da5fca21c3b3aeea6c9712f3b9d" +gem "caseflow", git: "https://github.com/department-of-veterans-affairs/caseflow-commons", ref: "9bd3635fbd8094d25160669f38d8699e2f1d7a98" gem "connect_mpi", git: "https://github.com/department-of-veterans-affairs/connect-mpi.git", ref: "a3a58c64f85b980a8b5ea6347430dd73a99ea74c" gem "connect_vbms", git: "https://github.com/department-of-veterans-affairs/connect_vbms.git", ref: "9807d9c9f0f3e3494a60b6693dc4f455c1e3e922" gem "console_tree_renderer", git: "https://github.com/department-of-veterans-affairs/console-tree-renderer.git", tag: "v0.1.1" @@ -33,9 +33,6 @@ gem "icalendar" gem "kaminari" gem "logstasher" gem "moment_timezone-rails" -# Rails 6 has native support for multiple dbs, so prefer that over multiverse after upgrade. -# https://github.com/ankane/multiverse#upgrading-to-rails-6 -gem "multiverse" gem "newrelic_rpm" gem "nokogiri", ">= 1.11.0.rc4" gem "paper_trail", "~> 12.0" @@ -56,7 +53,7 @@ gem "pg", platforms: :ruby # Discussion: https://github.com/18F/college-choice/issues/597#issuecomment-139034834 gem "puma", "5.6.4" gem "rack", "~> 2.2.6.2" -gem "rails", "6.0.6.1" +gem "rails", "6.1.7.7" # Used to colorize output for rake tasks gem "rainbow" # React @@ -80,7 +77,7 @@ gem "stringex", require: false gem "strong_migrations" # print trees gem "tty-tree" -gem "tzinfo", "1.2.10" +gem "tzinfo", "~> 2.0" # Use Uglifier as compressor for JavaScript assets gem "uglifier", ">= 1.3.0" gem "validates_email_format_of" @@ -88,14 +85,14 @@ gem "ziptz" group :production, :staging, :ssh_forwarding, :development, :test do # Oracle DB - gem "activerecord-oracle_enhanced-adapter", "~> 6.0.0" + gem "activerecord-oracle_enhanced-adapter", "~> 6.1.0" gem "ruby-oci8", "~> 2.2" end -group :test, :development, :demo do +group :test, :development, :demo, :make_docs do # Security scanners gem "brakeman" - gem "bullet" + gem "bullet", "~> 6.1.0" gem "bundler-audit" # Testing tools gem "capybara" diff --git a/Gemfile.lock b/Gemfile.lock index 2239aa22953..f2db3b52b7f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,16 +9,14 @@ GIT GIT remote: https://github.com/department-of-veterans-affairs/caseflow-commons - revision: 716b58caf2116da5fca21c3b3aeea6c9712f3b9d - ref: 716b58caf2116da5fca21c3b3aeea6c9712f3b9d + revision: 9bd3635fbd8094d25160669f38d8699e2f1d7a98 + ref: 9bd3635fbd8094d25160669f38d8699e2f1d7a98 specs: caseflow (0.4.8) aws-sdk-s3 - bourbon (= 4.2.7) d3-rails jquery-rails momentjs-rails - neat rails (>= 4.2.7.1) redis-namespace redis-rails @@ -100,66 +98,70 @@ GEM remote: https://rubygems.org/ specs: aasm (4.11.0) - actioncable (6.0.6.1) - actionpack (= 6.0.6.1) + actioncable (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) 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) + actionmailbox (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (>= 2.7.1) - actionmailer (6.0.6.1) - actionpack (= 6.0.6.1) - actionview (= 6.0.6.1) - activejob (= 6.0.6.1) + actionmailer (6.1.7.7) + actionpack (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (~> 2.5, >= 2.5.4) 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) + actionpack (6.1.7.7) + actionview (= 6.1.7.7) + activesupport (= 6.1.7.7) + rack (~> 2.0, >= 2.0.9) 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) + actiontext (6.1.7.7) + actionpack (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) nokogiri (>= 1.8.5) - actionview (6.0.6.1) - activesupport (= 6.0.6.1) + actionview (6.1.7.7) + activesupport (= 6.1.7.7) builder (~> 3.1) 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) + activejob (6.1.7.7) + activesupport (= 6.1.7.7) 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) - activerecord-import (1.0.2) + activemodel (6.1.7.7) + activesupport (= 6.1.7.7) + activerecord (6.1.7.7) + activemodel (= 6.1.7.7) + activesupport (= 6.1.7.7) + activerecord-import (1.0.3) activerecord (>= 3.2) - activerecord-oracle_enhanced-adapter (6.0.6) - activerecord (~> 6.0.0) + activerecord-oracle_enhanced-adapter (6.1.6) + activerecord (~> 6.1.0) ruby-plsql (>= 0.6.0) - activestorage (6.0.6.1) - actionpack (= 6.0.6.1) - activejob (= 6.0.6.1) - activerecord (= 6.0.6.1) + activestorage (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activesupport (= 6.1.7.7) marcel (~> 1.0) - activesupport (6.0.6.1) + mini_mime (>= 1.1.0) + activesupport (6.1.7.7) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) acts_as_tree (2.9.0) activerecord (>= 3.0.0) addressable (2.8.0) @@ -1455,24 +1457,22 @@ GEM aws-eventstream (~> 1, >= 1.0.2) backport (1.2.0) base64 (0.2.0) + benchmark (0.3.0) benchmark-ips (2.7.2) bootsnap (1.7.5) msgpack (~> 1.0) - bourbon (4.2.7) - sass (~> 3.4) - thor (~> 0.19) brakeman (4.7.1) browser (5.3.1) builder (3.2.4) - bullet (6.0.1) + bullet (6.1.5) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) bummr (0.5.0) rainbow thor - bundler-audit (0.6.1) + bundler-audit (0.9.1) bundler (>= 1.2.0, < 3) - thor (~> 0.18) + thor (~> 1.0) business_time (0.9.3) activesupport (>= 3.2.0) tzinfo @@ -1531,24 +1531,29 @@ GEM date (3.3.3) ddtrace (0.34.1) msgpack + dead_end (4.0.0) debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.14) - derailed_benchmarks (1.3.6) + derailed_benchmarks (2.1.2) benchmark-ips (~> 2) + dead_end get_process_mem (~> 0) heapy (~> 0) - memory_profiler (~> 0) + memory_profiler (>= 0, < 2) + mini_histogram (>= 0.3.0) rack (>= 1) - rake (> 10, < 13) - thor (~> 0.19) + rack-test + rake (> 10, < 14) + ruby-statistics (>= 2.1) + thor (>= 0.19, < 2) diff-lcs (1.3) docile (1.1.5) dogstatsd-ruby (4.4.0) - dotenv (2.7.5) - dotenv-rails (2.7.5) - dotenv (= 2.7.5) - railties (>= 3.2, < 6.1) + dotenv (2.8.1) + dotenv-rails (2.8.1) + dotenv (= 2.8.1) + railties (>= 3.2) dry-configurable (0.11.5) concurrent-ruby (~> 1.0) dry-core (~> 0.4, >= 0.4.7) @@ -1580,6 +1585,7 @@ GEM dry-equalizer (~> 0.3) dry-inflector (~> 0.1, >= 0.1.2) dry-logic (~> 1.0, >= 1.0.2) + e2mmap (0.1.0) ecma-re-validator (0.2.1) regexp_parser (~> 1.2) erubi (1.12.0) @@ -1613,8 +1619,8 @@ GEM git (1.13.2) addressable (~> 2.8) rchardet (~> 1.8) - globalid (1.1.0) - activesupport (>= 5.0) + globalid (1.2.1) + activesupport (>= 6.1) govdelivery-tms (2.8.4) activesupport faraday @@ -1702,8 +1708,7 @@ GEM net-imap net-pop net-smtp - marcel (1.0.2) - maruku (0.7.3) + marcel (1.0.4) memory_profiler (0.9.14) meta_request (0.7.2) rack-contrib (>= 1.1, < 3) @@ -1712,6 +1717,7 @@ GEM mime-types (3.3) mime-types-data (~> 3.2015) mime-types-data (3.2019.1009) + mini_histogram (0.3.1) mini_mime (1.1.2) mini_portile2 (2.8.5) minitest (5.19.0) @@ -1720,13 +1726,7 @@ GEM railties (>= 3.1) msgpack (1.4.2) multipart-post (2.1.1) - multiverse (0.2.2) - activerecord (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) nap (1.1.0) - neat (4.0.0) - thor (~> 0.19) nenv (0.3.0) net-imap (0.3.7) date @@ -1755,8 +1755,8 @@ GEM activerecord (>= 5.2) request_store (~> 1.1) parallel (1.23.0) - paranoia (2.4.2) - activerecord (>= 4.0, < 6.1) + paranoia (2.6.3) + activerecord (>= 5.1, < 7.2) parser (2.7.2.0) ast (~> 2.4.1) pdf-forms (1.2.0) @@ -1782,20 +1782,20 @@ GEM rack (~> 2.0) 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) + rails (6.1.7.7) + actioncable (= 6.1.7.7) + actionmailbox (= 6.1.7.7) + actionmailer (= 6.1.7.7) + actionpack (= 6.1.7.7) + actiontext (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activemodel (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) + bundler (>= 1.15.0) + railties (= 6.1.7.7) sprockets-rails (>= 2.0.0) rails-dom-testing (2.1.1) activesupport (>= 5.0.0) @@ -1809,12 +1809,12 @@ GEM 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) + railties (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) method_source - rake (>= 0.8.7) - thor (>= 0.20.3, < 2.0) + rake (>= 12.2) + thor (~> 1.0) rainbow (3.1.1) rake (12.3.3) rb-fsevent (0.11.2) @@ -1918,6 +1918,7 @@ GEM ruby-plsql (0.8.0) ruby-prof (1.4.1) ruby-progressbar (1.13.0) + ruby-statistics (3.0.2) ruby_dep (1.5.0) ruby_parser (3.20.3) sexp_processor (~> 4.16) @@ -1966,18 +1967,20 @@ GEM single_cov (1.3.2) sixarm_ruby_unaccent (1.2.0) socksify (1.7.1) - solargraph (0.38.0) + solargraph (0.40.1) backport (~> 1.1) + benchmark bundler (>= 1.17.2) + e2mmap jaro_winkler (~> 1.5) - maruku (~> 0.7, >= 0.7.3) - nokogiri (~> 1.9, >= 1.9.1) + kramdown (~> 2.3) + kramdown-parser-gfm (~> 1.1) parser (~> 2.3) - reverse_markdown (~> 1.0, >= 1.0.5) - rubocop (~> 0.52) - thor (~> 0.19, >= 0.19.4) + reverse_markdown (>= 1.0.5, < 3) + rubocop (>= 0.52) + thor (~> 1.0) tilt (~> 2.0) - yard (~> 0.9) + yard (~> 0.9, >= 0.9.24) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -1993,19 +1996,18 @@ GEM terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) test-prof (0.10.1) - thor (0.20.3) - thread_safe (0.3.6) + thor (1.3.1) tilt (2.0.8) timecop (0.9.1) timeout (0.4.0) tty-tree (0.3.0) - tzinfo (1.2.10) - thread_safe (~> 0.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) uglifier (4.1.20) execjs (>= 0.3.0, < 3) unicode-display_width (1.8.0) unicode_utils (1.4.0) - uniform_notifier (1.12.1) + uniform_notifier (1.16.0) uri_template (0.7.0) validates_email_format_of (1.6.3) i18n @@ -2047,8 +2049,8 @@ PLATFORMS DEPENDENCIES aasm (= 4.11.0) - activerecord-import - activerecord-oracle_enhanced-adapter (~> 6.0.0) + activerecord-import (= 1.0.3) + activerecord-oracle_enhanced-adapter (~> 6.1.0) acts_as_tree amoeba anbt-sql-formatter @@ -2057,7 +2059,7 @@ DEPENDENCIES bootsnap brakeman browser - bullet + bullet (~> 6.1.0) bummr bundler-audit business_time (~> 0.9.3) @@ -2093,7 +2095,6 @@ DEPENDENCIES logstasher meta_request moment_timezone-rails - multiverse newrelic_rpm nokogiri (>= 1.11.0.rc4) paper_trail (~> 12.0) @@ -2108,7 +2109,7 @@ DEPENDENCIES pry-byebug (~> 3.9) puma (= 5.6.4) rack (~> 2.2.6.2) - rails (= 6.0.6.1) + rails (= 6.1.7.7) rails-erd rainbow rb-readline @@ -2149,7 +2150,7 @@ DEPENDENCIES test-prof timecop tty-tree - tzinfo (= 1.2.10) + tzinfo (~> 2.0) uglifier (>= 1.3.0) validates_email_format_of webdrivers diff --git a/MAC_INTEL.md b/MAC_INTEL.md index 18fc4ea6a06..ee480bdb68d 100644 --- a/MAC_INTEL.md +++ b/MAC_INTEL.md @@ -96,12 +96,12 @@ 27. Run `make reset` * If issues occur: - 1. Run `bundle exec rake db:create` + 1. Run `bundle exec rake db:create:primary` * If you get connection issues stating no file to be found, run the following: * `rm /opt/homebrew/var/postgres/postmaster.pid` or possibly `rm /usr/local/var/postgres/postmaster.pid` * `brew services restart postgresql` 2. Run `bundle exec rake local:vacols:seed` - 3. Run `bundle exec rake db:schema:load db:seed` + 3. Run `bundle exec rake db:schema:load:primary db:seed` 27. Open a new tab in terminal diff --git a/MAC_M1.md b/MAC_M1.md index 31d15d8eca6..2fbe9244ae4 100644 --- a/MAC_M1.md +++ b/MAC_M1.md @@ -194,7 +194,7 @@ Running Caseflow 5. Start Vacols UTM VM (if not already running) 6. run `make up-m1` to create the docker containers and volumes 7. run `make reset` to (re)create and seed the database; this takes a while (~45 minutes) - 1. if you get a database not found error, run `bundle exec rake db:drop db:create db:schema:load`, and then run `make reset` again + 1. if you get a database not found error, run `bundle exec rake db:drop:primary db:create:primary db:schema:load:primary`, and then run `make reset` again 8. open a second terminal tab/window 9. run `make run-backend-m1` in one tab, and `make run-frontend` in the other 1. the backend should launch on `localhost:3000`. go there in your browser to access Caseflow @@ -566,7 +566,7 @@ The following steps are an alternative to step 7 of the Running Caseflow section * d. `make reset` * i. Resets caseflow and ETL database schemas, seeds databases, and enables feature flags * **If `make reset` returns database not found error: - * a. Run command `bundle exec rake db:drop` + * a. Run command `bundle exec rake db:drop:primary` * b. Download caseflow-db-backup.gz (not able to share this download via policy, ask in the slack channel) * c. Enter terminal, navigate to ~/Downloads * e. Run command diff --git a/Makefile.example b/Makefile.example index 2c1d7565a97..f37b02940ed 100644 --- a/Makefile.example +++ b/Makefile.example @@ -222,19 +222,19 @@ c: ## Start rails console bundle exec rails console etl-migrate: ## Migrate ETL database - DB=etl bundle exec rake db:migrate + bundle exec rake db:migrate:etl etl-test-prepare: - DB=etl bundle exec rake db:test:prepare + bundle exec rake db:test:prepare:etl etl-rollback: ## Rollback ETL database - DB=etl bundle exec rake db:rollback + bundle exec rake db:rollback:etl db-migrate: ## Migrate main Caseflow db - bundle exec rake db:migrate + bundle exec rake db:migrate:primary db-rollback: ## Rollback main Caseflow db - bundle exec rake db:rollback + bundle exec rake db:rollback:primary migrate: external-db-remove etl-migrate etl-test-prepare db-migrate ## Migrate all non-external Rails databases @@ -246,8 +246,8 @@ fresh: ## https://github.com/imsky/git-fresh - updates local master to match or reset: reset-dbs seed-dbs enable-feature-flags ## Resets databases and enable feature flags reset-dbs: ## Resets Caseflow and ETL database schemas - DB=etl bundle exec rake db:drop db:create db:schema:load - bundle exec rake db:drop db:create db:schema:load + bundle exec rake db:drop:etl db:create:etl db:schema:load:etl + bundle exec rake db:drop:primary db:create:primary db:schema:load:primary make consolidated_db_scripts seed-vbms-ext-claim: ## Seed only vbms_ext_claim @@ -260,7 +260,6 @@ seed-dbs: ## Seed all databases bundle exec rake local:vacols:seed bundle exec rake spec:setup_vacols bundle exec rake db:seed - DB=etl bundle exec rake db:seed enable-feature-flags: ## enable all feature flags bundle exec rails runner scripts/enable_features_dev.rb diff --git a/Rakefile b/Rakefile index 838add5d4e9..dac0a4b9bb8 100644 --- a/Rakefile +++ b/Rakefile @@ -10,4 +10,5 @@ Dir[Rails.root.join("lib/tasks/support/**/*.rb")].sort.each { |f| require f } Rails.application.load_tasks -task "db:schema:dump": "strong_migrations:alphabetize_columns" +task "db:schema:dump:primary": "strong_migrations:alphabetize_columns" +task "db:schema:dump:etl": "strong_migrations:alphabetize_columns" diff --git a/WINDOWS_11.md b/WINDOWS_11.md index 2b8139175f4..8d7f388a3d9 100644 --- a/WINDOWS_11.md +++ b/WINDOWS_11.md @@ -134,9 +134,9 @@ Run each line is a separate command, run them one at a time 26. ```cd ~/appeals/caseflow in terminal``` -27. ```bin/rails db:migrate RAILS_ENV=development``` +27. ```bin/rails db:migrate:primary RAILS_ENV=development``` -28. Run ```bundle install``` to install missing gems and then ```bin/rails db:migrate``` ```RAILS_ENV=development``` command if you have too again. +28. Run ```bundle install``` to install missing gems and then ```bin/rails db:migrate:primary``` ```RAILS_ENV=development``` command if you have too again. 29. ```make reset``` (should have split_correlation_tables) diff --git a/app/controllers/api/application_controller.rb b/app/controllers/api/application_controller.rb index ea12981e0fc..adb315f0d93 100644 --- a/app/controllers/api/application_controller.rb +++ b/app/controllers/api/application_controller.rb @@ -5,7 +5,6 @@ class Api::ApplicationController < ActionController::Base include TrackRequestId - force_ssl if: :ssl_enabled? before_action :strict_transport_security before_action :setup_fakes, @@ -51,10 +50,6 @@ def unauthorized render json: { status: "unauthorized" }, status: :unauthorized end - def ssl_enabled? - Rails.env.production? - end - def strict_transport_security response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains" if request.ssl? end diff --git a/app/controllers/application_base_controller.rb b/app/controllers/application_base_controller.rb index 41f55a7fe3b..f9b1304a804 100644 --- a/app/controllers/application_base_controller.rb +++ b/app/controllers/application_base_controller.rb @@ -8,7 +8,6 @@ class ApplicationBaseController < ActionController::Base include TrackRequestId - force_ssl if: :ssl_enabled? before_action :check_out_of_service before_action :strict_transport_security @@ -35,10 +34,6 @@ def check_out_of_service render "out_of_service", layout: "application" if Rails.cache.read("out_of_service") end - def ssl_enabled? - Rails.env.production? - end - def strict_transport_security response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains" if request.ssl? end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c34519195e4..277121cf689 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -273,7 +273,7 @@ def set_no_cache_headers # https://stackoverflow.com/a/748646 def no_cache # :nocov: - response.headers["Cache-Control"] = "no-cache, no-store" + response.headers["Cache-Control"] = "no-store" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" # waaaay in the past # :nocov: diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 437047dd68b..63b65843dd6 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -88,7 +88,7 @@ def filter_by_organization end # Depending on the route and the requested resource, the requested user's id could be sent as :id or :user_id - # ex from rake routes: user GET /users/:id or user_task_pages GET /users/:user_id/task_pages + # ex from rails routes: user GET /users/:id or user_task_pages GET /users/:user_id/task_pages def id @id ||= params[:id] || params[:user_id] end diff --git a/app/models/etl/record.rb b/app/models/etl/record.rb index 79819d27973..a71604ee94c 100644 --- a/app/models/etl/record.rb +++ b/app/models/etl/record.rb @@ -16,7 +16,7 @@ class ETL::Record < ApplicationRecord self.abstract_class = true - establish_connection :"etl_#{Rails.env}" + establish_connection :etl class << self def sync_with_original(original) diff --git a/app/models/queue_column.rb b/app/models/queue_column.rb index b848c345925..750639de49a 100644 --- a/app/models/queue_column.rb +++ b/app/models/queue_column.rb @@ -107,7 +107,7 @@ def task_type_options(tasks) end def assignee_options(tasks) - tasks.with_assignees.group("assignees.display_name").count(:all).each_pair.map do |option, count| + tasks.with_assignees.group("display_name").count(:all).each_pair.map do |option, count| label = self.class.format_option_label(option, count) self.class.filter_option_hash(option, label) end diff --git a/app/models/ro_schedule_period.rb b/app/models/ro_schedule_period.rb index 3966864cb65..7fdbbf7cee0 100644 --- a/app/models/ro_schedule_period.rb +++ b/app/models/ro_schedule_period.rb @@ -17,8 +17,9 @@ class RoSchedulePeriod < SchedulePeriod # Run various validations on the uploaded spreadsheet and record errors def validate_spreadsheet - validate_spreadsheet = HearingSchedule::ValidateRoSpreadsheet.new(spreadsheet, start_date, end_date) - errors[:base] << validate_spreadsheet.validate + spreadsheet_errors = HearingSchedule::ValidateRoSpreadsheet.new(spreadsheet, start_date, end_date).validate + errors.add(:base, spreadsheet_errors) if spreadsheet_errors.any? + errors[:base] end # Create NonAvailibility records for ROs and CO and Allocation records for each RO diff --git a/app/models/task.rb b/app/models/task.rb index f74de948c52..b2244e0f1b0 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -724,15 +724,14 @@ def previous_task def cancel_task_and_child_subtasks # Cancel all descendants at the same time to avoid after_update hooks marking some tasks as completed. # it would be better if we could allow the callbacks to happen sanely - descendant_ids = descendants.pluck(:id) # by avoiding callbacks, we aren't saving PaperTrail versions # Manually save the state before and after. - tasks = Task.open.where(id: descendant_ids) + tasks = Task.open.where(id: descendants).to_a transaction do tasks.each { |task| task.paper_trail.save_with_version } - tasks.update_all( + Task.where(id: tasks).update_all( status: Constants.TASK_STATUSES.cancelled, cancelled_by_id: RequestStore[:current_user]&.id, closed_at: Time.zone.now diff --git a/app/models/vacols/record.rb b/app/models/vacols/record.rb index cf6070a6c70..145c5b0466d 100644 --- a/app/models/vacols/record.rb +++ b/app/models/vacols/record.rb @@ -3,7 +3,7 @@ class VACOLS::Record < ApplicationRecord self.abstract_class = true - establish_connection "#{Rails.env}_vacols".to_sym + establish_connection :vacols ActiveSupport.run_load_hooks(:active_record_vacols, VACOLS::Record) # This method calculates the appropriate date & timezone diff --git a/app/policies/ssl_redirect_exclusion_policy.rb b/app/policies/ssl_redirect_exclusion_policy.rb new file mode 100644 index 00000000000..41f19dba046 --- /dev/null +++ b/app/policies/ssl_redirect_exclusion_policy.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# @note To be used in the environment configuration settings for excluding exempt request paths from SSL redirects +# when `config.force_ssl = true` +# +# @example config/environments/production.rb +# +# Rails.application.configure do +# config.force_ssl = true +# config.ssl_options = { redirect: { exclude: SslRedirectExclusionPolicy } } +# # etc. +class SslRedirectExclusionPolicy + EXEMPT_PATH_PATTERNS = [ + %r{^/api/docs/v3/}, + %r{^/api/metadata$}, + %r{^/health-check$}, + %r{^/idt/api/v1/}, + %r{^/idt/api/v2/}, + %r{^/pdfjs/} + ].freeze + + # @param [ActionDispatch::Request] request + # @return [TrueClass, FalseClass] true if request path is exempt from an SSL redirect + def self.call(request) + EXEMPT_PATH_PATTERNS.any? { |pattern| pattern =~ request.path } + end +end diff --git a/app/services/deprecation_warnings/base_handler.rb b/app/services/deprecation_warnings/base_handler.rb deleted file mode 100644 index 65b473bfb38..00000000000 --- a/app/services/deprecation_warnings/base_handler.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -# @abstract Subclass and override {.call} to implement a custom DeprecationWarnings handler class. -# @note For use with `ActiveSupport::Deprecation.behavior=`. -module DeprecationWarnings - class BaseHandler - class << self - # Subclasses must respond to `.call` to play nice with `ActiveSupport::Deprecation.behavior=`. - # https://github.com/rails/rails/blob/a4581b53aae93a8dd3205abae0630398cbce9204/activesupport/lib/active_support/deprecation/behaviors.rb#L70-L71 - # :reek:LongParameterList - def call(_message, _callstack, _deprecation_horizon, _gem_name) - fail NotImplementedError - end - - # Subclasses must respond to `.arity` to play nice with `ActiveSupport::Deprecation.behavior=`. - # Must return number of arguments accepted by `.call`. - # https://github.com/rails/rails/blob/a4581b53aae93a8dd3205abae0630398cbce9204/activesupport/lib/active_support/deprecation/behaviors.rb#L101 - def arity - method(:call).arity - end - end - end -end diff --git a/app/services/deprecation_warnings/development_handler.rb b/app/services/deprecation_warnings/development_handler.rb deleted file mode 100644 index a61d262e5e6..00000000000 --- a/app/services/deprecation_warnings/development_handler.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require_relative "disallowed_deprecations" - -# @note For use with `ActiveSupport::Deprecation.behavior=`. -module DeprecationWarnings - class DevelopmentHandler < BaseHandler - extend DisallowedDeprecations - - class << self - # :reek:LongParameterList - def call(message, _callstack, _deprecation_horizon, _gem_name) - raise_if_disallowed_deprecation!(message) - emit_warning_to_application_logs(message) - end - - private - - def emit_warning_to_application_logs(message) - Rails.logger.warn(message) - end - end - end -end diff --git a/app/services/deprecation_warnings/production_handler.rb b/app/services/deprecation_warnings/production_handler.rb index fe1c1310d78..7e4f70d0743 100644 --- a/app/services/deprecation_warnings/production_handler.rb +++ b/app/services/deprecation_warnings/production_handler.rb @@ -1,27 +1,32 @@ # frozen_string_literal: true -# @note For use with `ActiveSupport::Deprecation.behavior=`. +# @note For use with `ActiveSupport::Deprecation.behavior=` or `Rails.application.config.active_support.deprecation=` module DeprecationWarnings - class ProductionHandler < BaseHandler + class ProductionHandler APP_NAME = "caseflow" + SLACK_ALERT_TITLE = "Deprecation Warning - #{APP_NAME} (#{ENV['DEPLOY_ENV']})" SLACK_ALERT_CHANNEL = "#appeals-deprecation-alerts" class << self + # Adhere to `.call` signature expected by `ActiveSupport::Deprecation.behavior=`. + # https://github.com/rails/rails/blob/a4581b53aae93a8dd3205abae0630398cbce9204/activesupport/lib/active_support/deprecation/behaviors.rb#L70-L71 # :reek:LongParameterList def call(message, callstack, deprecation_horizon, gem_name) - emit_warning_to_application_logs(message) emit_warning_to_sentry(message, callstack, deprecation_horizon, gem_name) emit_warning_to_slack_alerts_channel(message) rescue StandardError => error Raven.capture_exception(error) end - private - - def emit_warning_to_application_logs(message) - Rails.logger.warn(message) + # Must respond to `.arity` to play nice with `ActiveSupport::Deprecation.behavior=` + # and return number of arguments accepted by `.call`. + # https://github.com/rails/rails/blob/a4581b53aae93a8dd3205abae0630398cbce9204/activesupport/lib/active_support/deprecation/behaviors.rb#L101 + def arity + method(:call).arity end + private + # :reek:LongParameterList def emit_warning_to_sentry(message, callstack, deprecation_horizon, gem_name) # Pre-emptive bugfix for future versions of the `sentry-raven` gem: @@ -44,9 +49,7 @@ def emit_warning_to_sentry(message, callstack, deprecation_horizon, gem_name) end def emit_warning_to_slack_alerts_channel(message) - slack_alert_title = "Deprecation Warning - #{APP_NAME} (#{ENV['DEPLOY_ENV']})" - - SlackService.new.send_notification(message, slack_alert_title, SLACK_ALERT_CHANNEL) + SlackService.new.send_notification(message, SLACK_ALERT_TITLE, SLACK_ALERT_CHANNEL) end end end diff --git a/app/services/deprecation_warnings/test_handler.rb b/app/services/deprecation_warnings/test_handler.rb deleted file mode 100644 index b87945be19c..00000000000 --- a/app/services/deprecation_warnings/test_handler.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -require_relative "disallowed_deprecations" - -# @note For use with `ActiveSupport::Deprecation.behavior=`. -module DeprecationWarnings - class TestHandler < BaseHandler - extend DisallowedDeprecations - - class << self - # :reek:LongParameterList - def call(message, _callstack, _deprecation_horizon, _gem_name) - raise_if_disallowed_deprecation!(message) - emit_error_to_stderr(message) - end - - private - - def emit_error_to_stderr(message) - ActiveSupport::Logger.new($stderr).error(message) - end - end - end -end diff --git a/app/services/hearings/calendar_service.rb b/app/services/hearings/calendar_service.rb index caf1936b7ab..8a9be76d602 100644 --- a/app/services/hearings/calendar_service.rb +++ b/app/services/hearings/calendar_service.rb @@ -8,11 +8,6 @@ # emails. class Hearings::CalendarService - class CalendarEventView < ActionView::Base - include Hearings::CalendarTemplateHelper - include Hearings::AppellantNameHelper - end - class << self # Sent when first switching a video hearing to a virtual hearing, # and also when the scheduled time for an existing virtual hearing @@ -100,24 +95,10 @@ def create_calendar_event(hearing) end def render_virtual_hearing_calendar_event_template(email_recipient_info, event_type, locals) - lookup_context = ActionView::Base.build_lookup_context(ActionController::Base.view_paths) - context = CalendarEventView.new(lookup_context) - - # Some *~ magic ~* here. The recipient title is used to determine which template to load: - # - # judge_confirmation_event_description - # representative_confirmation_event_description - # veteran_confirmation_event_description - # - # representative_changed_to_video_event_description - # veteran_changed_to_video_event_description - - template_name = "#{email_recipient_info.title.downcase}_#{event_type}_event_description" - - context.render( - template: "hearing_mailer/calendar_events/#{template_name}", - locals: locals - ) + template_name = + "hearing_mailer/calendar_events/#{email_recipient_info.title.downcase}_#{event_type}_event_description" + + ApplicationController.render(template: template_name, locals: locals) end end end diff --git a/app/workflows/case_search_results_base.rb b/app/workflows/case_search_results_base.rb index ea30ccd739e..f8e4e1a0528 100644 --- a/app/workflows/case_search_results_base.rb +++ b/app/workflows/case_search_results_base.rb @@ -1,12 +1,35 @@ # frozen_string_literal: true class CaseSearchResultsBase - include ActiveModel::Validations + class AbstractMethodError < StandardError; end - validate :vso_employee_has_access + # @note Data Transfer Object (DTO) for encapsulating error data grouped by attribute + class Errors + attr_accessor :messages + + private :messages= + + delegate :none?, to: :messages + + def initialize + @messages = Hash.new([]) + end + + # @param attribute [Symbol] attribute the error is associated with + # @param title [String] summary of the error + # @param detail [String] detailed description of the error + # + # @example + # add(:workflow, title: "Access to Veteran file prohibited", + # detail: "You do not have access to this claims file number") + def add(attribute, title:, detail:) + messages[attribute.to_sym] += [{ title: title, detail: detail }] + end + end def initialize(user:) @user = user + @errors = Errors.new end def call @@ -99,8 +122,25 @@ def search_page_json_appeals(appeals) private + attr_accessor :errors attr_reader :success + def valid? + validate_vso_employee_has_access + validation_hook + errors.none? + end + + # @note (Optional) hook method to be implemented by subclasses for performing subclass-specific validations. + # @example + # def validation_hook + # unless foobar_has_bazbah? + # errors.add(:workflow, title: "Veteran file number missing", + # detail: "HTTP_CASE_SEARCH request header must include Veteran file number") + # end + # end + def validation_hook; end + def access?(file_number) !current_user_is_vso_employee? || bgs.can_access?(file_number) end @@ -109,7 +149,7 @@ def bgs @bgs ||= BGSService.new end - def veterans_exist + def validate_veterans_exist return unless veterans_user_can_access.empty? errors.add(:workflow, not_found_error) @@ -146,7 +186,7 @@ def case_search_results } end - def vso_employee_has_access + def validate_vso_employee_has_access return unless current_user_is_vso_employee? errors.add(:workflow, prohibited_error) if diff --git a/app/workflows/case_search_results_for_caseflow_veteran_id.rb b/app/workflows/case_search_results_for_caseflow_veteran_id.rb index 986b3dfdd4d..3fe2b5604df 100644 --- a/app/workflows/case_search_results_for_caseflow_veteran_id.rb +++ b/app/workflows/case_search_results_for_caseflow_veteran_id.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class CaseSearchResultsForCaseflowVeteranId < ::CaseSearchResultsBase - validate :veterans_exist - def initialize(caseflow_veteran_ids:, user:) super(user: user) @caseflow_veteran_ids = caseflow_veteran_ids @@ -18,6 +16,10 @@ def veterans attr_reader :caseflow_veteran_ids + def validation_hook + validate_veterans_exist + end + def not_found_error { "title": "Veteran not found", diff --git a/app/workflows/case_search_results_for_docket_number.rb b/app/workflows/case_search_results_for_docket_number.rb index af8ace8a2fb..6c16a50a46d 100644 --- a/app/workflows/case_search_results_for_docket_number.rb +++ b/app/workflows/case_search_results_for_docket_number.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class CaseSearchResultsForDocketNumber < ::CaseSearchResultsBase - validate :veterans_exist, if: :current_user_is_vso_employee? - def initialize(docket_number:, user:) super(user: user) @docket_number = docket_number.to_s if docket_number @@ -22,6 +20,10 @@ def appeals attr_reader :docket_number + def validation_hook + validate_veterans_exist if current_user_is_vso_employee? + end + def not_found_error { "title": "Docket ID not found", diff --git a/app/workflows/case_search_results_for_veteran_file_number.rb b/app/workflows/case_search_results_for_veteran_file_number.rb index 63cd79983b1..3f0f97fe466 100644 --- a/app/workflows/case_search_results_for_veteran_file_number.rb +++ b/app/workflows/case_search_results_for_veteran_file_number.rb @@ -1,9 +1,6 @@ # frozen_string_literal: true class CaseSearchResultsForVeteranFileNumber < ::CaseSearchResultsBase - validate :file_number_or_ssn_presence - validate :veterans_exist, if: :current_user_is_vso_employee? - def initialize(file_number_or_ssn:, user:) super(user: user) # Ensure we have a string made of solely numeric characters @@ -14,7 +11,12 @@ def initialize(file_number_or_ssn:, user:) attr_reader :file_number_or_ssn - def file_number_or_ssn_presence + def validation_hook + validate_file_number_or_ssn_presence + validate_veterans_exist if current_user_is_vso_employee? + end + + def validate_file_number_or_ssn_presence return if file_number_or_ssn errors.add(:workflow, missing_veteran_file_number_or_ssn_error) diff --git a/app/workflows/post_decision_motion_updater.rb b/app/workflows/post_decision_motion_updater.rb index 70585da819e..45341485500 100644 --- a/app/workflows/post_decision_motion_updater.rb +++ b/app/workflows/post_decision_motion_updater.rb @@ -69,7 +69,7 @@ def create_motion end unless motion.valid? - errors.messages.merge!(motion.errors.messages) + errors.merge!(motion.errors) return end @@ -85,13 +85,13 @@ def handle_denial_or_dismissal abstract_task = create_abstract_task unless abstract_task.valid? - errors.messages.merge!(abstract_task.errors.messages) + errors.merge!(abstract_task.errors) return end new_task = create_denial_or_dismissal_task(abstract_task) unless new_task.valid? - errors.messages.merge!(new_task.errors.messages) + errors.merge!(new_task.errors) return end new_task.save @@ -132,7 +132,7 @@ def create_new_stream_tasks(stream) ) unless attorney_task.valid? - errors.messages.merge!(attorney_task.errors.messages) + errors.merge!(attorney_task.errors) return end diff --git a/bin/rails b/bin/rails index 07396602377..6fb4e4051c4 100755 --- a/bin/rails +++ b/bin/rails @@ -1,4 +1,4 @@ #!/usr/bin/env ruby APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake index 17240489f64..4fbf10b960e 100755 --- a/bin/rake +++ b/bin/rake @@ -1,4 +1,4 @@ #!/usr/bin/env ruby -require_relative '../config/boot' -require 'rake' +require_relative "../config/boot" +require "rake" Rake.application.run diff --git a/bin/setup b/bin/setup index 5853b5ea875..90700ac4f9a 100755 --- a/bin/setup +++ b/bin/setup @@ -1,5 +1,5 @@ #!/usr/bin/env ruby -require 'fileutils' +require "fileutils" # path to your application root. APP_ROOT = File.expand_path('..', __dir__) @@ -9,8 +9,8 @@ def system!(*args) end FileUtils.chdir APP_ROOT do - # This script is a way to setup or update your development environment automatically. - # This script is idempotent, so that you can run it at anytime and get an expectable outcome. + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. # Add necessary setup steps to this file. puts '== Installing dependencies ==' @@ -18,7 +18,7 @@ FileUtils.chdir APP_ROOT do system('bundle check') || system!('bundle install') # Install JavaScript dependencies - # system('bin/yarn') + system! 'bin/yarn' # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') diff --git a/bin/spring b/bin/spring deleted file mode 100755 index a4759986d15..00000000000 --- a/bin/spring +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# This file loads spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require "rubygems" - require "bundler" - - if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) - Gem.paths = { "GEM_PATH" => [Bundler.bundle_path.to_s, *Gem.path].uniq } - gem "spring", match[1] - require "spring/binstub" - end -end diff --git a/bin/yarn b/bin/yarn index 460dd565b4a..9fab2c35079 100755 --- a/bin/yarn +++ b/bin/yarn @@ -1,9 +1,15 @@ #!/usr/bin/env ruby APP_ROOT = File.expand_path('..', __dir__) Dir.chdir(APP_ROOT) do - begin - exec "yarnpkg", *ARGV - rescue Errno::ENOENT + yarn = ENV["PATH"].split(File::PATH_SEPARATOR). + select { |dir| File.expand_path(dir) != __dir__ }. + product(["yarn", "yarn.cmd", "yarn.ps1"]). + map { |dir, file| File.expand_path(file, dir) }. + find { |file| File.executable?(file) } + + if yarn + exec yarn, *ARGV + else $stderr.puts "Yarn executable was not detected in the system." $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" exit 1 diff --git a/config.ru b/config.ru index cb504065454..265d93376ed 100644 --- a/config.ru +++ b/config.ru @@ -1,8 +1,6 @@ -# frozen_string_literal: true - # This file is used by Rack-based servers to start the application. -require ::File.expand_path("../config/environment", __FILE__) +require_relative "config/environment" require "rack" # rubocop:disable all @@ -69,3 +67,4 @@ end # rubocop:enable all run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb index 37e00da3554..fba36ffb18a 100644 --- a/config/application.rb +++ b/config/application.rb @@ -1,6 +1,6 @@ -require_relative 'boot' +require_relative "boot" -require 'rails/all' +require "rails/all" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. @@ -12,13 +12,13 @@ module CaseflowCertification class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 5.2 + config.load_defaults 6.1 config.autoloader = :classic - # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. # ================================================================================================================== # Rails default overrides @@ -84,10 +84,6 @@ class Application < Rails::Application # Default as of 5.2: true config.action_controller.default_protect_from_forgery = false - # Store boolean values in sqlite3 databases as 1 and 0 instead of 't' and 'f' after migrating old data. - # Default as of 5.2: true - config.active_record.sqlite3.represent_boolean_as_integer = false - # ------------------------------------------------------------------------------------------------------------------ # Rails 6.0 default overrides # ------------------------------------------------------------------------------------------------------------------ @@ -108,22 +104,24 @@ class Application < Rails::Application # Default as of 6.0: false config.action_dispatch.return_only_media_type_on_content_type = true - # Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail. - # - # The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob), - # will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions. - # If you send mail in the background, job workers need to have a copy of - # MailDeliveryJob to ensure all delivery jobs are processed properly. - # Make sure your entire app is migrated and stable on 6.0 before using this setting. - # Default as of 6.0: "ActionMailer::MailDeliveryJob" - config.action_mailer.delivery_job = nil - # Enable the same cache key to be reused when the object being cached of type # `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count) # of the relation's cache key into the cache version to support recycling cache key. # Default as of 6.0: true config.active_record.collection_cache_versioning = false + # ------------------------------------------------------------------------------------------------------------------ + # Rails 6.1 default overrides + # ------------------------------------------------------------------------------------------------------------------ + + # Support for inversing belongs_to -> has_many Active Record associations. + # Default as of 6.1: true + config.active_record.has_many_inversing = false + + # Apply random variation to the delay when retrying failed jobs. + # Default as of 6.1: 0.15 + config.active_job.retry_jitter = 0 + # ================================================================================================================== # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. diff --git a/config/boot.rb b/config/boot.rb index 9833741ac57..54cda1cdcc7 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,5 +1,5 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) ENV["NLS_LANG"] = "AMERICAN_AMERICA.UTF8" -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. +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/database.yml b/config/database.yml index 6a2e9dcf41e..88e0cea7747 100644 --- a/config/database.yml +++ b/config/database.yml @@ -18,26 +18,6 @@ default: &default password: <%= ENV['POSTGRES_PASSWORD'] %> <% end %> -demo: - <<: *default - database: caseflow_certification_demo - -ssh_forwarding: - <<: *default - database: caseflow_certification_ssh_forwarding - -development: - <<: *default - database: caseflow_certification_development - -staging: - <<: *default - database: caseflow_certification_staging - -production: - <<: *default - url: <%= ENV["POSTGRES_URL"] %> - # NOTE Rails 6 has native support for multiple databases, # and this configuration should change to nest "primary" and "etl" and "vacols" # under each env name, per @@ -51,83 +31,124 @@ etl_default: &etl_default <% if ENV["ETL_DB_PASSWORD"] || ENV["POSTGRES_PASSWORD"] %> password: <%= ENV["ETL_DB_PASSWORD"] || ENV["POSTGRES_PASSWORD"] %> <% end %> + migrations_paths: db/etl_migrate -etl_development: - <<: *etl_default - database: caseflow_etl_development - -etl_test: - <<: *etl_default - database: caseflow_etl_test<%= ENV["TEST_SUBCATEGORY"] %> - -etl_production: - <<: *etl_default - url: <%= ENV["ETL_DB_URL"] %> - -development_vacols: - adapter: oracle_enhanced - username: VACOLS_DEV - password: VACOLS_DEV - <% if ! ENV['DOCKERIZED'] %> - host: localhost - port: 1521 - <% end %> - database: <%= ENV['DEMO_DB'] || "BVAP" %> - -demo_vacols: - adapter: sqlite3 - pool: 5 - timeout: 5000 - database: db/demo-vacols.sqlite3 - -ssh_forwarding_vacols: - adapter: oracle_enhanced - host: localhost - port: 1526 - username: <%= ENV["VACOLS_USERNAME"] %> - password: <%= ENV["VACOLS_PASSWORD"] %> - database: BVAP - -staging_vacols: - adapter: oracle_enhanced - username: <%= ENV["VACOLS_USERNAME"] %> - password: <%= ENV["VACOLS_PASSWORD"] %> - host: vacols.dev.vaco.va.gov - port: 1526 - database: BVAP.VACO.VA.GOV - -production_vacols: - adapter: oracle_enhanced - username: <%= ENV["VACOLS_USERNAME"] %> - password: <%= ENV["VACOLS_PASSWORD"] %> - host: <%= ENV["VACOLS_HOST"] %> - port: <%= ENV["VACOLS_PORT"] %> - database: <%= ENV["VACOLS_DATABASE"] %> - pool: <%= ENV["DB_CONN_POOL_MAX_SIZE"] || 5 %> +development: + primary: + <<: *default + database: caseflow_certification_development + etl: + <<: *etl_default + database: caseflow_etl_development + vacols: + adapter: oracle_enhanced + username: VACOLS_DEV + password: VACOLS_DEV + <% if ! ENV['DOCKERIZED'] %> + host: localhost + port: 1521 + <% end %> + database: <%= ENV['DEMO_DB'] || "BVAP" %> # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: - <<: *default - username: <%= ENV['POSTGRES_USER'] || `whoami` %> - database: caseflow_certification_test<%= ENV['TEST_SUBCATEGORY'] %> - <% if ENV['POSTGRES_HOST'] %> - host: <%= ENV['POSTGRES_HOST'] %> - <% end %> - <% if ENV['POSTGRES_PASSWORD'] %> - password: <%= ENV['POSTGRES_PASSWORD'] %> - <% end %> + primary: + <<: *default + username: <%= ENV['POSTGRES_USER'] || `whoami` %> + database: caseflow_certification_test<%= ENV['TEST_SUBCATEGORY'] %> + <% if ENV['POSTGRES_HOST'] %> + host: <%= ENV['POSTGRES_HOST'] %> + <% end %> + <% if ENV['POSTGRES_PASSWORD'] %> + password: <%= ENV['POSTGRES_PASSWORD'] %> + <% end %> + etl: + <<: *etl_default + database: caseflow_etl_test<%= ENV["TEST_SUBCATEGORY"] %> + # Increase the receive timeout value due to ORA-12609: TNS: Receive timeout occurred + # Solution: https://www.fatihacar.com/blog/category/databases/oracle/oracle-errors-and-solutions/page/13/ + # Oracle timeout configuration: https://github.com/rsim/oracle-enhanced#timeouts + vacols: + adapter: oracle_enhanced + username: VACOLS_TEST + password: VACOLS_TEST + database: "(DESCRIPTION= + (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=<%= ENV['TEST_VACOLS_HOST']%>)(PORT=1521))) + (RECV_TIMEOUT=120)(SEND_TIMEOUT=5) + (CONNECT_DATA=(SID=BVAP)) + )" + +# For use by GH workflow `Make-docs-to-webpage` (See `.github/workflows/make-docs.yml`) +make_docs: + primary: + <<: *default + username: <%= ENV['POSTGRES_USER'] || `whoami` %> + database: caseflow_certification_test<%= ENV['TEST_SUBCATEGORY'] %> + <% if ENV['POSTGRES_HOST'] %> + host: <%= ENV['POSTGRES_HOST'] %> + <% end %> + <% if ENV['POSTGRES_PASSWORD'] %> + password: <%= ENV['POSTGRES_PASSWORD'] %> + <% end %> + etl: + <<: *etl_default + database: caseflow_etl_test<%= ENV["TEST_SUBCATEGORY"] %> + # Even though it won't be used, Rails expects a 'vacols' DB configuration due to + # VACOLS::Record `establish_connection :vacols` + vacols: + adapter: postgresql + pool: 1 + timeout: 5000 + database: test-vacols + +demo: + primary: + <<: *default + database: caseflow_certification_demo + vacols: + adapter: sqlite3 + pool: 5 + timeout: 5000 + database: db/demo-vacols.sqlite3 -# Increase the receive timeout value due to ORA-12609: TNS: Receive timeout occurred -# Solution: https://www.fatihacar.com/blog/category/databases/oracle/oracle-errors-and-solutions/page/13/ -# Oracle timeout configuration: https://github.com/rsim/oracle-enhanced#timeouts -test_vacols: - adapter: oracle_enhanced - username: VACOLS_TEST - password: VACOLS_TEST - database: "(DESCRIPTION= - (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=<%= ENV['TEST_VACOLS_HOST']%>)(PORT=1521))) - (RECV_TIMEOUT=120)(SEND_TIMEOUT=5) - (CONNECT_DATA=(SID=BVAP)) - )" +ssh_forwarding: + primary: + <<: *default + database: caseflow_certification_ssh_forwarding + vacols: + adapter: oracle_enhanced + host: localhost + port: 1526 + username: <%= ENV["VACOLS_USERNAME"] %> + password: <%= ENV["VACOLS_PASSWORD"] %> + database: BVAP + +staging: + primary: + <<: *default + database: caseflow_certification_staging + vacols: + adapter: oracle_enhanced + username: <%= ENV["VACOLS_USERNAME"] %> + password: <%= ENV["VACOLS_PASSWORD"] %> + host: vacols.dev.vaco.va.gov + port: 1526 + database: BVAP.VACO.VA.GOV + +production: + primary: + <<: *default + url: <%= ENV["POSTGRES_URL"] %> + etl: + <<: *etl_default + url: <%= ENV["ETL_DB_URL"] %> + vacols: + adapter: oracle_enhanced + username: <%= ENV["VACOLS_USERNAME"] %> + password: <%= ENV["VACOLS_PASSWORD"] %> + host: <%= ENV["VACOLS_HOST"] %> + port: <%= ENV["VACOLS_PORT"] %> + database: <%= ENV["VACOLS_DATABASE"] %> + pool: <%= ENV["DB_CONN_POOL_MAX_SIZE"] || 5 %> diff --git a/config/environment.rb b/config/environment.rb index 426333bb469..cac53157752 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -1,5 +1,5 @@ # Load the Rails application. -require_relative 'application' +require_relative "application" # Initialize the Rails application. Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb index c56b036c14a..c2c8b84f409 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,8 +1,16 @@ +require "active_support/core_ext/integer/time" +require_relative "../../config/initializers/deprecation_warnings" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development + # When `config.assets.debug == true`, there is an edge case where the length of the Link header could become + # exceptionally long, due to the way concatenated assets are split and included separately, thus exceeding the + # maximum 8192 bytes for HTTP response headers. To preclude this from happening, we override the default here: + config.action_view.preload_links_header = false + + # In the development environment your application's code is reloaded any time + # it changes. 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 @@ -45,9 +53,13 @@ end # Print deprecation notices to the Rails logger. - # config.active_support.deprecation = :log - require_relative "../../app/services/deprecation_warnings/development_handler" - ActiveSupport::Deprecation.behavior = DeprecationWarnings::DevelopmentHandler + config.active_support.deprecation = :log + + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = DeprecationWarnings::DISALLOWED_DEPRECATION_WARNING_REGEXES # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load @@ -64,7 +76,10 @@ config.assets.quiet = true # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true # Use an evented file watcher to asynchronously detect changes in source code, # routes, locales, etc. This feature depends on the listen gem. @@ -73,6 +88,9 @@ # Bypass DNS rebinding protection for all `demo` sub-domains config.hosts << ".demo.appeals.va.gov" + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + #===================================================================================================================== # Please keep custom config settings below this comment. # This will ensure cleaner diffs when generating config file changes during Rails upgrades. diff --git a/config/environments/make_docs.rb b/config/environments/make_docs.rb new file mode 100644 index 00000000000..fc7a8460dc3 --- /dev/null +++ b/config/environments/make_docs.rb @@ -0,0 +1,152 @@ +require "active_support/core_ext/integer/time" +require "fileutils" + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + config.cache_classes = true + + cache_dir = Rails.root.join("tmp", "cache", "test_#{ENV['TEST_SUBCATEGORY']}", $$.to_s) + FileUtils.mkdir_p(cache_dir) unless File.exists?(cache_dir) + config.cache_store = :file_store, cache_dir + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = false + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = true + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + unless ENV['RAILS_ENABLE_TEST_LOG'] + config.logger = Logger.new(nil) + config.log_level = :error + end + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + #===================================================================================================================== + # Please keep custom config settings below this comment. + # This will ensure cleaner diffs when generating config file changes during Rails upgrades. + #===================================================================================================================== + + config.after_initialize do + Bullet.enable = false + Bullet.bullet_logger = true + Bullet.rails_logger = true + Bullet.raise = true + Bullet.unused_eager_loading_enable = false + end + + ENV["VA_DOT_GOV_API_URL"] = "https://sandbox-api.va.gov/" + + # For testing uncertification methods + ENV["TEST_USER_ID"] = "TEST_USER_ID" + ENV["TEST_APPEAL_IDS"] = "123C,456D,678E" + ENV["FULL_GRANT_IDS"] = "VACOLS123,VACOLS234,VACOLS345,VACOLS456" + ENV["PARTIAL_AND_REMAND_IDS"] = "VACOLS321,VACOLS432,VACOLS543,VACOLS654" + + ENV["AWS_ACCESS_KEY_ID"] ||= "dummykeyid" + ENV["AWS_SECRET_ACCESS_KEY"] ||= "dummysecretkey" + + # BatchProcess ENVs + # priority_ep_sync + ENV["BATCH_PROCESS_JOB_DURATION"] ||= "50" # Number of minutes the job will run for + ENV["BATCH_PROCESS_SLEEP_DURATION"] ||= "0" # Number of seconds between loop iterations + ENV["BATCH_PROCESS_BATCH_LIMIT"]||= "100" # Max number of records in a batch + ENV["BATCH_PROCESS_ERROR_DELAY"] ||= "3" # In number of hours + ENV["BATCH_PROCESS_MAX_ERRORS_BEFORE_STUCK"] ||= "3" # When record errors for X time, it's declared stuck + + # RequestIssue paginates_per offset (vbms intake) + ENV["REQUEST_ISSUE_PAGINATION_OFFSET"] ||= "10" + ENV["REQUEST_ISSUE_DEFAULT_UPPER_BOUND_PER_PAGE"] ||= "50" + + config.active_job.queue_adapter = :test + + # Disable SqlTracker from creating tmp/sql_tracker-*.json files -- https://github.com/steventen/sql_tracker/pull/10 + SqlTracker::Config.enabled = false + + # Setup S3 + config.s3_enabled = false + + config.vacols_db_name = "VACOLS_TEST" + + if ENV["TEST_SUBCATEGORY"] + assets_cache_path = Rails.root.join("tmp/cache/assets/#{ENV['TEST_SUBCATEGORY']}") + config.assets.configure do |env| + env.cache = Sprockets::Cache::FileStore.new(assets_cache_path) + end + end + + # Allows rake scripts to be run without querying VACOLS on startup + if ENV["DISABLE_FACTORY_BOT_INITIALIZERS"] + config.factory_bot.definition_file_paths = [] + end + + # VA Notify environment variables + ENV["VA_NOTIFY_API_URL"] ||= "https://staging-api.va.gov/vanotify" + ENV["VA_NOTIFY_API_KEY"] ||= "secret-key" + ENV["VA_NOTIFY_SERVICE_ID"] ||= "fake-service-id" + ENV["VA_NOTIFY_TOKEN_ALG"] ||= "my-secret-algorithm" + ENV["VA_NOTIFY_STATUS_UPDATE_BATCH_LIMIT"] ||= "650" + + # One time Appeal States migration for Legacy & AMA Appeal Batch Sizes + ENV["STATE_MIGRATION_JOB_BATCH_SIZE"] ||= "1000" + + # Quarterly Notifications Batch Sizes + ENV["QUARTERLY_NOTIFICATIONS_JOB_BATCH_SIZE"] ||= "1000" + + # Travel Board Sync Batch Size + ENV["TRAVEL_BOARD_HEARING_SYNC_BATCH_LIMIT"] ||= "250" + + # Time in seconds before the sync lock expires + LOCK_TIMEOUT = ENV["SYNC_LOCK_MAX_DURATION"] ||= "60" + + # Notifications page eFolder link + ENV["CLAIM_EVIDENCE_EFOLDER_BASE_URL"] ||= "https://vefs-claimevidence-ui-uat.stage.bip.va.gov" + + ENV['TEST_VACOLS_HOST'] ||= "localhost" + + # Pacman environment variables + ENV["PACMAN_API_TOKEN_ALG"] ||= "HS512" + ENV["PACMAN_API_URL"] ||= "https://pacman-uat.dev.bip.va.gov" + ENV["PACMAN_API_SAML_TOKEN"] ||= "our-saml-token" + ENV["PACMAN_API_TOKEN_SECRET"] ||= "client-secret" + ENV["PACMAN_API_TOKEN_ISSUER"] ||= "issuer-of-our-token" + ENV["PACMAN_API_SYS_ACCOUNT"] ||= "CSS_ID_OF_OUR_ACCOUNT" + + # Dynatrace variables + ENV["STATSD_ENV"] = "test" +end diff --git a/config/environments/production.rb b/config/environments/production.rb index c1b6847d036..f1d8fe761c6 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,3 +1,7 @@ +require "active_support/core_ext/integer/time" +require_relative "../../app/services/deprecation_warnings/production_handler" +require_relative "../../config/initializers/deprecation_warnings" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -29,7 +33,7 @@ config.assets.compile = false # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' + # config.asset_host = 'http://assets.example.com' # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache @@ -44,7 +48,10 @@ # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true + config.force_ssl = true + + require_relative "../../app/policies/ssl_redirect_exclusion_policy" + config.ssl_options = { redirect: { exclude: SslRedirectExclusionPolicy } } # Use the lowest log level to ensure availability of diagnostic information # when problems arise. @@ -77,16 +84,20 @@ # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true - # Send deprecation notices to registered listeners. - # config.active_support.deprecation = :notify - require_relative "../../app/services/deprecation_warnings/production_handler" - ActiveSupport::Deprecation.behavior = DeprecationWarnings::ProductionHandler + # Send deprecation notices to handler. + config.active_support.deprecation = DeprecationWarnings::ProductionHandler + + # Log disallowed deprecations. + config.active_support.disallowed_deprecation = :log + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = DeprecationWarnings::DISALLOWED_DEPRECATION_WARNING_REGEXES # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Use a different logger for distributed setups. - # require 'syslog/logger' + # require "syslog/logger" # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') if ENV["RAILS_LOG_TO_STDOUT"].present? diff --git a/config/environments/test.rb b/config/environments/test.rb index 83e3a687dd0..49d5e11344f 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,4 +1,6 @@ +require "active_support/core_ext/integer/time" require "fileutils" +require_relative "../../config/initializers/deprecation_warnings" # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that @@ -46,19 +48,24 @@ config.action_mailer.delivery_method = :test # Print deprecation notices to the stderr. - # config.active_support.deprecation = :stderr - require_relative "../../app/services/deprecation_warnings/test_handler" - ActiveSupport::Deprecation.behavior = DeprecationWarnings::TestHandler + config.active_support.deprecation = :stderr + + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = DeprecationWarnings::DISALLOWED_DEPRECATION_WARNING_REGEXES unless ENV['RAILS_ENABLE_TEST_LOG'] config.logger = Logger.new(nil) config.log_level = :error end - config.action_mailer.delivery_method = :test - # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true #===================================================================================================================== # Please keep custom config settings below this comment. diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index 59385cdf379..33699c30910 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -1,7 +1,8 @@ # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } +# Rails.backtrace_cleaner.add_silencer { |line| /my_noisy_library/.match?(line) } -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code +# by setting BACKTRACE=1 before calling your invocation, like "BACKTRACE=1 ./bin/rails runner 'MyClass.perform'". +Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"] diff --git a/app/services/deprecation_warnings/disallowed_deprecations.rb b/config/initializers/deprecation_warnings.rb similarity index 64% rename from app/services/deprecation_warnings/disallowed_deprecations.rb rename to config/initializers/deprecation_warnings.rb index df4f14a24b1..4d102c4e702 100644 --- a/app/services/deprecation_warnings/disallowed_deprecations.rb +++ b/config/initializers/deprecation_warnings.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true -# @note Temporary solution for disallowed deprecation warnings. -# To be replaced by ActiveSupport Disallowed Deprecations after upgrading to Rails 6.1: -# https://rubyonrails.org/2020/12/9/Rails-6-1-0-release#disallowed-deprecation-support -module DisallowedDeprecations - class ::DisallowedDeprecationError < StandardError; end +module DeprecationWarnings + # Regular expressions for custom deprecation warnings that we have addressed in the codebase + CUSTOM_DEPRECATION_WARNING_REGEXES = [ + /Caseflow::Migration is deprecated/ + ].freeze # Regular expressions for Rails 6.0 deprecation warnings that we have addressed in the codebase RAILS_6_0_FIXED_DEPRECATION_WARNING_REGEXES = [ @@ -19,19 +19,15 @@ class ::DisallowedDeprecationError < StandardError; end /ActionView::Base instances must implement `compiled_method_container`/, /render file: should be given the absolute path to a file/, /`ActiveRecord::Result#to_hash` has been renamed to `to_a`/, - /Class level methods will no longer inherit scoping/ + /Class level methods will no longer inherit scoping/, + /Controller-level `force_ssl` is deprecated and will be removed from Rails 6\.1/, + /NOT conditions will no longer behave as NOR in Rails 6\.1/ ].freeze # Regular expressions for deprecation warnings that should raise an exception on detection DISALLOWED_DEPRECATION_WARNING_REGEXES = [ + *CUSTOM_DEPRECATION_WARNING_REGEXES, *RAILS_6_0_FIXED_DEPRECATION_WARNING_REGEXES, *RAILS_6_1_FIXED_DEPRECATION_WARNING_REGEXES ].freeze - - # @param message [String] deprecation warning message to be checked against disallow list - def raise_if_disallowed_deprecation!(message) - if DISALLOWED_DEPRECATION_WARNING_REGEXES.any? { |re| re.match?(message) } - fail DisallowedDeprecationError, message - end - end end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 4a994e1e7bb..4b34a036689 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -1,4 +1,6 @@ # Be sure to restart your server when you modify this file. # Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] +Rails.application.config.filter_parameters += [ + :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn +] diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb new file mode 100644 index 00000000000..00f64d71b03 --- /dev/null +++ b/config/initializers/permissions_policy.rb @@ -0,0 +1,11 @@ +# Define an application-wide HTTP permissions policy. For further +# information see https://developers.google.com/web/updates/2018/06/feature-policy +# +# Rails.application.config.permissions_policy do |f| +# f.camera :none +# f.gyroscope :none +# f.microphone :none +# f.usb :none +# f.fullscreen :self +# f.payment :self, "https://secure.example.com" +# end diff --git a/config/initializers/strong_migrations.rb b/config/initializers/strong_migrations.rb index c079aa8007b..c6ebfb8c42d 100644 --- a/config/initializers/strong_migrations.rb +++ b/config/initializers/strong_migrations.rb @@ -1,2 +1,20 @@ StrongMigrations.start_after = 20190111000717 StrongMigrations.auto_analyze = true + +# Customized error message when a new migration uses `add_index` non-concurrently +StrongMigrations.error_messages[:add_index] = <<~TEXT + Adding a non-concurrent index locks the table for writes. + Instead, prefer using `Caseflow::Migrations::AddIndexConcurrently #add_safe_index`: + + class YourMigrationName < ActiveRecord::Migration%{migration_suffix} + include Caseflow::Migrations::AddIndexConcurrently + + def change + add_safe_index # add args here... + end + end + + Nota Bene: Since adding indexes concurrently must occur outside of a transaction, + one should avoid mixing in other DB changes when doing so. It is strongly recommended + to segregate index additions from other DB changes in a separate migration. + TEXT diff --git a/config/initializers/warmup_vacols.rb b/config/initializers/warmup_vacols.rb index 68f5db2f460..053b49551f7 100644 --- a/config/initializers/warmup_vacols.rb +++ b/config/initializers/warmup_vacols.rb @@ -20,7 +20,7 @@ db_config = Rails.application.config.database_configuration[Rails.env] # use specified initial pool size, default to half the maximum size - initial_pool_size = (ENV['DB_CONN_POOL_INITIAL_SIZE'] || db_config['pool'] / 2).to_i + initial_pool_size = (ENV['DB_CONN_POOL_INITIAL_SIZE'] || db_config['primary']['pool'] / 2).to_i Rails.logger.info("creating #{initial_pool_size} initial connections...") unless ApplicationController.dependencies_faked? diff --git a/config/puma.rb b/config/puma.rb index b2c644daa93..b1b0f09e2da 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -8,9 +8,14 @@ min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count +# Specifies the `worker_timeout` threshold that Puma will use to wait before +# terminating a worker in development environments. +# +worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" + # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # -port ENV.fetch("PORT") { 3000 } +port ENV.fetch("PORT") { 3000 } # Specifies the `environment` that Puma will run in. # diff --git a/config/routes.rb b/config/routes.rb index 9662aaea056..ef67aeffb8e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,8 +2,6 @@ mount Rswag::Ui::Engine => '/api-docs' mount Rswag::Api::Engine => '/api-docs' # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html - # The priority is based upon order of creation: first created -> highest priority. - # See how all your routes lay out with "rake routes". resources :sessions, only: [:new, :update] resources :certifications, path_names: { new: "new/:vacols_id" } do diff --git a/db/etl/migrate/20191111164808_create_etl_appeals.rb b/db/etl_migrate/20191111164808_create_etl_appeals.rb similarity index 100% rename from db/etl/migrate/20191111164808_create_etl_appeals.rb rename to db/etl_migrate/20191111164808_create_etl_appeals.rb diff --git a/db/etl/migrate/20191119204827_create_etl_users.rb b/db/etl_migrate/20191119204827_create_etl_users.rb similarity index 100% rename from db/etl/migrate/20191119204827_create_etl_users.rb rename to db/etl_migrate/20191119204827_create_etl_users.rb diff --git a/db/etl/migrate/20191120184256_create_etl_tasks.rb b/db/etl_migrate/20191120184256_create_etl_tasks.rb similarity index 100% rename from db/etl/migrate/20191120184256_create_etl_tasks.rb rename to db/etl_migrate/20191120184256_create_etl_tasks.rb diff --git a/db/etl/migrate/20191120213930_create_etl_people.rb b/db/etl_migrate/20191120213930_create_etl_people.rb similarity index 100% rename from db/etl/migrate/20191120213930_create_etl_people.rb rename to db/etl_migrate/20191120213930_create_etl_people.rb diff --git a/db/etl/migrate/20191120213941_create_etl_organizations.rb b/db/etl_migrate/20191120213941_create_etl_organizations.rb similarity index 100% rename from db/etl/migrate/20191120213941_create_etl_organizations.rb rename to db/etl_migrate/20191120213941_create_etl_organizations.rb diff --git a/db/etl/migrate/20191126164353_remove_users_vacols_not_null.rb b/db/etl_migrate/20191126164353_remove_users_vacols_not_null.rb similarity index 100% rename from db/etl/migrate/20191126164353_remove_users_vacols_not_null.rb rename to db/etl_migrate/20191126164353_remove_users_vacols_not_null.rb diff --git a/db/etl/migrate/20191126203511_add_appeal_timestamps.rb b/db/etl_migrate/20191126203511_add_appeal_timestamps.rb similarity index 100% rename from db/etl/migrate/20191126203511_add_appeal_timestamps.rb rename to db/etl_migrate/20191126203511_add_appeal_timestamps.rb diff --git a/db/etl/migrate/20191209162326_add_appeal_status_sort.rb b/db/etl_migrate/20191209162326_add_appeal_status_sort.rb similarity index 100% rename from db/etl/migrate/20191209162326_add_appeal_status_sort.rb rename to db/etl_migrate/20191209162326_add_appeal_status_sort.rb diff --git a/db/etl/migrate/20191212221851_org_status_change.rb b/db/etl_migrate/20191212221851_org_status_change.rb similarity index 100% rename from db/etl/migrate/20191212221851_org_status_change.rb rename to db/etl_migrate/20191212221851_org_status_change.rb diff --git a/db/etl/migrate/20191212222617_org_status_default.rb b/db/etl_migrate/20191212222617_org_status_default.rb similarity index 100% rename from db/etl/migrate/20191212222617_org_status_default.rb rename to db/etl_migrate/20191212222617_org_status_default.rb diff --git a/db/etl/migrate/20191213194037_add_task_id_index.rb b/db/etl_migrate/20191213194037_add_task_id_index.rb similarity index 100% rename from db/etl/migrate/20191213194037_add_task_id_index.rb rename to db/etl_migrate/20191213194037_add_task_id_index.rb diff --git a/db/etl/migrate/20191217193046_create_attorney_case_reviews.rb b/db/etl_migrate/20191217193046_create_attorney_case_reviews.rb similarity index 100% rename from db/etl/migrate/20191217193046_create_attorney_case_reviews.rb rename to db/etl_migrate/20191217193046_create_attorney_case_reviews.rb diff --git a/db/etl/migrate/20191217202614_create_decision_issues.rb b/db/etl_migrate/20191217202614_create_decision_issues.rb similarity index 100% rename from db/etl/migrate/20191217202614_create_decision_issues.rb rename to db/etl_migrate/20191217202614_create_decision_issues.rb diff --git a/db/etl/migrate/20191218214351_add_more_cached_user_attributes.rb b/db/etl_migrate/20191218214351_add_more_cached_user_attributes.rb similarity index 100% rename from db/etl/migrate/20191218214351_add_more_cached_user_attributes.rb rename to db/etl_migrate/20191218214351_add_more_cached_user_attributes.rb diff --git a/db/etl/migrate/20191223213954_add_email_address_to_person.rb b/db/etl_migrate/20191223213954_add_email_address_to_person.rb similarity index 100% rename from db/etl/migrate/20191223213954_add_email_address_to_person.rb rename to db/etl_migrate/20191223213954_add_email_address_to_person.rb diff --git a/db/etl/migrate/20200114201144_add_aod_due_to_age.rb b/db/etl_migrate/20200114201144_add_aod_due_to_age.rb similarity index 100% rename from db/etl/migrate/20200114201144_add_aod_due_to_age.rb rename to db/etl_migrate/20200114201144_add_aod_due_to_age.rb diff --git a/db/etl/migrate/20200116215235_add_claimant_dob_to_appeals.rb b/db/etl_migrate/20200116215235_add_claimant_dob_to_appeals.rb similarity index 100% rename from db/etl/migrate/20200116215235_add_claimant_dob_to_appeals.rb rename to db/etl_migrate/20200116215235_add_claimant_dob_to_appeals.rb diff --git a/db/etl/migrate/20200121221718_add_appeals_claimant_indexes.rb b/db/etl_migrate/20200121221718_add_appeals_claimant_indexes.rb similarity index 100% rename from db/etl/migrate/20200121221718_add_appeals_claimant_indexes.rb rename to db/etl_migrate/20200121221718_add_appeals_claimant_indexes.rb diff --git a/db/etl/migrate/20200212205344_add_etl_build_tables.rb b/db/etl_migrate/20200212205344_add_etl_build_tables.rb similarity index 100% rename from db/etl/migrate/20200212205344_add_etl_build_tables.rb rename to db/etl_migrate/20200212205344_add_etl_build_tables.rb diff --git a/db/etl/migrate/20200303223155_add_etl_users_index.rb b/db/etl_migrate/20200303223155_add_etl_users_index.rb similarity index 100% rename from db/etl/migrate/20200303223155_add_etl_users_index.rb rename to db/etl_migrate/20200303223155_add_etl_users_index.rb diff --git a/db/etl/migrate/20200429152715_create_vha_decision_reviews.rb b/db/etl_migrate/20200429152715_create_vha_decision_reviews.rb similarity index 100% rename from db/etl/migrate/20200429152715_create_vha_decision_reviews.rb rename to db/etl_migrate/20200429152715_create_vha_decision_reviews.rb diff --git a/db/etl/migrate/20200429164923_create_hearings.rb b/db/etl_migrate/20200429164923_create_hearings.rb similarity index 100% rename from db/etl/migrate/20200429164923_create_hearings.rb rename to db/etl_migrate/20200429164923_create_hearings.rb diff --git a/db/etl/migrate/20200430152234_add_hearing_type.rb b/db/etl_migrate/20200430152234_add_hearing_type.rb similarity index 100% rename from db/etl/migrate/20200430152234_add_hearing_type.rb rename to db/etl_migrate/20200430152234_add_hearing_type.rb diff --git a/db/etl/migrate/20200501211351_change_hearing_day_id_null.rb b/db/etl_migrate/20200501211351_change_hearing_day_id_null.rb similarity index 100% rename from db/etl/migrate/20200501211351_change_hearing_day_id_null.rb rename to db/etl_migrate/20200501211351_change_hearing_day_id_null.rb diff --git a/db/etl/migrate/20200504133723_change_css_limit.rb b/db/etl_migrate/20200504133723_change_css_limit.rb similarity index 100% rename from db/etl/migrate/20200504133723_change_css_limit.rb rename to db/etl_migrate/20200504133723_change_css_limit.rb diff --git a/db/etl/migrate/20200504204154_remove_null_hearings.rb b/db/etl_migrate/20200504204154_remove_null_hearings.rb similarity index 100% rename from db/etl/migrate/20200504204154_remove_null_hearings.rb rename to db/etl_migrate/20200504204154_remove_null_hearings.rb diff --git a/db/etl/migrate/20200508141923_drop_legacy_hearing_scheduled_for.rb b/db/etl_migrate/20200508141923_drop_legacy_hearing_scheduled_for.rb similarity index 100% rename from db/etl/migrate/20200508141923_drop_legacy_hearing_scheduled_for.rb rename to db/etl_migrate/20200508141923_drop_legacy_hearing_scheduled_for.rb diff --git a/db/etl/migrate/20200517021335_create_etl_remand_reason.rb b/db/etl_migrate/20200517021335_create_etl_remand_reason.rb similarity index 100% rename from db/etl/migrate/20200517021335_create_etl_remand_reason.rb rename to db/etl_migrate/20200517021335_create_etl_remand_reason.rb diff --git a/db/etl/migrate/20200519213755_change_vha_decision_reviews_to_decision_reviews.rb b/db/etl_migrate/20200519213755_change_vha_decision_reviews_to_decision_reviews.rb similarity index 100% rename from db/etl/migrate/20200519213755_change_vha_decision_reviews_to_decision_reviews.rb rename to db/etl_migrate/20200519213755_change_vha_decision_reviews_to_decision_reviews.rb diff --git a/db/etl/migrate/20200519214159_change_decision_reviews_comments.rb b/db/etl_migrate/20200519214159_change_decision_reviews_comments.rb similarity index 100% rename from db/etl/migrate/20200519214159_change_decision_reviews_comments.rb rename to db/etl_migrate/20200519214159_change_decision_reviews_comments.rb diff --git a/db/etl/migrate/20200519214329_change_decision_reviews_indices.rb b/db/etl_migrate/20200519214329_change_decision_reviews_indices.rb similarity index 100% rename from db/etl/migrate/20200519214329_change_decision_reviews_indices.rb rename to db/etl_migrate/20200519214329_change_decision_reviews_indices.rb diff --git a/db/etl/migrate/20200519221508_add_decision_issue_benefit_index.rb b/db/etl_migrate/20200519221508_add_decision_issue_benefit_index.rb similarity index 100% rename from db/etl/migrate/20200519221508_add_decision_issue_benefit_index.rb rename to db/etl_migrate/20200519221508_add_decision_issue_benefit_index.rb diff --git a/db/etl/migrate/20200520220924_add_person_ssn.rb b/db/etl_migrate/20200520220924_add_person_ssn.rb similarity index 100% rename from db/etl/migrate/20200520220924_add_person_ssn.rb rename to db/etl_migrate/20200520220924_add_person_ssn.rb diff --git a/db/etl/migrate/20200526054515_add_subject_text_and_percent_number_to_decision_issue.rb b/db/etl_migrate/20200526054515_add_subject_text_and_percent_number_to_decision_issue.rb similarity index 100% rename from db/etl/migrate/20200526054515_add_subject_text_and_percent_number_to_decision_issue.rb rename to db/etl_migrate/20200526054515_add_subject_text_and_percent_number_to_decision_issue.rb diff --git a/db/etl/migrate/20200715110034_add_accepts_priority_pushed_cases_to_etl_organization.rb b/db/etl_migrate/20200715110034_add_accepts_priority_pushed_cases_to_etl_organization.rb similarity index 100% rename from db/etl/migrate/20200715110034_add_accepts_priority_pushed_cases_to_etl_organization.rb rename to db/etl_migrate/20200715110034_add_accepts_priority_pushed_cases_to_etl_organization.rb diff --git a/db/etl/migrate/20200715110603_add_accepts_priority_pushed_cases_index_on_organization.rb b/db/etl_migrate/20200715110603_add_accepts_priority_pushed_cases_index_on_organization.rb similarity index 100% rename from db/etl/migrate/20200715110603_add_accepts_priority_pushed_cases_index_on_organization.rb rename to db/etl_migrate/20200715110603_add_accepts_priority_pushed_cases_index_on_organization.rb diff --git a/db/etl/migrate/20210729124530_remove_etl_decision_issues_index.rb b/db/etl_migrate/20210729124530_remove_etl_decision_issues_index.rb similarity index 100% rename from db/etl/migrate/20210729124530_remove_etl_decision_issues_index.rb rename to db/etl_migrate/20210729124530_remove_etl_decision_issues_index.rb diff --git a/db/etl/migrate/20210729130353_add_etl_decision_issues_rating_issue_ref_id_index.rb b/db/etl_migrate/20210729130353_add_etl_decision_issues_rating_issue_ref_id_index.rb similarity index 100% rename from db/etl/migrate/20210729130353_add_etl_decision_issues_rating_issue_ref_id_index.rb rename to db/etl_migrate/20210729130353_add_etl_decision_issues_rating_issue_ref_id_index.rb diff --git a/db/etl/migrate/20210810115309_create_etl_judge_case_review.rb b/db/etl_migrate/20210810115309_create_etl_judge_case_review.rb similarity index 100% rename from db/etl/migrate/20210810115309_create_etl_judge_case_review.rb rename to db/etl_migrate/20210810115309_create_etl_judge_case_review.rb diff --git a/db/etl/migrate/20210810115459_create_etl_decision_document.rb b/db/etl_migrate/20210810115459_create_etl_decision_document.rb similarity index 100% rename from db/etl/migrate/20210810115459_create_etl_decision_document.rb rename to db/etl_migrate/20210810115459_create_etl_decision_document.rb diff --git a/db/etl/migrate/20210818172716_add_ama_only_to_organization.rb b/db/etl_migrate/20210818172716_add_ama_only_to_organization.rb similarity index 100% rename from db/etl/migrate/20210818172716_add_ama_only_to_organization.rb rename to db/etl_migrate/20210818172716_add_ama_only_to_organization.rb diff --git a/db/etl/migrate/20220107125705_remove_non_null_constraint_on_appeal_docket_type.rb b/db/etl_migrate/20220107125705_remove_non_null_constraint_on_appeal_docket_type.rb similarity index 100% rename from db/etl/migrate/20220107125705_remove_non_null_constraint_on_appeal_docket_type.rb rename to db/etl_migrate/20220107125705_remove_non_null_constraint_on_appeal_docket_type.rb diff --git a/db/etl/migrate/20220110143457_remove_non_null_constraint_on_appeal_receipt_date.rb b/db/etl_migrate/20220110143457_remove_non_null_constraint_on_appeal_receipt_date.rb similarity index 100% rename from db/etl/migrate/20220110143457_remove_non_null_constraint_on_appeal_receipt_date.rb rename to db/etl_migrate/20220110143457_remove_non_null_constraint_on_appeal_receipt_date.rb diff --git a/db/etl/migrate/20240129200527_add_exclude_appeals_from_affinity_to_organizations.rb b/db/etl_migrate/20240129200527_add_exclude_appeals_from_affinity_to_organizations.rb similarity index 100% rename from db/etl/migrate/20240129200527_add_exclude_appeals_from_affinity_to_organizations.rb rename to db/etl_migrate/20240129200527_add_exclude_appeals_from_affinity_to_organizations.rb diff --git a/db/etl/migrate/20240617205006_add_scheduled_in_timezone_to_hearings.rb b/db/etl_migrate/20240617205006_add_scheduled_in_timezone_to_hearings.rb similarity index 100% rename from db/etl/migrate/20240617205006_add_scheduled_in_timezone_to_hearings.rb rename to db/etl_migrate/20240617205006_add_scheduled_in_timezone_to_hearings.rb diff --git a/db/etl/schema.rb b/db/etl_schema.rb similarity index 100% rename from db/etl/schema.rb rename to db/etl_schema.rb diff --git a/docker-bin/env.sh b/docker-bin/env.sh index 80735dd9ab2..6a1acb1d207 100644 --- a/docker-bin/env.sh +++ b/docker-bin/env.sh @@ -13,8 +13,7 @@ export REDIS_URL_SIDEKIQ=redis://appeals-redis:6379 # envs to make development work in docker without affecting other devs export DOCKERIZED=true export DEMO_PORT=1521 -export DEMO_DB="(DESCRIPTION= - (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=VACOLS_DB-development)(PORT=1521)))(RECV_TIMEOUT=120)(SEND_TIMEOUT=5)(CONNECT_DATA=(SID=BVAP)))" +export DEMO_DB="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=VACOLS_DB-development)(PORT=1521)))(RECV_TIMEOUT=120)(SEND_TIMEOUT=5)(CONNECT_DATA=(SID=BVAP)))" export PATH=/.yarn/bin:/.config/yarn/global/node_modules/.bin:/usr/local/nvm/versions/node/v16.16.0/bin:/usr/local/bundle/bin:/usr/local/bundle/gems/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/oracle/instantclient_12_2: diff --git a/docker-bin/startup.sh b/docker-bin/startup.sh index 97a73eeae4e..5689eecc68d 100644 --- a/docker-bin/startup.sh +++ b/docker-bin/startup.sh @@ -25,7 +25,8 @@ echo "Waiting for Vacols to be ready" rake local:vacols:wait_for_connection echo "Creating DB in PG" -rake db:setup +rake db:create:primary +rake db:schema:load:primary echo "Seeding Facols" rake local:vacols:seed diff --git a/lib/caseflow/migration.rb b/lib/caseflow/migration.rb index 7f8ad1b01db..7435d5de8b6 100644 --- a/lib/caseflow/migration.rb +++ b/lib/caseflow/migration.rb @@ -1,8 +1,25 @@ # frozen_string_literal: true -# Migration with built-in timeout extensions for adding indexes - +# @deprecated Use {Caseflow::Migrations::AddIndexConcurrently} instead, because descendants of this class are forever +# coupled to Active Record 5.1. +# This class should be preserved until all descendant migrations <= LAST_DESCENDANT_MIGRATION_VERSION are pruned. +# +# @note Migration with built-in timeout extensions for adding indexes class Caseflow::Migration < ActiveRecord::Migration[5.1] + # version of last migration that inherits from this class (across 'primary' and 'etl' databases) + LAST_DESCENDANT_MIGRATION_VERSION = 20_240_617_205_006 + + def initialize(*) + super + # Trigger deprecation warning to prevent re-introduction in migrations after LAST_DESCENDANT_MIGRATION_VERSION + if version > LAST_DESCENDANT_MIGRATION_VERSION + ActiveSupport::Deprecation.warn( + "Caseflow::Migration is deprecated and should no longer be used.\n" \ + "If adding an index, see Caseflow::Migrations::AddIndexConcurrently." + ) + end + end + # hardcode this because setting via class method does not work in subclass def disable_ddl_transaction say "disable_ddl_transaction is true" diff --git a/lib/caseflow/migrations/add_index_concurrently.rb b/lib/caseflow/migrations/add_index_concurrently.rb new file mode 100644 index 00000000000..fc3b7ac155e --- /dev/null +++ b/lib/caseflow/migrations/add_index_concurrently.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +# @note Usage: Include this module only in migrations where you need to add an index concurrently. +# Invoke `#add_safe_index` in place of `#add index`. +# +# @note Since this module necessarily disables transactions, you should avoid mixing in other DB changes when +# adding indexes concurrently. Prefer isolating index additions in their own migration. +# +# @see [PostgreSQL: Building Indexes Concurrently](https://www.postgresql.org/docs/14/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY) +# @see [thoughtbot: How to Create Postgres Indexes Concurrently in ActiveRecord Migrations](https://thoughtbot.com/blog/how-to-create-postgres-indexes-concurrently-in) +# +# @example +# class YourMigrationName < ActiveRecord::Migration[6.0] +# include Caseflow::Migrations::AddIndexConcurrently +# +# change +# add_safe_index :some_table, :some_column +# end +# end +# +# @example +# # Alternatively, you can add in the requisite incantations yourself, without this module +# +# class YourMigrationName < ActiveRecord::Migration[6.0] +# disable_ddl_transaction! +# +# change +# add_index :some_table, :some_column, algorithm: :concurrently +# rescue StandardError => error +# remove_index :some_table, :some_column +# end +# end +module Caseflow + module Migrations + module AddIndexConcurrently + extend ActiveSupport::Concern + + EXTENDED_STATEMENT_TIMEOUT_DURATION = 30.minutes + + included do + # Disables the automatic transaction wrapping this migration. + # https://github.com/rails/rails/blob/28bb76d3efc39b2ef663dfe2346f7c2621343cd6/activerecord/lib/active_record/migration.rb#L508-L524 + disable_ddl_transaction! + + # @note Use this method in place of `#add_index` to add an index concurrently (i.e. without blocking DB writes). + # - Accommodates long-running index builds by extending the statement_timeout duration + # - Performs a rollback should an error occur during the migration, since transactions are disabled + # + # @note Inspired by {Caseflow::Migration} https://github.com/department-of-veterans-affairs/caseflow/blob/6fc9d26a5ae9417b69d7d1f30cc70bea57a0700d/lib/caseflow/migration.rb#L12-L29 + def add_safe_index(*args) + original_statement_timeout_duration = current_statement_timeout_duration + extend_statement_timeout + add_index_concurrently(args) + rescue StandardError => error + rollback_index(error, args) + raise error # re-raise to abort migration + ensure + restore_original_statement_timeout(original_statement_timeout_duration) + end + + private + + def current_statement_timeout_duration + ActiveSupport::Duration.build( + ActiveRecord::Base.connection.execute("SHOW statement_timeout").first["statement_timeout"].to_i + ) + end + + def extend_statement_timeout + say "Extending statement_timeout to #{EXTENDED_STATEMENT_TIMEOUT_DURATION.inspect}" + ActiveRecord::Base.connection.execute( + ActiveRecord::Base.sanitize_sql(["SET statement_timeout = ?", + EXTENDED_STATEMENT_TIMEOUT_DURATION.in_milliseconds]) + ) + end + + def add_index_concurrently(args) + table, columns, options = *args + options ||= {} + options[:algorithm] ||= :concurrently + add_index(table, columns, options) + end + + def rollback_index(error, args) + say "Caught #{error}, rolling back index" + table, columns, options = *args + options[:column] = columns unless options[:name] + remove_index(table, options) + end + + # :reek:FeatureEnvy + def restore_original_statement_timeout(duration) + say "Restoring statement_timeout to #{duration.inspect}" + ActiveRecord::Base.connection.execute( + ActiveRecord::Base.sanitize_sql(["SET statement_timeout = ?", duration.in_milliseconds]) + ) + end + end + end + end +end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake new file mode 100644 index 00000000000..e56cb6d3404 --- /dev/null +++ b/lib/tasks/db.rake @@ -0,0 +1,300 @@ +# frozen_string_literal: true + +# Once on Rails 7+, we can add the `database_tasks: false` option to the `database.yml` to permit connection to the +# vacols database without generating database tasks for it: +# https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/guides/source/active_record_multiple_databases.md?plain=1#L203-L219 +# +# After adopting and sufficiently testing the above setting setting, we can dispense with the workarounds in this file. +if Rails::VERSION::MAJOR >= 7 + ActiveSupport::Deprecation.warn( + "Use the new `database_tasks` DB config option to skip generation of database tasks for the VACOLS DB.\n" \ + "For further details, see https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/guides/source/active_record_multiple_databases.md?plain=1#L203-L219" + ) +end + +# Explicitly clear any generated database tasks for the vacols DB. +%w[ + db:create:vacols + db:drop:vacols + db:migrate:vacols + db:migrate:status:vacols + db:migrate:up:vacols + db:migrate:down:vacols + db:migrate:redo:vacols + db:rollback:vacols + db:schema:dump:vacols + db:schema:load:vacols + db:structure:dump:vacols + db:structure:load:vacols +].each do |task_name| + Rake::Task[task_name].clear if Rake::Task.task_defined?(task_name) +end + +#----------------------------------------------------------------------------------------------------------------------- + +# The original definition of the `db:seed` task calls `db:abort_if_pending_migrations`, which would attempt to create a +# `schema_migrations` table on ALL configured databases, including the vacols DB: +# https://github.com/rails/rails/blob/ac87f58207cff18880593263be9d83456aa3a2ef/activerecord/lib/active_record/railties/databases.rake#L389-L393 +# +# This would result in the following error, since the Caseflow app does not have permissions to alter the VACOLS schema: +# +# ActiveRecord::StatementInvalid: OCIError: ORA-01031: insufficient privileges +# +# This re-definiton of `db:seed` will instead call the DB-specific `db:abort_if_pending_migrations` as a workaround. + +db_namespace = namespace :db do + Rake::Task["db:seed"].clear if Rake::Task.task_defined?("db:seed") + desc "Loads the seed data from db/seeds.rb" + task seed: :load_config do + db_namespace["abort_if_pending_migrations:primary"].invoke + + # skip for environments where ETL DB does not exist + db_namespace["abort_if_pending_migrations:etl"].invoke unless %w(demo prodtest).include?(ENV["DEPLOY_ENV"]) + + ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym) + + ActiveRecord::Tasks::DatabaseTasks.load_seed + end +end + +#----------------------------------------------------------------------------------------------------------------------- + +# After transitioning to Rails-native multi-DB support, the behavior of some DB tasks changed such that they will now +# act on ALL databases, including the vacols DB, and not just the primary database. +# +# To avoid accidents, we re-define these tasks here to no-op and output a helpful message to redirect developers toward +# using their new database-specific counterparts instead. + +# rubocop:disable Rails/RakeEnvironment, Layout/HeredocIndentation +namespace :db do + Rake::Task["db:create"].clear if Rake::Task.task_defined?("db:create") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :create do + puts <<~HEREDOC + + db:create is prohibited. + + Prefer using the appropriate database-specific task below: + + db:create:primary # Create primary database for current environment + db:create:etl # Create etl database for current environment + HEREDOC + end + + Rake::Task["db:drop"].clear if Rake::Task.task_defined?("db:drop") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :drop do + puts <<~HEREDOC + + db:drop is prohibited. + + Prefer using the appropriate database-specific task below: + + db:drop:primary # Drop primary database for current environment + db:drop:etl # Drop etl database for current environment + HEREDOC + end + + Rake::Task["db:migrate"].clear if Rake::Task.task_defined?("db:migrate") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :migrate do + puts <<~HEREDOC + + db:migrate is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:primary # Migrate primary database for current environment + db:migrate:etl # Migrate etl database for current environment + HEREDOC + end + + namespace :migrate do + Rake::Task["db:migrate:down"].clear if Rake::Task.task_defined?("db:migrate:down") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :down do + puts <<~HEREDOC + + db:migrate:down is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:down:primary # Runs the "down" for a given migration VERSION on the primary database + db:migrate:down:etl # Runs the "down" for a given migration VERSION on the etl database + HEREDOC + end + + Rake::Task["db:migrate:redo"].clear if Rake::Task.task_defined?("db:migrate:redo") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :redo do + puts <<~HEREDOC + + db:migrate:redo is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:redo:primary # Rolls back primary database one migration and re-migrates up (options: STEP=x, VERSION=x) + db:migrate:redo:etl # Rolls back etl database one migration and re-migrates up (options: STEP=x, VERSION=x) + HEREDOC + end + + Rake::Task["db:migrate:status"].clear if Rake::Task.task_defined?("db:migrate:status") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :status do + puts <<~HEREDOC + + db:migrate:status is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:status:primary # Display status of migrations for primary database + db:migrate:status:etl # Display status of migrations for etl database + HEREDOC + end + + Rake::Task["db:migrate:up"].clear if Rake::Task.task_defined?("db:migrate:up") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :up do + puts <<~HEREDOC + + db:migrate:up is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:up:primary # Runs the "up" for a given migration VERSION on the primary database + db:migrate:up:etl # Runs the "up" for a given migration VERSION on the etl database + HEREDOC + end + end + + Rake::Task["db:reset"].clear if Rake::Task.task_defined?("db:reset") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :reset do + puts <<~HEREDOC + + db:reset is prohibited. + + Prefer using the appropriate sequence of database-specific tasks below: + + db:drop:primary db:create:primary db:schema:load:primary db:seed # Reset the primary database + db:drop:etl db:create:etl db:schema:load:etl db:seed # Reset the etl database + HEREDOC + end + + Rake::Task["db:rollback"].clear if Rake::Task.task_defined?("db:rollback") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :rollback do + puts <<~HEREDOC + + db:rollback is prohibited. + + Prefer using the appropriate database-specific task below: + + db:rollback:primary # Rollback primary database for current environment (specify steps w/ STEP=n) + db:rollback:etl # Rollback etl database for current environment (specify steps w/ STEP=n) + HEREDOC + end + + namespace :schema do + Rake::Task["db:schema:dump"].clear if Rake::Task.task_defined?("db:schema:dump") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :dump do + puts <<~HEREDOC + + db:schema:dump is prohibited. + + Prefer using the appropriate database-specific task below: + + db:schema:dump:primary # Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for primary database + db:schema:dump:etl # Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for etl database + HEREDOC + end + + Rake::Task["db:schema:load"].clear if Rake::Task.task_defined?("db:schema:load") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :load do + puts <<~HEREDOC + + db:schema:load is prohibited. + + Prefer using the appropriate database-specific task below: + + db:schema:load:primary # Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the primary database + db:schema:load:etl # Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the etl database + HEREDOC + end + end + + Rake::Task["db:setup"].clear if Rake::Task.task_defined?("db:setup") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :setup do + puts <<~HEREDOC + + db:setup is prohibited. + + Prefer using the appropriate sequence of database-specific tasks below: + + db:create:primary db:schema:load:primary db:seed # Setup the primary database + db:create:etl db:schema:load:etl db:seed # Setup the etl database + HEREDOC + end + + namespace :test do + Rake::Task["db:test:load"].clear if Rake::Task.task_defined?("db:test:load") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :load do + puts <<~HEREDOC + + db:test:load is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:load:primary # Recreate the primary test database from the current schema + db:test:load:etl # Recreate the etl test database from the current schema + HEREDOC + end + + Rake::Task["db:test:load_schema"].clear if Rake::Task.task_defined?("db:test:load_schema") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :load_schema do + puts <<~HEREDOC + + db:test:load_schema is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:load_schema:primary # Recreate the primary test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`) + db:test:load_schema:etl # Recreate the etl test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`) + HEREDOC + end + + Rake::Task["db:test:prepare"].clear if Rake::Task.task_defined?("db:test:prepare") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :prepare do + puts <<~HEREDOC + + db:test:prepare is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:prepare:primary # Load the schema for the primary test database + db:test:prepare:etl # Load the schema for the etl test database + HEREDOC + end + + Rake::Task["db:test:purge"].clear if Rake::Task.task_defined?("db:test:purge") + desc "[PROHIBITED] Use the appropriate database-specific tasks instead" + task :purge do + puts <<~HEREDOC + + db:test:purge is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:purge:primary # Empty the primary test database + db:test:purge:etl # Empty the etl test database + HEREDOC + end + end +end +# rubocop:enable Rails/RakeEnvironment, Layout/HeredocIndentation diff --git a/lib/tasks/local/build.rake b/lib/tasks/local/build.rake index 15b08e42ada..7f202ba75f7 100644 --- a/lib/tasks/local/build.rake +++ b/lib/tasks/local/build.rake @@ -21,7 +21,7 @@ namespace :local do puts "" puts ">>> 04/08 Creating development and test caseflow databases" - system("RAILS_ENV=development bundle exec rake db:create") || abort + system("RAILS_ENV=development bundle exec rake db:create:primary") || abort puts ">>> 05/08 Seeding FACOLS" system("RAILS_ENV=development bundle exec rake local:vacols:seed") || abort @@ -30,7 +30,7 @@ namespace :local do system("RAILS_ENV=test bundle exec rake spec:setup_vacols") || abort puts ">>> 07/08 Loading schema and seeding local caseflow database" - system("RAILS_ENV=development bundle exec rake db:schema:load db:seed") || abort + system("RAILS_ENV=development bundle exec rake db:schema:load:primary db:seed") || abort puts ">>> 08/08 Enabling feature flags" system("bundle exec rails runner scripts/enable_features_dev.rb") || abort diff --git a/lib/tasks/local/destroy.rake b/lib/tasks/local/destroy.rake index e0873e20ffe..541f489e467 100644 --- a/lib/tasks/local/destroy.rake +++ b/lib/tasks/local/destroy.rake @@ -6,7 +6,7 @@ namespace :local do puts ">>> BEGIN local:destroy" puts ">>> 01/02 Dropping development and test caseflow databases" - system("RAILS_ENV=development bundle exec rake db:drop") || abort + system("RAILS_ENV=development bundle exec rake db:drop:primary") || abort puts ">>> 02/02 Tearing down docker volumes" # Note: In some cases, there may be dangling images or volumes that diff --git a/lib/tasks/spec.rake b/lib/tasks/spec.rake index aca6c9082c3..31dfc56f59a 100644 --- a/lib/tasks/spec.rake +++ b/lib/tasks/spec.rake @@ -25,7 +25,7 @@ namespace :spec do task :spec_name do # rubocop:disable Rails/RakeEnvironment envs = "export TEST_SUBCATEGORY=#{spec_name} && export RAILS_ENV=test &&" - ["rake db:create", "rake db:schema:load"].each do |cmd| + ["rake db:create:primary", "rake db:schema:load:primary"].each do |cmd| ShellCommand.run_and_batch_output("#{envs} #{cmd}") end end diff --git a/scripts/squash.sh b/scripts/squash.sh index bb631e46153..751e8463c34 100755 --- a/scripts/squash.sh +++ b/scripts/squash.sh @@ -5,5 +5,5 @@ git ls-files db/migrate/*.rb | sort | tail -1 | \ %x(git rm -f db/migrate/*.rb; mkdir db/migrate; git mv db/schema.rb #{init_schema}; - bundle exec rake db:migrate; + bundle exec rake db:migrate:primary; git add db/schema.rb; git commit -m 'Squashed migrations')" diff --git a/spec/controllers/api/v1/jobs_controller_spec.rb b/spec/controllers/api/v1/jobs_controller_spec.rb index bd632f60f68..036aeb3bd4b 100644 --- a/spec/controllers/api/v1/jobs_controller_spec.rb +++ b/spec/controllers/api/v1/jobs_controller_spec.rb @@ -30,7 +30,7 @@ # needed to reach 90% test coverage it "should successfully run a job" do - expect(HeartbeatTasksJob.perform_now).to eq true + expect(HeartbeatTasksJob.perform_now).to eq 53 end end diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 44d392ed3cf..6feb3e44749 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -56,7 +56,7 @@ def index it "sets Cache-Control etc" do get :index - expect(response.headers["Cache-Control"]).to eq "no-cache, no-store" + expect(response.headers["Cache-Control"]).to eq "no-store" end end end diff --git a/spec/controllers/decision_reviews_controller_spec.rb b/spec/controllers/decision_reviews_controller_spec.rb index e16465f0362..4280faa4987 100644 --- a/spec/controllers/decision_reviews_controller_spec.rb +++ b/spec/controllers/decision_reviews_controller_spec.rb @@ -942,7 +942,7 @@ params = { business_line_slug: non_comp_org.url }.merge(generate_report_filters.except("report_type")) get :generate_report, format: :csv, params: params expect(response).to have_http_status(:bad_request) - expect(response.content_type).to eq("application/json") + expect(response.content_type).to eq("application/json; charset=utf-8") json_response = JSON.parse(response.body) expect(json_response["error"]).to eq("param is missing or the value is empty: reportType") end diff --git a/spec/factories/ro_schedule_period.rb b/spec/factories/ro_schedule_period.rb index b3ef91ac530..8746f031fa2 100644 --- a/spec/factories/ro_schedule_period.rb +++ b/spec/factories/ro_schedule_period.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true FactoryBot.define do - before(:create) do + after(:build) do S3Service.store_file(SchedulePeriod::S3_SUB_BUCKET + "/" + "validRoSpreadsheet.xlsx", "spec/support/validRoSpreadsheet.xlsx", :filepath) S3Service.store_file(SchedulePeriod::S3_SUB_BUCKET + "/" + "blankRoSpreadsheet.xlsx", diff --git a/spec/feature/non_comp/report_page_spec.rb b/spec/feature/non_comp/report_page_spec.rb index 6cf2c458097..b714a8d328e 100644 --- a/spec/feature/non_comp/report_page_spec.rb +++ b/spec/feature/non_comp/report_page_spec.rb @@ -331,7 +331,7 @@ def clear_filters end def change_history_csv_file - wait_for(5) + sleep 5 # Copied from Capybara setup download_directory = Rails.root.join("tmp/downloads_#{ENV['TEST_SUBCATEGORY'] || 'all'}") list_of_files = Dir.glob(File.join(download_directory, "*")).select { |f| File.file?(f) } @@ -340,11 +340,4 @@ def change_history_csv_file expect(latest_file).to_not eq(nil) latest_file end - - def wait_for(seconds) - start_time = Time.zone.now - while Time.zone.now - start_time < seconds - # Do nothing, just wait - end - end end diff --git a/spec/lib/helpers/association_wrapper_spec.rb b/spec/lib/helpers/association_wrapper_spec.rb index 5acf5ae0cb1..86e157dc91b 100644 --- a/spec/lib/helpers/association_wrapper_spec.rb +++ b/spec/lib/helpers/association_wrapper_spec.rb @@ -91,7 +91,7 @@ [:attorney_case_reviews, false, false, "task_id", "attorney_case_review_id", nil], [:task_timers, false, false, "task_id", "task_timer_id", nil], # has_one declared in Task - [:cached_appeal, false, true, :appeal_id, "cached_appeal_id", nil] + [:cached_appeal, false, true, "appeal_id", "cached_appeal_id", nil] ] end end diff --git a/spec/lib/tasks/db_spec.rb b/spec/lib/tasks/db_spec.rb new file mode 100644 index 00000000000..fab7ca72e54 --- /dev/null +++ b/spec/lib/tasks/db_spec.rb @@ -0,0 +1,295 @@ +# frozen_string_literal: true + +# rubocop:disable Layout/HeredocIndentation +describe "db" do + include_context "rake" + + describe "create" do + subject { Rake::Task["db:create"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:create is prohibited. + + Prefer using the appropriate database-specific task below: + + db:create:primary # Create primary database for current environment + db:create:etl # Create etl database for current environment + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "drop" do + subject { Rake::Task["db:drop"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:drop is prohibited. + + Prefer using the appropriate database-specific task below: + + db:drop:primary # Drop primary database for current environment + db:drop:etl # Drop etl database for current environment + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "migrate" do + subject { Rake::Task["db:migrate"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:migrate is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:primary # Migrate primary database for current environment + db:migrate:etl # Migrate etl database for current environment + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "migrate:down" do + subject { Rake::Task["db:migrate:down"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:migrate:down is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:down:primary # Runs the "down" for a given migration VERSION on the primary database + db:migrate:down:etl # Runs the "down" for a given migration VERSION on the etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "migrate:redo" do + subject { Rake::Task["db:migrate:redo"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:migrate:redo is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:redo:primary # Rolls back primary database one migration and re-migrates up (options: STEP=x, VERSION=x) + db:migrate:redo:etl # Rolls back etl database one migration and re-migrates up (options: STEP=x, VERSION=x) + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "migrate:status" do + subject { Rake::Task["db:migrate:status"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:migrate:status is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:status:primary # Display status of migrations for primary database + db:migrate:status:etl # Display status of migrations for etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "migrate:up" do + subject { Rake::Task["db:migrate:up"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:migrate:up is prohibited. + + Prefer using the appropriate database-specific task below: + + db:migrate:up:primary # Runs the "up" for a given migration VERSION on the primary database + db:migrate:up:etl # Runs the "up" for a given migration VERSION on the etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "reset" do + subject { Rake::Task["db:reset"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:reset is prohibited. + + Prefer using the appropriate sequence of database-specific tasks below: + + db:drop:primary db:create:primary db:schema:load:primary db:seed # Reset the primary database + db:drop:etl db:create:etl db:schema:load:etl db:seed # Reset the etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "rollback" do + subject { Rake::Task["db:rollback"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:rollback is prohibited. + + Prefer using the appropriate database-specific task below: + + db:rollback:primary # Rollback primary database for current environment (specify steps w/ STEP=n) + db:rollback:etl # Rollback etl database for current environment (specify steps w/ STEP=n) + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "schema:dump" do + subject { Rake::Task["db:schema:dump"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:schema:dump is prohibited. + + Prefer using the appropriate database-specific task below: + + db:schema:dump:primary # Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for primary database + db:schema:dump:etl # Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "schema:load" do + subject { Rake::Task["db:schema:load"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:schema:load is prohibited. + + Prefer using the appropriate database-specific task below: + + db:schema:load:primary # Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the primary database + db:schema:load:etl # Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "setup" do + subject { Rake::Task["db:setup"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:setup is prohibited. + + Prefer using the appropriate sequence of database-specific tasks below: + + db:create:primary db:schema:load:primary db:seed # Setup the primary database + db:create:etl db:schema:load:etl db:seed # Setup the etl database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "test:load" do + subject { Rake::Task["db:test:load"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:test:load is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:load:primary # Recreate the primary test database from the current schema + db:test:load:etl # Recreate the etl test database from the current schema + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "test:load_schema" do + subject { Rake::Task["db:test:load_schema"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:test:load_schema is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:load_schema:primary # Recreate the primary test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`) + db:test:load_schema:etl # Recreate the etl test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`) + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "test:prepare" do + subject { Rake::Task["db:test:prepare"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:test:prepare is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:prepare:primary # Load the schema for the primary test database + db:test:prepare:etl # Load the schema for the etl test database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end + + describe "test:purge" do + subject { Rake::Task["db:test:purge"].invoke } + + it "no-ops and outputs a helpful message" do + expected_output = <<~HEREDOC + + db:test:purge is prohibited. + + Prefer using the appropriate database-specific task below: + + db:test:purge:primary # Empty the primary test database + db:test:purge:etl # Empty the etl test database + HEREDOC + + expect { subject }.to output(expected_output).to_stdout + end + end +end +# rubocop:enable Layout/HeredocIndentation diff --git a/spec/models/ro_schedule_period_spec.rb b/spec/models/ro_schedule_period_spec.rb index 774902d3423..78af18d1563 100644 --- a/spec/models/ro_schedule_period_spec.rb +++ b/spec/models/ro_schedule_period_spec.rb @@ -7,6 +7,28 @@ subject { ro_schedule_period.validate_spreadsheet } it { is_expected.to be_truthy } + + context "when spreadsheet is invalid" do + let(:spreadsheet_errors) do + [ + HearingSchedule::ValidateRoSpreadsheet::RoDatesNotUnique.new("RoDatesNotUnique message"), + HearingSchedule::ValidateRoSpreadsheet::RoDatesNotInRange.new("RoDatesNotInRange message"), + HearingSchedule::ValidateRoSpreadsheet::RoDatesNotCorrectFormat.new("RoDatesNotCorrectFormat message"), + HearingSchedule::ValidateRoSpreadsheet::RoTemplateNotFollowed.new("RoTemplateNotFollowed message") + ] + end + + before do + allow_any_instance_of(HearingSchedule::ValidateRoSpreadsheet).to receive(:validate) { spreadsheet_errors } + end + + it "adds errors to model" do + model = build(:ro_schedule_period) + model.valid? + expect(model).to_not be_valid + expect(model.errors[:base]).to match_array([spreadsheet_errors]) + end + end end context "Allocate RO Days Per Given Schedule" do diff --git a/spec/models/veteran_spec.rb b/spec/models/veteran_spec.rb index 7b3a4b5c875..c139c615f7e 100644 --- a/spec/models/veteran_spec.rb +++ b/spec/models/veteran_spec.rb @@ -316,18 +316,24 @@ end end - context "when veteran pay grade is invalid" do - subject { veteran.validate_veteran_pay_grade } - let(:service) do - [{ branch_of_service: "Army", - entered_on_duty_date: "06282002", - released_active_duty_date: "06282003", - pay_grade: "not valid", - char_of_svc_code: "TBD" }] - end + context "pay grade" do + context "when not in BGS pay grade list" do + let(:service) do + [{ branch_of_service: "Army", + entered_on_duty_date: "06282002", + released_active_duty_date: "06282003", + pay_grade: "not valid", + char_of_svc_code: "TBD" }] + end + + it "is invalid within 'bgs' context" do + expect(veteran.valid?(:bgs)).to eq(false) + expect(veteran.errors.messages_for(:pay_grades)).to eq ["invalid_pay_grade"] + end - it "pay grade invalid" do - expect(subject).to eq ["invalid_pay_grade"] + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end end end @@ -554,11 +560,18 @@ end end - context "when a zip code is invalid" do - let(:zip_code) { "1234" } + context "zip code" do + context "when not a valid zip code" do + let(:zip_code) { "1234" } + + it "is invalid within 'bgs' context" do + expect(veteran.valid?(:bgs)).to eq(false) + expect(veteran.errors.messages_for(:zip_code)).to eq ["invalid_zip_code"] + end - it "zip code has invalid characters" do - expect(veteran.validate_zip_code).to eq ["invalid_zip_code"] + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end end @@ -573,21 +586,35 @@ end end - context "given a military address with invalid city characters" do - let(:military_postal_type_code) { "AA" } - let(:city) { "ÐÐÐÐÐ" } - let(:state) { nil } + context "city" do + context "when a military address with invalid city characters" do + let(:military_postal_type_code) { "AA" } + let(:city) { "ÐÐÐÐÐ" } + let(:state) { nil } + + it "is invalid within 'bgs' context" do + expect(veteran.valid?(:bgs)).to eq(false) + expect(veteran.errors.messages_for(:city)).to eq ["invalid_characters"] + end - it "city is considered invalid" do - expect(veteran.validate_city).to eq ["invalid_characters"] + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end end - context "given date of birth is missing leading zeros" do - let(:date_of_birth) { "2/2/1956" } + context "date of birth" do + context "when missing leading zeros" do + let(:date_of_birth) { "2/2/1956" } + + it "is invalid within 'bgs' context" do + expect(veteran.valid?(:bgs)).to eq(false) + expect(veteran.errors.messages_for(:date_of_birth)).to eq ["invalid_date_of_birth"] + end - it "date_of_birth is considered invalid" do - expect(veteran.validate_date_of_birth).to eq ["invalid_date_of_birth"] + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end end @@ -599,22 +626,30 @@ end end - context "#validate_name_suffix" do - subject { veteran.validate_name_suffix } - let(:name_suffix) { "JR." } + context "name suffix" do + context "when containing a special character" do + let(:name_suffix) { "JR." } + + it "is invalid within 'bgs' context" do + expect(veteran.valid?(:bgs)).to eq false + expect(veteran.errors.messages_for(:name_suffix)).to eq(["invalid_character"]) + end - it "name_suffix is considered invalid" do - expect(subject).to eq ["invalid_character"] - expect(veteran.valid?(:bgs)).to eq false + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end - context "name_suffix nil" do + context "when nil" do let(:name_suffix) { nil } - it "name_suffix is considered valid" do - subject + it "is valid within 'bgs' context" do expect(veteran.valid?(:bgs)).to eq true end + + it "is valid outside of 'bgs' context" do + expect(veteran.valid?).to eq(true) + end end end diff --git a/spec/requests/ssl_redirects_spec.rb b/spec/requests/ssl_redirects_spec.rb new file mode 100644 index 00000000000..33c1b3d8412 --- /dev/null +++ b/spec/requests/ssl_redirects_spec.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +describe "SSL Redirects" do + # `app` is what RSpec tests against in request specs, similar to `controller` in controller specs. + # Here, we override it with our modified app. + def app + # Since `CaseflowCertification::Application` is already loaded at this stage, we can't modify the middleware stack, + # so we subclass the application and adjust the relevant SSL config settings. + @app ||= Class.new(Rails.application.class) do + config.force_ssl = true + config.ssl_options = { redirect: { exclude: SslRedirectExclusionPolicy } } + end + end + + before { allow(SslRedirectExclusionPolicy).to receive(:call).and_call_original } + + context "when request is not SSL" do + context "when path matches '/api/docs/v3/'" do + it "is exempt from SSL redirect" do + get "/api/docs/v3/decision_reviews" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path is '/api/metadata'" do + it "is exempt from SSL redirect" do + get "/api/metadata" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path is '/health-check'" do + it "is exempt from SSL redirect" do + get "/health-check" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path matches '/idt/api/v1/'" do + it "is exempt from SSL redirect" do + get "/idt/api/v1/appeals" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path matches '/idt/api/v2/'" do + it "is exempt from SSL redirect" do + get "/idt/api/v2/appeals" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path matches '/pdfjs/'" do + it "is exempt from SSL redirect" do + get "/pdfjs/full?file=%2Fcertifications%2F2774535%2Fform9_pdf" + expect(SslRedirectExclusionPolicy).to have_received(:call) + expect(response).not_to have_http_status(:redirect) + end + end + + context "when path is not exempt from SSL redirects" do + it "is redirected with SSL" do + get "/users" + expect(SslRedirectExclusionPolicy).to have_received(:call) + + expect(response).to redirect_to("https://#{request.host}/users") + end + end + end +end diff --git a/spec/services/deprecation_warnings/development_handler_spec.rb b/spec/services/deprecation_warnings/development_handler_spec.rb deleted file mode 100644 index 0848fd5b3ae..00000000000 --- a/spec/services/deprecation_warnings/development_handler_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -module DeprecationWarnings - describe DevelopmentHandler do - context ".call" do - subject(:call) do - described_class.call(message, _callstack = [], _deprecation_horizon = "6.0", _gem_name = "Rails") - end - - let(:message) { "dummy deprecation message" } - let(:rails_logger) { Rails.logger } - - before do - allow(Rails).to receive(:logger).and_return(rails_logger) - allow(rails_logger).to receive(:warn) - end - - it "emits a warning to the application logs" do - call - - expect(rails_logger).to have_received(:warn).with(message) - end - - context "when deprecation is allowed" do - let(:message) { "allowed deprecation message" } - - it "does not raise error" do - expect { call }.not_to raise_error - end - end - - context "when deprecation is disallowed" do - let(:message) { "disallowed deprecation message" } - - before do - stub_const("DisallowedDeprecations::DISALLOWED_DEPRECATION_WARNING_REGEXES", - [Regexp.new(Regexp.escape(message))]) - end - - it "raises DisallowedDeprecationError" do - expect { call }.to raise_error(::DisallowedDeprecationError) - end - end - end - end -end diff --git a/spec/services/deprecation_warnings/production_handler_spec.rb b/spec/services/deprecation_warnings/production_handler_spec.rb index e28cf27f0e1..a34c219d584 100644 --- a/spec/services/deprecation_warnings/production_handler_spec.rb +++ b/spec/services/deprecation_warnings/production_handler_spec.rb @@ -25,12 +25,6 @@ module DeprecationWarnings allow(slack_service).to receive(:send_notification) end - it "emits a warning to the application logs" do - call - - expect(rails_logger).to have_received(:warn).with(message) - end - it "emits a warning to Sentry" do call diff --git a/spec/services/deprecation_warnings/test_handler_spec.rb b/spec/services/deprecation_warnings/test_handler_spec.rb deleted file mode 100644 index 0ddf9bec0ad..00000000000 --- a/spec/services/deprecation_warnings/test_handler_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -module DeprecationWarnings - describe TestHandler do - context ".call" do - subject(:call) do - described_class.call(message, _callstack = [], _deprecation_horizon = "6.0", _gem_name = "Rails") - end - - let(:message) { "dummy deprecation message" } - - it "logs message to stderr" do - expect { call }.to output("#{message}\n").to_stderr - end - - context "when deprecation is allowed" do - let(:message) { "allowed deprecation message" } - - it "does not raise error" do - expect { call }.not_to raise_error - end - end - - context "when deprecation is disallowed" do - let(:message) { "disallowed deprecation message" } - - before do - stub_const("DisallowedDeprecations::DISALLOWED_DEPRECATION_WARNING_REGEXES", - [Regexp.new(Regexp.escape(message))]) - end - - it "raises DisallowedDeprecationError" do - expect { call }.to raise_error(::DisallowedDeprecationError) - end - end - end - end -end diff --git a/spec/sql/ama_cases_sql_spec.rb b/spec/sql/ama_cases_sql_spec.rb index 6dbafeb8e1d..def32079c57 100644 --- a/spec/sql/ama_cases_sql_spec.rb +++ b/spec/sql/ama_cases_sql_spec.rb @@ -22,10 +22,10 @@ non_aod_case = result.find { |r| r["id"] == not_distributed.id } expect(aod_case["aod_is_advanced_on_docket"]).to eq(true) - expect(aod_case["aod_veteran.age"]).to eq("76") + expect(aod_case["aod_veteran.age"]).to eq(76) expect(non_aod_case["aod_is_advanced_on_docket"]).to eq(false) - expect(non_aod_case["aod_veteran.age"]).to eq("65") + expect(non_aod_case["aod_veteran.age"]).to eq(65) end end end diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb index bc90949aa75..9905b0e7f78 100644 --- a/spec/support/database_cleaner.rb +++ b/spec/support/database_cleaner.rb @@ -5,35 +5,31 @@ RSpec.configure do |config| config.use_transactional_fixtures = false - etl = "etl_#{Rails.env}".to_sym - vacols = "#{Rails.env}_vacols".to_sym - caseflow = Rails.env.to_s.to_sym - vacols_tables_to_preserve = %w[vftypes issref] - # IMPORTANT that in all these hook defs, the "caseflow" connection comes last. + # IMPORTANT that in all these hook defs, the "primary" connection comes last. config.before(:suite) do - DatabaseCleaner[:active_record, { db: etl }].clean_with(:truncation) - DatabaseCleaner[:active_record, { db: vacols }] + DatabaseCleaner[:active_record, { db: :etl }].clean_with(:truncation) + DatabaseCleaner[:active_record, { db: :vacols }] .clean_with(:deletion, except: vacols_tables_to_preserve) - DatabaseCleaner[:active_record, { db: caseflow }].clean_with(:truncation) + DatabaseCleaner[:active_record, { db: :primary }].clean_with(:truncation) end config.before(:each) do |example| # Allows seeded data to persist for use across threads # You will need to manually clean the data once the threads under test close. unless example.metadata[:bypass_cleaner] - DatabaseCleaner[:active_record, { db: vacols }].strategy = :transaction - DatabaseCleaner[:active_record, { db: caseflow }].strategy = :transaction + DatabaseCleaner[:active_record, { db: :vacols }].strategy = :transaction + DatabaseCleaner[:active_record, { db: :primary }].strategy = :transaction end end config.before(:each, db_clean: :truncation) do |example| unless example.metadata[:bypass_cleaner] - DatabaseCleaner[:active_record, { db: vacols }].strategy = + DatabaseCleaner[:active_record, { db: :vacols }].strategy = :deletion, { except: vacols_tables_to_preserve } - DatabaseCleaner[:active_record, { db: caseflow }].strategy = :truncation + DatabaseCleaner[:active_record, { db: :primary }].strategy = :truncation end end @@ -46,42 +42,42 @@ # Driver is probably for an external browser with an app # under test that does *not* share a database connection with the # specs, so use truncation strategy. - DatabaseCleaner[:active_record, { db: vacols }].strategy = + DatabaseCleaner[:active_record, { db: :vacols }].strategy = :deletion, { except: vacols_tables_to_preserve } - DatabaseCleaner[:active_record, { db: caseflow }].strategy = :truncation + DatabaseCleaner[:active_record, { db: :primary }].strategy = :truncation end end config.before(:each) do |example| unless example.metadata[:bypass_cleaner] - DatabaseCleaner[:active_record, { db: vacols }].start - DatabaseCleaner[:active_record, { db: caseflow }].start + DatabaseCleaner[:active_record, { db: :vacols }].start + DatabaseCleaner[:active_record, { db: :primary }].start end end config.append_after(:each) do - DatabaseCleaner[:active_record, { db: vacols }].clean - DatabaseCleaner[:active_record, { db: caseflow }].clean + DatabaseCleaner[:active_record, { db: :vacols }].clean + DatabaseCleaner[:active_record, { db: :primary }].clean clean_application! end # ETL is never used in feature tests and there are only a few, so we tag those with :etl # ETL db uses deletion strategy everywhere because syncing runs in a transaction. config.before(:each, :etl) do - DatabaseCleaner[:active_record, { db: etl }].strategy = :deletion + DatabaseCleaner[:active_record, { db: :etl }].strategy = :deletion end config.before(:each, :etl, db_clean: :truncation) do - DatabaseCleaner[:active_record, { db: etl }].strategy = :truncation + DatabaseCleaner[:active_record, { db: :etl }].strategy = :truncation end config.before(:each, :etl) do Rails.logger.info("DatabaseCleaner.start ETL") - DatabaseCleaner[:active_record, { db: etl }].start + DatabaseCleaner[:active_record, { db: :etl }].start end config.append_after(:each, :etl) do - DatabaseCleaner[:active_record, { db: etl }].clean + DatabaseCleaner[:active_record, { db: :etl }].clean Rails.logger.info("DatabaseCleaner.clean ETL") end end diff --git a/spec/workflows/ama_appeal_dispatch_spec.rb b/spec/workflows/ama_appeal_dispatch_spec.rb index 62a1e336e61..425ab981695 100644 --- a/spec/workflows/ama_appeal_dispatch_spec.rb +++ b/spec/workflows/ama_appeal_dispatch_spec.rb @@ -70,7 +70,10 @@ it "does not call #perform_later on MailRequestJob" do allow(ProcessDecisionDocumentJob).to receive(:perform_later).and_raise(StandardError) expect(MailRequestJob).to_not receive(:perform_later) - expect { subject }.to raise_error(StandardError) + subject + rescue Minitest::UnexpectedError => error # rubocop:disable Lint/SuppressedException + ensure + expect(error.message).to match("StandardError") end end end diff --git a/spec/workflows/legacy_appeal_dispatch_spec.rb b/spec/workflows/legacy_appeal_dispatch_spec.rb index 81c40e35793..a1831d29f04 100644 --- a/spec/workflows/legacy_appeal_dispatch_spec.rb +++ b/spec/workflows/legacy_appeal_dispatch_spec.rb @@ -102,7 +102,10 @@ it "does not call #perform_later on MailRequestJob" do allow(ProcessDecisionDocumentJob).to receive(:perform_later).and_raise(StandardError) expect(MailRequestJob).to_not receive(:perform_later) - expect { subject }.to raise_error(StandardError) + subject + rescue Minitest::UnexpectedError => error # rubocop:disable Lint/SuppressedException + ensure + expect(error.message).to match("StandardError") end end end From e2d466c42bc9c879435417acfe04f4fc7ccc743d Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Tue, 10 Sep 2024 16:12:47 -0400 Subject: [PATCH 45/46] Fixing force_sll issue --- app/controllers/application_base_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_base_controller.rb b/app/controllers/application_base_controller.rb index 76993065561..c5ee3d5d62a 100644 --- a/app/controllers/application_base_controller.rb +++ b/app/controllers/application_base_controller.rb @@ -6,7 +6,6 @@ class ApplicationBaseController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - force_ssl if: :ssl_enabled? before_action :check_out_of_service before_action :strict_transport_security @@ -33,6 +32,10 @@ def check_out_of_service render "out_of_service", layout: "application" if Rails.cache.read("out_of_service") end + def ssl_enabled? + Rails.env.production? + end + def strict_transport_security response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains" if request.ssl? end From b06b27074425833b993510c5777f4d16e3e66808 Mon Sep 17 00:00:00 2001 From: raymond-hughes Date: Tue, 10 Sep 2024 16:14:32 -0400 Subject: [PATCH 46/46] Fixing force_sll issue --- app/controllers/api/application_controller.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/application_controller.rb b/app/controllers/api/application_controller.rb index a5542a4125b..ad7f9c0a127 100644 --- a/app/controllers/api/application_controller.rb +++ b/app/controllers/api/application_controller.rb @@ -3,7 +3,6 @@ class Api::ApplicationController < ActionController::Base protect_from_forgery with: :null_session - force_ssl if: :ssl_enabled? before_action :strict_transport_security before_action :setup_fakes, @@ -49,6 +48,10 @@ def unauthorized render json: { status: "unauthorized" }, status: :unauthorized end + def ssl_enabled? + Rails.env.production? + end + def strict_transport_security response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains" if request.ssl? end