stateful_models 0.0.2 → 0.0.4

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -2
  3. data/README.md +68 -0
  4. data/lib/generators/has_states/install/install_generator.rb +27 -9
  5. data/lib/generators/has_states/install/templates/create_has_states_states.rb.erb +1 -1
  6. data/lib/generators/has_states/install/templates/create_indexes_on_has_states_states.rb.erb +11 -0
  7. data/lib/has_states/base.rb +30 -1
  8. data/lib/has_states/configuration/model_configuration.rb +16 -0
  9. data/lib/has_states/configuration/state_type_configuration.rb +3 -1
  10. data/lib/has_states/configuration.rb +75 -16
  11. data/lib/has_states/state.rb +1 -2
  12. data/lib/has_states/stateable.rb +11 -8
  13. data/lib/has_states/version.rb +1 -1
  14. data/lib/has_states.rb +1 -1
  15. data/spec/dummy/Gemfile.lock +123 -101
  16. data/spec/dummy/config/initializers/has_states.rb +44 -41
  17. data/spec/dummy/db/migrate/20241223212128_create_has_states_states.rb +2 -2
  18. data/spec/dummy/db/migrate/20250114175939_create_indexes_on_has_states_states.rb +10 -0
  19. data/spec/dummy/db/schema.rb +26 -22
  20. data/spec/dummy/log/development.log +88 -0
  21. data/spec/dummy/log/test.log +33161 -0
  22. data/spec/dummy/storage/development.sqlite3 +0 -0
  23. data/spec/dummy/storage/test.sqlite3 +0 -0
  24. data/spec/generators/has_states/install_generator_spec.rb +1 -1
  25. data/spec/generators/{tmp/db/migrate/20241223213845_create_has_states_states.rb → templates/db/migrate/20250322001530_create_has_states_states.rb} +1 -1
  26. data/spec/generators/templates/db/migrate/20250322001530_create_indexes_on_has_states_states.rb +11 -0
  27. data/spec/has_states/configuration_spec.rb +57 -0
  28. data/spec/has_states/state_limit_spec.rb +107 -0
  29. data/spec/has_states/state_metadata_schema_spec.rb +75 -0
  30. data/spec/has_states/state_spec.rb +38 -15
  31. data/spec/has_states/stateable_spec.rb +183 -0
  32. data/spec/rails_helper.rb +1 -0
  33. metadata +26 -6
  34. /data/spec/generators/{tmp → templates}/config/initializers/has_states.rb +0 -0
