geneva_drive 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/lib/geneva_drive/executor.rb +5 -7
  4. data/lib/geneva_drive/flow_control.rb +20 -5
  5. data/lib/geneva_drive/jobs/housekeeping_job.rb +1 -1
  6. data/lib/geneva_drive/version.rb +1 -1
  7. data/test/dummy/config/environments/development.rb +0 -18
  8. data/test/dummy/config/environments/production.rb +0 -19
  9. data/test/dummy/config/environments/test.rb +0 -14
  10. data/test/dummy/log/test.log +54290 -0
  11. data/test/dummy_install/config/environments/development.rb +0 -18
  12. data/test/dummy_install/config/environments/production.rb +0 -19
  13. data/test/dummy_install/config/environments/test.rb +0 -14
  14. data/test/dummy_install/db/schema.rb +1 -1
  15. data/test/dummy_install/log/test.log +417 -0
  16. data/test/workflow/flow_control_test.rb +6 -5
  17. data/test/workflow/resume_and_skip_test.rb +305 -0
  18. metadata +49 -17
  19. data/app/assets/stylesheets/geneva_drive/application.css +0 -15
  20. data/app/controllers/geneva_drive/application_controller.rb +0 -2
  21. data/app/helpers/geneva_drive/application_helper.rb +0 -2
  22. data/app/jobs/geneva_drive/application_job.rb +0 -2
  23. data/app/mailers/geneva_drive/application_mailer.rb +0 -4
  24. data/app/models/geneva_drive/application_record.rb +0 -3
  25. data/app/views/layouts/geneva_drive/application.html.erb +0 -17
  26. data/test/dummy/app/mailers/application_mailer.rb +0 -4
  27. data/test/dummy/config/storage.yml +0 -34
  28. data/test/dummy_install/app/mailers/application_mailer.rb +0 -4
  29. data/test/dummy_install/config/storage.yml +0 -34
  30. /data/test/dummy_install/db/migrate/{20260126091843_create_geneva_drive_workflows.rb → 20260126164025_create_geneva_drive_workflows.rb} +0 -0
  31. /data/test/dummy_install/db/migrate/{20260126091844_create_geneva_drive_step_executions.rb → 20260126164026_create_geneva_drive_step_executions.rb} +0 -0
  32. /data/test/dummy_install/db/migrate/{20260126091845_add_finished_at_to_geneva_drive_step_executions.rb → 20260126164027_add_finished_at_to_geneva_drive_step_executions.rb} +0 -0
  33. /data/test/dummy_install/db/migrate/{20260126091846_add_error_class_name_to_geneva_drive_step_executions.rb → 20260126164028_add_error_class_name_to_geneva_drive_step_executions.rb} +0 -0
@@ -28,18 +28,6 @@ Rails.application.configure do
28
28
  # Change to :null_store to avoid any caching.
29
29
  config.cache_store = :memory_store
30
30
 
31
- # Store uploaded files on the local file system (see config/storage.yml for options).
32
- config.active_storage.service = :local
33
-
34
- # Don't care if the mailer can't send.
35
- config.action_mailer.raise_delivery_errors = false
36
-
37
- # Make template changes take effect immediately.
38
- config.action_mailer.perform_caching = false
39
-
40
- # Set localhost to be used by links generated in mailer templates.
41
- config.action_mailer.default_url_options = {host: "localhost", port: 3000}
42
-
43
31
  # Print deprecation notices to the Rails logger.
44
32
  config.active_support.deprecation = :log
45
33
 
@@ -58,12 +46,6 @@ Rails.application.configure do
58
46
  # Raises error for missing translations.
59
47
  # config.i18n.raise_on_missing_translations = true
60
48
 
61
- # Annotate rendered view with file names.
62
- config.action_view.annotate_rendered_view_with_filenames = true
63
-
64
- # Uncomment if you wish to allow Action Cable access from any origin.
65
- # config.action_cable.disable_request_forgery_protection = true
66
-
67
49
  # Raise error when a before_action's only/except options reference missing actions.
68
50
  config.action_controller.raise_on_missing_callback_actions = true
69
51
  end
@@ -21,9 +21,6 @@ Rails.application.configure do
21
21
  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
