stateful_models 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58bd1cdf2dd440bf776a3fd5607b2b965d2dc4a47b03174e2ef542777b62f95d
4
- data.tar.gz: 94f8c8473326519ba676df54e010037f699b0985976a68d09832f1a42ebb567a
3
+ metadata.gz: 140dacad43c4287b2317ab10567b808c4c6c751715a640d04560ea9396f15b11
4
+ data.tar.gz: b0590f0190d823fad1693ebec1a65e933d465693ac0ecb2688f045fab2f84474
5
5
  SHA512:
6
- metadata.gz: 436f47aaac1ba1216157ed927ea9ba758570b8c36b75f77e6ad3e21d905070f34f9beca5e4065b247306b10898fbf356a99a4935d89917c1ed8df296543f27ba
7
- data.tar.gz: 629afd3e4a9280c03571bbcfcb12b9da2d9d7da6c53bbbd2f98d3bc902164e10dcb3fba6a079b29c2d7f7a133895ad8d8f3d56d5645ca9d64198b02e5551690c
6
+ metadata.gz: c0e603d13345f3c36c68dcea633b2d0d37d1de41d5de961b63f81970b572e90e76a2b2f642c2868a94f1b440400f795d4243490159ed58265ab45770a27cb5d2
7
+ data.tar.gz: dc8688d4ebc992dc7cf32a92dc17d1bda1c2de58ea6747292fd746b529b3a5fdccbe9295090854b252b6b42689fed613b30821655d2a8deb4462b4daabaa13d5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  ## Released
2
2
 
3
+ ## [0.0.2] - 2024-12-23
4
+
5
+ ### Added
6
+ - Single Table Inheritance (STI) support for custom state types
7
+ - Ability to create custom state classes by inheriting from `HasStates::Base`
8
+ - Default state class `HasStates::State` for basic state management
9
+ - Example implementation of custom state types in documentation
10
+
11
+ ### Changed
12
+ - Refactored base state functionality into `HasStates::Base`
13
+ - Updated `add_state` method to support custom state classes
14
+ - Improved test coverage for inheritance and custom state types
15
+
3
16
  ## [0.1.0] - 2024-12-21
4
17
 
5
18
  - Initial release
data/README.md CHANGED
@@ -17,7 +17,7 @@ HasStates is a flexible state management gem for Ruby on Rails that allows you t
17
17
  Add this line to your application's Gemfile:
18
18
 
19
19
  ```ruby
20
- gem 'has_states'
20
+ gem 'stateful_models'
21
21
  ```
22
22
 
23
23
  Then execute:
@@ -1,6 +1,7 @@
1
1
  class CreateHasStatesStates < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def change
3
3
  create_table :has_states_states do |t|
4
+ t.string :type, null: false
4
5
  t.string :state_type
5
6
  t.string :status, null: false
6
7
 
@@ -8,9 +9,9 @@
8
9
 
9
10
  t.references :stateable, polymorphic: true, null: false
10
11
 
11
- t.datetime :completed_at
12
12
  t.timestamps
13
13
 
14
+ t.index %i[type stateable_id]
14
15
  t.index %i[stateable_type stateable_id]
15
16
  end
