gitextract_igikmbi3/ ├── .ameba.yml ├── .changes/ │ ├── clock/ │ │ ├── v0.2.0.md │ │ └── v0.3.0.md │ ├── console/ │ │ ├── v0.4.1.md │ │ ├── v0.4.2.md │ │ └── v0.4.3.md │ ├── contracts/ │ │ └── v0.1.0.md │ ├── dependency-injection/ │ │ ├── v0.4.3.md │ │ ├── v0.4.4.md │ │ └── v0.4.5.md │ ├── dotenv/ │ │ ├── v0.2.0.md │ │ └── v0.2.1.md │ ├── event-dispatcher/ │ │ ├── v0.3.1.md │ │ ├── v0.4.0.md │ │ └── v0.4.1.md │ ├── framework/ │ │ ├── v0.20.1.md │ │ ├── v0.21.0.md │ │ ├── v0.21.1.md │ │ └── v0.22.0.md │ ├── header.tpl.md │ ├── http/ │ │ └── v0.1.0.md │ ├── http-kernel/ │ │ └── v0.1.0.md │ ├── image-size/ │ │ └── v0.1.4.md │ ├── mercure/ │ │ └── v0.1.0.md │ ├── mercure-bundle/ │ │ └── v0.1.0.md │ ├── mime/ │ │ ├── v0.2.0.md │ │ └── v0.2.1.md │ ├── negotiation/ │ │ └── v0.2.0.md │ ├── routing/ │ │ ├── v0.1.10.md │ │ ├── v0.1.11.md │ │ ├── v0.1.12.md │ │ └── v0.2.0.md │ ├── serializer/ │ │ ├── v0.4.1.md │ │ ├── v0.4.2.md │ │ └── v0.4.3.md │ ├── spec/ │ │ ├── v0.3.11.md │ │ ├── v0.4.0.md │ │ ├── v0.4.1.md │ │ └── v0.4.2.md │ ├── unreleased/ │ │ ├── .gitkeep │ │ └── event-dispatcher-Changed-20260502-225424.yaml │ └── validator/ │ ├── v0.4.0.md │ ├── v0.4.1.md │ └── v0.5.0.md ├── .changie.yaml ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── dependabot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── build_and_publish_docs.yml │ ├── ci.yml │ ├── sync.yml │ └── tag_and_create_release.yml ├── .gitignore ├── .python-version ├── .typos.toml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── UPGRADING.md ├── codecov.yml ├── docs/ │ ├── README.md │ ├── api_reference.md │ ├── bundle_reference.md │ ├── css/ │ │ ├── index.css │ │ └── monorepo.css │ ├── getting_started/ │ │ ├── README.md │ │ ├── commands.md │ │ ├── configuration.md │ │ ├── error_handling.md │ │ ├── middleware.md │ │ ├── routing.md │ │ ├── testing.md │ │ └── validation.md │ ├── guides/ │ │ ├── README.md │ │ └── proxies.md │ ├── index.cr │ ├── templates/ │ │ └── crystal/ │ │ └── material/ │ │ ├── schema.html │ │ └── type.html │ └── why_athena.md ├── gen_doc_stubs.py ├── justfile ├── mkdocs-common.yml ├── mkdocs.yml ├── pyproject.toml ├── scripts/ │ └── test.sh ├── shard.dev.yml ├── shard.prod.yml ├── shard.yml └── src/ ├── bundles/ │ └── mercure/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── shard.yml │ ├── spec/ │ │ ├── authorization_spec.cr │ │ ├── bundle_spec.cr │ │ ├── discovery_spec.cr │ │ ├── listeners/ │ │ │ ├── add_link_header_spec.cr │ │ │ └── set_cookie_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── athena-mercure_bundle.cr │ ├── authorization.cr │ ├── discovery.cr │ └── listeners/ │ ├── add_link_header.cr │ └── set_cookie.cr └── components/ ├── clock/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── athena-clock_spec.cr │ │ ├── aware_spec.cr │ │ ├── mock_clock_spec.cr │ │ ├── native_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── athena-clock.cr │ ├── aware.cr │ ├── interface.cr │ ├── native.cr │ └── spec.cr ├── console/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── application_spec.cr │ │ ├── application_tester_spec.cr │ │ ├── command_spec.cr │ │ ├── command_tester_spec.cr │ │ ├── commands/ │ │ │ ├── complete_spec.cr │ │ │ ├── dump_completion_spec.cr │ │ │ ├── help_spec.cr │ │ │ ├── lazy_spec.cr │ │ │ └── list_spec.cr │ │ ├── compiler_spec.cr │ │ ├── completion/ │ │ │ ├── input_spec.cr │ │ │ └── output/ │ │ │ ├── bash_spec.cr │ │ │ ├── completion_output_test_case.cr │ │ │ ├── fish_spec.cr │ │ │ └── zsh_spec.cr │ │ ├── cursor_spec.cr │ │ ├── descriptor/ │ │ │ ├── abstract_descriptor_test_case.cr │ │ │ ├── application_spec.cr │ │ │ ├── object_provider.cr │ │ │ └── text_spec.cr │ │ ├── fixtures/ │ │ │ ├── applications/ │ │ │ │ ├── descriptor1.cr │ │ │ │ └── descriptor2.cr │ │ │ ├── commands/ │ │ │ │ ├── annotation_configured.cr │ │ │ │ ├── annotation_configured_aliases.cr │ │ │ │ ├── annotation_configured_hidden.cr │ │ │ │ ├── annotation_configured_hidden_field.cr │ │ │ │ ├── bar_buc.cr │ │ │ │ ├── descriptor1.cr │ │ │ │ ├── descriptor2.cr │ │ │ │ ├── descriptor3.cr │ │ │ │ ├── descriptor4.cr │ │ │ │ ├── foo.cr │ │ │ │ ├── foo1.cr │ │ │ │ ├── foo2.cr │ │ │ │ ├── foo3.cr │ │ │ │ ├── foo4.cr │ │ │ │ ├── foo6.cr │ │ │ │ ├── foo_bar.cr │ │ │ │ ├── foo_hidden.cr │ │ │ │ ├── foo_opt.cr │ │ │ │ ├── foo_same_case_lowercase.cr │ │ │ │ ├── foo_same_case_uppercase.cr │ │ │ │ ├── foo_subnamespaced1.cr │ │ │ │ ├── foo_subnamespaced2.cr │ │ │ │ ├── foo_without_alias.cr │ │ │ │ ├── io.cr │ │ │ │ ├── test.cr │ │ │ │ ├── test_ambiguous_command_registering1.cr │ │ │ │ └── test_ambiguous_command_registering2.cr │ │ │ ├── helper/ │ │ │ │ └── table/ │ │ │ │ ├── borderless.txt │ │ │ │ ├── borderless_vertical.txt │ │ │ │ ├── box.txt │ │ │ │ ├── compact.txt │ │ │ │ ├── compact_vertical.txt │ │ │ │ ├── default.txt │ │ │ │ ├── default_cells_with_colspan.txt │ │ │ │ ├── default_cells_with_formatting_tags.txt │ │ │ │ ├── default_cells_with_non_formatting_tags.txt │ │ │ │ ├── default_cells_with_rowspan.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_and_alignment.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_and_custom_format.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_and_fgbg.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_and_line_breaks.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_no_separators.txt │ │ │ │ ├── default_cells_with_rowspan_and_colspan_separator_in_rowspan.txt │ │ │ │ ├── default_colspan_and_table_cell_with_comment_style.txt │ │ │ │ ├── default_formatted_row_with_line_breaks.txt │ │ │ │ ├── default_headerless.txt │ │ │ │ ├── default_line_break_after_colspan_cell.txt │ │ │ │ ├── default_line_breaks_after_colspan_cell.txt │ │ │ │ ├── default_missing_cell_values.txt │ │ │ │ ├── default_multiline_cells.txt │ │ │ │ ├── default_multiple_header_lines.txt │ │ │ │ ├── default_no_rows.txt │ │ │ │ ├── default_row_with_multiple_cells.txt │ │ │ │ ├── double_box_separator.txt │ │ │ │ ├── markdown.txt │ │ │ │ └── suggested_vertical.txt │ │ │ ├── style/ │ │ │ │ ├── backslashes.txt │ │ │ │ ├── block.txt │ │ │ │ ├── block_line_endings.txt │ │ │ │ ├── block_no_prefix_type.txt │ │ │ │ ├── block_padding.txt │ │ │ │ ├── block_prefix_no_type.txt │ │ │ │ ├── blocks.txt │ │ │ │ ├── closing_tag.txt │ │ │ │ ├── definition_list.txt │ │ │ │ ├── emojis.txt │ │ │ │ ├── empty_buffer.txt │ │ │ │ ├── horizontal_table.txt │ │ │ │ ├── long_line_block.txt │ │ │ │ ├── long_line_block_wrapping.txt │ │ │ │ ├── long_line_comment.txt │ │ │ │ ├── long_line_comment_decorated.txt │ │ │ │ ├── multi_line_block.txt │ │ │ │ ├── nested_tag_prefix.txt │ │ │ │ ├── non_interactive_question.txt │ │ │ │ ├── table.txt │ │ │ │ ├── table_horizontal.txt │ │ │ │ ├── table_vertical.txt │ │ │ │ ├── text_block_blank_line.txt │ │ │ │ ├── title_block.txt │ │ │ │ ├── titles.txt │ │ │ │ └── titles_text.txt │ │ │ └── text/ │ │ │ ├── application_1.txt │ │ │ ├── application_2.txt │ │ │ ├── application_alternative_namespace.txt │ │ │ ├── application_filtered_namespace.txt │ │ │ ├── application_renderexception1.txt │ │ │ ├── application_renderexception2.txt │ │ │ ├── application_renderexception3.txt │ │ │ ├── application_renderexception3_decorated.txt │ │ │ ├── application_renderexception4.txt │ │ │ ├── application_renderexception_doublewidth1.txt │ │ │ ├── application_renderexception_escapeslines.txt │ │ │ ├── application_renderexception_linebreaks.txt │ │ │ ├── application_renderexception_synopsis_escapeslines.txt │ │ │ ├── application_run1.txt │ │ │ ├── application_run2.txt │ │ │ ├── application_run3.txt │ │ │ ├── application_run4.txt │ │ │ ├── application_run5.txt │ │ │ ├── command_1.txt │ │ │ ├── command_2.txt │ │ │ ├── input_argument_1.txt │ │ │ ├── input_argument_2.txt │ │ │ ├── input_argument_3.txt │ │ │ ├── input_argument_4.txt │ │ │ ├── input_argument_with_style.txt │ │ │ ├── input_definition_1.txt │ │ │ ├── input_definition_2.txt │ │ │ ├── input_definition_3.txt │ │ │ ├── input_definition_4.txt │ │ │ ├── input_option_1.txt │ │ │ ├── input_option_2.txt │ │ │ ├── input_option_3.txt │ │ │ ├── input_option_4.txt │ │ │ ├── input_option_5.txt │ │ │ ├── input_option_6.txt │ │ │ ├── input_option_with_style.txt │ │ │ └── input_option_with_style_array.txt │ │ ├── formatter/ │ │ │ ├── null_spec.cr │ │ │ ├── null_style_spec.cr │ │ │ ├── output_formatter_spec.cr │ │ │ ├── output_formatter_style_spec.cr │ │ │ └── output_formatter_style_stack_spec.cr │ │ ├── helper/ │ │ │ ├── abstract_question_helper_test_case.cr │ │ │ ├── athena_question_spec.cr │ │ │ ├── formatter_spec.cr │ │ │ ├── helper_set_spec.cr │ │ │ ├── helper_spec.cr │ │ │ ├── output_wrapper_spec.cr │ │ │ ├── progress_bar_spec.cr │ │ │ ├── progress_indicator_spec.cr │ │ │ ├── question_spec.cr │ │ │ ├── table_spec.cr │ │ │ └── table_style_spec.cr │ │ ├── input/ │ │ │ ├── argument_spec.cr │ │ │ ├── argv_spec.cr │ │ │ ├── definition_spec.cr │ │ │ ├── hash_spec.cr │ │ │ ├── input_spec.cr │ │ │ ├── option_spec.cr │ │ │ ├── string_line_spec.cr │ │ │ └── value/ │ │ │ ├── array_spec.cr │ │ │ ├── bool_spec.cr │ │ │ ├── nil_spec.cr │ │ │ ├── number_spec.cr │ │ │ └── string_spec.cr │ │ ├── output/ │ │ │ ├── console_section_output_spec.cr │ │ │ ├── io_spec.cr │ │ │ ├── null_spec.cr │ │ │ └── output_spec.cr │ │ ├── question/ │ │ │ ├── choice_spec.cr │ │ │ ├── confirmation_spec.cr │ │ │ ├── multiple_choice_spec.cr │ │ │ └── question_spec.cr │ │ ├── spec_helper.cr │ │ ├── style/ │ │ │ └── athena_style_spec.cr │ │ └── terminal_spec.cr │ └── src/ │ ├── annotations.cr │ ├── application.cr │ ├── athena-console.cr │ ├── command.cr │ ├── commands/ │ │ ├── complete.cr │ │ ├── dump_completion.cr │ │ ├── generic.cr │ │ ├── help.cr │ │ ├── lazy.cr │ │ └── list.cr │ ├── completion/ │ │ ├── input.cr │ │ ├── output/ │ │ │ ├── bash.cr │ │ │ ├── completion.bash │ │ │ ├── completion.fish │ │ │ ├── completion.zsh │ │ │ ├── fish.cr │ │ │ ├── interface.cr │ │ │ └── zsh.cr │ │ └── suggestions.cr │ ├── cursor.cr │ ├── descriptor/ │ │ ├── application.cr │ │ ├── context.cr │ │ ├── descriptor.cr │ │ ├── interface.cr │ │ └── text.cr │ ├── exception/ │ │ ├── command_not_found.cr │ │ ├── invalid_argument.cr │ │ ├── invalid_option.cr │ │ ├── logic.cr │ │ ├── missing_input.cr │ │ ├── namespace_not_found.cr │ │ └── runtime.cr │ ├── ext/ │ │ └── terminal.cr │ ├── formatter/ │ │ ├── interface.cr │ │ ├── null.cr │ │ ├── null_style.cr │ │ ├── output.cr │ │ ├── output_formatter_style_stack.cr │ │ ├── output_style.cr │ │ ├── output_style_interface.cr │ │ └── wrappable_interface.cr │ ├── helper/ │ │ ├── athena_question.cr │ │ ├── descriptor_helper.cr │ │ ├── formatter.cr │ │ ├── helper.cr │ │ ├── helper_set.cr │ │ ├── interface.cr │ │ ├── output_wrapper.cr │ │ ├── progress_bar.cr │ │ ├── progress_indicator.cr │ │ ├── question.cr │ │ ├── table.cr │ │ ├── table_cell_style.cr │ │ └── table_style.cr │ ├── input/ │ │ ├── argument.cr │ │ ├── argv.cr │ │ ├── definition.cr │ │ ├── hash.cr │ │ ├── input.cr │ │ ├── interface.cr │ │ ├── option.cr │ │ ├── streamable.cr │ │ ├── string_line.cr │ │ └── value/ │ │ ├── array.cr │ │ ├── bool.cr │ │ ├── nil.cr │ │ ├── number.cr │ │ ├── string.cr │ │ └── value.cr │ ├── loader/ │ │ ├── factory.cr │ │ └── interface.cr │ ├── output/ │ │ ├── console_output.cr │ │ ├── console_output_interface.cr │ │ ├── interface.cr │ │ ├── io.cr │ │ ├── null.cr │ │ ├── output.cr │ │ ├── section.cr │ │ ├── sized_buffer.cr │ │ ├── type.cr │ │ └── verbosity.cr │ ├── question/ │ │ ├── abstract_choice.cr │ │ ├── base.cr │ │ ├── choice.cr │ │ ├── confirmation.cr │ │ ├── multiple_choice.cr │ │ └── question.cr │ ├── spec/ │ │ └── expectations/ │ │ └── command_is_successful.cr │ ├── spec.cr │ ├── style/ │ │ ├── athena.cr │ │ ├── interface.cr │ │ └── output.cr │ └── terminal.cr ├── contracts/ │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ └── .gitkeep │ └── src/ │ ├── alias.cr │ ├── athena-contracts.cr │ ├── contracts/ │ │ └── event_dispatcher/ │ │ ├── event.cr │ │ ├── interface.cr │ │ └── stoppable_event.cr │ └── event_dispatcher.cr ├── dependency_injection/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── abstract_bundle_spec.cr │ │ ├── athena-dependency_injection_spec.cr │ │ ├── compiler_passes/ │ │ │ ├── auto_wire_spec.cr │ │ │ ├── define_getters_spec.cr │ │ │ ├── inline_service_definitions_spec.cr │ │ │ ├── merge_configs_spec.cr │ │ │ ├── merge_extension_config_spec.cr │ │ │ ├── namespaced_spec.cr │ │ │ ├── normalize_definitions_spec.cr │ │ │ ├── optional_services_spec.cr │ │ │ ├── parameters_spec.cr │ │ │ ├── process_aliases_spec.cr │ │ │ ├── process_auto_configurations_spec.cr │ │ │ ├── process_bindings_spec.cr │ │ │ ├── process_parameters_spec.cr │ │ │ ├── proxy_spec.cr │ │ │ ├── register_services_spec.cr │ │ │ ├── remove_unused_services_spec.cr │ │ │ ├── resolve_parameter_placeholders_spec.cr │ │ │ ├── resolve_values_spec.cr │ │ │ ├── untyped_with_default_spec.cr │ │ │ ├── validate_arguments_spec.cr │ │ │ └── validate_generics_spec.cr │ │ ├── extension_spec.cr │ │ ├── spec_helper.cr │ │ └── spec_spec.cr │ └── src/ │ ├── abstract_bundle.cr │ ├── annotation_configurations.cr │ ├── annotations.cr │ ├── athena-dependency_injection.cr │ ├── compiler_passes/ │ │ ├── analyze_service_references.cr │ │ ├── auto_wire.cr │ │ ├── define_getters.cr │ │ ├── inline_service_definitions.cr │ │ ├── merge_configs.cr │ │ ├── merge_extension_config.cr │ │ ├── normalize_definitions.cr │ │ ├── process_aliases.cr │ │ ├── process_annotation_bindings.cr │ │ ├── process_autoconfigure_annotations.cr │ │ ├── process_bindings.cr │ │ ├── process_parameters.cr │ │ ├── process_tags.cr │ │ ├── register_services.cr │ │ ├── remove_unused_services.cr │ │ ├── resolve_parameter_placeholders.cr │ │ ├── resolve_tagged_iterators.cr │ │ ├── resolve_values.cr │ │ ├── validate_arguments.cr │ │ └── validate_generics.cr │ ├── extension.cr │ ├── proxy.cr │ ├── service_container.cr │ └── spec.cr ├── dotenv/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── athena-dotenv_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── athena-dotenv.cr │ └── exception/ │ ├── format.cr │ ├── logic.cr │ └── path.cr ├── event_dispatcher/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── callable_spec.cr │ │ ├── compiler_spec.cr │ │ ├── event_dispatcher_spec.cr │ │ ├── generic_event_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── annotations.cr │ ├── athena-event_dispatcher.cr │ ├── callable.cr │ ├── event.cr │ ├── event_dispatcher.cr │ ├── event_dispatcher_interface.cr │ ├── generic_event.cr │ └── spec.cr ├── framework/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── .gitkeep │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── argument_resolver_controller_spec.cr │ │ ├── assets/ │ │ │ ├── file-big.txt │ │ │ ├── file-small.txt │ │ │ ├── foo.txt │ │ │ ├── greeting.ecr │ │ │ ├── layout.ecr │ │ │ └── openssl/ │ │ │ ├── openssl.crt │ │ │ └── openssl.key │ │ ├── athena_spec.cr │ │ ├── bundle_spec.cr │ │ ├── commands/ │ │ │ ├── debug_event_dispatcher_spec.cr │ │ │ ├── debug_router_match_spec.cr │ │ │ └── debug_router_spec.cr │ │ ├── compiler_spec.cr │ │ ├── controller/ │ │ │ ├── redirect_spec.cr │ │ │ └── value_resolvers/ │ │ │ ├── enum_spec.cr │ │ │ ├── query_parameter_spec.cr │ │ │ ├── request_body_spec.cr │ │ │ ├── time_spec.cr │ │ │ └── uuid_spec.cr │ │ ├── controller_spec.cr │ │ ├── controllers/ │ │ │ ├── argument_resolver_controller.cr │ │ │ ├── custom_annotation_controller.cr │ │ │ ├── file_upload_controller.cr │ │ │ ├── prefix_controller.cr │ │ │ ├── routing_controller.cr │ │ │ └── view_controller.cr │ │ ├── custom_annotation_spec.cr │ │ ├── ext/ │ │ │ ├── console/ │ │ │ │ └── register_commands_spec.cr │ │ │ └── routing/ │ │ │ └── annotation_route_loader_spec.cr │ │ ├── file_parser_spec.cr │ │ ├── file_upload_controller_spec.cr │ │ ├── listeners/ │ │ │ ├── cors_spec.cr │ │ │ ├── file_spec.cr │ │ │ ├── format_spec.cr │ │ │ └── view_spec.cr │ │ ├── prefix_spec.cr │ │ ├── routing_spec.cr │ │ ├── spec/ │ │ │ ├── expectations/ │ │ │ │ ├── request/ │ │ │ │ │ └── attribute_equals_spec.cr │ │ │ │ └── response/ │ │ │ │ ├── cookie_value_equals_spec.cr │ │ │ │ ├── format_equals_spec.cr │ │ │ │ ├── has_cookie_spec.cr │ │ │ │ ├── has_header_spec.cr │ │ │ │ ├── has_status_spec.cr │ │ │ │ ├── header_equals_spec.cr │ │ │ │ ├── is_redirected_spec.cr │ │ │ │ ├── is_successful_spec.cr │ │ │ │ └── is_unprocessable_spec.cr │ │ │ └── web_test_case_spec.cr │ │ ├── spec_helper.cr │ │ ├── view/ │ │ │ ├── context_spec.cr │ │ │ ├── format_negotiator_spec.cr │ │ │ ├── view_handler_spec.cr │ │ │ └── view_spec.cr │ │ └── view_controller_spec.cr │ └── src/ │ ├── annotation_resolver.cr │ ├── annotations.cr │ ├── athena.cr │ ├── bundle.cr │ ├── commands/ │ │ ├── debug_event_dispatcher.cr │ │ ├── debug_router.cr │ │ └── debug_router_match.cr │ ├── compiler_passes/ │ │ └── expose_controller_services.cr │ ├── controller/ │ │ ├── redirect.cr │ │ └── value_resolvers/ │ │ ├── enum.cr │ │ ├── interface.cr │ │ ├── query_parameter.cr │ │ ├── request_body.cr │ │ ├── time.cr │ │ └── uuid.cr │ ├── controller.cr │ ├── ext/ │ │ ├── clock.cr │ │ ├── console/ │ │ │ ├── application.cr │ │ │ ├── compiler_passes/ │ │ │ │ └── register_commands.cr │ │ │ ├── container_command_loader.cr │ │ │ ├── descriptor/ │ │ │ │ ├── descriptor.cr │ │ │ │ └── text.cr │ │ │ └── helper/ │ │ │ └── descriptor_helper.cr │ │ ├── console.cr │ │ ├── event_dispatcher.cr │ │ ├── http.cr │ │ ├── http_kernel.cr │ │ ├── routing/ │ │ │ ├── annotation_route_loader.cr │ │ │ ├── redirectable_url_matcher.cr │ │ │ └── router.cr │ │ ├── routing.cr │ │ ├── serializer.cr │ │ ├── validator/ │ │ │ └── validation_failed_exception.cr │ │ └── validator.cr │ ├── file_parser.cr │ ├── listeners/ │ │ ├── cors.cr │ │ ├── file.cr │ │ ├── format.cr │ │ └── view.cr │ ├── logging.cr │ ├── spec/ │ │ ├── abstract_browser.cr │ │ ├── api_test_case.cr │ │ ├── expectations/ │ │ │ ├── http.cr │ │ │ ├── request/ │ │ │ │ └── attribute_equals.cr │ │ │ └── response/ │ │ │ ├── base.cr │ │ │ ├── cookie_value_equals.cr │ │ │ ├── format_equals.cr │ │ │ ├── has_cookie.cr │ │ │ ├── has_header.cr │ │ │ ├── has_status.cr │ │ │ ├── header_equals.cr │ │ │ ├── is_redirected.cr │ │ │ ├── is_successful.cr │ │ │ └── is_unprocessable.cr │ │ ├── http_browser.cr │ │ └── web_test_case.cr │ ├── spec.cr │ └── view/ │ ├── configurable_view_handler_interface.cr │ ├── context.cr │ ├── format_handler_interface.cr │ ├── format_negotiator.cr │ ├── view.cr │ ├── view_handler.cr │ └── view_handler_interface.cr ├── http/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── assets/ │ │ │ ├── .unknownextension │ │ │ ├── case-sensitive-mime-type.xlsm │ │ │ ├── directory/ │ │ │ │ └── .empty │ │ │ ├── file-big.txt │ │ │ ├── file-small.txt │ │ │ ├── foo.txt │ │ │ ├── fööö.html │ │ │ ├── test │ │ │ └── webkitdirectory/ │ │ │ ├── nested/ │ │ │ │ └── test.txt │ │ │ └── test.txt │ │ ├── binary_file_response_spec.cr │ │ ├── ext/ │ │ │ └── conversion_types_spec.cr │ │ ├── file_spec.cr │ │ ├── header_utils_spec.cr │ │ ├── ip_utils_spec.cr │ │ ├── parameter_bag_spec.cr │ │ ├── redirect_response_spec.cr │ │ ├── request_matcher/ │ │ │ ├── attributes_spec.cr │ │ │ ├── header_spec.cr │ │ │ ├── hostname_spec.cr │ │ │ ├── method_spec.cr │ │ │ ├── path_spec.cr │ │ │ └── query_parameter_spec.cr │ │ ├── request_matcher_spec.cr │ │ ├── request_spec.cr │ │ ├── response_headers_spec.cr │ │ ├── response_spec.cr │ │ ├── spec_helper.cr │ │ ├── streamed_response_spec.cr │ │ └── uploaded_file_spec.cr │ └── src/ │ ├── abstract_file.cr │ ├── athena-http.cr │ ├── binary_file_response.cr │ ├── exception/ │ │ ├── conflicting_headers.cr │ │ ├── file.cr │ │ ├── file_not_found.cr │ │ ├── file_size_limit_exceeded.cr │ │ ├── logic.cr │ │ ├── request_exception_interface.cr │ │ └── suspicious_operation.cr │ ├── ext/ │ │ └── conversion_types.cr │ ├── file.cr │ ├── header_utils.cr │ ├── ip_utils.cr │ ├── parameter_bag.cr │ ├── redirect_response.cr │ ├── request.cr │ ├── request_matcher/ │ │ ├── attributes.cr │ │ ├── header.cr │ │ ├── hostname.cr │ │ ├── method.cr │ │ ├── path.cr │ │ └── query_parameter.cr │ ├── request_matcher.cr │ ├── request_store.cr │ ├── response.cr │ ├── response_headers.cr │ ├── streamed_response.cr │ └── uploaded_file.cr ├── http_kernel/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── controller/ │ │ │ ├── argument_resolver_spec.cr │ │ │ ├── parameter_metadata_spec.cr │ │ │ └── value_resolvers/ │ │ │ ├── default_value_spec.cr │ │ │ ├── request_attribute_spec.cr │ │ │ └── request_spec.cr │ │ ├── error_renderer_spec.cr │ │ ├── exception/ │ │ │ ├── bad_gateway_spec.cr │ │ │ ├── http_exception_spec.cr │ │ │ ├── service_unavailable_spec.cr │ │ │ ├── too_many_requests_spec.cr │ │ │ └── unauthorized_spec.cr │ │ ├── http_kernel_spec.cr │ │ ├── listeners/ │ │ │ └── error_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── action.cr │ ├── action_resolver.cr │ ├── action_resolver_interface.cr │ ├── athena-http_kernel.cr │ ├── controller/ │ │ ├── argument_resolver.cr │ │ ├── argument_resolver_interface.cr │ │ ├── parameter_metadata.cr │ │ └── value_resolvers/ │ │ ├── default_value.cr │ │ ├── interface.cr │ │ ├── request.cr │ │ └── request_attribute.cr │ ├── error_renderer.cr │ ├── error_renderer_interface.cr │ ├── events/ │ │ ├── action_event.cr │ │ ├── exception_event.cr │ │ ├── request_aware.cr │ │ ├── request_event.cr │ │ ├── response_event.cr │ │ ├── settable_response.cr │ │ ├── terminate_event.cr │ │ └── view_event.cr │ ├── exception/ │ │ ├── bad_gateway.cr │ │ ├── bad_request.cr │ │ ├── conflict.cr │ │ ├── forbidden.cr │ │ ├── gone.cr │ │ ├── http_exception.cr │ │ ├── length_required.cr │ │ ├── logic.cr │ │ ├── method_not_allowed.cr │ │ ├── not_acceptable.cr │ │ ├── not_found.cr │ │ ├── not_implemented.cr │ │ ├── precondition_failed.cr │ │ ├── service_unavailable.cr │ │ ├── stop_format_listener.cr │ │ ├── too_many_requests.cr │ │ ├── unauthorized.cr │ │ ├── unprocessable_entity.cr │ │ └── unsupported_media_type.cr │ ├── http_kernel.cr │ └── listeners/ │ ├── error.cr │ └── routing.cr ├── image_size/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── athena-image_size_spec.cr │ │ ├── images/ │ │ │ ├── cur/ │ │ │ │ └── 32x256_8_0.cur │ │ │ ├── mng/ │ │ │ │ └── 61x42_0_0.mng │ │ │ ├── png/ │ │ │ │ └── 192x110_8_0.apng │ │ │ ├── psd/ │ │ │ │ └── 16x20_8_3.psd │ │ │ ├── swf/ │ │ │ │ └── 450x200_0_0.swf │ │ │ └── tiff/ │ │ │ ├── big-endian.68x49_8_1.tiff │ │ │ └── little-endian.40x68_8_1.tiff │ │ └── spec_helper.cr │ └── src/ │ ├── athena-image_size.cr │ ├── extractors/ │ │ ├── abstract_ico.cr │ │ ├── abstract_png.cr │ │ ├── abstract_tiff.cr │ │ ├── apng.cr │ │ ├── bmp.cr │ │ ├── cur.cr │ │ ├── extractor.cr │ │ ├── gif.cr │ │ ├── ico.cr │ │ ├── ii_tiff.cr │ │ ├── jpeg.cr │ │ ├── mm_tiff.cr │ │ ├── mng.cr │ │ ├── png.cr │ │ ├── psd.cr │ │ ├── svg.cr │ │ ├── swf.cr │ │ └── webp.cr │ ├── image.cr │ └── image_format.cr ├── mercure/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── authorization_spec.cr │ │ ├── discovery_spec.cr │ │ ├── hub/ │ │ │ ├── hub_spec.cr │ │ │ └── registry_spec.cr │ │ ├── spec_helper.cr │ │ ├── token_factory/ │ │ │ └── jwt_spec.cr │ │ └── token_provider/ │ │ ├── callable_spec.cr │ │ ├── factory_spec.cr │ │ └── static_spec.cr │ └── src/ │ ├── athena-mercure.cr │ ├── authorization.cr │ ├── discovery.cr │ ├── exception/ │ │ ├── invalid_argument.cr │ │ └── runtime.cr │ ├── hub/ │ │ ├── hub.cr │ │ ├── interface.cr │ │ └── registry.cr │ ├── spec.cr │ ├── token_factory/ │ │ ├── interface.cr │ │ └── jwt.cr │ ├── token_provider/ │ │ ├── callable.cr │ │ ├── factory.cr │ │ ├── interface.cr │ │ └── static.cr │ └── update.cr ├── mercure-bundle/ │ ├── README.md │ ├── docs/ │ │ └── README.md │ └── mkdocs.yml ├── mime/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── abstract_types_guesser_test_case.cr │ │ ├── address_spec.cr │ │ ├── draft_email_spec.cr │ │ ├── email_spec.cr │ │ ├── encoder/ │ │ │ ├── base64_content_spec.cr │ │ │ ├── eight_bit_content_spec.cr │ │ │ ├── idn_address_spec.cr │ │ │ ├── quoted_printable_content_spec.cr │ │ │ ├── quoted_printable_mime_header_spec.cr │ │ │ └── rfc2231_spec.cr │ │ ├── fixtures/ │ │ │ ├── content.txt │ │ │ ├── mimetypes/ │ │ │ │ ├── -test │ │ │ │ ├── .unknownextension │ │ │ │ ├── abc.csv │ │ │ │ ├── directory/ │ │ │ │ │ └── .empty │ │ │ │ ├── other-file.example │ │ │ │ └── test │ │ │ ├── samples/ │ │ │ │ └── charsets/ │ │ │ │ ├── iso-2022-jp/ │ │ │ │ │ └── one.txt │ │ │ │ ├── iso-8859-1/ │ │ │ │ │ └── one.txt │ │ │ │ └── utf-8/ │ │ │ │ ├── one.txt │ │ │ │ ├── three.txt │ │ │ │ └── two.txt │ │ │ └── test.docx │ │ ├── header/ │ │ │ ├── collection_spec.cr │ │ │ ├── date_spec.cr │ │ │ ├── identification_spec.cr │ │ │ ├── mailbox_list_spec.cr │ │ │ ├── mailbox_spec.cr │ │ │ ├── parameterized_spec.cr │ │ │ ├── path_spec.cr │ │ │ └── unstructured_spec.cr │ │ ├── magic_types_guesser_spec.cr │ │ ├── message_converter_spec.cr │ │ ├── message_spec.cr │ │ ├── native_types_guessuer_spec.cr │ │ ├── part/ │ │ │ ├── data_spec.cr │ │ │ ├── file_spec.cr │ │ │ ├── message_spec.cr │ │ │ ├── multipart/ │ │ │ │ ├── alternative_spec.cr │ │ │ │ ├── digest_spec.cr │ │ │ │ ├── form_spec.cr │ │ │ │ ├── mixed_spec.cr │ │ │ │ └── related_spec.cr │ │ │ └── text_spec.cr │ │ ├── spec_helper.cr │ │ └── types_spec.cr │ └── src/ │ ├── address.cr │ ├── athena-mime.cr │ ├── draft_email.cr │ ├── email.cr │ ├── encoder/ │ │ ├── address_encoder_interface.cr │ │ ├── base64_content.cr │ │ ├── content_encoder_interface.cr │ │ ├── eight_bit_content.cr │ │ ├── encoder_interface.cr │ │ ├── idn_address.cr │ │ ├── mime_header_encoder_interface.cr │ │ ├── quoted_printable_content.cr │ │ ├── quoted_printable_mime_header.cr │ │ └── rfc2231.cr │ ├── exception/ │ │ ├── header_not_found.cr │ │ ├── invalid_argument.cr │ │ ├── logic.cr │ │ └── runtime.cr │ ├── header/ │ │ ├── abstract.cr │ │ ├── collection.cr │ │ ├── date.cr │ │ ├── identification.cr │ │ ├── interface.cr │ │ ├── mailbox.cr │ │ ├── mailbox_list.cr │ │ ├── parameterized.cr │ │ ├── path.cr │ │ └── unstructured.cr │ ├── magic_types_guesser.cr │ ├── message.cr │ ├── message_converter.cr │ ├── native_types_guesser.cr │ ├── part/ │ │ ├── abstract.cr │ │ ├── abstract_multipart.cr │ │ ├── data.cr │ │ ├── file.cr │ │ ├── message.cr │ │ ├── multipart/ │ │ │ ├── alternative.cr │ │ │ ├── digest.cr │ │ │ ├── form.cr │ │ │ ├── mixed.cr │ │ │ └── related.cr │ │ └── text.cr │ ├── types/ │ │ └── data.cr │ ├── types.cr │ ├── types_guesser_interface.cr │ └── types_interface.cr ├── negotiation/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── accept_language_spec.cr │ │ ├── accept_match_spec.cr │ │ ├── accept_spec.cr │ │ ├── base_accept_spec.cr │ │ ├── charset_negotiator_spec.cr │ │ ├── encoding_negotiator_spec.cr │ │ ├── language_negotiator_spec.cr │ │ ├── negotiator_spec.cr │ │ ├── negotiator_test_case.cr │ │ └── spec_helper.cr │ └── src/ │ ├── abstract_negotiator.cr │ ├── accept.cr │ ├── accept_charset.cr │ ├── accept_encoding.cr │ ├── accept_language.cr │ ├── accept_match.cr │ ├── athena-negotiation.cr │ ├── base_accept.cr │ ├── charset_negotiator.cr │ ├── encoding_negotiator.cr │ ├── exception/ │ │ ├── invalid_argument.cr │ │ ├── invalid_language.cr │ │ └── invalid_media_type.cr │ ├── language_negotiator.cr │ └── negotiator.cr ├── routing/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── fixtures/ │ │ │ └── route_provider/ │ │ │ ├── route_collection0.cr │ │ │ ├── route_collection1.cr │ │ │ ├── route_collection10.cr │ │ │ ├── route_collection11.cr │ │ │ ├── route_collection12.cr │ │ │ ├── route_collection2.cr │ │ │ ├── route_collection3.cr │ │ │ ├── route_collection4.cr │ │ │ ├── route_collection5.cr │ │ │ ├── route_collection6.cr │ │ │ ├── route_collection7.cr │ │ │ ├── route_collection8.cr │ │ │ └── route_collection9.cr │ │ ├── generator/ │ │ │ └── url_generator_spec.cr │ │ ├── matcher/ │ │ │ ├── abstract_url_matcher_test_case.cr │ │ │ ├── redirectable_url_matcher_spec.cr │ │ │ ├── traceable_url_matcher_spec.cr │ │ │ └── url_matcher_spec.cr │ │ ├── parameters_spec.cr │ │ ├── request_context_spec.cr │ │ ├── requirement/ │ │ │ ├── enum_spec.cr │ │ │ └── requirement_spec.cr │ │ ├── route_collection_spec.cr │ │ ├── route_compiler_spec.cr │ │ ├── route_provider_spec.cr │ │ ├── route_spec.cr │ │ ├── router_spec.cr │ │ ├── routing_handler_spec.cr │ │ ├── spec_helper.cr │ │ └── static_prefix_collection_spec.cr │ └── src/ │ ├── annotations.cr │ ├── athena-routing.cr │ ├── compiled_route.cr │ ├── exception/ │ │ ├── invalid_argument.cr │ │ ├── invalid_parameter.cr │ │ ├── method_not_allowed.cr │ │ ├── missing_required_parameters.cr │ │ ├── no_configuration.cr │ │ ├── resource_not_found.cr │ │ └── route_not_found.cr │ ├── ext/ │ │ └── regex.cr │ ├── generator/ │ │ ├── configurable_requirements_interface.cr │ │ ├── interface.cr │ │ ├── reference_type.cr │ │ └── url_generator.cr │ ├── matcher/ │ │ ├── redirectable_url_matcher_interface.cr │ │ ├── request_matcher_interface.cr │ │ ├── traceable_url_matcher.cr │ │ ├── url_matcher.cr │ │ └── url_matcher_interface.cr │ ├── parameters.cr │ ├── request_context.cr │ ├── request_context_aware_interface.cr │ ├── requirement/ │ │ ├── enum.cr │ │ └── requirement.cr │ ├── route.cr │ ├── route_collection.cr │ ├── route_compiler.cr │ ├── route_provider.cr │ ├── router.cr │ ├── router_interface.cr │ ├── routing_handler.cr │ └── static_prefix_collection.cr ├── serializer/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── athena-serializer_spec.cr │ │ ├── compiler_spec.cr │ │ ├── exclusion_strategies/ │ │ │ ├── custom_strategy_spec.cr │ │ │ ├── group_spec.cr │ │ │ └── version_spec.cr │ │ ├── models/ │ │ │ ├── accessor.cr │ │ │ ├── accessor_order.cr │ │ │ ├── basic.cr │ │ │ ├── discriminator.cr │ │ │ ├── emit_null.cr │ │ │ ├── empty.cr │ │ │ ├── exclude.cr │ │ │ ├── expose.cr │ │ │ ├── groups.cr │ │ │ ├── ignore_on_deserialize.cr │ │ │ ├── ignore_on_serialize.cr │ │ │ ├── name.cr │ │ │ ├── nested.cr │ │ │ ├── post_deserialize.cr │ │ │ ├── post_serialize.cr │ │ │ ├── pre_serialize.cr │ │ │ ├── read_only.cr │ │ │ ├── skip.cr │ │ │ ├── skip_when_empty.cr │ │ │ └── virtual_property.cr │ │ ├── navigators/ │ │ │ ├── deserialization_navigator_spec.cr │ │ │ └── serialization_navigator_spec.cr │ │ ├── serialization_context_spec.cr │ │ ├── serializer_spec.cr │ │ ├── spec_helper.cr │ │ └── visitors/ │ │ ├── json_deserialization_visitor_spec.cr │ │ ├── json_serialization_visitor_spec.cr │ │ ├── yaml_deserialization_visitor_spec.cr │ │ └── yaml_serialization_visitor_spec.cr │ └── src/ │ ├── annotations.cr │ ├── any.cr │ ├── athena-serializer.cr │ ├── construction/ │ │ ├── instantiate_object_constructor.cr │ │ └── object_constructor_interface.cr │ ├── context.cr │ ├── deserialization_context.cr │ ├── exception/ │ │ ├── deserialization_exception.cr │ │ ├── logic.cr │ │ ├── missing_required_property.cr │ │ ├── nil_required_property.cr │ │ ├── property_exception.cr │ │ └── serialization_exception.cr │ ├── exclusion_strategies/ │ │ ├── disjunct.cr │ │ ├── exclusion_strategy_interface.cr │ │ ├── groups.cr │ │ └── version.cr │ ├── navigators/ │ │ ├── deserialization_navigator.cr │ │ ├── navigator_factory.cr │ │ └── serialization_navigator.cr │ ├── property_metadata.cr │ ├── serializable.cr │ ├── serialization_context.cr │ ├── serializer.cr │ ├── serializer_interface.cr │ └── visitors/ │ ├── deserialization_visitor.cr │ ├── deserialization_visitor_interface.cr │ ├── json_deserialization_visitor.cr │ ├── json_serialization_visitor.cr │ ├── serialization_visitor_interface.cr │ ├── yaml_deserialization_visitor.cr │ └── yaml_serialization_visitor.cr ├── spec/ │ ├── .editorconfig │ ├── .gitignore │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── UPGRADING.md │ ├── docs/ │ │ └── README.md │ ├── mkdocs.yml │ ├── shard.yml │ ├── spec/ │ │ ├── athena-spec_spec.cr │ │ ├── compiler_spec.cr │ │ ├── methods_spec.cr │ │ └── spec_helper.cr │ └── src/ │ ├── athena-spec.cr │ ├── methods.cr │ └── test_case.cr └── validator/ ├── .editorconfig ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── UPGRADING.md ├── docs/ │ └── README.md ├── mkdocs.yml ├── shard.yml ├── spec/ │ ├── athena-validator_spec.cr │ ├── constraint_spec.cr │ ├── constraints/ │ │ ├── all_validator_spec.cr │ │ ├── at_least_one_of_validator_spec.cr │ │ ├── blank_validator_spec.cr │ │ ├── callback_validator_spec.cr │ │ ├── choice_validator_spec.cr │ │ ├── collection_spec.cr │ │ ├── collection_validator_test_case.cr │ │ ├── composite_spec.cr │ │ ├── compound_validator_spec.cr │ │ ├── count_validator_spec.cr │ │ ├── email_validator_spec.cr │ │ ├── equal_to_validator_spec.cr │ │ ├── file_spec.cr │ │ ├── file_validator_ath_file_spec.cr │ │ ├── file_validator_path_spec.cr │ │ ├── file_validator_std_file_spec.cr │ │ ├── file_validator_test_case.cr │ │ ├── fixtures/ │ │ │ └── file-big.txt │ │ ├── greater_than_or_equal_validator_spec.cr │ │ ├── greater_than_validator_spec.cr │ │ ├── hash_collection_validator_spec.cr │ │ ├── hash_like_object_collection_validator_spec.cr │ │ ├── image_validator_spec.cr │ │ ├── ip_validator_spec.cr │ │ ├── is_false_validator_spec.cr │ │ ├── is_nil_validator_spec.cr │ │ ├── is_true_validator_spec.cr │ │ ├── isbn_validator_spec.cr │ │ ├── isin_validator_spec.cr │ │ ├── issn_validator_spec.cr │ │ ├── length_validator_spec.cr │ │ ├── less_than_or_equal_validator_spec.cr │ │ ├── less_than_validator_spec.cr │ │ ├── luhn_validator_spec.cr │ │ ├── negative_or_zero_validator_spec.cr │ │ ├── negative_validator_spec.cr │ │ ├── not_blank_validator_spec.cr │ │ ├── not_equal_to_validator_spec.cr │ │ ├── not_nil_validator_spec.cr │ │ ├── positive_or_zero_validator_spec.cr │ │ ├── positive_validator_spec.cr │ │ ├── range_validator_spec.cr │ │ ├── regex_validator_spec.cr │ │ ├── sequentially_validator_spec.cr │ │ ├── unique_validator_spec.cr │ │ ├── url_validator_spec.cr │ │ └── valid_validator_spec.cr │ ├── metadata/ │ │ └── class_metadata_spec.cr │ ├── property_path_spec.cr │ ├── spec/ │ │ └── compound_constraint_test_case_spec.cr │ ├── spec_helper.cr │ ├── validatable_spec.cr │ ├── validator/ │ │ └── recursive_validator_spec.cr │ └── violation/ │ ├── constraint_violation_list_spec.cr │ └── constraint_violation_spec.cr └── src/ ├── athena-validator.cr ├── constraint.cr ├── constraint_validator.cr ├── constraint_validator_factory.cr ├── constraint_validator_factory_interface.cr ├── constraint_validator_interface.cr ├── constraints/ │ ├── abstract_comparison.cr │ ├── abstract_comparison_validator.cr │ ├── all.cr │ ├── at_least_one_of.cr │ ├── blank.cr │ ├── callback.cr │ ├── choice.cr │ ├── collection.cr │ ├── composite.cr │ ├── compound.cr │ ├── count.cr │ ├── email.cr │ ├── equal_to.cr │ ├── existence.cr │ ├── file.cr │ ├── greater_than.cr │ ├── greater_than_or_equal.cr │ ├── group_sequence.cr │ ├── image.cr │ ├── ip.cr │ ├── is_false.cr │ ├── is_nil.cr │ ├── is_true.cr │ ├── isbn.cr │ ├── isin.cr │ ├── issn.cr │ ├── length.cr │ ├── less_than.cr │ ├── less_than_or_equal.cr │ ├── luhn.cr │ ├── negative.cr │ ├── negative_or_zero.cr │ ├── not_blank.cr │ ├── not_equal_to.cr │ ├── not_nil.cr │ ├── optional.cr │ ├── positive.cr │ ├── positive_or_zero.cr │ ├── range.cr │ ├── regex.cr │ ├── required.cr │ ├── sequentially.cr │ ├── unique.cr │ ├── url.cr │ └── valid.cr ├── exception/ │ ├── invalid_argument.cr │ ├── logic.cr │ └── unexpected_value_error.cr ├── execution_context.cr ├── execution_context_interface.cr ├── metadata/ │ ├── cascading_strategy.cr │ ├── class_metadata.cr │ ├── generic_metadata.cr │ ├── getter_metadata.cr │ ├── metadata.cr │ ├── metadata_factory.cr │ ├── metadata_factory_interface.cr │ ├── metadata_interface.cr │ ├── property_metadata.cr │ └── property_metadata_interface.cr ├── property_path.cr ├── spec/ │ ├── abstract_validator_test_case.cr │ ├── compound_constraint_test_case.cr │ ├── constraint_validator_test_case.cr │ └── validator_test_case.cr ├── spec.cr ├── validatable.cr ├── validator/ │ ├── contextual_validator_interface.cr │ ├── recursive_contextual_validator.cr │ ├── recursive_validator.cr │ └── validator_interface.cr └── violation/ ├── constraint_violation.cr ├── constraint_violation_builder.cr ├── constraint_violation_builder_interface.cr ├── constraint_violation_interface.cr ├── constraint_violation_list.cr └── constraint_violation_list_interface.cr