22
22
  # config.asset_host = "http://assets.example.com"
23
23
 
24
- # Store uploaded files on the local file system (see config/storage.yml for options).
25
- config.active_storage.service = :local
26
-
27
24
  # Assume all access to the app is happening through a SSL-terminating reverse proxy.
28
25
  config.assume_ssl = true
29
26
 
@@ -52,22 +49,6 @@ Rails.application.configure do
52
49
  # Replace the default in-process and non-durable queuing backend for Active Job.
53
50
  # config.active_job.queue_adapter = :resque
54
51
 
55
- # Ignore bad email addresses and do not raise email delivery errors.
56
- # Set this to true and configure the email server for immediate delivery to raise delivery errors.
57
- # config.action_mailer.raise_delivery_errors = false
58
-
59
- # Set host to be used by links generated in mailer templates.
60
- config.action_mailer.default_url_options = {host: "example.com"}
61
-
62
- # Specify outgoing SMTP server. Remember to add smtp/* credentials via rails credentials:edit.
63
- # config.action_mailer.smtp_settings = {
64
- # user_name: Rails.application.credentials.dig(:smtp, :user_name),
65
- # password: Rails.application.credentials.dig(:smtp, :password),
66
- # address: "smtp.example.com",
67
- # port: 587,
68
- # authentication: :plain
69
- # }
70
-
71
52
  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
72
53
  # the I18n.default_locale when a translation cannot be found).
73
54
  config.i18n.fallbacks = true
@@ -28,26 +28,12 @@ Rails.application.configure do
28
28
  # Disable request forgery protection in test environment.
29
29
  config.action_controller.allow_forgery_protection = false
30
30
 
31
- # Store uploaded files on the local file system in a temporary directory.
32
- config.active_storage.service = :test
33
-
34
- # Tell Action Mailer not to deliver emails to the real world.
35
- # The :test delivery method accumulates sent emails in the
36
- # ActionMailer::Base.deliveries array.
37
- config.action_mailer.delivery_method = :test
38
-
39
- # Set host to be used by links generated in mailer templates.
40
- config.action_mailer.default_url_options = {host: "example.com"}
41
-
42
31
  # Print deprecation notices to the stderr.
43
32
  config.active_support.deprecation = :stderr
44
33
 
45
34
  # Raises error for missing translations.
46
35
  # config.i18n.raise_on_missing_translations = true
47
36
 
48
- # Annotate rendered view with file names.
49
- # config.action_view.annotate_rendered_view_with_filenames = true
50
-
51
37
  # Raise error when a before_action's only/except options reference missing actions.
52
38
  config.action_controller.raise_on_missing_callback_actions = true
53
39
  end
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema[8.1].define(version: 2026_01_26_091846) do
13
+ ActiveRecord::Schema[8.1].define(version: 2026_01_26_164028) do
14
14
  # These are extensions that must be enabled in order to support this database
15
15
  enable_extension "pg_catalog.plpgsql"
16
16
 
@@ -2991,3 +2991,420 @@ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126091846)
2991
2991
  SQL (0.0ms) SET search_path TO public
2992
2992
  SQL (0.0ms) SET search_path TO "$user", public
2993
2993
  Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
