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,124 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module ErrorsType
5
+ include Concern
6
+
7
+ module ClassMethods
8
+ def process_error_constants
9
+ return if @error_constants_processed
10
+
11
+ @error_constants_processed = true
12
+
13
+ Util.constant_values(self, extends: Foobara::RuntimeError).each do |error_class|
14
+ key = PossibleError.new(error_class).key.to_s
15
+
16
+ unless error_context_type_map.key?(key)
17
+ possible_error error_class
18
+ end
19
+ end
20
+ end
21
+
22
+ def possible_errors
23
+ error_context_type_map.values
24
+ end
25
+
26
+ def possible_error(*args)
27
+ possible_error = case args.size
28
+ when 1
29
+ arg = args.first
30
+
31
+ if arg.is_a?(PossibleError)
32
+ # TODO: test this code path
33
+ # :nocov:
34
+ arg
35
+ # :nocov:
36
+ elsif arg.is_a?(::Class) && arg < Foobara::Error
37
+ PossibleError.new(arg)
38
+ else
39
+ # :nocov:
40
+ raise ArgumentError, "Expected a PossibleError or an Error but got #{arg}"
41
+ # :nocov:
42
+ end
43
+ when 2
44
+ symbol, error_class_or_context_type_declaration, data = args
45
+ error_class = to_runtime_error_class(symbol, error_class_or_context_type_declaration)
46
+ PossibleError.new(error_class, symbol:, data:)
47
+ else
48
+ # :nocov:
49
+ raise ArgumentError, "Expected an error or a symbol and error context type declaration"
50
+ # :nocov:
51
+ end
52
+
53
+ register_possible_error_class(possible_error)
54
+ end
55
+
56
+ def possible_input_error(
57
+ path,
58
+ symbol_or_error_class,
59
+ error_class_or_context_type_declaration = {},
60
+ data = nil
61
+ )
62
+ error_class, symbol = if symbol_or_error_class.is_a?(Class)
63
+ [symbol_or_error_class, symbol_or_error_class.symbol]
64
+ else
65
+ [
66
+ to_input_error_class(
67
+ symbol_or_error_class,
68
+ error_class_or_context_type_declaration
69
+ ),
70
+ symbol_or_error_class
71
+ ]
72
+ end
73
+
74
+ possible_error = PossibleError.new(error_class, symbol:, data:)
75
+ possible_error.prepend_path!(path)
76
+
77
+ possible_error.manually_added = true
78
+ register_possible_error_class(possible_error)
79
+ end
80
+
81
+ def manually_added_possible_input_errors
82
+ @manually_added_possible_input_errors ||= []
83
+ end
84
+
85
+ # TODO: kill this method in favor of possible_errors
86
+ def error_context_type_map
87
+ process_error_constants
88
+ @error_context_type_map ||= if superclass < Foobara::Command
89
+ superclass.error_context_type_map.dup
90
+ end || {}
91
+ end
92
+
93
+ def register_possible_error_class(possible_error)
94
+ if possible_error.manually_added
95
+ manually_added_possible_input_errors << possible_error
96
+ end
97
+
98
+ error_context_type_map[possible_error.key.to_s] = possible_error
99
+ end
100
+
101
+ def unregister_possible_error_if_registered(possible_error)
102
+ key = possible_error.key.to_s
103
+ error_context_type_map.delete(key)
104
+ end
105
+
106
+ # TODO: should we cache these???
107
+ def to_input_error_class(symbol, context_type_declaration)
108
+ Foobara::Value::DataError.subclass(
109
+ symbol:,
110
+ context_type_declaration:
111
+ )
112
+ end
113
+
114
+ def to_runtime_error_class(symbol, context_type_declaration)
115
+ Foobara::RuntimeError.subclass(
116
+ symbol:,
117
+ context_type_declaration:
118
+ )
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,59 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module Inputs
5
+ include Concern
6
+
7
+ attr_reader :inputs
8
+
9
+ def method_missing(method_name, *args, &)
10
+ if respond_to_missing_for_inputs?(method_name)
11
+ inputs[method_name]
12
+ else
13
+ # :nocov:
14
+ super
15
+ # :nocov:
16
+ end
17
+ end
18
+
19
+ def respond_to_missing?(method_name, private = false)
20
+ respond_to_missing_for_inputs?(method_name, private) || super
21
+ end
22
+
23
+ def respond_to_missing_for_inputs?(method_name, _private = false)
24
+ inputs_type&.element_types&.key?(method_name)
25
+ end
26
+
27
+ foobara_delegate :inputs_type, to: :class
28
+
29
+ def cast_and_validate_inputs
30
+ if inputs_type.nil? && (raw_inputs.nil? || raw_inputs.empty?)
31
+ @inputs = {}
32
+ return
33
+ end
34
+
35
+ outcome = inputs_type.runner(raw_inputs).process_value
36
+
37
+ if outcome.success?
38
+ @inputs = outcome.result
39
+ else
40
+ outcome.errors.each do |error|
41
+ if error.is_a?(Value::DataError)
42
+ add_input_error(error)
43
+ else
44
+ # TODO: raise a real error
45
+ # :nocov:
46
+ raise "wtf"
47
+ # :nocov:
48
+ end
49
+ end
50
+ end
51
+
52
+ if outcome.success?
53
+ @inputs = outcome.result
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,58 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module InputsType
5
+ include Concern
6
+
7
+ module ClassMethods
8
+ def inputs(...)
9
+ old_inputs_type = inputs_type
10
+
11
+ old_inputs_type&.possible_errors&.each do |possible_error|
12
+ unregister_possible_error_if_registered(possible_error)
13
+ end
14
+
15
+ type = type_for_declaration(...)
16
+
17
+ if type.extends?(BuiltinTypes[:model]) && !type.extends?(BuiltinTypes[:entity])
18
+ type = type.element_types
19
+ end
20
+
21
+ @inputs_type = type
22
+
23
+ register_possible_input_errors
24
+
25
+ @inputs_type
26
+ end
27
+
28
+ def inputs_type
29
+ return @inputs_type if defined?(@inputs_type)
30
+
31
+ @inputs_type = if superclass < Foobara::Command
32
+ superclass.inputs_type
33
+ end
34
+ end
35
+
36
+ def raw_inputs_type_declaration
37
+ inputs_type.raw_declaration_data
38
+ end
39
+
40
+ def inputs_type_declaration
41
+ inputs_type.declaration_data
42
+ end
43
+
44
+ private
45
+
46
+ def register_possible_input_errors
47
+ # TODO: let's derive these at runtime and memoize...
48
+ inputs_type.possible_errors.each do |possible_error|
49
+ register_possible_error_class(possible_error)
50
+ end
51
+ end
52
+ end
53
+
54
+ foobara_delegate :inputs_type, :raw_inputs_type_declaration, to: :class
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,49 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module Namespace
5
+ include Concern
6
+
7
+ on_include do
8
+ foobara_subclasses_are_namespaces!(default_parent: Foobara::GlobalDomain, autoregister: true)
9
+ end
10
+
11
+ module ClassMethods
12
+ def type_for_declaration(...)
13
+ domain.foobara_type_from_declaration(...)
14
+ end
15
+
16
+ def domain
17
+ namespace = foobara_parent_namespace
18
+
19
+ while namespace
20
+ if namespace.is_a?(Module) && namespace.foobara_domain?
21
+ d = namespace
22
+ break
23
+ end
24
+
25
+ namespace = namespace.foobara_parent_namespace
26
+ end
27
+
28
+ d || GlobalDomain
29
+ end
30
+
31
+ # TODO: prefix these...
32
+ def organization
33
+ domain.foobara_organization
34
+ end
35
+
36
+ def full_command_name
37
+ scoped_full_name
38
+ end
39
+
40
+ def full_command_symbol
41
+ @full_command_symbol ||= Util.underscore_sym(full_command_name)
42
+ end
43
+ end
44
+
45
+ foobara_delegate :type_for_declaration, to: :class
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,137 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module Reflection
5
+ include Concern
6
+ include Manifestable
7
+
8
+ def initialize(...)
9
+ self.class.all << self
10
+ super(...)
11
+ end
12
+
13
+ module ClassMethods
14
+ def all
15
+ @all ||= []
16
+ end
17
+
18
+ def reset_all
19
+ remove_instance_variable("@all") if instance_variable_defined?("@all")
20
+ end
21
+
22
+ def foobara_manifest(to_include:)
23
+ depends_on = self.depends_on.map do |command_name|
24
+ other_command = Foobara::Namespace.global.foobara_lookup!(command_name,
25
+ mode: Foobara::Namespace::LookupMode::ABSOLUTE)
26
+ to_include << other_command
27
+ other_command.foobara_manifest_reference
28
+ end.sort
29
+
30
+ types = types_depended_on.map do |t|
31
+ to_include << t
32
+ t.foobara_manifest_reference
33
+ end.sort
34
+
35
+ inputs_types_depended_on = self.inputs_types_depended_on.map do |t|
36
+ to_include << t
37
+ t.foobara_manifest_reference
38
+ end.sort
39
+
40
+ result_types_depended_on = self.result_types_depended_on.map do |t|
41
+ to_include << t
42
+ t.foobara_manifest_reference
43
+ end.sort
44
+
45
+ errors_types_depended_on = self.errors_types_depended_on.map do |t|
46
+ to_include << t
47
+ t.foobara_manifest_reference
48
+ end.sort
49
+
50
+ possible_errors = self.possible_errors.map do |possible_error|
51
+ [possible_error.key.to_s, possible_error.foobara_manifest(to_include:)]
52
+ end.sort.to_h
53
+
54
+ h = Util.remove_blank(
55
+ types_depended_on: types,
56
+ inputs_types_depended_on:,
57
+ result_types_depended_on:,
58
+ errors_types_depended_on:,
59
+ possible_errors:,
60
+ depends_on:,
61
+ # TODO: allow inputs type to be nil or really any type?
62
+ inputs_type: inputs_type&.reference_or_declaration_data || {
63
+ type: "::attributes",
64
+ element_type_declarations: {},
65
+ required: []
66
+ }
67
+ ).merge(description:)
68
+
69
+ if result_type
70
+ # TODO: find a way to represent literal types like "nil"
71
+ h[:result_type] = result_type.reference_or_declaration_data
72
+ end
73
+
74
+ super.merge(h)
75
+ end
76
+
77
+ def command_name
78
+ Util.non_full_name(self)
79
+ end
80
+
81
+ def types_depended_on
82
+ # TODO: is there a simpler way to wrap these methods in this namespace?
83
+ # something aspect-oriented-ish?
84
+ @types_depended_on ||= begin
85
+ types = inputs_types_depended_on | result_types_depended_on | errors_types_depended_on
86
+
87
+ unless depends_on_entities.empty?
88
+ entity_types = depends_on_entities.map(&:entity_type)
89
+ types |= entity_types
90
+ types |= entity_types.map(&:types_depended_on).inject(:|)
91
+ end
92
+
93
+ types
94
+ end
95
+ end
96
+
97
+ def inputs_types_depended_on
98
+ @inputs_types_depended_on ||= if inputs_type
99
+ if inputs_type.registered?
100
+ # TODO: if we ever change from attributes-only inputs type
101
+ # then this will be handy
102
+ # :nocov:
103
+ Set[inputs_type]
104
+ # :nocov:
105
+ else
106
+ inputs_type.types_depended_on
107
+ end
108
+ else
109
+ Set.new
110
+ end
111
+ end
112
+
113
+ def result_types_depended_on
114
+ @result_types_depended_on ||= if result_type
115
+ if result_type.registered?
116
+ Set[result_type]
117
+ else
118
+ result_type.types_depended_on
119
+ end
120
+ else
121
+ Set.new
122
+ end
123
+ end
124
+
125
+ def errors_types_depended_on
126
+ @errors_types_depended_on ||= begin
127
+ error_classes = possible_errors.map(&:error_class)
128
+ error_classes.map(&:types_depended_on).inject(:|) || Set.new
129
+ end
130
+ end
131
+ end
132
+
133
+ foobara_delegate :type_for_declaration, to: :class
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,25 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module Result
5
+ include Concern
6
+
7
+ class CouldNotProcessResult < Outcome::UnsuccessfulOutcomeError; end
8
+
9
+ private
10
+
11
+ def process_result_using_result_type(result)
12
+ return result unless result_type
13
+
14
+ outcome = result_type.process_value(result)
15
+
16
+ if outcome.success?
17
+ outcome.result
18
+ else
19
+ raise CouldNotProcessResult, outcome.errors
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module ResultType
5
+ include Concern
6
+
7
+ module ClassMethods
8
+ def result(...)
9
+ @result_type = type_for_declaration(...)
10
+ end
11
+
12
+ def result_type
13
+ return @result_type if defined?(@result_type)
14
+
15
+ @result_type = if superclass < Foobara::Command
16
+ superclass.result_type
17
+ end
18
+ end
19
+
20
+ def raw_result_type_declaration
21
+ result_type.raw_declaration_data
22
+ end
23
+ end
24
+
25
+ foobara_delegate :result_type, :raw_result_type_declaration, to: :class
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,119 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module Runtime
5
+ include Concern
6
+
7
+ class CannotHaltWithoutAddingErrors < StandardError; end
8
+ class Halt < StandardError; end
9
+
10
+ module ClassMethods
11
+ def run(...)
12
+ new(...).run
13
+ end
14
+
15
+ def run!(...)
16
+ new(...).run!
17
+ end
18
+ end
19
+
20
+ attr_reader :outcome, :exception
21
+
22
+ def run!
23
+ run.result!
24
+ end
25
+
26
+ def run
27
+ Foobara::Namespace.use self.class do
28
+ invoke_with_callbacks_and_transition(:open_transaction)
29
+
30
+ invoke_with_callbacks_and_transition_in_transaction(%i[
31
+ cast_and_validate_inputs
32
+ load_records
33
+ validate_records
34
+ validate
35
+ run_execute
36
+ commit_transaction
37
+ ])
38
+
39
+ invoke_with_callbacks_and_transition(:succeed)
40
+ end
41
+
42
+ @outcome
43
+ rescue Halt
44
+ rollback_transaction
45
+
46
+ return outcome if state_machine.currently_errored?
47
+
48
+ if error_collection.empty?
49
+ # :nocov:
50
+ raise CannotHaltWithoutAddingErrors, "Cannot halt without adding errors first. " \
51
+ "Either add errors or use error! transition instead."
52
+ # :nocov:
53
+ end
54
+
55
+ state_machine.fail!
56
+
57
+ @outcome = Outcome.errors(error_collection)
58
+ rescue => e
59
+ @exception = e
60
+ rollback_transaction
61
+ state_machine.error!
62
+ raise
63
+ end
64
+
65
+ def success?
66
+ outcome&.success?
67
+ end
68
+
69
+ def run_execute
70
+ result = process_result_using_result_type(execute)
71
+ @outcome = Outcome.success(result)
72
+ end
73
+
74
+ def succeed
75
+ # noop but for now helpful for carrying out state transition
76
+ end
77
+
78
+ def validate_records
79
+ # noop
80
+ end
81
+
82
+ def validate
83
+ # can override if desired, default is a no-op
84
+ end
85
+
86
+ def halt!
87
+ raise Halt
88
+ end
89
+
90
+ private
91
+
92
+ def invoke_with_callbacks_and_transition_in_transaction(transition_or_transitions)
93
+ Persistence::EntityBase.using_transactions(transactions) do
94
+ invoke_with_callbacks_and_transition(transition_or_transitions)
95
+ end
96
+ end
97
+
98
+ def invoke_with_callbacks_and_transition(transition_or_transitions)
99
+ result = nil
100
+
101
+ if transition_or_transitions.is_a?(Array)
102
+ transition_or_transitions.each do |transition|
103
+ result = invoke_with_callbacks_and_transition(transition)
104
+ end
105
+ else
106
+ transition = transition_or_transitions
107
+
108
+ state_machine.perform_transition!(transition) do
109
+ result = send(transition)
110
+ halt! if has_errors?
111
+ end
112
+ end
113
+
114
+ result
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,12 @@
1
+ module Foobara
2
+ class Command
3
+ module Concerns
4
+ module StateMachine
5
+ def state_machine
6
+ # It makes me nervous to pass self around. Seems like a design smell.
7
+ @state_machine ||= Foobara::Command::StateMachine.new(owner: self)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end