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.
- checksums.yaml +7 -0
- data/.rspec +5 -0
- data/.rubocop.yml +20 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +10 -0
- data/DECISION_LOG.md +220 -0
- data/Guardfile +9 -0
- data/LICENSE-AGPL.txt +666 -0
- data/LICENSE.txt +4 -0
- data/README.md +50 -0
- data/Rakefile +10 -0
- data/concepts.md +153 -0
- data/projects/builtin_types/lib/foobara/builtin_types.rb +67 -0
- data/projects/builtin_types/src/README.md +140 -0
- data/projects/builtin_types/src/array/casters/arrayable.rb +22 -0
- data/projects/builtin_types/src/array/supported_processors/element_type_declaration.rb +41 -0
- data/projects/builtin_types/src/array/supported_validators/size.rb +43 -0
- data/projects/builtin_types/src/associative_array/casters/array.rb +22 -0
- data/projects/builtin_types/src/associative_array/supported_processors/key_type_declaration.rb +44 -0
- data/projects/builtin_types/src/associative_array/supported_processors/value_type_declaration.rb +44 -0
- data/projects/builtin_types/src/atomic_duck.rb +6 -0
- data/projects/builtin_types/src/attributes/casters/array.rb +33 -0
- data/projects/builtin_types/src/attributes/casters/hash.rb +28 -0
- data/projects/builtin_types/src/attributes/supported_processors/element_type_declarations.rb +89 -0
- 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
- data/projects/builtin_types/src/attributes/supported_transformers/defaults/type_declaration_extension/extend_attributes_type_declaration/desugarizers/symbolize_defaults.rb +31 -0
- 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
- 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
- data/projects/builtin_types/src/attributes/supported_transformers/defaults.rb +41 -0
- 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
- 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
- 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
- data/projects/builtin_types/src/attributes/supported_validators/required.rb +51 -0
- data/projects/builtin_types/src/big_decimal/casters/integer.rb +21 -0
- data/projects/builtin_types/src/big_decimal/casters/string.rb +24 -0
- data/projects/builtin_types/src/boolean/casters/numeric.rb +21 -0
- data/projects/builtin_types/src/boolean/casters/string_or_symbol.rb +27 -0
- data/projects/builtin_types/src/builtin_types.rb +189 -0
- data/projects/builtin_types/src/date/casters/hash.rb +23 -0
- data/projects/builtin_types/src/date/casters/string.rb +40 -0
- data/projects/builtin_types/src/datetime/casters/date.rb +21 -0
- data/projects/builtin_types/src/datetime/casters/hash.rb +77 -0
- data/projects/builtin_types/src/datetime/casters/seconds_since_epoch.rb +21 -0
- data/projects/builtin_types/src/datetime/casters/string.rb +31 -0
- data/projects/builtin_types/src/duck/supported_casters/allow_nil.rb +38 -0
- data/projects/builtin_types/src/duck/supported_validators/instance_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/class_desugarizer.rb +29 -0
- 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
- 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
- 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
- data/projects/builtin_types/src/duck/supported_validators/instance_of.rb +42 -0
- data/projects/builtin_types/src/duck/supported_validators/one_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/cast_one_of.rb +37 -0
- data/projects/builtin_types/src/duck/supported_validators/one_of/type_declaration_extension/extend_registered_type_declaration/desugarizers/module_desugarizer.rb +41 -0
- data/projects/builtin_types/src/duck/supported_validators/one_of.rb +41 -0
- data/projects/builtin_types/src/duck.rb +6 -0
- data/projects/builtin_types/src/duckture.rb +6 -0
- data/projects/builtin_types/src/email/transformers/downcase.rb +15 -0
- data/projects/builtin_types/src/email/validator_base.rb +94 -0
- data/projects/builtin_types/src/float/casters/integer.rb +21 -0
- data/projects/builtin_types/src/float/casters/string.rb +24 -0
- data/projects/builtin_types/src/integer/casters/string.rb +23 -0
- data/projects/builtin_types/src/number/supported_validators/max.rb +41 -0
- data/projects/builtin_types/src/number/supported_validators/min.rb +41 -0
- data/projects/builtin_types/src/string/casters/numeric.rb +21 -0
- data/projects/builtin_types/src/string/casters/symbol.rb +21 -0
- data/projects/builtin_types/src/string/supported_transformers/downcase.rb +11 -0
- data/projects/builtin_types/src/string/supported_validators/matches.rb +41 -0
- data/projects/builtin_types/src/string/supported_validators/max_length.rb +37 -0
- data/projects/builtin_types/src/symbol/casters/string.rb +21 -0
- data/projects/builtin_types/src/tuple/supported_processors/element_type_declarations/type_declaration_extension/extend_tuple_type_declaration/desugarizers/set_size.rb +32 -0
- 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
- data/projects/builtin_types/src/tuple/supported_processors/element_type_declarations.rb +59 -0
- data/projects/callback/lib/foobara/callback.rb +1 -0
- data/projects/callback/src/block/after.rb +10 -0
- data/projects/callback/src/block/around.rb +10 -0
- data/projects/callback/src/block/before.rb +10 -0
- data/projects/callback/src/block/concerns/block_parameter_not_allowed.rb +21 -0
- data/projects/callback/src/block/concerns/block_parameter_required.rb +21 -0
- data/projects/callback/src/block/concerns/keyword_argumentable_block.rb +31 -0
- data/projects/callback/src/block/concerns/single_argument_block.rb +22 -0
- data/projects/callback/src/block/concerns/type.rb +17 -0
- data/projects/callback/src/block/error.rb +10 -0
- data/projects/callback/src/block.rb +83 -0
- data/projects/callback/src/registry/base.rb +90 -0
- data/projects/callback/src/registry/chained_conditioned.rb +24 -0
- data/projects/callback/src/registry/chained_multiple_action.rb +24 -0
- data/projects/callback/src/registry/conditioned.rb +101 -0
- data/projects/callback/src/registry/multiple_action.rb +110 -0
- data/projects/callback/src/registry/single_action.rb +15 -0
- data/projects/callback/src/runner.rb +89 -0
- data/projects/callback/src/set.rb +56 -0
- data/projects/command/lib/foobara/command.rb +9 -0
- data/projects/command/src/command/entity_helpers.rb +145 -0
- data/projects/command/src/command.rb +36 -0
- data/projects/command/src/concerns/callbacks.rb +93 -0
- data/projects/command/src/concerns/description.rb +23 -0
- data/projects/command/src/concerns/domain_mappers.rb +35 -0
- data/projects/command/src/concerns/entities.rb +88 -0
- data/projects/command/src/concerns/errors.rb +181 -0
- data/projects/command/src/concerns/errors_type.rb +124 -0
- data/projects/command/src/concerns/inputs.rb +59 -0
- data/projects/command/src/concerns/inputs_type.rb +58 -0
- data/projects/command/src/concerns/namespace.rb +49 -0
- data/projects/command/src/concerns/reflection.rb +137 -0
- data/projects/command/src/concerns/result.rb +25 -0
- data/projects/command/src/concerns/result_type.rb +29 -0
- data/projects/command/src/concerns/runtime.rb +119 -0
- data/projects/command/src/concerns/state_machine.rb +12 -0
- data/projects/command/src/concerns/subcommands.rb +102 -0
- data/projects/command/src/concerns/transactions.rb +81 -0
- data/projects/command/src/state_machine.rb +57 -0
- data/projects/command/src/transformed_command.rb +459 -0
- data/projects/command_connectors/lib/foobara/command_connectors.rb +12 -0
- data/projects/command_connectors/src/command_connector.rb +401 -0
- data/projects/command_connectors/src/command_registry/allowed_rule.rb +29 -0
- data/projects/command_connectors/src/command_registry/exposed_command.rb +140 -0
- data/projects/command_connectors/src/command_registry/exposed_domain.rb +30 -0
- data/projects/command_connectors/src/command_registry/exposed_organization.rb +30 -0
- data/projects/command_connectors/src/command_registry.rb +257 -0
- data/projects/command_connectors/src/commands/describe.rb +36 -0
- data/projects/command_connectors/src/commands/list_commands.rb +51 -0
- data/projects/command_connectors/src/commands/ping.rb +21 -0
- data/projects/command_connectors/src/commands/query_git_commit_info.rb +81 -0
- data/projects/command_connectors/src/request.rb +99 -0
- data/projects/command_connectors/src/response.rb +17 -0
- data/projects/command_connectors/src/serializer.rb +25 -0
- data/projects/command_connectors/src/serializers/aggregate_serializer.rb +32 -0
- data/projects/command_connectors/src/serializers/atomic_serializer.rb +25 -0
- data/projects/command_connectors/src/serializers/entities_to_primary_keys_serializer.rb +28 -0
- data/projects/command_connectors/src/serializers/errors_serializer.rb +18 -0
- data/projects/command_connectors/src/serializers/json_serializer.rb +20 -0
- data/projects/command_connectors/src/serializers/noop_serializer.rb +20 -0
- data/projects/command_connectors/src/serializers/record_store_serializer.rb +31 -0
- data/projects/command_connectors/src/serializers/success_serializer.rb +14 -0
- data/projects/command_connectors/src/serializers/yaml_serializer.rb +20 -0
- data/projects/command_connectors/src/transformers/auth_errors_transformer.rb +35 -0
- data/projects/command_connectors/src/transformers/load_aggregates_pre_commit_transformer.rb +36 -0
- data/projects/command_connectors_http/lib/foobara/command_connectors_http.rb +6 -0
- data/projects/command_connectors_http/src/http/commands/get_options.rb +16 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/command.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/domain.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/entity.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/error.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/model.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/organization.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/processor.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/processor_class.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/root.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter/type.rb +14 -0
- data/projects/command_connectors_http/src/http/commands/help/presenter.rb +162 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/command.html.erb +11 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/domain.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/entity.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/error.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/model.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/organization.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/processor.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/processor_class.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/root.html.erb +3 -0
- data/projects/command_connectors_http/src/http/commands/help/templates/type.html.erb +1 -0
- data/projects/command_connectors_http/src/http/commands/help.rb +98 -0
- data/projects/command_connectors_http/src/http/request.rb +98 -0
- data/projects/command_connectors_http/src/http/response.rb +14 -0
- data/projects/command_connectors_http/src/http.rb +84 -0
- data/projects/common/lib/foobara/common.rb +11 -0
- data/projects/common/src/data_path.rb +272 -0
- data/projects/common/src/error.rb +215 -0
- data/projects/common/src/error_collection.rb +97 -0
- data/projects/common/src/error_key.rb +168 -0
- data/projects/common/src/outcome.rb +101 -0
- data/projects/common/src/possible_error.rb +80 -0
- data/projects/common/src/runtime_error.rb +24 -0
- data/projects/concerns/lib/foobara/concerns.rb +1 -0
- data/projects/concerns/src/concern.rb +93 -0
- data/projects/delegate/lib/foobara/delegate.rb +1 -0
- data/projects/delegate/src/extensions/module.rb +12 -0
- data/projects/domain/lib/foobara/domain.rb +25 -0
- data/projects/domain/src/domain.rb +65 -0
- data/projects/domain/src/domain_mapper/registry.rb +47 -0
- data/projects/domain/src/domain_mapper.rb +162 -0
- data/projects/domain/src/domain_module_extension.rb +510 -0
- data/projects/domain/src/extensions/foobara.rb +69 -0
- data/projects/domain/src/global_domain.rb +14 -0
- data/projects/domain/src/global_organization.rb +12 -0
- data/projects/domain/src/is_manifestable.rb +68 -0
- data/projects/domain/src/manifestable.rb +12 -0
- data/projects/domain/src/module_extension.rb +122 -0
- data/projects/domain/src/organization.rb +52 -0
- data/projects/domain/src/organization_module_extension.rb +50 -0
- data/projects/entity/lib/foobara/entity.rb +27 -0
- data/projects/entity/src/concerns/associations.rb +241 -0
- data/projects/entity/src/concerns/attributes.rb +170 -0
- data/projects/entity/src/concerns/callbacks.rb +97 -0
- data/projects/entity/src/concerns/initialization.rb +127 -0
- data/projects/entity/src/concerns/persistence.rb +142 -0
- data/projects/entity/src/concerns/primary_key.rb +43 -0
- data/projects/entity/src/concerns/queries.rb +96 -0
- data/projects/entity/src/concerns/reflection.rb +51 -0
- data/projects/entity/src/concerns/transactions.rb +31 -0
- data/projects/entity/src/concerns/types.rb +31 -0
- data/projects/entity/src/entity.rb +61 -0
- data/projects/entity/src/extensions/builtin_types/entity/casters/hash.rb +33 -0
- data/projects/entity/src/extensions/builtin_types/entity/validators/attributes_declaration.rb +32 -0
- data/projects/entity/src/extensions/builtin_types/entity.rb +6 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/attributes_handler_desugarizer.rb +14 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/hash_desugarizer.rb +43 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/model_class_desugarizer.rb +21 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/primary_key_desugarizer.rb +19 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/to_type_transformer.rb +64 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_is_symbol.rb +35 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_present.rb +27 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration/validate_primary_key_references_attribute.rb +36 -0
- data/projects/entity/src/extensions/type_declarations/handlers/extend_entity_type_declaration.rb +11 -0
- data/projects/entity/src/new_prepend.rb +21 -0
- data/projects/entity/src/not_found_error.rb +72 -0
- data/projects/enumerated/lib/foobara/enumerated.rb +1 -0
- data/projects/enumerated/src/accessors.rb +61 -0
- data/projects/enumerated/src/values.rb +121 -0
- data/projects/foobara/lib/foobara/all.rb +44 -0
- data/projects/in_memory_crud_driver/lib/foobara/in_memory_crud_driver.rb +3 -0
- data/projects/in_memory_crud_driver/src/in_memory.rb +10 -0
- data/projects/in_memory_crud_driver_minimal/lib/foobara/in_memory_crud_driver_minimal.rb +1 -0
- data/projects/in_memory_crud_driver_minimal/src/in_memory_minimal.rb +113 -0
- data/projects/manifest/lib/foobara/manifest.rb +4 -0
- data/projects/manifest/src/foobara/manifest/array.rb +13 -0
- data/projects/manifest/src/foobara/manifest/attributes.rb +40 -0
- data/projects/manifest/src/foobara/manifest/base_manifest.rb +161 -0
- data/projects/manifest/src/foobara/manifest/command.rb +59 -0
- data/projects/manifest/src/foobara/manifest/domain.rb +43 -0
- data/projects/manifest/src/foobara/manifest/entity.rb +35 -0
- data/projects/manifest/src/foobara/manifest/error.rb +33 -0
- data/projects/manifest/src/foobara/manifest/model.rb +43 -0
- data/projects/manifest/src/foobara/manifest/organization.rb +45 -0
- data/projects/manifest/src/foobara/manifest/possible_error.rb +30 -0
- data/projects/manifest/src/foobara/manifest/processor.rb +11 -0
- data/projects/manifest/src/foobara/manifest/processor_class.rb +11 -0
- data/projects/manifest/src/foobara/manifest/root_manifest.rb +112 -0
- data/projects/manifest/src/foobara/manifest/type.rb +86 -0
- data/projects/manifest/src/foobara/manifest/type_declaration.rb +117 -0
- data/projects/model/lib/foobara/model.rb +23 -0
- data/projects/model/src/concerns/reflection.rb +22 -0
- data/projects/model/src/concerns/types.rb +104 -0
- data/projects/model/src/extensions/builtin_types/model/casters/hash.rb +23 -0
- data/projects/model/src/extensions/builtin_types/model/transformers/mutable.rb +26 -0
- data/projects/model/src/extensions/builtin_types/model/validators/attributes_declaration.rb +33 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/attributes_handler_desugarizer.rb +24 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/hash_desugarizer.rb +32 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/model_class_desugarizer.rb +119 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration/to_type_transformer.rb +57 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_model_type_declaration.rb +21 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/hash_desugarizer.rb +37 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/model_class_type_desugarizer.rb +25 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/mutable_validator.rb +46 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/normalize_mutable_attributes_desugarizer.rb +28 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration/to_type_transformer.rb +27 -0
- data/projects/model/src/extensions/type_declarations/handlers/extend_registered_model_type_declaration.rb +31 -0
- data/projects/model/src/extensions/type_declarations/handlers/registered_type_declaration/model_class_desugarizer.rb +23 -0
- data/projects/model/src/model.rb +320 -0
- data/projects/monorepo/lib/foobara/monorepo/project.rb +52 -0
- data/projects/monorepo/lib/foobara/monorepo.rb +63 -0
- data/projects/namespace/lib/foobara/namespace.rb +4 -0
- data/projects/namespace/src/ambiguous_registry.rb +104 -0
- data/projects/namespace/src/base_registry.rb +66 -0
- data/projects/namespace/src/extensions/module.rb +5 -0
- data/projects/namespace/src/is_namespace.rb +352 -0
- data/projects/namespace/src/namespace/lookup_mode.rb +41 -0
- data/projects/namespace/src/namespace.rb +61 -0
- data/projects/namespace/src/namespace_helpers.rb +273 -0
- data/projects/namespace/src/prefixless_registry.rb +54 -0
- data/projects/namespace/src/scoped.rb +113 -0
- data/projects/namespace/src/unambiguous_registry.rb +65 -0
- data/projects/persistence/lib/foobara/persistence.rb +22 -0
- data/projects/persistence/src/entity_attributes_crud_driver.rb +241 -0
- data/projects/persistence/src/entity_base/table.rb +14 -0
- data/projects/persistence/src/entity_base/transaction/concerns/entity_callback_handling.rb +157 -0
- data/projects/persistence/src/entity_base/transaction/concerns/state_transitions.rb +83 -0
- data/projects/persistence/src/entity_base/transaction/concerns/transaction_tracking.rb +53 -0
- data/projects/persistence/src/entity_base/transaction/state_machine.rb +27 -0
- data/projects/persistence/src/entity_base/transaction.rb +163 -0
- data/projects/persistence/src/entity_base/transaction_table/concerns/queries.rb +42 -0
- data/projects/persistence/src/entity_base/transaction_table/concerns/record_tracking.rb +134 -0
- data/projects/persistence/src/entity_base/transaction_table.rb +620 -0
- data/projects/persistence/src/entity_base.rb +114 -0
- data/projects/persistence/src/persistence.rb +172 -0
- data/projects/state_machine/lib/foobara/state_machine.rb +1 -0
- data/projects/state_machine/src/callbacks.rb +158 -0
- data/projects/state_machine/src/log_entry.rb +13 -0
- data/projects/state_machine/src/state_machine.rb +91 -0
- data/projects/state_machine/src/sugar.rb +125 -0
- data/projects/state_machine/src/transition_log.rb +19 -0
- data/projects/state_machine/src/validations.rb +69 -0
- data/projects/thread_parent/lib/foobara/thread_parent.rb +1 -0
- data/projects/thread_parent/src/thread_parent.rb +38 -0
- data/projects/type_declarations/lib/foobara/type_declarations.rb +131 -0
- data/projects/type_declarations/src/attributes.rb +34 -0
- data/projects/type_declarations/src/caster.rb +7 -0
- data/projects/type_declarations/src/desugarizer.rb +25 -0
- data/projects/type_declarations/src/dsl/attributes.rb +199 -0
- data/projects/type_declarations/src/element_processor.rb +7 -0
- data/projects/type_declarations/src/error_extension.rb +73 -0
- data/projects/type_declarations/src/handlers/extend_array_type_declaration/array_desugarizer.rb +31 -0
- data/projects/type_declarations/src/handlers/extend_array_type_declaration/element_type_declaration_desugarizer.rb +37 -0
- data/projects/type_declarations/src/handlers/extend_array_type_declaration/to_type_transformer.rb +22 -0
- data/projects/type_declarations/src/handlers/extend_array_type_declaration/type_set_to_array_desugarizer.rb +36 -0
- data/projects/type_declarations/src/handlers/extend_array_type_declaration.rb +14 -0
- data/projects/type_declarations/src/handlers/extend_associative_array_type_declaration/to_type_transformer.rb +28 -0
- data/projects/type_declarations/src/handlers/extend_associative_array_type_declaration.rb +20 -0
- data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/dsl_desugarizer.rb +25 -0
- data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/element_type_declarations_desugarizer.rb +34 -0
- data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/hash_desugarizer.rb +60 -0
- data/projects/type_declarations/src/handlers/extend_attributes_type_declaration/to_type_transformer.rb +21 -0
- data/projects/type_declarations/src/handlers/extend_attributes_type_declaration.rb +16 -0
- data/projects/type_declarations/src/handlers/extend_registered_type_declaration/to_type_transformer.rb +75 -0
- data/projects/type_declarations/src/handlers/extend_registered_type_declaration.rb +23 -0
- data/projects/type_declarations/src/handlers/extend_tuple_type_declaration/array_desugarizer.rb +30 -0
- data/projects/type_declarations/src/handlers/extend_tuple_type_declaration/to_type_transformer.rb +24 -0
- data/projects/type_declarations/src/handlers/extend_tuple_type_declaration.rb +13 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/desugarizer_metadata_cleanup_desugarizer.rb +29 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/short_type_name_desugarizer.rb +65 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/strict_desugarizer.rb +32 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/strict_stringified_desugarizer.rb +39 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/symbol_desugarizer.rb +26 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/to_type_transformer.rb +28 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration/type_desugarizer.rb +24 -0
- data/projects/type_declarations/src/handlers/registered_type_declaration.rb +26 -0
- data/projects/type_declarations/src/processor.rb +7 -0
- data/projects/type_declarations/src/to_type_transformer.rb +11 -0
- data/projects/type_declarations/src/transformer.rb +7 -0
- data/projects/type_declarations/src/type_builder.rb +112 -0
- data/projects/type_declarations/src/type_declaration_error.rb +9 -0
- data/projects/type_declarations/src/type_declaration_handler.rb +120 -0
- data/projects/type_declarations/src/type_declaration_handler_registry.rb +27 -0
- data/projects/type_declarations/src/type_declaration_validator.rb +19 -0
- data/projects/type_declarations/src/type_declarations.rb +128 -0
- data/projects/type_declarations/src/typed_transformer.rb +89 -0
- data/projects/type_declarations/src/validator.rb +7 -0
- data/projects/type_declarations/src/with_registries.rb +41 -0
- data/projects/types/lib/foobara/types.rb +11 -0
- data/projects/types/src/element_processor.rb +7 -0
- data/projects/types/src/extensions/error.rb +32 -0
- data/projects/types/src/type/concerns/reflection.rb +79 -0
- data/projects/types/src/type/concerns/supported_processor_registration.rb +56 -0
- data/projects/types/src/type.rb +375 -0
- data/projects/types/src/types.rb +4 -0
- data/projects/value/lib/foobara/value.rb +7 -0
- data/projects/value/src/caster.rb +84 -0
- data/projects/value/src/data_error.rb +27 -0
- data/projects/value/src/processor/casting.rb +123 -0
- data/projects/value/src/processor/multi.rb +63 -0
- data/projects/value/src/processor/pipeline.rb +27 -0
- data/projects/value/src/processor/runner.rb +38 -0
- data/projects/value/src/processor/selection.rb +90 -0
- data/projects/value/src/processor.rb +358 -0
- data/projects/value/src/transformer.rb +84 -0
- data/projects/value/src/validator.rb +53 -0
- data/projects/version/lib/foobara/version.rb +4 -0
- data/projects/version/src/version.rb +5 -0
- data/projects/weak_object_set/lib/foobara/weak_object_set.rb +3 -0
- data/projects/weak_object_set/src/weak_object_set.rb +163 -0
- metadata +445 -0
|
@@ -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,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
|