16
17
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HasStates
4
+ class Base < ActiveRecord::Base
5
+ self.table_name = 'has_states_states'
6
+
7
+ belongs_to :stateable, polymorphic: true
8
+
9
+ validate :status_is_configured
10
+ validate :state_type_is_configured
11
+
12
+ after_save :trigger_callbacks, if: :saved_change_to_status?
13
+
14
+ private
15
+
16
+ def status_is_configured
17
+ return if HasStates.configuration.valid_status?(
18
+ stateable_type.constantize,
19
+ state_type,
20
+ status
21
+ )
22
+
23
+ errors.add(:status, 'is not configured')
24
+ end
25
+
26
+ def state_type_is_configured
27
+ return if HasStates.configuration.valid_state_type?(
28
+ stateable_type.constantize,
29
+ state_type
30
+ )
31
+
32
+ errors.add(:state_type, 'is not configured')
33
+ end
34
+
35
+ def trigger_callbacks
36
+ HasStates.configuration.matching_callbacks(self).each do |callback|
37
+ callback.call(self)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,41 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HasStates
4
- class State < ActiveRecord::Base
5
- self.table_name = 'has_states_states'
6
-
7
- belongs_to :stateable, polymorphic: true
8
-
9
- validate :status_is_configured
10
- validate :state_type_is_configured
11
-
12
- after_save :trigger_callbacks, if: :saved_change_to_status?
13
-
14
- private
15
-
16
- def status_is_configured
17
- return if HasStates.configuration.valid_status?(
18
- stateable_type.constantize,
19
- state_type,
20
- status
21
- )
22
-
23
- errors.add(:status, 'is not configured')
24
- end
25
-
26
- def state_type_is_configured
27
- return if HasStates.configuration.valid_state_type?(
28
- stateable_type.constantize,
29
- state_type
30
- )
31
-
32
- errors.add(:state_type, 'is not configured')
33
- end
34
-
35
- def trigger_callbacks
36
- HasStates.configuration.matching_callbacks(self).each do |callback|
37
- callback.call(self)
38
- end
39
- end
4
+ class State < Base
40
5
  end
41
6
  end
@@ -5,14 +5,15 @@ module HasStates
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- has_many :states, class_name: 'HasStates::State',
9
- as: :stateable,
10
- dependent: :destroy
8
+ has_many :states, class_name: 'HasStates::Base',
9
+ as: :stateable,
10
+ dependent: :destroy
11
11
  end
12
12
 
13
13
  # Instance methods for managing states