@@ -257,3 +257,91 @@ Migrating to CreateHasStatesStates (20241223212128)
257
257
  TRANSACTION (0.1ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
258
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
259
  TRANSACTION (14.6ms) COMMIT TRANSACTION /*application='Dummy'*/
260
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
261
+ User Load (0.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
262
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
263
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
264
+ HasStates::Base 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' AND "has_states_states"."state_type" = 'kyc' /* loading for pp */ ORDER BY "has_states_states"."created_at" DESC LIMIT 11 /*application='Dummy'*/
265
+ HasStates::Base Load (0.1ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
266
+ HasStates::State Load (0.3ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."type" = 'HasStates::State' /* loading for pp */ LIMIT 11 /*application='Dummy'*/
267
+ HasStates::Base Exists? (0.2ms) 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" = 'onboarding' AND "has_states_states"."status" = 'pending' LIMIT 1 /*application='Dummy'*/
268
+ HasStates::Base 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" = 'onboarding' AND "has_states_states"."status" = 'email_verified' LIMIT 1 /*application='Dummy'*/
269
+ HasStates::Base Load (0.3ms) 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'*/
270
+ HasStates::Base Load (0.1ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
271
+ HasStates::State Pluck (0.2ms) SELECT "has_states_states"."type" FROM "has_states_states" WHERE "has_states_states"."type" = 'HasStates::State' /*application='Dummy'*/
272
+ HasStates::State Load (0.3ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."type" = 'HasStates::State' /*application='Dummy'*/
273
+ HasStates::Base Load (0.3ms) 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'*/
274
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
275
+ HasStates::State Update All (0.2ms) UPDATE "has_states_states" SET "type" = 'HasStates::State' WHERE "has_states_states"."type" = 'HasStates::State' AND "has_states_states"."type" = 'TestState' /*application='Dummy'*/
276
+ HasStates::Base Load (0.2ms) 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'*/
277
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
278
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
279
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
280
+ HasStates::Base Load (0.1ms) 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'*/
281
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
282
+ User Load (0.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
283
+ HasStates::Base Load (0.3ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
284
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
285
+ HasStates::Base Load (0.1ms) 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'*/
286
+ HasStates::Base Load (0.1ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
287
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
288
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
289
+ HasStates::State Update All (13.4ms) UPDATE "has_states_states" SET "type" = 'HasStates::State' WHERE "has_states_states"."type" = 'HasStates::State' /*application='Dummy'*/
290
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
291
+ HasStates::Base Load (0.1ms) 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'*/
292
+ HasStates::Base Load (0.1ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
293
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
294
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
295
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
296
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' /* loading for pp */ ORDER BY "has_states_states"."created_at" DESC LIMIT 11 /*application='Dummy'*/
297
+ HasStates::Base Load (0.1ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."stateable_id" = 1 AND "has_states_states"."stateable_type" = 'User' /* loading for inspect */ LIMIT 11 /*application='Dummy'*/
298
+  (0.2ms) SELECT id, type, state_type, status FROM has_states_states /*application='Dummy'*/
299
+ HasStates::Base Update All (0.5ms) UPDATE "has_states_states" SET "type" = 'HasStates::State' WHERE "has_states_states"."type" IN ('TestState', 'KYCState') /*application='Dummy'*/
300
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
301
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' /* loading for pp */ ORDER BY "has_states_states"."created_at" DESC LIMIT 11 /*application='Dummy'*/
302
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
303
+ HasStates::Base Load (0.3ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
304
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
305
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
306
+ HasStates::Base Load (0.2ms) SELECT "has_states_states".* 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' ORDER BY "has_states_states"."created_at" DESC LIMIT 1 /*application='Dummy'*/
307
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
308
+ HasStates::Base Exists? (0.1ms) 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" = 'approved' LIMIT 1 /*application='Dummy'*/
309
+ User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
310
+ User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 /*application='Dummy'*/
311
+ HasStates::Base Exists? (0.1ms) 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" = 'approved' LIMIT 1 /*application='Dummy'*/
312
+ 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'*/
313
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
314
+ Migrating to CreateIndexesOnHasStatesStates (20250114175939)
315
+ 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'*/
316
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
317
+ Migrating to CreateIndexesOnHasStatesStates (20250114175939)
318
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
319
+  (0.6ms) CREATE INDEX "index_has_states_states_on_stateable_id_and_state_type" ON "has_states_states" ("stateable_id", "state_type") /*application='Dummy'*/
320
+  (0.1ms) CREATE INDEX "idx_on_stateable_id_state_type_status_6d3d026e4d" ON "has_states_states" ("stateable_id", "state_type", "status") /*application='Dummy'*/
321
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_created_at_b5d09fb6ee" ON "has_states_states" ("stateable_id", "state_type", "created_at") /*application='Dummy'*/
322
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_status_created_at_19e1cf37c2" ON "has_states_states" ("stateable_id", "state_type", "status", "created_at") /*application='Dummy'*/
323
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateble_type_and_stateable_id" ON "has_states_states" ("stateble_type", "stateable_id") /*application='Dummy'*/
324
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
325
+ 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'*/
326
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
327
+ Migrating to CreateIndexesOnHasStatesStates (20250114175939)
328
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
329
+  (0.7ms) CREATE INDEX "index_has_states_states_on_stateable_id_and_state_type" ON "has_states_states" ("stateable_id", "state_type") /*application='Dummy'*/
330
+  (0.1ms) CREATE INDEX "idx_on_stateable_id_state_type_status_6d3d026e4d" ON "has_states_states" ("stateable_id", "state_type", "status") /*application='Dummy'*/
331
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_created_at_b5d09fb6ee" ON "has_states_states" ("stateable_id", "state_type", "created_at") /*application='Dummy'*/
332
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_status_created_at_19e1cf37c2" ON "has_states_states" ("stateable_id", "state_type", "status", "created_at") /*application='Dummy'*/
333
+  (0.1ms) CREATE INDEX "index_has_states_states_on_stateable_type_and_stateable_id" ON "has_states_states" ("stateable_type", "stateable_id") /*application='Dummy'*/
334
+ TRANSACTION (0.0ms) ROLLBACK TRANSACTION /*application='Dummy'*/
335
+ 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'*/
336
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
337
+ Migrating to CreateIndexesOnHasStatesStates (20250114175939)
338
+ TRANSACTION (0.0ms) BEGIN immediate TRANSACTION /*application='Dummy'*/
339
+  (0.7ms) CREATE INDEX "index_has_states_states_on_stateable_id_and_state_type" ON "has_states_states" ("stateable_id", "state_type") /*application='Dummy'*/
340
+  (0.1ms) CREATE INDEX "idx_on_stateable_id_state_type_status_6d3d026e4d" ON "has_states_states" ("stateable_id", "state_type", "status") /*application='Dummy'*/
341
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_created_at_b5d09fb6ee" ON "has_states_states" ("stateable_id", "state_type", "created_at") /*application='Dummy'*/
342
+  (0.0ms) CREATE INDEX "idx_on_stateable_id_state_type_status_created_at_19e1cf37c2" ON "has_states_states" ("stateable_id", "state_type", "status", "created_at") /*application='Dummy'*/
343
+ ActiveRecord::SchemaMigration Create (0.0ms) INSERT INTO "schema_migrations" ("version") VALUES ('20250114175939') RETURNING "version" /*application='Dummy'*/
344
+ TRANSACTION (14.2ms) COMMIT TRANSACTION /*application='Dummy'*/
345
+ ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC /*application='Dummy'*/
346
+ HasStates::State Load (0.3ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."type" = 'HasStates::State' ORDER BY "has_states_states"."id" DESC LIMIT 1 /*application='Dummy'*/
347
+ HasStates::State Load (0.4ms) SELECT "has_states_states".* FROM "has_states_states" WHERE "has_states_states"."type" = 'HasStates::State' ORDER BY "has_states_states"."id" DESC LIMIT 1 /*application='Dummy'*/