foobara 0.0.1

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 (359) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +5 -0
  3. data/.rubocop.yml +20 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +10 -0
  6. data/DECISION_LOG.md +220 -0
  7. data/Guardfile +9 -0
  8. data/LICENSE-AGPL.txt +666 -0
  9. data/LICENSE.txt +4 -0
  10. data/README.md +50 -0
  11. data/Rakefile +10 -0
  12. data/concepts.md +153 -0
  13. data/projects/builtin_types/lib/foobara/builtin_types.rb +67 -0
  14. data/projects/builtin_types/src/README.md +140 -0
  15. data/projects/builtin_types/src/array/casters/arrayable.rb +22 -0
  16. data/projects/builtin_types/src/array/supported_processors/element_type_declaration.rb +41 -0
  17. data/projects/builtin_types/src/array/supported_validators/size.rb +43 -0
  18. data/projects/builtin_types/src/associative_array/casters/array.rb +22 -0
  19. data/projects/builtin_types/src/associative_array/supported_processors/key_type_declaration.rb +44 -0
  20. data/projects/builtin_types/src/associative_array/supported_processors/value_type_declaration.rb +44 -0
  21. data/projects/builtin_types/src/atomic_duck.rb +6 -0
  22. data/projects/builtin_types/src/attributes/casters/array.rb +33 -0
  23. data/projects/builtin_types/src/attributes/casters/hash.rb +28 -0
  24. data/projects/builtin_types/src/attributes/supported_processors/element_type_declarations.rb +89 -0
  25. data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/desugarizers/move_defaults_from_element_types_to_root.rb +40 -0
  26. data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/desugarizers/symbolize_defaults.rb +31 -0
  27. data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/type_declaration_validators/hash_with_symbolic_keys.rb +37 -0
  28. data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/type_declaration_validators/valid_attribute_names.rb +60 -0
  29. data/projects/builtin_types/src/attributes/supported_transformers/defaults.rb +41 -0
  30. data/projects/builtin_types/src/attributes/supported_validators/required/type_declaration_extension/extend_attributes_type_declaration/desugarizers/move_required_from_element_types_to_root.rb +55 -0
  31. data/projects/builtin_types/src/attributes/supported_validators/required/type_declaration_extension/extend_attributes_type_declaration/type_declaration_validators/array_of_symbols.rb +47 -0
  32. data/projects/builtin_types/src/attributes/supported_validators/required/type_declaration_extension/extend_attributes_type_declaration/type_declaration_validators/array_with_valid_attribute_names.rb +54 -0
  33. data/projects/builtin_types/src/attributes/supported_validators/required.rb +51 -0
  34. data/projects/builtin_types/src/big_decimal/casters/integer.rb +21 -0
  35. data/projects/builtin_types/src/big_decimal/casters/string.rb +24 -0
  36. data/projects/builtin_types/src/boolean/casters/numeric.rb +21 -0
  37. data/projects/builtin_types/src/boolean/casters/string_or_symbol.rb +27 -0
  38. data/projects/builtin_types/src/builtin_types.rb +189 -0
  39. data/projects/builtin_types/src/date/casters/hash.rb +23 -0
  40. data/projects/builtin_types/src/date/casters/string.rb +40 -0
  41. data/projects/builtin_types/src/datetime/casters/date.rb +21 -0
  42. data/projects/builtin_types/src/datetime/casters/hash.rb +77 -0
  43. data/projects/builtin_types/src/datetime/casters/seconds_since_epoch.rb +21 -0
  44. data/projects/builtin_types/src/datetime/casters/string.rb +31 -0
  45. data/projects/builtin_types/src/duck/supported_casters/allow_nil.rb +38 -0
  46. data/projects/builtin_types/src/duck/supported_validators/instance_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/class_desugarizer.rb +29 -0
  47. data/projects/builtin_types/src/duck/supported_validators/instance_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/instance_of_class_desugarizer.rb +31 -0
  48. data/projects/builtin_types/src/duck/supported_validators/instance_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/instance_of_symbol_desugarizer.rb +31 -0
  49. data/projects/builtin_types/src/duck/supported_validators/instance_of/type_declaration_extension/extend_registered_type_declaration/type_declaration_validators/is_valid_class.rb +43 -0
  50. data/projects/builtin_types/src/duck/supported_validators/instance_of.rb +42 -0
  51. data/projects/builtin_types/src/duck/supported_validators/one_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/cast_one_of.rb +37 -0
  52. data/projects/builtin_types/src/duck/supported_validators/one_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/module_desugarizer.rb +41 -0
  53. data/projects/builtin_types/src/duck/supported_validators/one_of.rb +41 -0
  54. data/projects/builtin_types/src/duck.rb +6 -0
  55. data/projects/builtin_types/src/duckture.rb +6 -0
  56. data/projects/builtin_types/src/email/transformers/downcase.rb +15 -0
  57. data/projects/builtin_types/src/email/validator_base.rb +94 -0
  58. data/projects/builtin_types/src/float/casters/integer.rb +21 -0
  59. data/projects/builtin_types/src/float/casters/string.rb +24 -0
  60. data/projects/builtin_types/src/integer/casters/string.rb +23 -0
  61. data/projects/builtin_types/src/number/supported_validators/max.rb +41 -0
  62. data/projects/builtin_types/src/number/supported_validators/min.rb +41 -0
  63. data/projects/builtin_types/src/string/casters/numeric.rb +21 -0
  64. data/projects/builtin_types/src/string/casters/symbol.rb +21 -0
  65. data/projects/builtin_types/src/string/supported_transformers/downcase.rb +11 -0
  66. data/projects/builtin_types/src/string/supported_validators/matches.rb +41 -0
  67. data/projects/builtin_types/src/string/supported_validators/max_length.rb +37 -0
  68. data/projects/builtin_types/src/symbol/casters/string.rb +21 -0
  69. data/projects/builtin_types/src/tuple/supported_processors/element_type_declarations/type_declaration_extension/extend_tuple_type_declaration/desugarizers/set_size.rb +32 -0
  70. data/projects/builtin_types/src/tuple/supported_processors/element_type_declarations/type_declaration_extension/extend_tuple_type_declaration/type_declaration_validators/size_matches.rb +50 -0
  71. data/projects/builtin_types/src/tuple/supported_processors/element_type_declarations.rb +59 -0
  72. data/projects/callback/lib/foobara/callback.rb +1 -0
  73. data/projects/callback/src/block/after.rb +10 -0
  74. data/projects/callback/src/block/around.rb +10 -0
  75. data/projects/callback/src/block/before.rb +10 -0
  76. data/projects/callback/src/block/concerns/block_parameter_not_allowed.rb +21 -0
  77. data/projects/callback/src/block/concerns/block_parameter_required.rb +21 -0
  78. data/projects/callback/src/block/concerns/keyword_argumentable_block.rb +31 -0
  79. data/projects/callback/src/block/concerns/single_argument_block.rb +22 -0
  80. data/projects/callback/src/block/concerns/type.rb +17 -0
  81. data/projects/callback/src/block/error.rb +10 -0
  82. data/projects/callback/src/block.rb +83 -0
  83. data/projects/callback/src/registry/base.rb +90 -0
  84. data/projects/callback/src/registry/chained_conditioned.rb +24 -0
  85. data/projects/callback/src/registry/chained_multiple_action.rb +24 -0
  86. data/projects/callback/src/registry/conditioned.rb +101 -0
  87. data/projects/callback/src/registry/multiple_action.rb +110 -0
  88. data/projects/callback/src/registry/single_action.rb +15 -0
  89. data/projects/callback/src/runner.rb +89 -0
  90. data/projects/callback/src/set.rb +56 -0
  91. data/projects/command/lib/foobara/command.rb +9 -0
  92. data/projects/command/src/command/entity_helpers.rb +145 -0
  93. data/projects/command/src/command.rb +36 -0
  94. data/projects/command/src/concerns/callbacks.rb +93 -0
  95. data/projects/command/src/concerns/description.rb +23 -0
  96. data/projects/command/src/concerns/domain_mappers.rb +35 -0
  97. data/projects/command/src/concerns/entities.rb +88 -0
  98. data/projects/command/src/concerns/errors.rb +181 -0
  99. data/projects/command/src/concerns/errors_type.rb +124 -0
  100. data/projects/command/src/concerns/inputs.rb +59 -0
  101. data/projects/command/src/concerns/inputs_type.rb +58 -0
  102. data/projects/command/src/concerns/namespace.rb +49 -0
  103. data/projects/command/src/concerns/reflection.rb +137 -0
  104. data/projects/command/src/concerns/result.rb +25 -0
  105. data/projects/command/src/concerns/result_type.rb +29 -0
  106. data/projects/command/src/concerns/runtime.rb +119 -0
  107. data/projects/command/src/concerns/state_machine.rb +12 -0
  108. data/projects/command/src/concerns/subcommands.rb +102 -0
  109. data/projects/command/src/concerns/transactions.rb +81 -0
  110. data/projects/command/src/state_machine.rb +57 -0
  111. data/projects/command/src/transformed_command.rb +459 -0
  112. data/projects/command_connectors/lib/foobara/command_connectors.rb +12 -0
  113. data/projects/command_connectors/src/command_connector.rb +401 -0
  114. data/projects/command_connectors/src/command_registry/allowed_rule.rb +29 -0
  115. data/projects/command_connectors/src/command_registry/exposed_command.rb +140 -0
  116. data/projects/command_connectors/src/command_registry/exposed_domain.rb +30 -0
  117. data/projects/command_connectors/src/command_registry/exposed_organization.rb +30 -0
  118. data/projects/command_connectors/src/command_registry.rb +257 -0
  119. data/projects/command_connectors/src/commands/describe.rb +36 -0
  120. data/projects/command_connectors/src/commands/list_commands.rb +51 -0
  121. data/projects/command_connectors/src/commands/ping.rb +21 -0
  122. data/projects/command_connectors/src/commands/query_git_commit_info.rb +81 -0
  123. data/projects/command_connectors/src/request.rb +99 -0
  124. data/projects/command_connectors/src/response.rb +17 -0
  125. data/projects/command_connectors/src/serializer.rb +25 -0
  126. data/projects/command_connectors/src/serializers/aggregate_serializer.rb +32 -0
  127. data/projects/command_connectors/src/serializers/atomic_serializer.rb +25 -0
  128. data/projects/command_connectors/src/serializers/entities_to_primary_keys_serializer.rb +28 -0
  129. data/projects/command_connectors/src/serializers/errors_serializer.rb +18 -0
  130. data/projects/command_connectors/src/serializers/json_serializer.rb +20 -0
  131. data/projects/command_connectors/src/serializers/noop_serializer.rb +20 -0
  132. data/projects/command_connectors/src/serializers/record_store_serializer.rb +31 -0
  133. data/projects/command_connectors/src/serializers/success_serializer.rb +14 -0
  134. data/projects/command_connectors/src/serializers/yaml_serializer.rb +20 -0
  135. data/projects/command_connectors/src/transformers/auth_errors_transformer.rb +35 -0
  136. data/projects/command_connectors/src/transformers/load_aggregates_pre_commit_transformer.rb +36 -0
  137. data/projects/command_connectors_http/lib/foobara/command_connectors_http.rb +6 -0
  138. data/projects/command_connectors_http/src/http/commands/get_options.rb +16 -0
  139. data/projects/command_connectors_http/src/http/commands/help/presenter/command.rb +14 -0
  140. data/projects/command_connectors_http/src/http/commands/help/presenter/domain.rb +14 -0
  141. data/projects/command_connectors_http/src/http/commands/help/presenter/entity.rb +14 -0
  142. data/projects/command_connectors_http/src/http/commands/help/presenter/error.rb +14 -0
  143. data/projects/command_connectors_http/src/http/commands/help/presenter/model.rb +14 -0
  144. data/projects/command_connectors_http/src/http/commands/help/presenter/organization.rb +14 -0
  145. data/projects/command_connectors_http/src/http/commands/help/presenter/processor.rb +14 -0
  146. data/projects/command_connectors_http/src/http/commands/help/presenter/processor_class.rb +14 -0
  147. data/projects/command_connectors_http/src/http/commands/help/presenter/root.rb +14 -0
  148. data/projects/command_connectors_http/src/http/commands/help/presenter/type.rb +14 -0
  149. data/projects/command_connectors_http/src/http/commands/help/presenter.rb +162 -0
  150. data/projects/command_connectors_http/src/http/commands/help/templates/command.html.erb +11 -0
  151. data/projects/command_connectors_http/src/http/commands/help/templates/domain.html.erb +1 -0
  152. data/projects/command_connectors_http/src/http/commands/help/templates/entity.html.erb +1 -0
  153. data/projects/command_connectors_http/src/http/commands/help/templates/error.html.erb +1 -0
  154. data/projects/command_connectors_http/src/http/commands/help/templates/model.html.erb +1 -0
  155. data/projects/command_connectors_http/src/http/commands/help/templates/organization.html.erb +1 -0
  156. data/projects/command_connectors_http/src/http/commands/help/templates/processor.html.erb +1 -0
  157. data/projects/command_connectors_http/src/http/commands/help/templates/processor_class.html.erb +1 -0
  158. data/projects/command_connectors_http/src/http/commands/help/templates/root.html.erb +3 -0
  159. data/projects/command_connectors_http/src/http/commands/help/templates/type.html.erb +1 -0
  160. data/projects/command_connectors_http/src/http/commands/help.rb +98 -0
  161. data/projects/command_connectors_http/src/http/request.rb +98 -0
  162. data/projects/command_connectors_http/src/http/response.rb +14 -0
  163. data/projects/command_connectors_http/src/http.rb +84 -0
  164. data/projects/common/lib/foobara/common.rb +11 -0
  165. data/projects/common/src/data_path.rb +272 -0
  166. data/projects/common/src/error.rb +215 -0
  167. data/projects/common/src/error_collection.rb +97 -0
  168. data/projects/common/src/error_key.rb +168 -0
  169. data/projects/common/src/outcome.rb +101 -0
  170. data/projects/common/src/possible_error.rb +80 -0
  171. data/projects/common/src/runtime_error.rb +24 -0
  172. data/projects/concerns/lib/foobara/concerns.rb +1 -0
  173. data/projects/concerns/src/concern.rb +93 -0
  174. data/projects/delegate/lib/foobara/delegate.rb +1 -0
  175. data/projects/delegate/src/extensions/module.rb +12 -0
  176. data/projects/domain/lib/foobara/domain.rb +25 -0
  177. data/projects/domain/src/domain.rb +65 -0
  178. data/projects/domain/src/domain_mapper/registry.rb +47 -0
  179. data/projects/domain/src/domain_mapper.rb +162 -0
  180. data/projects/domain/src/domain_module_extension.rb +510 -0
  181. data/projects/domain/src/extensions/foobara.rb +69 -0
  182. data/projects/domain/src/global_domain.rb +14 -0
  183. data/projects/domain/src/global_organization.rb +12 -0
  184. data/projects/domain/src/is_manifestable.rb +68 -0
  185. data/projects/domain/src/manifestable.rb +12 -0
  186. data/projects/domain/src/module_extension.rb +122 -0
  187. data/projects/domain/src/organization.rb +52 -0
  188. data/projects/domain/src/organization_module_extension.rb +50 -0
  189. data/projects/entity/lib/foobara/entity.rb +27 -0
  190. data/projects/entity/src/concerns/associations.rb +241 -0
  191. data/projects/entity/src/concerns/attributes.rb +170 -0
  192. data/projects/entity/src/concerns/callbacks.rb +97 -0
  193. data/projects/entity/src/concerns/initialization.rb +127 -0
  194. data/projects/entity/src/concerns/persistence.rb +142 -0
  195. data/projects/entity/src/concerns/primary_key.rb +43 -0
  196. data/projects/entity/src/concerns/queries.rb +96 -0
  197. data/projects/entity/src/concerns/reflection.rb +51 -0
  198. data/projects/entity/src/concerns/transactions.rb +31 -0
  199. data/projects/entity/src/concerns/types.rb +31 -0
  200. data/projects/entity/src/entity.rb +61 -0
  201. data/projects/entity/src/extensions/builtin_types/entity/casters/hash.rb +33 -0
  202. data/projects/entity/src/extensions/builtin_types/entity/validators/attributes_declaration.rb +32 -0
  203. data/projects/entity/src/extensions/builtin_types/entity.rb +6 -0
  204. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/attributes_handler_desugarizer.rb +14 -0
  205. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/hash_desugarizer.rb +43 -0
  206. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/model_class_desugarizer.rb +21 -0
  207. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/primary_key_desugarizer.rb +19 -0
  208. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/to_type_transformer.rb +64 -0
  209. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_is_symbol.rb +35 -0
  210. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_present.rb +27 -0
  211. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_references_attribute.rb +36 -0
  212. data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration.rb +11 -0
  213. data/projects/entity/src/new_prepend.rb +21 -0
  214. data/projects/entity/src/not_found_error.rb +72 -0
  215. data/projects/enumerated/lib/foobara/enumerated.rb +1 -0
  216. data/projects/enumerated/src/accessors.rb +61 -0
  217. data/projects/enumerated/src/values.rb +121 -0
  218. data/projects/foobara/lib/foobara/all.rb +44 -0
  219. data/projects/in_memory_crud_driver/lib/foobara/in_memory_crud_driver.rb +3 -0
  220. data/projects/in_memory_crud_driver/src/in_memory.rb +10 -0
  221. data/projects/in_memory_crud_driver_minimal/lib/foobara/in_memory_crud_driver_minimal.rb +1 -0
  222. data/projects/in_memory_crud_driver_minimal/src/in_memory_minimal.rb +113 -0
  223. data/projects/manifest/lib/foobara/manifest.rb +4 -0
  224. data/projects/manifest/src/foobara/manifest/array.rb +13 -0
  225. data/projects/manifest/src/foobara/manifest/attributes.rb +40 -0
  226. data/projects/manifest/src/foobara/manifest/base_manifest.rb +161 -0
  227. data/projects/manifest/src/foobara/manifest/command.rb +59 -0
  228. data/projects/manifest/src/foobara/manifest/domain.rb +43 -0
  229. data/projects/manifest/src/foobara/manifest/entity.rb +35 -0
  230. data/projects/manifest/src/foobara/manifest/error.rb +33 -0
  231. data/projects/manifest/src/foobara/manifest/model.rb +43 -0
  232. data/projects/manifest/src/foobara/manifest/organization.rb +45 -0
  233. data/projects/manifest/src/foobara/manifest/possible_error.rb +30 -0
  234. data/projects/manifest/src/foobara/manifest/processor.rb +11 -0
  235. data/projects/manifest/src/foobara/manifest/processor_class.rb +11 -0
  236. data/projects/manifest/src/foobara/manifest/root_manifest.rb +112 -0
  237. data/projects/manifest/src/foobara/manifest/type.rb +86 -0
  238. data/projects/manifest/src/foobara/manifest/type_declaration.rb +117 -0
  239. data/projects/model/lib/foobara/model.rb +23 -0
  240. data/projects/model/src/concerns/reflection.rb +22 -0
  241. data/projects/model/src/concerns/types.rb +104 -0
  242. data/projects/model/src/extensions/builtin_types/model/casters/hash.rb +23 -0
  243. data/projects/model/src/extensions/builtin_types/model/transformers/mutable.rb +26 -0
  244. data/projects/model/src/extensions/builtin_types/model/validators/attributes_declaration.rb +33 -0
  245. data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/attributes_handler_desugarizer.rb +24 -0
  246. data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/hash_desugarizer.rb +32 -0
  247. data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/model_class_desugarizer.rb +119 -0
  248. data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/to_type_transformer.rb +57 -0
  249. data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration.rb +21 -0
  250. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/hash_desugarizer.rb +37 -0
  251. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/model_class_type_desugarizer.rb +25 -0
  252. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/mutable_validator.rb +46 -0
  253. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/normalize_mutable_attributes_desugarizer.rb +28 -0
  254. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/to_type_transformer.rb +27 -0
  255. data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration.rb +31 -0
  256. data/projects/model/src/extensions/type_declarations/handlers/registered_type_declaration/model_class_desugarizer.rb +23 -0
  257. data/projects/model/src/model.rb +320 -0
  258. data/projects/monorepo/lib/foobara/monorepo/project.rb +52 -0
  259. data/projects/monorepo/lib/foobara/monorepo.rb +63 -0
  260. data/projects/namespace/lib/foobara/namespace.rb +4 -0
  261. data/projects/namespace/src/ambiguous_registry.rb +104 -0
  262. data/projects/namespace/src/base_registry.rb +66 -0
  263. data/projects/namespace/src/extensions/module.rb +5 -0
  264. data/projects/namespace/src/is_namespace.rb +352 -0
  265. data/projects/namespace/src/namespace/lookup_mode.rb +41 -0
  266. data/projects/namespace/src/namespace.rb +61 -0
  267. data/projects/namespace/src/namespace_helpers.rb +273 -0
  268. data/projects/namespace/src/prefixless_registry.rb +54 -0
  269. data/projects/namespace/src/scoped.rb +113 -0
  270. data/projects/namespace/src/unambiguous_registry.rb +65 -0
  271. data/projects/persistence/lib/foobara/persistence.rb +22 -0
  272. data/projects/persistence/src/entity_attributes_crud_driver.rb +241 -0
  273. data/projects/persistence/src/entity_base/table.rb +14 -0
  274. data/projects/persistence/src/entity_base/transaction/concerns/entity_callback_handling.rb +157 -0
  275. data/projects/persistence/src/entity_base/transaction/concerns/state_transitions.rb +83 -0
  276. data/projects/persistence/src/entity_base/transaction/concerns/transaction_tracking.rb +53 -0
  277. data/projects/persistence/src/entity_base/transaction/state_machine.rb +27 -0
  278. data/projects/persistence/src/entity_base/transaction.rb +163 -0
  279. data/projects/persistence/src/entity_base/transaction_table/concerns/queries.rb +42 -0
  280. data/projects/persistence/src/entity_base/transaction_table/concerns/record_tracking.rb +134 -0
  281. data/projects/persistence/src/entity_base/transaction_table.rb +620 -0
  282. data/projects/persistence/src/entity_base.rb +114 -0
  283. data/projects/persistence/src/persistence.rb +172 -0
  284. data/projects/state_machine/lib/foobara/state_machine.rb +1 -0
  285. data/projects/state_machine/src/callbacks.rb +158 -0
  286. data/projects/state_machine/src/log_entry.rb +13 -0
  287. data/projects/state_machine/src/state_machine.rb +91 -0
  288. data/projects/state_machine/src/sugar.rb +125 -0
  289. data/projects/state_machine/src/transition_log.rb +19 -0
  290. data/projects/state_machine/src/validations.rb +69 -0
  291. data/projects/thread_parent/lib/foobara/thread_parent.rb +1 -0
  292. data/projects/thread_parent/src/thread_parent.rb +38 -0
  293. data/projects/type_declarations/lib/foobara/type_declarations.rb +131 -0
  294. data/projects/type_declarations/src/attributes.rb +34 -0
  295. data/projects/type_declarations/src/caster.rb +7 -0
  296. data/projects/type_declarations/src/desugarizer.rb +25 -0
  297. data/projects/type_declarations/src/dsl/attributes.rb +199 -0
  298. data/projects/type_declarations/src/element_processor.rb +7 -0
  299. data/projects/type_declarations/src/error_extension.rb +73 -0
  300. data/projects/type_declarations/src/handlers/extend_array_type_declaration/array_desugarizer.rb +31 -0
  301. data/projects/type_declarations/src/handlers/extend_array_type_declaration/element_type_declaration_desugarizer.rb +37 -0
  302. data/projects/type_declarations/src/handlers/extend_array_type_declaration/to_type_transformer.rb +22 -0
  303. data/projects/type_declarations/src/handlers/extend_array_type_declaration/type_set_to_array_desugarizer.rb +36 -0
  304. data/projects/type_declarations/src/handlers/extend_array_type_declaration.rb +14 -0
  305. data/projects/type_declarations/src/handlers/extend_associative_array_type_declaration/to_type_transformer.rb +28 -0
  306. data/projects/type_declarations/src/handlers/extend_associative_array_type_declaration.rb +20 -0
  307. data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/dsl_desugarizer.rb +25 -0
  308. data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/element_type_declarations_desugarizer.rb +34 -0
  309. data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/hash_desugarizer.rb +60 -0
  310. data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/to_type_transformer.rb +21 -0
  311. data/projects/type_declarations/src/handlers/extend_attributes_type_declaration.rb +16 -0
  312. data/projects/type_declarations/src/handlers/extend_registered_type_declaration/to_type_transformer.rb +75 -0
  313. data/projects/type_declarations/src/handlers/extend_registered_type_declaration.rb +23 -0
  314. data/projects/type_declarations/src/handlers/extend_tuple_type_declaration/array_desugarizer.rb +30 -0
  315. data/projects/type_declarations/src/handlers/extend_tuple_type_declaration/to_type_transformer.rb +24 -0
  316. data/projects/type_declarations/src/handlers/extend_tuple_type_declaration.rb +13 -0
  317. data/projects/type_declarations/src/handlers/registered_type_declaration/desugarizer_metadata_cleanup_desugarizer.rb +29 -0
  318. data/projects/type_declarations/src/handlers/registered_type_declaration/short_type_name_desugarizer.rb +65 -0
  319. data/projects/type_declarations/src/handlers/registered_type_declaration/strict_desugarizer.rb +32 -0
  320. data/projects/type_declarations/src/handlers/registered_type_declaration/strict_stringified_desugarizer.rb +39 -0
  321. data/projects/type_declarations/src/handlers/registered_type_declaration/symbol_desugarizer.rb +26 -0
  322. data/projects/type_declarations/src/handlers/registered_type_declaration/to_type_transformer.rb +28 -0
  323. data/projects/type_declarations/src/handlers/registered_type_declaration/type_desugarizer.rb +24 -0
  324. data/projects/type_declarations/src/handlers/registered_type_declaration.rb +26 -0
  325. data/projects/type_declarations/src/processor.rb +7 -0
  326. data/projects/type_declarations/src/to_type_transformer.rb +11 -0
  327. data/projects/type_declarations/src/transformer.rb +7 -0
  328. data/projects/type_declarations/src/type_builder.rb +112 -0
  329. data/projects/type_declarations/src/type_declaration_error.rb +9 -0
  330. data/projects/type_declarations/src/type_declaration_handler.rb +120 -0
  331. data/projects/type_declarations/src/type_declaration_handler_registry.rb +27 -0
  332. data/projects/type_declarations/src/type_declaration_validator.rb +19 -0
  333. data/projects/type_declarations/src/type_declarations.rb +128 -0
  334. data/projects/type_declarations/src/typed_transformer.rb +89 -0
  335. data/projects/type_declarations/src/validator.rb +7 -0
  336. data/projects/type_declarations/src/with_registries.rb +41 -0
  337. data/projects/types/lib/foobara/types.rb +11 -0
  338. data/projects/types/src/element_processor.rb +7 -0
  339. data/projects/types/src/extensions/error.rb +32 -0
  340. data/projects/types/src/type/concerns/reflection.rb +79 -0
  341. data/projects/types/src/type/concerns/supported_processor_registration.rb +56 -0
  342. data/projects/types/src/type.rb +375 -0
  343. data/projects/types/src/types.rb +4 -0
  344. data/projects/value/lib/foobara/value.rb +7 -0
  345. data/projects/value/src/caster.rb +84 -0
  346. data/projects/value/src/data_error.rb +27 -0
  347. data/projects/value/src/processor/casting.rb +123 -0
  348. data/projects/value/src/processor/multi.rb +63 -0
  349. data/projects/value/src/processor/pipeline.rb +27 -0
  350. data/projects/value/src/processor/runner.rb +38 -0
  351. data/projects/value/src/processor/selection.rb +90 -0
  352. data/projects/value/src/processor.rb +358 -0
  353. data/projects/value/src/transformer.rb +84 -0
  354. data/projects/value/src/validator.rb +53 -0
  355. data/projects/version/lib/foobara/version.rb +4 -0
  356. data/projects/version/src/version.rb +5 -0
  357. data/projects/weak_object_set/lib/foobara/weak_object_set.rb +3 -0
  358. data/projects/weak_object_set/src/weak_object_set.rb +163 -0
  359. metadata +445 -0