14
- def add_state(type, status: 'pending', metadata: {})
14
+ def add_state(type, status: 'pending', metadata: {}, state_class: HasStates::State)
15
15
  states.create!(
16
+ type: state_class.name,
16
17
  state_type: type,
17
18
  status: status,
18
19
  metadata: metadata
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HasStates
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
data/lib/has_states.rb CHANGED
@@ -11,13 +11,14 @@ module HasStates
11
11
  def configure
12
12
  yield(configuration)
13
13
  end
14
-
14
+
15
15
  def configuration
16
16
  Configuration.instance
17
17
  end
18
18
  end
19
19
  end
20
20
 
21
+ require 'has_states/base'
21
22
  require 'has_states/state'
22
23
  require 'has_states/callback'
23
24
  require 'has_states/stateable'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- has_state (0.0.1)
4
+ stateful_models (0.0.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -272,13 +272,13 @@ PLATFORMS
272
272
  DEPENDENCIES
273
273
  brakeman
274
274
  debug
275
- has_state!
276
275
  kamal
277
276
  puma (>= 5.0)
278
277
  rails (~> 8.0.1)
279
278
  solid_cache
280
279
  solid_queue
281
280
  sqlite3 (>= 2.1)
281
+ stateful_models!
282
282
  thruster
283
283
  tzinfo-data
284
284
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ HasStates.configure do |config|
4
+ # Configure your models and their state types below
5
+ #
6
+ # Example configuration:
7
+ #
8
+ # config.configure_model User do |model|
9
+ # # KYC state type with its allowed statuses
10
+ # model.state_type :kyc do |type|
11
+ # type.statuses = [
12
+ # 'pending', # Initial state
13
+ # 'documents_required', # Waiting for user documents
14
+ # 'under_review', # Documents being reviewed
15
+ # 'approved', # KYC process completed successfully
16
+ # 'rejected' # KYC process failed
17
+ # ]
18
+ # end
19
+ #
20
+ # # Onboarding state type with different statuses
21
+ # model.state_type :onboarding do |type|
22
+ # type.statuses = [
23
+ # 'pending', # Just started
24
+ # 'email_verified', # Email verification complete
25
+ # 'profile_complete', # User filled all required fields
26
+ # 'completed' # Onboarding finished
27
+ # ]
28
+ # end
29
+ # end
30
+ #
31
+ # config.configure_model Company do |model|
32
+ # model.state_type :verification do |type|
33
+ # type.statuses = [
34
+ # 'pending',
35
+ # 'documents_submitted',
36
+ # 'under_review',
37
+ # 'verified',
38
+ # 'rejected'
39
+ # ]
40
+ # end
41
+ # end
42
+ end
@@ -1,6 +1,7 @@
1
1
  class CreateHasStatesStates < ActiveRecord::Migration[8.0]
2
2
  def change
3
3
  create_table :has_states_states do |t|
4
+ t.string :type, null: false
4
5
  t.string :state_type
5
6
  t.string :status, null: false
6
7
 
@@ -8,9 +9,9 @@
8
9
 
9
10
  t.references :stateable, polymorphic: true, null: false
10
11
 
11
- t.datetime :completed_at
12
12
  t.timestamps
13
13
 
14
+ t.index %i[type stateable_id]
14
15
  t.index %i[stateable_type stateable_id]
15
16
  end
16
17
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  # This file is auto-generated from the current state of the database. Instead
4
2
  # of editing this file, please use the migrations feature of Active Record to
5
3
  # incrementally modify your database, and then regenerate this schema definition.
@@ -12,29 +10,31 @@
12
10
  #
13
11
  # It's strongly recommended that you check this file into your version control system.
14
12
 
15
- ActiveRecord::Schema[8.0].define(version: 20_241_221_183_116) do
16
- create_table 'companies', force: :cascade do |t|
17
- t.string 'name'
18
- t.datetime 'created_at', null: false
19
- t.datetime 'updated_at', null: false
13
+ ActiveRecord::Schema[8.0].define(version: 2024_12_23_212128) do
14
+ create_table "companies", force: :cascade do |t|
15
+ t.string "name"
16
+ t.datetime "created_at", null: false
17
+ t.datetime "updated_at", null: false
20
18
  end
21
19
 
22
- create_table 'has_states_states', force: :cascade do |t|
23
- t.string 'state_type'
24
- t.string 'status', null: false
25
- t.json 'metadata', default: {}, null: false
26
- t.string 'stateable_type', null: false
27
- t.integer 'stateable_id', null: false
28
- t.datetime 'completed_at'
29
- t.datetime 'created_at', null: false
30
- t.datetime 'updated_at', null: false
31
- t.index %w[stateable_type stateable_id], name: 'index_has_states_states_on_stateable'
32
- t.index %w[stateable_type stateable_id], name: 'index_has_states_states_on_stateable_type_and_stateable_id'
20
+ create_table "has_states_states", force: :cascade do |t|
21
+ t.string "type", null: false
22
+ t.string "state_type"
23
+ t.string "status", null: false
24
+ t.json "metadata", default: {}, null: false
25
+ t.string "stateable_type", null: false
26
+ t.integer "stateable_id", null: false
27
+ t.datetime "completed_at"
28
+ t.datetime "created_at", null: false
29
+ t.datetime "updated_at", null: false
30
+ t.index ["stateable_type", "stateable_id"], name: "index_has_states_states_on_stateable"
31
+ t.index ["stateable_type", "stateable_id"], name: "index_has_states_states_on_stateable_type_and_stateable_id"
32
+ t.index ["type", "stateable_id"], name: "index_has_states_states_on_type_and_stateable_id"
33
33
  end
34
34
 
35
- create_table 'users', force: :cascade do |t|
36
- t.string 'name'
37
- t.datetime 'created_at', null: false
38
- t.datetime 'updated_at', null: false
35
+ create_table "users", force: :cascade do |t|
36
+ t.string "name"
37
+ t.datetime "created_at", null: false
38
+ t.datetime "updated_at", null: false
39
39
  end
40
40
  end
@@ -140,3 +140,120 @@ Migrating to CreateHasStatesTables (20241221183116)
140
140
  HasStates::State Load (0.4ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for pp */ LIMIT 11 /*application='Dummy'*/
141
141
  HasStates::State Exists? (0.3ms) SELECT 1 AS one FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' AND "has_states_states"."state_type" = 'kyc' AND "has_states_states"."status" = 'under_review' LIMIT 1 /*application='Dummy'*/
142
142
  HasStates::State Load (0.3ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."state_type" = 'onboarding' /* loading for pp */ LIMIT 11 /*application='Dummy'*/
143
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
144
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
145
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
146
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
147
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
148
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
149
+  (0.0ms) DROP TABLE IF EXISTS "companies" /*application='Dummy'*/
150
+  (5.6ms) CREATE TABLE "companies" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
151
+  (0.0ms) DROP TABLE IF EXISTS "has_states_states" /*application='Dummy'*/
152
+  (0.1ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
153
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
154
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable_type_and_stateable_id" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
155
+  (0.0ms) DROP TABLE IF EXISTS "users" /*application='Dummy'*/
156
+  (0.1ms) CREATE TABLE "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
157
+  (0.1ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY) /*application='Dummy'*/
158
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
159
+  (0.0ms) INSERT INTO "schema_migrations" (version) VALUES (20241221183116) /*application='Dummy'*/
160
+  (0.0ms) INSERT INTO "schema_migrations" (version) VALUES
161
+ (20241221171423); /*application='Dummy'*/
162
+  (0.1ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
163
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
164
+ ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'development', '2024-12-23 21:21:52.718796', '2024-12-23 21:21:52.718798') RETURNING "key" /*application='Dummy'*/
165
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
166
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'schema_sha1' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
167
+ ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '0760f8030e1032ec04330c6d62a7c41acb788447', '2024-12-23 21:21:52.720124', '2024-12-23 21:21:52.720125') RETURNING "key" /*application='Dummy'*/
168
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
169
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
170
+ Migrating to CreateHasStatesStates (20241223212128)
171
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
172
+  (0.7ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
173
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
174
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
175
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
176
+ Migrating to CreateHasStatesStates (20241223212128)
177
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
178
+  (1.0ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
179
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
180
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
181
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
182
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
183
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
184
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
185
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
186
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
187
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
188
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
189
+  (0.1ms) DROP TABLE IF EXISTS "companies" /*application='Dummy'*/
190
+  (5.6ms) CREATE TABLE "companies" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
191
+  (0.0ms) DROP TABLE IF EXISTS "has_states_states" /*application='Dummy'*/
192
+  (0.1ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
193
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
194
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable_type_and_stateable_id" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
195
+  (0.0ms) DROP TABLE IF EXISTS "users" /*application='Dummy'*/
196
+  (0.1ms) CREATE TABLE "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
197
+  (0.1ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY) /*application='Dummy'*/
198
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
199
+  (0.0ms) INSERT INTO "schema_migrations" (version) VALUES (20241221183116) /*application='Dummy'*/
200
+  (0.0ms) INSERT INTO "schema_migrations" (version) VALUES
201
+ (20241221171423); /*application='Dummy'*/
202
+  (0.1ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
203
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
204
+ ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'development', '2024-12-23 21:22:55.418140', '2024-12-23 21:22:55.418143') RETURNING "key" /*application='Dummy'*/
205
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
206
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'schema_sha1' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
207
+ ActiveRecord::InternalMetadata Create (0.0ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('schema_sha1', '0760f8030e1032ec04330c6d62a7c41acb788447', '2024-12-23 21:22:55.419477', '2024-12-23 21:22:55.419478') RETURNING "key" /*application='Dummy'*/
208
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
209
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
210
+ Migrating to CreateHasStatesStates (20241223212128)
211
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
212
+  (0.6ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
213
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
214
+ ActiveRecord::InternalMetadata Load (0.1ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
215
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
216
+ Migrating to CreateHasStatesStates (20241223212128)
217
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
218
+  (0.9ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
219
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
220
+ ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
221
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
222
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
223
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
224
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
225
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
226
+  (14.8ms) CREATE TABLE "schema_migrations" ("version" varchar NOT NULL PRIMARY KEY) /*application='Dummy'*/
227
+  (0.1ms) CREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
228
+ ActiveRecord::InternalMetadata Load (0.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = 'environment' ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 /*application='Dummy'*/
229
+ ActiveRecord::InternalMetadata Create (0.1ms) INSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES ('environment', 'development', '2024-12-23 21:23:59.040610', '2024-12-23 21:23:59.040613') RETURNING "key" /*application='Dummy'*/
230
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
231
+ Migrating to CreateTestModels (20241221171423)
232
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
233
+  (0.8ms) CREATE TABLE "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
234
+  (0.1ms) CREATE TABLE "companies" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
235
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241221171423') RETURNING "version" /*application='Dummy'*/
236
+ TRANSACTION (0.0ms) COMMIT TRANSACTION /*application='Dummy'*/
237
+ Migrating to CreateHasStatesStates (20241223212128)
238
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
239
+  (0.5ms) CREATE TABLE "has_states_states" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar NOT NULL, "state_type" varchar, "status" varchar NOT NULL, "metadata" json DEFAULT '{}' NOT NULL, "stateable_type" varchar NOT NULL, "stateable_id" integer NOT NULL, "completed_at" datetime(6), "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL) /*application='Dummy'*/
240
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
241
+  (0.0ms) CREATE INDEX "index_has_states_states_on_type_and_stateable_id" ON "has_states_states" ("type", "stateable_id") /*application='Dummy'*/
242
+  (0.0ms) CREATE INDEX "index_has_states_states_on_stateable_type_and_stateable_id" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
243
+ ActiveRecord::SchemaMigration Create (0.1ms) INSERT INTO "schema_migrations" ("version") VALUES ('20241223212128') RETURNING "version" /*application='Dummy'*/
244
+ TRANSACTION (0.1ms) COMMIT TRANSACTION /*application='Dummy'*/
245
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
246
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
247
+ TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
248
+ User Create (1.0ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES ('Bob', '2024-12-23 21:26:02.330048', '2024-12-23 21:26:02.330048') RETURNING "id" /*application='Dummy'*/
249
+ TRANSACTION (5.5ms) COMMIT TRANSACTION /*application='Dummy'*/
250
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
251
+ HasStates::State Create (0.2ms) INSERT INTO "has_states_states" ("type", "state_type", "status", "metadata", "stateable_type", "stateable_id", "completed_at", "created_at", "updated_at") VALUES ('HasStates::State', 'kyc', 'pending', '{}', 'User', 1, NULL, '2024-12-23 21:27:24.876829', '2024-12-23 21:27:24.876829') RETURNING "id" /*application='Dummy'*/
252
+ TRANSACTION (0.1ms) COMMIT TRANSACTION /*application='Dummy'*/
253
+ TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
254
+ TestState Create (0.6ms) INSERT INTO "has_states_states" ("type", "state_type", "status", "metadata", "stateable_type", "stateable_id", "completed_at", "created_at", "updated_at") VALUES ('TestState', 'kyc', 'pending', '{"foo":"bar"}', 'User', 1, NULL, '2024-12-23 21:31:02.082316', '2024-12-23 21:31:02.082316') RETURNING "id" /*application='Dummy'*/
255
+ TRANSACTION (0.1ms) COMMIT TRANSACTION /*application='Dummy'*/
256
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
257
+ TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
258
+ KYCState Create (0.6ms) INSERT INTO "has_states_states" ("type", "state_type", "status", "metadata", "stateable_type", "stateable_id", "completed_at", "created_at", "updated_at") VALUES ('KYCState', 'kyc', 'pending', '{"document_type":"passport"}', 'User', 1, NULL, '2024-12-23 21:38:20.849253', '2024-12-23 21:38:20.849253') RETURNING "id" /*application='Dummy'*/
259
+ TRANSACTION (14.6ms) COMMIT TRANSACTION /*application='Dummy'*/