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,10 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ class Around < Block
5
+ include Concerns::KeywordArgumentableBlock
6
+ include Concerns::BlockParameterRequired
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ class Before < Block
5
+ include Concerns::KeywordArgumentableBlock
6
+ include Concerns::BlockParameterNotAllowed
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ module Concerns
5
+ module BlockParameterNotAllowed
6
+ private
7
+
8
+ def validate_original_block!
9
+ super
10
+
11
+ if takes_block?
12
+ # :nocov:
13
+ raise ArgumentError, "#{type} callback is not allowed to accept a block"
14
+ # :nocov:
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ module Concerns
5
+ module BlockParameterRequired
6
+ private
7
+
8
+ def validate_original_block!
9
+ super
10
+
11
+ unless takes_block?
12
+ # :nocov:
13
+ raise ArgumentError, "#{type} callback must take a block argument"
14
+ # :nocov:
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ module Concerns
5
+ module KeywordArgumentableBlock
6
+ def to_proc
7
+ @to_proc ||= if has_keyword_args?
8
+ proc do |*args, &block|
9
+ keyword_args = args.reduce(:merge) || {}
10
+ original_block.call(**keyword_args, &block)
11
+ end
12
+ else
13
+ original_block
14
+ end
15
+ end
16
+
17
+ def validate_original_block!
18
+ super
19
+
20
+ if has_keyword_args? && has_positional_args?
21
+ # TODO: raise a real error
22
+ # :nocov:
23
+ raise "Expect #{type} block to either take a positional arg or keyword args but not both"
24
+ # :nocov:
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ module Concerns
5
+ module SingleArgumentBlock
6
+ private
7
+
8
+ def validate_original_block!
9
+ super
10
+
11
+ if has_keyword_args?
12
+ # :nocov:
13
+ raise ArgumentError,
14
+ "Expect #{type} block to only receive one or zero arguments. It cannot take keyword arguments."
15
+ # :nocov:
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ module Concerns
5
+ module Type
6
+ include Concern
7
+
8
+ module ClassMethods
9
+ def type
10
+ @type ||= Util.non_full_name_underscore(self)&.gsub(/_block$/, "")&.to_sym
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ module Foobara
2
+ module Callback
3
+ class Block
4
+ class Error < Block
5
+ include Concerns::SingleArgumentBlock
6
+ include Concerns::BlockParameterNotAllowed
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,83 @@
1
+ Foobara::Util.require_directory("#{__dir__}/block")
2
+
3
+ module Foobara
4
+ module Callback
5
+ class Block
6
+ include Concerns::Type
7
+
8
+ class << self
9
+ def types_to_subclasses
10
+ @types_to_subclasses ||= subclasses.to_h { |klass| [klass.type, klass] }
11
+ end
12
+
13
+ def types
14
+ @types ||= types_to_subclasses.keys
15
+ end
16
+
17
+ def for(type, callback)
18
+ const_get(Util.classify(type)).new(callback)
19
+ end
20
+ end
21
+
22
+ attr_accessor :original_block
23
+
24
+ def initialize(original_block)
25
+ self.original_block = original_block
26
+ validate_original_block!
27
+ end
28
+
29
+ foobara_delegate :type, to: :class
30
+
31
+ def call(...)
32
+ to_proc.call(...)
33
+ end
34
+
35
+ def to_proc
36
+ @to_proc ||= original_block
37
+ end
38
+
39
+ private
40
+
41
+ def validate_original_block!
42
+ unless has_one_or_zero_positional_args?
43
+ # TODO: raise a real error
44
+ # :nocov:
45
+ raise "Can't pass multiple arguments to a callback. Only 1 or 0 arguments."
46
+ # :nocov:
47
+ end
48
+ end
49
+
50
+ def takes_block?
51
+ @takes_block ||= original_block.parameters.last&.first&.==(:block)
52
+ end
53
+
54
+ def has_one_or_zero_positional_args?
55
+ @has_one_or_zero_positional_args ||= positional_args_count <= 1
56
+ end
57
+
58
+ def has_keyword_args?
59
+ @has_keyword_args ||= param_types.any? { |type| %i[keyreq keyrest].include?(type) }
60
+ end
61
+
62
+ def has_positional_args?
63
+ @has_positional_args ||= positional_args_count > 0
64
+ end
65
+
66
+ def param_types
67
+ @param_types ||= original_block.parameters.map(&:first)
68
+ end
69
+
70
+ def optional_positional_args_count
71
+ @optional_positional_args_count ||= original_block.parameters.map(&:first).count { |type| type == :opt }
72
+ end
73
+
74
+ def required_positional_args_count
75
+ @required_positional_args_count ||= original_block.parameters.map(&:first).count { |type| type == :req }
76
+ end
77
+
78
+ def positional_args_count
79
+ @positional_args_count ||= optional_positional_args_count + required_positional_args_count
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,90 @@
1
+ module Foobara
2
+ module Callback
3
+ module Registry
4
+ class Base
5
+ def runner(*, **)
6
+ Runner.new(unioned_callback_set_for(*, **))
7
+ end
8
+
9
+ def register_callback(type, *, **, &callback_block)
10
+ unless block_given?
11
+ # :nocov:
12
+ raise ArgumentError, "Must provide a callback block to register"
13
+ # :nocov:
14
+ end
15
+
16
+ validate_type!(type)
17
+
18
+ set = specific_callback_set_for(*, **)
19
+
20
+ set[type] << Block.for(type, callback_block)
21
+ end
22
+
23
+ def specific_callback_set_for(*_args, **_opts)
24
+ # :nocov:
25
+ raise "subclass responsibility"
26
+ # :nocov:
27
+ end
28
+
29
+ def unioned_callback_set_for(*_args, **_opts)
30
+ # :nocov:
31
+ raise "subclass responsibility"
32
+ # :nocov:
33
+ end
34
+
35
+ def before(...)
36
+ register_callback(:before, ...)
37
+ end
38
+
39
+ def after(...)
40
+ register_callback(:after, ...)
41
+ end
42
+
43
+ def around(...)
44
+ register_callback(:around, ...)
45
+ end
46
+
47
+ def error(...)
48
+ register_callback(:error, ...)
49
+ end
50
+
51
+ def has_callbacks?(type, *, **)
52
+ !unioned_callback_set_for(*, **)[type].empty?
53
+ end
54
+
55
+ def has_before_callbacks?(*, **)
56
+ has_callbacks?(:before, *, **)
57
+ end
58
+
59
+ def has_after_callbacks?(*, **)
60
+ has_callbacks?(:after, *, **)
61
+ end
62
+
63
+ def has_around_callbacks?(*, **)
64
+ has_callbacks?(:around, *, **)
65
+ end
66
+
67
+ def has_error_callbacks?(*, **)
68
+ has_callbacks?(:error, *, **)
69
+ end
70
+
71
+ attr_writer :allowed_types
72
+
73
+ def allowed_types
74
+ @allowed_types = Block.types
75
+ end
76
+
77
+ private
78
+
79
+ def validate_type!(type)
80
+ unless allowed_types.include?(type)
81
+ # TODO: raise a real error
82
+ # :nocov:
83
+ raise "bad type #{type} expected one of #{allowed_types}"
84
+ # :nocov:
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,24 @@
1
+ Foobara.require_project_file("callback", "registry/conditioned")
2
+
3
+ module Foobara
4
+ module Callback
5
+ module Registry
6
+ class ChainedConditioned < Conditioned
7
+ attr_accessor :other_conditions_registry
8
+
9
+ class InvalidConditions < StandardError; end
10
+
11
+ foobara_delegate :possible_conditions, :possible_condition_keys, to: :other_conditions_registry
12
+
13
+ def initialize(other_conditions_registry)
14
+ self.other_conditions_registry = other_conditions_registry
15
+ super(possible_conditions)
16
+ end
17
+
18
+ def unioned_callback_set_for(...)
19
+ super.union(other_conditions_registry.unioned_callback_set_for(...))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ Foobara.require_project_file("callback", "registry/multiple_action")
2
+
3
+ module Foobara
4
+ module Callback
5
+ module Registry
6
+ class ChainedMultipleAction < MultipleAction
7
+ attr_accessor :other_multiple_actions_registry
8
+
9
+ class InvalidConditions < StandardError; end
10
+
11
+ foobara_delegate :possible_actions, :allowed_types, to: :other_multiple_actions_registry
12
+
13
+ def initialize(other_multiple_actions_registry)
14
+ self.other_multiple_actions_registry = other_multiple_actions_registry
15
+ super(possible_actions)
16
+ end
17
+
18
+ def unioned_callback_set_for(...)
19
+ super.union(other_multiple_actions_registry.unioned_callback_set_for(...))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,101 @@
1
+ Foobara.require_project_file("callback", "registry/base")
2
+
3
+ module Foobara
4
+ module Callback
5
+ module Registry
6
+ class Conditioned < Base
7
+ attr_accessor :possible_conditions, :possible_condition_keys, :callback_sets
8
+
9
+ class InvalidConditions < StandardError; end
10
+
11
+ def initialize(possible_conditions)
12
+ super()
13
+
14
+ self.callback_sets = {}
15
+ self.possible_conditions = possible_conditions
16
+ self.possible_condition_keys = possible_conditions.keys.map(&:to_s).sort.map(&:to_sym)
17
+ end
18
+
19
+ def specific_callback_set_for(*args, **opts)
20
+ conditions = Util.args_and_opts_to_opts(args, opts)
21
+ validate_conditions!(**conditions) # TODO: don't always have to validate this...
22
+ key = condition_hash_to_callback_key(conditions)
23
+ callback_sets[key] ||= Callback::Set.new
24
+ end
25
+
26
+ def unioned_callback_set_for(**conditions)
27
+ return specific_callback_set_for if conditions.empty?
28
+
29
+ full_callback_key = condition_hash_to_callback_key(conditions)
30
+ all_sets = callback_key_permutations(full_callback_key).map do |callback_key|
31
+ callback_sets[callback_key]
32
+ end.compact
33
+
34
+ all_sets.inject { |unioned, set| unioned.union(set) } || Callback::Set.new
35
+ end
36
+
37
+ private
38
+
39
+ def validate_conditions!(**conditions)
40
+ unless conditions.is_a?(Hash)
41
+ # :nocov:
42
+ raise InvalidConditions, "Expected a hash"
43
+ # :nocov:
44
+ end
45
+
46
+ conditions.each_pair do |condition_name, condition_value|
47
+ unless possible_condition_keys.include?(condition_name)
48
+ raise InvalidConditions,
49
+ "Invalid condition name #{condition_name} expected one of #{possible_condition_keys}"
50
+ end
51
+
52
+ next if condition_value.nil?
53
+
54
+ possible_values = possible_conditions[condition_name]
55
+
56
+ unless possible_values.include?(condition_value)
57
+ raise InvalidConditions,
58
+ "Invalid condition value #{
59
+ condition_value
60
+ }: expected nil or one of #{possible_values} but got #{condition_value}"
61
+
62
+ end
63
+ end
64
+ end
65
+
66
+ def condition_hash_to_callback_key(hash)
67
+ possible_condition_keys.map do |condition|
68
+ hash[condition]
69
+ end
70
+ end
71
+
72
+ # we need to fetch callbacks for every possible way a specified condition could be omitted
73
+ # so for example...
74
+ # let's say possible conditions are :a, :b, :c
75
+ # and we are given callbacks_for(:before, a: 1, c: 2)
76
+ # well then b is always nil meaning b can be anything.
77
+ # so we need the callbacks that were registered for the following keys...
78
+ # [1, nil, 2] (conditions that were passed in, the most specific callbacks)
79
+ # [1, nil, nil]
80
+ # [nil, nil, 2]
81
+ # [nil, nil, nil] (all :before callbacks for any conditions)
82
+ # So what is the logic that generates this behavior?
83
+ # What we could do is take the indexes of non-nil values and then create the powerset of those.
84
+ # This would then create a list of which indexes to keep and which to nil out.
85
+ def callback_key_permutations(full_callback_key)
86
+ non_nil_indices = []
87
+
88
+ full_callback_key.each.with_index do |condition_value, index|
89
+ non_nil_indices << index if condition_value
90
+ end
91
+
92
+ Util.power_set(non_nil_indices).map do |indices_to_exclude|
93
+ indices_to_exclude.each_with_object(full_callback_key.dup) do |index, condition_key|
94
+ condition_key[index] = nil
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,110 @@
1
+ Foobara.require_project_file("callback", "registry/base")
2
+
3
+ module Foobara
4
+ module Callback
5
+ module Registry
6
+ class MultipleAction < Base
7
+ attr_accessor :callback_sets, :possible_actions
8
+
9
+ class InvalidAction < StandardError; end
10
+
11
+ def initialize(*possible_actions)
12
+ super()
13
+
14
+ self.callback_sets = {}
15
+
16
+ possible_actions = normalize_actions(possible_actions, false)
17
+
18
+ self.possible_actions = possible_actions.map(&:to_s).sort.map(&:to_sym)
19
+ end
20
+
21
+ def runner(*actions)
22
+ super(*normalize_actions(actions))
23
+ end
24
+
25
+ def before(*actions, &)
26
+ super(*normalize_actions(actions), &)
27
+ end
28
+
29
+ def after(*actions, &)
30
+ super(*normalize_actions(actions), &)
31
+ end
32
+
33
+ def around(*actions, &)
34
+ super(*normalize_actions(actions), &)
35
+ end
36
+
37
+ def error(*actions, &)
38
+ super(*normalize_actions(actions), &)
39
+ end
40
+
41
+ def specific_callback_set_for(*actions)
42
+ action = normalize_action(actions)
43
+
44
+ validate_action!(action)
45
+ callback_sets[action] ||= Callback::Set.new
46
+ end
47
+
48
+ def unioned_callback_set_for(*actions)
49
+ action = normalize_action(actions)
50
+
51
+ if action.nil?
52
+ callback_sets.values.reduce(:|) || Callback::Set.new
53
+ else
54
+ specific_callback_set_for(nil) | specific_callback_set_for(action)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def validate_action!(action)
61
+ if !action.nil? && !possible_actions.include?(action)
62
+ raise InvalidAction,
63
+ "Invalid action #{action.inspect} expected nil or one of #{possible_actions}"
64
+ end
65
+ end
66
+
67
+ def validate_actions!(actions)
68
+ actions.each { |action| validate_action!(action) }
69
+ end
70
+
71
+ def normalize_action(actions)
72
+ case actions.size
73
+ when 0
74
+ nil
75
+ when 1
76
+ action = actions.first
77
+ validate_action!(action)
78
+ action
79
+ else
80
+ # :nocov:
81
+ raise ArgumentError, "Can either pass an action or not but can't pass multiple"
82
+ # :nocov:
83
+ end
84
+ end
85
+
86
+ def normalize_actions(actions, validate = true)
87
+ first = actions.first
88
+
89
+ if first.is_a?(Array)
90
+ if actions.size == 1
91
+ normalize_actions(first, validate)
92
+ else
93
+ # :nocov:
94
+ raise ArgumentError, "Not expecting an array of arrays, expected an array of actions"
95
+ # :nocov:
96
+ end
97
+ elsif actions.empty?
98
+ [nil]
99
+ else
100
+ if validate
101
+ validate_actions!(actions)
102
+ end
103
+
104
+ actions
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,15 @@
1
+ module Foobara
2
+ module Callback
3
+ module Registry
4
+ class SingleAction < Base
5
+ def specific_callback_set_for
6
+ @specific_callback_set_for ||= Callback::Set.new
7
+ end
8
+
9
+ def unioned_callback_set_for
10
+ specific_callback_set_for
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,89 @@
1
+ module Foobara
2
+ module Callback
3
+ class Runner
4
+ class UnexpectedErrorWhileRunningCallback < StandardError
5
+ attr_accessor :callback_data
6
+
7
+ def initialize(callback_data, error)
8
+ super(error.message)
9
+
10
+ self.callback_data = callback_data
11
+ end
12
+ end
13
+
14
+ attr_accessor :callback_set, :error
15
+ attr_writer :callback_data
16
+
17
+ def initialize(callback_set)
18
+ self.callback_set = callback_set
19
+ end
20
+
21
+ def has_callback_data?
22
+ defined?(@callback_data)
23
+ end
24
+
25
+ def callback_data(*args, **opts)
26
+ return @callback_data if args.empty? && opts.empty?
27
+
28
+ self.callback_data = Util.args_and_opts_to_opts(args, opts)
29
+
30
+ self
31
+ end
32
+
33
+ def run(&do_it)
34
+ if block_given?
35
+ callback_set.each_before do |callback|
36
+ run_callback(callback)
37
+ end
38
+
39
+ around_callback = callback_set.around.inject(do_it) do |nested_proc, callback|
40
+ proc do
41
+ run_callback(callback, &nested_proc)
42
+ end
43
+ end
44
+
45
+ run_callback(around_callback)
46
+ else
47
+ # TODO: raise better errors
48
+ if callback_set.has_before_callbacks?
49
+ # :nocov:
50
+ raise
51
+ # :nocov:
52
+ end
53
+ if callback_set.has_around_callbacks?
54
+ # :nocov:
55
+ raise
56
+ # :nocov:
57
+ end
58
+ end
59
+
60
+ callback_set.each_after do |callback|
61
+ run_callback(callback)
62
+ end
63
+ rescue => real_error
64
+ begin
65
+ raise UnexpectedErrorWhileRunningCallback.new(callback_data, real_error)
66
+ # this non-sense is just to set the Error#cause properly
67
+ rescue UnexpectedErrorWhileRunningCallback => e
68
+ self.error = e
69
+
70
+ callback_set.each_error do |callback|
71
+ run_callback(callback)
72
+ end
73
+ end
74
+
75
+ raise
76
+ end
77
+
78
+ def run_callback(callback, &)
79
+ if error
80
+ callback.call(error)
81
+ elsif has_callback_data?
82
+ callback.call(callback_data, &)
83
+ else
84
+ callback.call(&)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end