@@ -0,0 +1,273 @@
1
+ require_relative "is_namespace"
2
+
3
+ module Foobara
4
+ class Namespace
5
+ module NamespaceHelpers
6
+ module ScopedDefaultNamespace
7
+ include Concern
8
+
9
+ inherited_overridable_class_attr_accessor :scoped_default_namespace
10
+ end
11
+
12
+ module SubclassesAreNamespaces
13
+ include Concern
14
+
15
+ module ClassMethods
16
+ def inherited(subclass)
17
+ super
18
+
19
+ subclass.extend ::Foobara::Scoped
20
+
21
+ NamespaceHelpers.foobara_autoset_namespace(subclass, default_namespace: scoped_default_namespace)
22
+ NamespaceHelpers.foobara_autoset_scoped_path(subclass)
23
+
24
+ subclass.extend ::Foobara::Namespace::IsNamespace
25
+ end
26
+ end
27
+ end
28
+
29
+ module AutoRegisterSubclasses
30
+ include Concern
31
+
32
+ module ClassMethods
33
+ def inherited(subclass)
34
+ super
35
+
36
+ subclass.extend ::Foobara::Scoped
37
+
38
+ NamespaceHelpers.foobara_autoset_namespace(subclass, default_namespace: scoped_default_namespace)
39
+ NamespaceHelpers.foobara_autoset_scoped_path(subclass)
40
+
41
+ if subclass.scoped_namespace
42
+ if subclass.is_a?(Foobara::Namespace::IsNamespace)
43
+ subclass.foobara_parent_namespace = subclass.scoped_namespace
44
+ end
45
+
46
+ subclass.scoped_namespace.foobara_register(subclass)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ module AutoRegisterInstances
53
+ include Concern
54
+
55
+ def initialize(*, **, &)
56
+ if Foobara::Util.super_method_takes_parameters?(self, AutoRegisterInstances, __method__)
57
+ super
58
+ else
59
+ # :nocov:
60
+ super()
61
+ # :nocov:
62
+ end
63
+
64
+ ns = scoped_namespace || self.class.scoped_default_namespace
65
+ ns&.foobara_register(self)
66
+ end
67
+ end
68
+
69
+ module InstancesAreNamespaces
70
+ include Concern
71
+
72
+ include ::Foobara::Namespace::IsNamespace
73
+
74
+ def initialize(*, **, &)
75
+ if Foobara::Util.super_method_takes_parameters?(self, InstancesAreNamespaces, __method__)
76
+ # :nocov:
77
+ super
78
+ # :nocov:
79
+ else
80
+ super()
81
+ end
82
+
83
+ parent_namespace = scoped_namespace || self.class.scoped_default_namespace
84
+ NamespaceHelpers.initialize_foobara_namespace(self, parent_namespace:)
85
+ end
86
+ end
87
+
88
+ class << self
89
+ def initialize_foobara_namespace(namespace, scoped_name_or_path = nil, parent_namespace: nil)
90
+ unless namespace.scoped_path_set?
91
+ scoped_name_or_path = scoped_name_or_path.to_s if scoped_name_or_path.is_a?(::Symbol)
92
+
93
+ if scoped_name_or_path.is_a?(::String)
94
+ namespace.scoped_name = scoped_name_or_path
95
+ elsif scoped_name_or_path.is_a?(::Array)
96
+ namespace.scoped_path = scoped_name_or_path
97
+ end
98
+ end
99
+
100
+ if namespace.scoped_path_set? && parent_namespace
101
+ namespace.foobara_parent_namespace = parent_namespace
102
+ end
103
+ end
104
+
105
+ def foobara_namespace!(object, scoped_path: nil, ignore_modules: nil)
106
+ object.extend ::Foobara::Scoped
107
+
108
+ if ignore_modules
109
+ object.scoped_ignore_modules = ignore_modules
110
+ end
111
+ object.scoped_path = scoped_path if scoped_path
112
+
113
+ object.extend ::Foobara::Namespace::IsNamespace
114
+
115
+ if object.scoped_path_set?
116
+ Namespace::NamespaceHelpers.update_children_with_new_parent(object)
117
+ end
118
+ end
119
+
120
+ def foobara_subclasses_are_namespaces!(klass, default_parent: nil, autoregister: nil)
121
+ klass.include ScopedDefaultNamespace unless klass < ScopedDefaultNamespace
122
+ klass.scoped_default_namespace = default_parent if default_parent
123
+
124
+ klass.include SubclassesAreNamespaces unless klass < SubclassesAreNamespaces
125
+
126
+ if autoregister
127
+ foobara_autoregister_subclasses(klass)
128
+ end
129
+ end
130
+
131
+ def foobara_instances_are_namespaces!(klass, default_parent: nil, autoregister: nil)
132
+ klass.include ScopedDefaultNamespace unless klass < ScopedDefaultNamespace
133
+ klass.scoped_default_namespace = default_parent if default_parent
134
+ klass.include InstancesAreNamespaces unless klass < InstancesAreNamespaces
135
+
136
+ if autoregister
137
+ klass.include AutoRegisterInstances
138
+ end
139
+ end
140
+
141
+ def foobara_autoregister_subclasses(klass, default_namespace: nil)
142
+ klass.include ScopedDefaultNamespace unless klass < ScopedDefaultNamespace
143
+ klass.scoped_default_namespace = default_namespace if default_namespace
144
+ klass.include AutoRegisterSubclasses unless klass < AutoRegisterSubclasses
145
+ end
146
+
147
+ def foobara_autoset_namespace(mod, default_namespace: nil)
148
+ return if mod.scoped_namespace
149
+
150
+ parent_mod = Util.module_for(mod)
151
+
152
+ while parent_mod
153
+ if parent_mod.is_a?(Foobara::Namespace::IsNamespace)
154
+ mod.scoped_namespace = parent_mod
155
+ return
156
+ else
157
+ parent_mod = Util.module_for(parent_mod)
158
+ end
159
+ end
160
+
161
+ mod.scoped_namespace = default_namespace if default_namespace
162
+ end
163
+
164
+ def foobara_autoset_scoped_path(mod, make_top_level: false)
165
+ return if mod.scoped_path_set?
166
+
167
+ scoped_path = mod.name.split("::")
168
+
169
+ adjusted_scoped_path = []
170
+
171
+ next_mod = Object
172
+
173
+ while next_mod
174
+ path_part = scoped_path.shift
175
+
176
+ break unless path_part
177
+
178
+ next_mod = Util.constant_value(next_mod, path_part)
179
+
180
+ if next_mod.is_a?(IsNamespace) && next_mod != mod && !make_top_level
181
+ adjusted_scoped_path = []
182
+ next
183
+ end
184
+
185
+ adjusted_scoped_path << path_part unless mod.scoped_namespace&.scoped_ignore_module?(next_mod)
186
+ end
187
+
188
+ mod.scoped_path_autoset = true
189
+ mod.scoped_path = adjusted_scoped_path
190
+
191
+ if mod.is_a?(IsNamespace)
192
+ update_children_with_new_parent(mod)
193
+ end
194
+ end
195
+
196
+ def update_children_with_new_parent(mod)
197
+ if mod.scoped_full_path.empty?
198
+ # hard to really know what we're trying to do here. Just bail out.
199
+ return
200
+ end
201
+
202
+ # how to do this?
203
+ # I guess we could just iterate over all objects and patch up any with matching prefixes?
204
+ # is this expensive to have to look at all of them or no? I guess at least it's a one-time thing.
205
+ # TODO: somehow look things up by prefixes since we know mod's path
206
+ Foobara.foobara_root_namespace.foobara_each do |scoped|
207
+ parent = scoped.scoped_namespace
208
+ next if parent == mod
209
+
210
+ if parent && !parent.scoped_full_path.empty?
211
+ next if _start_with?(parent.scoped_full_path, mod.scoped_full_path)
212
+ end
213
+
214
+ if _start_with?(scoped.scoped_full_path, mod.scoped_full_path)
215
+ scoped.scoped_path = scoped.scoped_full_path[mod.scoped_full_path.size..]
216
+
217
+ if parent
218
+ parent.foobara_unregister(scoped)
219
+
220
+ mod.foobara_register(scoped)
221
+
222
+ if scoped.is_a?(Namespace::IsNamespace)
223
+ scoped.foobara_parent_namespace = mod
224
+ else
225
+ scoped.scoped_namespace = mod
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+
232
+ # TODO: move to util
233
+ def _start_with?(large_array, small_array)
234
+ return false unless large_array.size > small_array.size
235
+
236
+ small_array.each.with_index do |item, index|
237
+ return false unless large_array[index] == item
238
+ end
239
+
240
+ true
241
+ end
242
+ end
243
+
244
+ def foobara_namespace!(scoped_path: nil, ignore_modules: nil)
245
+ NamespaceHelpers.foobara_namespace!(self, scoped_path:, ignore_modules:)
246
+ end
247
+
248
+ def foobara_subclasses_are_namespaces!(default_parent: nil, autoregister: false)
249
+ NamespaceHelpers.foobara_subclasses_are_namespaces!(self, default_parent:, autoregister:)
250
+ end
251
+
252
+ def foobara_instances_are_namespaces!(default_parent: nil, autoregister: false)
253
+ NamespaceHelpers.foobara_instances_are_namespaces!(self, default_parent:, autoregister:)
254
+ end
255
+
256
+ def foobara_autoregister_subclasses(default_namespace: nil)
257
+ NamespaceHelpers.foobara_autoregister_subclasses(self, default_namespace:)
258
+ end
259
+
260
+ def foobara_root_namespace!(ignore_modules: nil)
261
+ foobara_namespace!(scoped_path: [], ignore_modules:)
262
+ end
263
+
264
+ def foobara_autoset_namespace!(default_namespace: nil)
265
+ NamespaceHelpers.foobara_autoset_namespace(self, default_namespace:)
266
+ end
267
+
268
+ def foobara_autoset_scoped_path!(make_top_level: false)
269
+ NamespaceHelpers.foobara_autoset_scoped_path(self, make_top_level:)
270
+ end
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,54 @@
1
+ require_relative "base_registry"
2
+
3
+ module Foobara
4
+ class Namespace
5
+ class PrefixlessRegistry < BaseRegistry
6
+ class RegisteringScopedWithPrefixError < StandardError; end
7
+
8
+ def registry
9
+ @registry ||= {}
10
+ end
11
+
12
+ def register(scoped)
13
+ key = to_key(scoped)
14
+
15
+ if registry.key?(key)
16
+ raise WouldMakeRegistryAmbiguousError, "#{key} is already registered"
17
+ end
18
+
19
+ registry[key] = scoped
20
+ end
21
+
22
+ def unregister(scoped)
23
+ key = to_key(scoped)
24
+
25
+ unless registry.key?(key)
26
+ # :nocov:
27
+ raise NotRegisteredError, "#{key} is not registered"
28
+ # :nocov:
29
+ end
30
+
31
+ registry.delete(key)
32
+ end
33
+
34
+ def lookup(path, filter = nil)
35
+ if path.size == 1
36
+ apply_filter(registry[path.first], filter)
37
+ end
38
+ end
39
+
40
+ def each_scoped_without_filter(&)
41
+ registry.each_value(&)
42
+ end
43
+
44
+ def to_key(scoped)
45
+ if scoped.scoped_prefix
46
+ raise RegisteringScopedWithPrefixError,
47
+ "Cannot register scoped with a prefix: #{scoped.scoped_name.inspect}"
48
+ end
49
+
50
+ scoped.scoped_short_name
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,113 @@
1
+ module Foobara
2
+ module Scoped
3
+ class NoScopedPathSetError < StandardError; end
4
+
5
+ attr_reader :scoped_namespace
6
+
7
+ def scoped_path
8
+ unless defined?(@scoped_path)
9
+ # :nocov:
10
+ raise NoScopedPathSetError, "No scoped path set. Explicitly set it to nil if that's what you want."
11
+ # :nocov:
12
+ end
13
+
14
+ @scoped_path
15
+ end
16
+
17
+ def scoped_namespace=(scoped_namespace)
18
+ scoped_clear_caches
19
+
20
+ @scoped_namespace = scoped_namespace
21
+ end
22
+
23
+ def scoped_clear_caches
24
+ [
25
+ "@scoped_absolute_name",
26
+ "@scoped_name",
27
+ "@scoped_prefix",
28
+ "@scoped_full_name",
29
+ "@scoped_full_path"
30
+ ].each do |variable|
31
+ remove_instance_variable(variable) if instance_variable_defined?(variable)
32
+ end
33
+ end
34
+
35
+ def scoped_name=(name)
36
+ name = name.to_s if name.is_a?(::Symbol)
37
+ self.scoped_path = name.split("::")
38
+ end
39
+
40
+ def scoped_path=(path)
41
+ scoped_clear_caches
42
+
43
+ @scoped_path = path.map(&:to_s)
44
+ end
45
+
46
+ def scoped_path_autoset=(bool)
47
+ @scoped_path_autoset = bool
48
+ end
49
+
50
+ def scoped_path_autoset?
51
+ @scoped_path_autoset
52
+ end
53
+
54
+ def scoped_short_name
55
+ @scoped_short_name ||= scoped_path.last
56
+ end
57
+
58
+ def scoped_short_path
59
+ @scoped_short_path ||= [scoped_short_name]
60
+ end
61
+
62
+ def scoped_name
63
+ return @scoped_name if defined?(@scoped_name)
64
+
65
+ @scoped_name = unless scoped_path.empty?
66
+ scoped_path.join("::")
67
+ end
68
+ end
69
+
70
+ def scoped_full_path
71
+ @scoped_full_path ||= [*scoped_namespace&.scoped_full_path, *scoped_path]
72
+ end
73
+
74
+ def scoped_full_name
75
+ @scoped_full_name ||= scoped_full_path.join("::")
76
+ end
77
+
78
+ attr_writer :foobara_manifest_reference
79
+
80
+ def foobara_manifest_reference
81
+ @foobara_manifest_reference ||= scoped_full_name
82
+ end
83
+
84
+ def scoped_absolute_name
85
+ @scoped_absolute_name ||= "::#{scoped_full_name}"
86
+ end
87
+
88
+ def scoped_prefix
89
+ return @scoped_prefix if defined?(@scoped_prefix)
90
+
91
+ @scoped_prefix = unless scoped_path.size == 1
92
+ scoped_path[0..-2]
93
+ end
94
+ end
95
+
96
+ def scoped_path_set?
97
+ defined?(@scoped_path)
98
+ end
99
+
100
+ def scoped_ignore_module?(mod)
101
+ @scoped_ignore_modules&.include?(mod) || scoped_namespace&.scoped_ignore_module?(mod)
102
+ end
103
+
104
+ def scoped_ignore_modules=(modules)
105
+ mods = @scoped_ignore_modules || []
106
+ @scoped_ignore_modules = [*mods, *modules]
107
+ end
108
+
109
+ def scoped_category
110
+ @scoped_category ||= Namespace.global.foobara_category_symbol_for(self)
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,65 @@
1
+ require_relative "base_registry"
2
+
3
+ module Foobara
4
+ class Namespace
5
+ class UnambiguousRegistry < BaseRegistry
6
+ def registry
7
+ @registry ||= {}
8
+ end
9
+
10
+ def register(scoped)
11
+ new_entries = {}
12
+
13
+ to_keys(scoped).each do |key|
14
+ if registry.key?(key)
15
+ raise WouldMakeRegistryAmbiguousError,
16
+ "Ambiguous match for #{key.inspect}. Matches the following: #{registry[key].inspect}"
17
+ end
18
+
19
+ new_entries[key] = scoped
20
+ end
21
+
22
+ all << scoped
23
+
24
+ registry.merge!(new_entries)
25
+ end
26
+
27
+ def unregister(scoped)
28
+ all.delete(scoped)
29
+
30
+ to_keys(scoped).each do |key|
31
+ unless registry.key?(key)
32
+ raise NotRegisteredError, "Not registered: #{key.inspect}"
33
+ end
34
+
35
+ registry.delete(key)
36
+ end
37
+ end
38
+
39
+ def lookup(path, filter = nil)
40
+ apply_filter(registry[path], filter)
41
+ end
42
+
43
+ def each_scoped_without_filter(&)
44
+ # records can be unregistered in the block so dup first
45
+ all.dup.each(&)
46
+ end
47
+
48
+ private
49
+
50
+ # TODO: why don't we do this in UnambiguousRegistry??
51
+ def to_keys(scoped)
52
+ short_name = scoped.scoped_short_name
53
+ prefixes = scoped.scoped_prefix ? Util.power_set(scoped.scoped_prefix) : [[]]
54
+
55
+ prefixes.map do |prefix|
56
+ [*prefix, *short_name]
57
+ end
58
+ end
59
+
60
+ def all
61
+ @all ||= []
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,22 @@
1
+ module Foobara
2
+ module Persistence
3
+ class << self
4
+ def reset_all
5
+ @tables_for_entity_class_name = @bases = @default_crud_driver = @default_base = nil
6
+ EntityBase::Transaction::Concerns::EntityCallbackHandling.reset_all
7
+ EntityBase::Transaction.reset_all
8
+
9
+ Util.descendants(Foobara::Entity).each do |entity_class|
10
+ if entity_class.instance_variable_defined?(:@entity_base)
11
+ entity_class.remove_instance_variable(:@entity_base)
12
+ end
13
+ end
14
+ end
15
+
16
+ def install!
17
+ EntityBase::Transaction::Concerns::EntityCallbackHandling.install!
18
+ EntityBase::Transaction.install!
19
+ end
20
+ end
21
+ end
22
+ end