2994
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
2995
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
2996
+ ActiveRecord::SchemaMigration Load (2.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
2997
+ ActiveRecord::InternalMetadata Load (1.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
2998
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
2999
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3000
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3001
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3002
+ SQL (0.1ms) SET search_path TO public
3003
+  (96.2ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3004
+ SQL (0.0ms) SET search_path TO public
3005
+  (126.1ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3006
+  (3.3ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3007
+  (2.6ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3008
+  (0.0ms) SELECT pg_try_advisory_lock(5769190355348905590)
3009
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3010
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3011
+ ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:25:47.836013', '2026-01-26 16:25:47.836015') RETURNING "key"
3012
+ Migrating to CreateUsers (20241217000000)
3013
+ TRANSACTION (0.0ms) BEGIN
3014
+  (1.7ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3015
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3016
+ TRANSACTION (0.1ms) COMMIT
3017
+ Migrating to CreateGenevaDriveWorkflows (20260126162546)
3018
+ TRANSACTION (0.3ms) BEGIN
3019
+  (1.6ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3020
+  (0.5ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3021
+  (0.5ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3022
+  (0.6ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3023
+  (0.7ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3024
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3025
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3026
+ 
3027
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162546') RETURNING "version"
3028
+ TRANSACTION (0.3ms) COMMIT
3029
+ Migrating to CreateGenevaDriveStepExecutions (20260126162547)
3030
+ TRANSACTION (0.3ms) BEGIN
3031
+  (1.9ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3032
+ FOREIGN KEY ("workflow_id")
3033
+ REFERENCES "geneva_drive_workflows" ("id")
3034
+ ON DELETE CASCADE)
3035
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3036
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3037
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3038
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3039
+  (0.4ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3040
+  (0.6ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3041
+  (0.5ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3042
+ ON geneva_drive_step_executions (workflow_id)
3043
+ WHERE state IN ('scheduled', 'in_progress');
3044
+ 
3045
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162547') RETURNING "version"
3046
+ TRANSACTION (0.1ms) COMMIT
3047
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126162548)
3048
+ TRANSACTION (0.0ms) BEGIN
3049
+  (0.1ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3050
+  (0.5ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3051
+  (0.3ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3052
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162548') RETURNING "version"
3053
+ TRANSACTION (0.1ms) COMMIT
3054
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126162549)
3055
+ TRANSACTION (0.0ms) BEGIN
3056
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162549') RETURNING "version"
3057
+ TRANSACTION (0.1ms) COMMIT
3058
+  (0.1ms) SELECT pg_advisory_unlock(5769190355348905590)
3059
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3060
+ SQL (0.0ms) SET search_path TO public
3061
+ SQL (0.0ms) SET search_path TO "$user", public
3062
+ SQL (0.0ms) SET search_path TO public
3063
+ SQL (0.0ms) SET search_path TO "$user", public
3064
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3065
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3066
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3067
+ ActiveRecord::SchemaMigration Load (1.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3068
+ ActiveRecord::InternalMetadata Load (0.7ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3069
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3070
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3071
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3072
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3073
+ SQL (0.1ms) SET search_path TO public
3074
+  (77.4ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3075
+ SQL (0.1ms) SET search_path TO public
3076
+  (90.9ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3077
+  (2.3ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3078
+  (1.1ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3079
+  (0.0ms) SELECT pg_try_advisory_lock(5769190355348905590)
3080
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3081
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3082
+ ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:26:08.249700', '2026-01-26 16:26:08.249701') RETURNING "key"
3083
+ Migrating to CreateUsers (20241217000000)
3084
+ TRANSACTION (0.0ms) BEGIN
3085
+  (2.6ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3086
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3087
+ TRANSACTION (0.3ms) COMMIT
3088
+ Migrating to CreateGenevaDriveWorkflows (20260126162607)
3089
+ TRANSACTION (0.1ms) BEGIN
3090
+  (1.4ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3091
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3092
+  (0.5ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3093
+  (0.5ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3094
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3095
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3096
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3097
+ 
3098
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162607') RETURNING "version"
3099
+ TRANSACTION (0.1ms) COMMIT
3100
+ Migrating to CreateGenevaDriveStepExecutions (20260126162608)
3101
+ TRANSACTION (0.1ms) BEGIN
3102
+  (1.4ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3103
+ FOREIGN KEY ("workflow_id")
3104
+ REFERENCES "geneva_drive_workflows" ("id")
3105
+ ON DELETE CASCADE)
3106
+  (0.2ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3107
+  (0.2ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3108
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3109
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3110
+  (0.3ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3111
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3112
+  (0.3ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3113
+ ON geneva_drive_step_executions (workflow_id)
3114
+ WHERE state IN ('scheduled', 'in_progress');
3115
+ 
3116
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162608') RETURNING "version"
3117
+ TRANSACTION (0.1ms) COMMIT
3118
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126162609)
3119
+ TRANSACTION (0.0ms) BEGIN
3120
+  (0.2ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3121
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3122
+  (0.3ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3123
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162609') RETURNING "version"
3124
+ TRANSACTION (0.1ms) COMMIT
3125
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126162610)
3126
+ TRANSACTION (0.0ms) BEGIN
3127
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162610') RETURNING "version"
3128
+ TRANSACTION (0.1ms) COMMIT
3129
+  (0.0ms) SELECT pg_advisory_unlock(5769190355348905590)
3130
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3131
+ SQL (0.0ms) SET search_path TO public
3132
+ SQL (0.1ms) SET search_path TO "$user", public
3133
+ SQL (0.0ms) SET search_path TO public
3134
+ SQL (0.0ms) SET search_path TO "$user", public
3135
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3136
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3137
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3138
+ ActiveRecord::SchemaMigration Load (1.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3139
+ ActiveRecord::InternalMetadata Load (0.8ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3140
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3141
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3142
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3143
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3144
+ SQL (0.1ms) SET search_path TO public
3145
+  (90.0ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3146
+ SQL (0.1ms) SET search_path TO public
3147
+  (84.5ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3148
+  (2.2ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3149
+  (1.3ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3150
+  (0.1ms) SELECT pg_try_advisory_lock(5769190355348905590)
3151
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3152
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3153
+ ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:26:34.023511', '2026-01-26 16:26:34.023513') RETURNING "key"
3154
+ Migrating to CreateUsers (20241217000000)
3155
+ TRANSACTION (0.1ms) BEGIN
3156
+  (3.8ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3157
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3158
+ TRANSACTION (0.3ms) COMMIT
3159
+ Migrating to CreateGenevaDriveWorkflows (20260126162632)
3160
+ TRANSACTION (0.1ms) BEGIN
3161
+  (1.4ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3162
+  (0.8ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3163
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3164
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3165
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3166
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3167
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3168
+ 
3169
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162632') RETURNING "version"
3170
+ TRANSACTION (0.1ms) COMMIT
3171
+ Migrating to CreateGenevaDriveStepExecutions (20260126162633)
3172
+ TRANSACTION (0.1ms) BEGIN
3173
+  (1.5ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3174
+ FOREIGN KEY ("workflow_id")
3175
+ REFERENCES "geneva_drive_workflows" ("id")
3176
+ ON DELETE CASCADE)
3177
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3178
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3179
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3180
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3181
+  (0.3ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3182
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3183
+  (0.3ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3184
+ ON geneva_drive_step_executions (workflow_id)
3185
+ WHERE state IN ('scheduled', 'in_progress');
3186
+ 
3187
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162633') RETURNING "version"
3188
+ TRANSACTION (0.1ms) COMMIT
3189
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126162634)
3190
+ TRANSACTION (0.0ms) BEGIN
3191
+  (0.1ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3192
+  (0.2ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3193
+  (0.3ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3194
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162634') RETURNING "version"
3195
+ TRANSACTION (0.1ms) COMMIT
3196
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126162635)
3197
+ TRANSACTION (0.0ms) BEGIN
3198
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126162635') RETURNING "version"
3199
+ TRANSACTION (0.1ms) COMMIT
3200
+  (0.1ms) SELECT pg_advisory_unlock(5769190355348905590)
3201
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3202
+ SQL (0.0ms) SET search_path TO public
3203
+ SQL (0.1ms) SET search_path TO "$user", public
3204
+ SQL (0.0ms) SET search_path TO public
3205
+ SQL (0.0ms) SET search_path TO "$user", public
3206
+ Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
3207
+ ActiveRecord::SchemaMigration Load (2.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3208
+ ActiveRecord::InternalMetadata Load (1.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3209
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3210
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3211
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3212
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3213
+ SQL (0.1ms) SET search_path TO public
3214
+  (108.7ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3215
+ SQL (0.0ms) SET search_path TO public
3216
+  (138.6ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3217
+  (2.5ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3218
+  (1.2ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3219
+  (0.0ms) SELECT pg_try_advisory_lock(5769190355348905590)
3220
+ ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3221
+ ActiveRecord::InternalMetadata Load (0.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3222
+ ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:35:15.720150', '2026-01-26 16:35:15.720152') RETURNING "key"
3223
+ Migrating to CreateUsers (20241217000000)
3224
+ TRANSACTION (0.1ms) BEGIN
3225
+  (1.7ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3226
+ ActiveRecord::SchemaMigration Create (0.2ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3227
+ TRANSACTION (0.4ms) COMMIT
3228
+ Migrating to CreateGenevaDriveWorkflows (20260126163514)
3229
+ TRANSACTION (0.1ms) BEGIN
3230
+  (1.4ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3231
+  (0.8ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3232
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3233
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3234
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3235
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3236
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3237
+ 
3238
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163514') RETURNING "version"
3239
+ TRANSACTION (0.1ms) COMMIT
3240
+ Migrating to CreateGenevaDriveStepExecutions (20260126163515)
3241
+ TRANSACTION (0.1ms) BEGIN
3242
+  (1.6ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3243
+ FOREIGN KEY ("workflow_id")
3244
+ REFERENCES "geneva_drive_workflows" ("id")
3245
+ ON DELETE CASCADE)
3246
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3247
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3248
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3249
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3250
+  (0.3ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3251
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3252
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3253
+ ON geneva_drive_step_executions (workflow_id)
3254
+ WHERE state IN ('scheduled', 'in_progress');
3255
+ 
3256
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163515') RETURNING "version"
3257
+ TRANSACTION (0.3ms) COMMIT
3258
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126163516)
3259
+ TRANSACTION (0.0ms) BEGIN
3260
+  (0.2ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3261
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3262
+  (0.4ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3263
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163516') RETURNING "version"
3264
+ TRANSACTION (0.1ms) COMMIT
3265
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126163517)
3266
+ TRANSACTION (0.0ms) BEGIN
3267
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163517') RETURNING "version"
3268
+ TRANSACTION (0.1ms) COMMIT
3269
+  (0.1ms) SELECT pg_advisory_unlock(5769190355348905590)
3270
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3271
+ SQL (0.0ms) SET search_path TO public
3272
+ SQL (0.0ms) SET search_path TO "$user", public
3273
+ SQL (0.0ms) SET search_path TO public
3274
+ SQL (0.0ms) SET search_path TO "$user", public
3275
+ ActiveRecord::SchemaMigration Load (1.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3276
+ ActiveRecord::InternalMetadata Load (0.9ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3277
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3278
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3279
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3280
+ ActiveRecord::InternalMetadata Load (0.2ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3281
+ SQL (0.1ms) SET search_path TO public
3282
+  (93.1ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3283
+ SQL (0.0ms) SET search_path TO public
3284
+  (90.3ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3285
+  (2.1ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3286
+  (1.0ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3287
+  (0.0ms) SELECT pg_try_advisory_lock(5769190355348905590)
3288
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3289
+ ActiveRecord::InternalMetadata Load (0.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3290
+ ActiveRecord::InternalMetadata Create (0.3ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:35:48.254875', '2026-01-26 16:35:48.254877') RETURNING "key"
3291
+ Migrating to CreateUsers (20241217000000)
3292
+ TRANSACTION (0.0ms) BEGIN
3293
+  (1.8ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3294
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3295
+ TRANSACTION (0.3ms) COMMIT
3296
+ Migrating to CreateGenevaDriveWorkflows (20260126163547)
3297
+ TRANSACTION (0.1ms) BEGIN
3298
+  (1.0ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3299
+  (0.2ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3300
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3301
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3302
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3303
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3304
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3305
+ 
3306
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163547') RETURNING "version"
3307
+ TRANSACTION (0.1ms) COMMIT
3308
+ Migrating to CreateGenevaDriveStepExecutions (20260126163548)
3309
+ TRANSACTION (0.1ms) BEGIN
3310
+  (2.0ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3311
+ FOREIGN KEY ("workflow_id")
3312
+ REFERENCES "geneva_drive_workflows" ("id")
3313
+ ON DELETE CASCADE)
3314
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3315
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3316
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3317
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3318
+  (0.3ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3319
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3320
+  (0.3ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3321
+ ON geneva_drive_step_executions (workflow_id)
3322
+ WHERE state IN ('scheduled', 'in_progress');
3323
+ 
3324
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163548') RETURNING "version"
3325
+ TRANSACTION (0.3ms) COMMIT
3326
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126163549)
3327
+ TRANSACTION (0.0ms) BEGIN
3328
+  (0.2ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3329
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3330
+  (0.4ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3331
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163549') RETURNING "version"
3332
+ TRANSACTION (0.1ms) COMMIT
3333
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126163550)
3334
+ TRANSACTION (0.0ms) BEGIN
3335
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126163550') RETURNING "version"
3336
+ TRANSACTION (0.1ms) COMMIT
3337
+  (0.1ms) SELECT pg_advisory_unlock(5769190355348905590)
3338
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3339
+ SQL (0.0ms) SET search_path TO public
3340
+ SQL (0.0ms) SET search_path TO "$user", public
3341
+ SQL (0.0ms) SET search_path TO public
3342
+ SQL (0.0ms) SET search_path TO "$user", public
3343
+ ActiveRecord::SchemaMigration Load (1.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3344
+ ActiveRecord::InternalMetadata Load (1.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3345
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3346
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3347
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3348
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3349
+ SQL (0.1ms) SET search_path TO public
3350
+  (88.8ms) DROP DATABASE IF EXISTS "geneva_drive_install_test"
3351
+ SQL (0.0ms) SET search_path TO public
3352
+  (92.7ms) CREATE DATABASE "geneva_drive_install_test" ENCODING = 'unicode'
3353
+  (2.8ms) CREATE TABLE "schema_migrations" ("version" character varying NOT NULL PRIMARY KEY)
3354
+  (1.2ms) CREATE TABLE "ar_internal_metadata" ("key" character varying NOT NULL PRIMARY KEY, "value" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3355
+  (0.1ms) SELECT pg_try_advisory_lock(5769190355348905590)
3356
+ ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3357
+ ActiveRecord::InternalMetadata Load (0.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
3358
+ ActiveRecord::InternalMetadata Create (0.2ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'test', '2026-01-26 16:40:26.675124', '2026-01-26 16:40:26.675126') RETURNING "key"
3359
+ Migrating to CreateUsers (20241217000000)
3360
+ TRANSACTION (0.0ms) BEGIN
3361
+  (1.6ms) CREATE TABLE "users" ("id" bigserial primary key, "email" character varying NOT NULL, "name" character varying, "active" boolean DEFAULT TRUE, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3362
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241217000000') RETURNING "version"
3363
+ TRANSACTION (0.2ms) COMMIT
3364
+ Migrating to CreateGenevaDriveWorkflows (20260126164025)
3365
+ TRANSACTION (0.1ms) BEGIN
3366
+  (1.3ms) CREATE TABLE "geneva_drive_workflows" ("id" bigserial primary key, "type" character varying NOT NULL, "hero_type" character varying NOT NULL, "hero_id" bigint NOT NULL, "state" character varying DEFAULT 'ready' NOT NULL, "current_step_name" character varying, "next_step_name" character varying, "allow_multiple" boolean DEFAULT FALSE NOT NULL, "started_at" timestamp(6), "transitioned_at" timestamp(6), "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
3367
+  (0.4ms) CREATE INDEX "index_geneva_drive_workflows_on_type" ON "geneva_drive_workflows" ("type")
3368
+  (0.3ms) CREATE INDEX "index_geneva_drive_workflows_on_state" ON "geneva_drive_workflows" ("state")
3369
+  (0.2ms) CREATE INDEX "index_geneva_drive_workflows_on_hero_type_and_hero_id" ON "geneva_drive_workflows" ("hero_type", "hero_id")
3370
+  (0.4ms)  CREATE UNIQUE INDEX index_geneva_drive_workflows_unique_ongoing
3371
+ ON geneva_drive_workflows (type, hero_type, hero_id)
3372
+ WHERE state NOT IN ('finished', 'canceled') AND allow_multiple = false;
3373
+ 
3374
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126164025') RETURNING "version"
3375
+ TRANSACTION (0.1ms) COMMIT
3376
+ Migrating to CreateGenevaDriveStepExecutions (20260126164026)
3377
+ TRANSACTION (0.1ms) BEGIN
3378
+  (1.5ms) CREATE TABLE "geneva_drive_step_executions" ("id" bigserial primary key, "workflow_id" bigint NOT NULL, "step_name" character varying NOT NULL, "state" character varying DEFAULT 'scheduled' NOT NULL, "outcome" character varying, "scheduled_for" timestamp(6) NOT NULL, "started_at" timestamp(6), "completed_at" timestamp(6), "failed_at" timestamp(6), "canceled_at" timestamp(6), "skipped_at" timestamp(6), "error_class_name" character varying, "error_message" text, "error_backtrace" text, "job_id" character varying, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_714b91b701"
3379
+ FOREIGN KEY ("workflow_id")
3380
+ REFERENCES "geneva_drive_workflows" ("id")
3381
+ ON DELETE CASCADE)
3382
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id" ON "geneva_drive_step_executions" ("workflow_id")
3383
+  (0.4ms) CREATE INDEX "index_geneva_drive_step_executions_on_state" ON "geneva_drive_step_executions" ("state")
3384
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_scheduled_for" ON "geneva_drive_step_executions" ("scheduled_for")
3385
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_scheduled" ON "geneva_drive_step_executions" ("state", "scheduled_for")
3386
+  (0.3ms) CREATE INDEX "idx_on_workflow_id_created_at_af16a14fb2" ON "geneva_drive_step_executions" ("workflow_id", "created_at")
3387
+  (0.2ms) CREATE INDEX "index_geneva_drive_step_executions_on_workflow_id_and_state" ON "geneva_drive_step_executions" ("workflow_id", "state")
3388
+  (0.3ms)  CREATE UNIQUE INDEX index_geneva_drive_step_executions_one_active
3389
+ ON geneva_drive_step_executions (workflow_id)
3390
+ WHERE state IN ('scheduled', 'in_progress');
3391
+ 
3392
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126164026') RETURNING "version"
3393
+ TRANSACTION (0.1ms) COMMIT
3394
+ Migrating to AddFinishedAtToGenevaDriveStepExecutions (20260126164027)
3395
+ TRANSACTION (0.0ms) BEGIN
3396
+  (0.2ms) ALTER TABLE "geneva_drive_step_executions" ADD "finished_at" timestamp(6)
3397
+  (0.3ms) CREATE INDEX "index_geneva_drive_step_executions_on_finished_at" ON "geneva_drive_step_executions" ("finished_at")
3398
+  (0.4ms) UPDATE geneva_drive_step_executions SET finished_at = COALESCE(completed_at, failed_at, canceled_at, skipped_at) WHERE finished_at IS NULL AND (completed_at IS NOT NULL OR failed_at IS NOT NULL OR canceled_at IS NOT NULL OR skipped_at IS NOT NULL)
3399
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126164027') RETURNING "version"
3400
+ TRANSACTION (0.3ms) COMMIT
3401
+ Migrating to AddErrorClassNameToGenevaDriveStepExecutions (20260126164028)
3402
+ TRANSACTION (0.1ms) BEGIN
3403
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20260126164028') RETURNING "version"
3404
+ TRANSACTION (0.1ms) COMMIT
3405
+  (0.1ms) SELECT pg_advisory_unlock(5769190355348905590)
3406
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3407
+ SQL (0.0ms) SET search_path TO public
3408
+ SQL (0.0ms) SET search_path TO "$user", public
3409
+ SQL (0.0ms) SET search_path TO public
3410
+ SQL (0.0ms) SET search_path TO "$user", public
@@ -259,15 +259,16 @@ class FlowControlTest < ActiveSupport::TestCase
259
259
  assert_equal "finished", workflow.state
260
260
  end
261
261
 
262
- test "external skip! raises error for paused workflow" do
262
+ test "external skip! on paused workflow skips current step and resumes" do
263
263
  workflow = SimpleWorkflow.create!(hero: @user)
264
264
  workflow.pause!
265
+ assert_equal "step_one", workflow.next_step_name
265
266
 
266
- error = assert_raises(GenevaDrive::InvalidStateError) do
267
- workflow.skip!
268
- end
267
+ workflow.skip!
268
+ workflow.reload
269
269
 
270
- assert_match(/Cannot skip on a paused workflow/, error.message)
270
+ assert_equal "ready", workflow.state
271
+ assert_equal "step_two", workflow.next_step_name
271
272
  end
272
273
 
273
274
  test "external skip! raises error for finished workflow" do