From c117ae4ba0291f5837c250e20704da13fd73d9a8 Mon Sep 17 00:00:00 2001 From: Oluwatumininu Date: Tue, 7 Oct 2025 22:45:09 +0100 Subject: [PATCH 1/5] Handled non-Transparent HTML nodes inside of References --- env/bin/Activate.ps1 | 247 + env/bin/activate | 69 + env/bin/activate.csh | 26 + env/bin/activate.fish | 69 + env/bin/docc | 7 + env/bin/markdown-it | 7 + env/bin/mistletoe | 7 + env/bin/pip | 7 + env/bin/pip3 | 7 + env/bin/pip3.10 | 7 + env/bin/pygmentize | 7 + env/bin/python | 1 + env/bin/python3 | 1 + env/bin/python3.10 | 1 + .../site-packages/__editable__.docc-0.3.1.pth | 1 + .../site-packages/_distutils_hack/__init__.py | 239 + .../site-packages/_distutils_hack/override.py | 1 + .../site-packages/_yaml/__init__.py | 33 + .../site-packages/distutils-precedence.pth | 1 + .../docc-0.3.1.dist-info/INSTALLER | 1 + .../docc-0.3.1.dist-info/METADATA | 67 + .../site-packages/docc-0.3.1.dist-info/RECORD | 11 + .../docc-0.3.1.dist-info/REQUESTED | 0 .../site-packages/docc-0.3.1.dist-info/WHEEL | 5 + .../docc-0.3.1.dist-info/direct_url.json | 1 + .../docc-0.3.1.dist-info/entry_points.txt | 53 + .../docc-0.3.1.dist-info/licenses/LICENSE.md | 675 + .../docc-0.3.1.dist-info/top_level.txt | 1 + .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 103 + .../RECORD | 67 + .../importlib_resources-6.5.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../importlib_resources/__init__.py | 40 + .../importlib_resources/_adapters.py | 168 + .../importlib_resources/_common.py | 211 + .../importlib_resources/_functional.py | 84 + .../importlib_resources/_itertools.py | 38 + .../site-packages/importlib_resources/abc.py | 193 + .../importlib_resources/compat/__init__.py | 0 .../importlib_resources/compat/py39.py | 9 + .../importlib_resources/future/__init__.py | 0 .../importlib_resources/future/adapters.py | 102 + .../importlib_resources/py.typed | 0 .../importlib_resources/readers.py | 202 + .../importlib_resources/simple.py | 106 + .../importlib_resources/tests/__init__.py | 0 .../importlib_resources/tests/_path.py | 90 + .../tests/compat/__init__.py | 0 .../importlib_resources/tests/compat/py312.py | 18 + .../importlib_resources/tests/compat/py39.py | 13 + .../tests/test_compatibilty_files.py | 103 + .../tests/test_contents.py | 39 + .../importlib_resources/tests/test_custom.py | 48 + .../importlib_resources/tests/test_files.py | 194 + .../tests/test_functional.py | 267 + .../importlib_resources/tests/test_open.py | 85 + .../importlib_resources/tests/test_path.py | 63 + .../importlib_resources/tests/test_read.py | 94 + .../importlib_resources/tests/test_reader.py | 137 + .../tests/test_resource.py | 238 + .../importlib_resources/tests/test_util.py | 29 + .../importlib_resources/tests/util.py | 308 + .../importlib_resources/tests/zip.py | 26 + .../inflection-0.5.1.dist-info/INSTALLER | 1 + .../inflection-0.5.1.dist-info/LICENSE | 19 + .../inflection-0.5.1.dist-info/METADATA | 49 + .../inflection-0.5.1.dist-info/RECORD | 11 + .../inflection-0.5.1.dist-info/WHEEL | 6 + .../inflection-0.5.1.dist-info/top_level.txt | 1 + .../python3.10/site-packages/inflection.py | 426 + .../site-packages/inflection/__init__.py | 426 + .../site-packages/inflection/py.typed | 0 .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 57 + .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 ++ .../site-packages/jinja2/constants.py | 20 + .../python3.10/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 ++ .../site-packages/jinja2/exceptions.py | 166 + .../python3.10/site-packages/jinja2/ext.py | 870 + .../site-packages/jinja2/filters.py | 1873 ++ .../site-packages/jinja2/idtracking.py | 318 + .../python3.10/site-packages/jinja2/lexer.py | 868 + .../site-packages/jinja2/loaders.py | 693 + .../python3.10/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.10/site-packages/jinja2/nodes.py | 1206 ++ .../site-packages/jinja2/optimizer.py | 48 + .../python3.10/site-packages/jinja2/parser.py | 1049 + .../python3.10/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 + .../site-packages/jinja2/sandbox.py | 436 + .../python3.10/site-packages/jinja2/tests.py | 256 + .../python3.10/site-packages/jinja2/utils.py | 766 + .../site-packages/jinja2/visitor.py | 92 + .../libcst-1.8.5.dist-info/INSTALLER | 1 + .../libcst-1.8.5.dist-info/METADATA | 347 + .../libcst-1.8.5.dist-info/RECORD | 604 + .../libcst-1.8.5.dist-info/WHEEL | 6 + .../libcst-1.8.5.dist-info/licenses/LICENSE | 102 + .../libcst-1.8.5.dist-info/top_level.txt | 1 + .../site-packages/libcst/__init__.py | 462 + .../site-packages/libcst/_add_slots.py | 65 + .../site-packages/libcst/_batched_visitor.py | 164 + .../site-packages/libcst/_exceptions.py | 191 + .../site-packages/libcst/_flatten_sentinel.py | 45 + .../site-packages/libcst/_maybe_sentinel.py | 58 + .../libcst/_metadata_dependent.py | 139 + .../site-packages/libcst/_nodes/__init__.py | 10 + .../site-packages/libcst/_nodes/base.py | 499 + .../libcst/_nodes/deep_equals.py | 56 + .../site-packages/libcst/_nodes/expression.py | 4067 ++++ .../site-packages/libcst/_nodes/internal.py | 227 + .../site-packages/libcst/_nodes/module.py | 165 + .../site-packages/libcst/_nodes/op.py | 1031 + .../site-packages/libcst/_nodes/statement.py | 3873 ++++ .../libcst/_nodes/tests/__init__.py | 4 + .../site-packages/libcst/_nodes/tests/base.py | 273 + .../libcst/_nodes/tests/test_assert.py | 146 + .../libcst/_nodes/tests/test_assign.py | 436 + .../libcst/_nodes/tests/test_atom.py | 1211 ++ .../libcst/_nodes/tests/test_attribute.py | 79 + .../libcst/_nodes/tests/test_await.py | 181 + .../libcst/_nodes/tests/test_binary_op.py | 191 + .../libcst/_nodes/tests/test_boolean_op.py | 117 + .../libcst/_nodes/tests/test_call.py | 547 + .../libcst/_nodes/tests/test_classdef.py | 434 + .../libcst/_nodes/tests/test_comment.py | 34 + .../libcst/_nodes/tests/test_comparison.py | 353 + .../libcst/_nodes/tests/test_cst_node.py | 197 + .../libcst/_nodes/tests/test_del.py | 76 + .../libcst/_nodes/tests/test_dict.py | 192 + .../libcst/_nodes/tests/test_dict_comp.py | 169 + .../libcst/_nodes/tests/test_docstring.py | 145 + .../libcst/_nodes/tests/test_else.py | 33 + .../libcst/_nodes/tests/test_empty_line.py | 34 + .../_nodes/tests/test_flatten_behavior.py | 79 + .../libcst/_nodes/tests/test_for.py | 193 + .../libcst/_nodes/tests/test_funcdef.py | 2267 +++ .../libcst/_nodes/tests/test_global.py | 135 + .../libcst/_nodes/tests/test_if.py | 149 + .../libcst/_nodes/tests/test_ifexp.py | 138 + .../libcst/_nodes/tests/test_import.py | 755 + .../_nodes/tests/test_indented_block.py | 156 + .../libcst/_nodes/tests/test_lambda.py | 1011 + .../tests/test_leaf_small_statements.py | 16 + .../libcst/_nodes/tests/test_list.py | 130 + .../libcst/_nodes/tests/test_match.py | 489 + .../_nodes/tests/test_matrix_multiply.py | 74 + .../libcst/_nodes/tests/test_module.py | 213 + .../libcst/_nodes/tests/test_namedexpr.py | 213 + .../libcst/_nodes/tests/test_newline.py | 34 + .../libcst/_nodes/tests/test_nonlocal.py | 142 + .../libcst/_nodes/tests/test_number.py | 131 + .../libcst/_nodes/tests/test_raise.py | 203 + .../_nodes/tests/test_removal_behavior.py | 108 + .../libcst/_nodes/tests/test_return.py | 111 + .../libcst/_nodes/tests/test_set.py | 137 + .../libcst/_nodes/tests/test_simple_comp.py | 521 + .../_nodes/tests/test_simple_statement.py | 351 + .../libcst/_nodes/tests/test_simple_string.py | 31 + .../_nodes/tests/test_simple_whitespace.py | 103 + .../_nodes/tests/test_small_statement.py | 80 + .../libcst/_nodes/tests/test_subscript.py | 461 + .../_nodes/tests/test_template_strings.py | 183 + .../_nodes/tests/test_trailing_whitespace.py | 29 + .../libcst/_nodes/tests/test_try.py | 642 + .../libcst/_nodes/tests/test_tuple.py | 290 + .../libcst/_nodes/tests/test_type_alias.py | 252 + .../libcst/_nodes/tests/test_unary_op.py | 88 + .../libcst/_nodes/tests/test_while.py | 138 + .../libcst/_nodes/tests/test_with.py | 333 + .../libcst/_nodes/tests/test_yield.py | 245 + .../site-packages/libcst/_nodes/whitespace.py | 296 + .../site-packages/libcst/_parser/__init__.py | 4 + .../libcst/_parser/_parsing_check.py | 53 + .../libcst/_parser/base_parser.py | 215 + .../libcst/_parser/conversions/README.md | 209 + .../libcst/_parser/conversions/__init__.py | 4 + .../libcst/_parser/conversions/expression.py | 1630 ++ .../libcst/_parser/conversions/module.py | 46 + .../libcst/_parser/conversions/params.py | 346 + .../libcst/_parser/conversions/statement.py | 1381 ++ .../libcst/_parser/conversions/terminals.py | 83 + .../libcst/_parser/custom_itertools.py | 17 + .../libcst/_parser/detect_config.py | 210 + .../libcst/_parser/entrypoints.py | 124 + .../site-packages/libcst/_parser/grammar.py | 413 + .../libcst/_parser/parso/__init__.py | 4 + .../libcst/_parser/parso/pgen2/__init__.py | 4 + .../libcst/_parser/parso/pgen2/generator.py | 364 + .../_parser/parso/pgen2/grammar_parser.py | 170 + .../libcst/_parser/parso/python/__init__.py | 4 + .../libcst/_parser/parso/python/py_token.py | 48 + .../libcst/_parser/parso/python/token.py | 33 + .../libcst/_parser/parso/python/tokenize.py | 1155 ++ .../libcst/_parser/parso/tests/__init__.py | 4 + .../_parser/parso/tests/test_fstring.py | 49 + .../_parser/parso/tests/test_tokenize.py | 428 + .../libcst/_parser/parso/tests/test_utils.py | 56 + .../libcst/_parser/parso/utils.py | 218 + .../libcst/_parser/production_decorator.py | 55 + .../libcst/_parser/py_whitespace_parser.py | 271 + .../libcst/_parser/python_parser.py | 47 + .../libcst/_parser/tests/__init__.py | 4 + .../libcst/_parser/tests/test_config.py | 36 + .../_parser/tests/test_detect_config.py | 331 + .../_parser/tests/test_footer_behavior.py | 232 + .../_parser/tests/test_node_identity.py | 46 + .../libcst/_parser/tests/test_parse_errors.py | 181 + .../_parser/tests/test_version_compare.py | 45 + .../_parser/tests/test_whitespace_parser.py | 228 + .../_parser/tests/test_wrapped_tokenize.py | 1906 ++ .../libcst/_parser/types/__init__.py | 4 + .../libcst/_parser/types/config.py | 180 + .../libcst/_parser/types/conversions.py | 14 + .../libcst/_parser/types/partials.py | 160 + .../libcst/_parser/types/production.py | 19 + .../libcst/_parser/types/py_config.py | 54 + .../libcst/_parser/types/py_token.py | 27 + .../_parser/types/py_whitespace_state.py | 36 + .../libcst/_parser/types/tests/__init__.py | 4 + .../libcst/_parser/types/tests/test_config.py | 56 + .../libcst/_parser/types/token.py | 12 + .../libcst/_parser/types/whitespace_state.py | 15 + .../libcst/_parser/whitespace_parser.py | 29 + .../libcst/_parser/wrapped_tokenize.py | 225 + .../site-packages/libcst/_position.py | 56 + .../site-packages/libcst/_removal_sentinel.py | 50 + .../python3.10/site-packages/libcst/_tabs.py | 26 + .../site-packages/libcst/_type_enforce.py | 169 + .../site-packages/libcst/_typed_visitor.py | 7669 +++++++ .../libcst/_typed_visitor_base.py | 21 + .../python3.10/site-packages/libcst/_types.py | 16 + .../site-packages/libcst/_version.py | 34 + .../site-packages/libcst/_visitors.py | 159 + .../site-packages/libcst/codegen/__init__.py | 4 + .../site-packages/libcst/codegen/gather.py | 160 + .../libcst/codegen/gen_matcher_classes.py | 668 + .../libcst/codegen/gen_type_mapping.py | 62 + .../libcst/codegen/gen_visitor_functions.py | 116 + .../site-packages/libcst/codegen/generate.py | 174 + .../libcst/codegen/tests/__init__.py | 4 + .../codegen/tests/test_codegen_clean.py | 181 + .../libcst/codegen/transforms.py | 45 + .../site-packages/libcst/codemod/__init__.py | 55 + .../site-packages/libcst/codemod/_cli.py | 703 + .../site-packages/libcst/codemod/_codemod.py | 119 + .../site-packages/libcst/codemod/_command.py | 180 + .../site-packages/libcst/codemod/_context.py | 74 + .../libcst/codemod/_dummy_pool.py | 49 + .../site-packages/libcst/codemod/_runner.py | 160 + .../site-packages/libcst/codemod/_testing.py | 143 + .../site-packages/libcst/codemod/_visitor.py | 108 + .../libcst/codemod/commands/__init__.py | 5 + .../codemod/commands/add_pyre_directive.py | 58 + .../codemod/commands/add_trailing_commas.py | 127 + .../commands/convert_format_to_fstring.py | 420 + .../convert_namedtuple_to_dataclass.py | 75 + .../convert_percent_format_to_fstring.py | 134 + .../codemod/commands/convert_type_comments.py | 875 + .../codemod/commands/convert_union_to_or.py | 56 + .../codemod/commands/ensure_import_present.py | 59 + .../codemod/commands/fix_pyre_directives.py | 89 + .../codemod/commands/fix_variadic_callable.py | 40 + .../libcst/codemod/commands/noop.py | 15 + .../codemod/commands/remove_pyre_directive.py | 56 + .../codemod/commands/remove_unused_imports.py | 89 + .../libcst/codemod/commands/rename.py | 406 + .../commands/rename_typing_generic_aliases.py | 37 + .../commands/strip_strings_from_types.py | 54 + .../libcst/codemod/commands/tests/__init__.py | 5 + .../commands/tests/test_add_pyre_directive.py | 123 + .../tests/test_add_trailing_commas.py | 90 + .../tests/test_convert_format_to_fstring.py | 422 + .../test_convert_namedtuple_to_dataclass.py | 177 + .../test_convert_percent_format_to_fstring.py | 48 + .../tests/test_convert_type_comments.py | 481 + .../tests/test_convert_union_to_or.py | 86 + .../tests/test_ensure_import_present.py | 36 + .../tests/test_fix_pyre_directives.py | 209 + .../tests/test_fix_variadic_callable.py | 92 + .../codemod/commands/tests/test_noop.py | 43 + .../tests/test_remove_pyre_directive.py | 180 + .../tests/test_remove_unused_imports.py | 132 + .../codemod/commands/tests/test_rename.py | 887 + .../test_rename_typing_generic_aliases.py | 33 + .../tests/test_strip_strings_from_types.py | 229 + .../tests/test_unnecessary_format_string.py | 44 + .../commands/unnecessary_format_string.py | 47 + .../libcst/codemod/tests/__init__.py | 5 + .../codemod_formatter_error_input.py.txt | 15 + .../libcst/codemod/tests/test_codemod.py | 99 + .../libcst/codemod/tests/test_codemod_cli.py | 119 + .../libcst/codemod/tests/test_metadata.py | 50 + .../libcst/codemod/tests/test_runner.py | 112 + .../libcst/codemod/visitors/__init__.py | 30 + .../libcst/codemod/visitors/_add_imports.py | 472 + .../visitors/_apply_type_annotations.py | 1336 ++ .../codemod/visitors/_gather_comments.py | 60 + .../codemod/visitors/_gather_exports.py | 145 + .../codemod/visitors/_gather_global_names.py | 75 + .../codemod/visitors/_gather_imports.py | 143 + .../_gather_string_annotation_names.py | 106 + .../visitors/_gather_unused_imports.py | 145 + .../libcst/codemod/visitors/_imports.py | 45 + .../codemod/visitors/_remove_imports.py | 465 + .../libcst/codemod/visitors/tests/__init__.py | 5 + .../visitors/tests/test_add_imports.py | 1028 + .../tests/test_apply_type_annotations.py | 2015 ++ .../visitors/tests/test_gather_comments.py | 46 + .../visitors/tests/test_gather_exports.py | 150 + .../tests/test_gather_global_names.py | 54 + .../visitors/tests/test_gather_imports.py | 175 + .../test_gather_string_annotation_names.py | 93 + .../tests/test_gather_unused_imports.py | 128 + .../visitors/tests/test_remove_imports.py | 929 + .../site-packages/libcst/display/__init__.py | 12 + .../site-packages/libcst/display/graphviz.py | 187 + .../libcst/display/tests/__init__.py | 4 + .../display/tests/test_dump_graphviz.py | 83 + .../libcst/display/tests/test_dump_text.py | 770 + .../site-packages/libcst/display/text.py | 133 + .../site-packages/libcst/helpers/__init__.py | 59 + .../site-packages/libcst/helpers/_template.py | 462 + .../site-packages/libcst/helpers/common.py | 25 + .../libcst/helpers/expression.py | 42 + .../site-packages/libcst/helpers/matchers.py | 45 + .../site-packages/libcst/helpers/module.py | 164 + .../libcst/helpers/node_fields.py | 128 + .../site-packages/libcst/helpers/paths.py | 25 + .../libcst/helpers/tests/__init__.py | 4 + .../libcst/helpers/tests/test_expression.py | 85 + .../libcst/helpers/tests/test_matchers.py | 53 + .../libcst/helpers/tests/test_module.py | 350 + .../libcst/helpers/tests/test_node_fields.py | 314 + .../libcst/helpers/tests/test_paths.py | 58 + .../libcst/helpers/tests/test_template.py | 392 + .../site-packages/libcst/matchers/__init__.py | 16680 ++++++++++++++++ .../libcst/matchers/_decorators.py | 120 + .../libcst/matchers/_matcher_base.py | 1943 ++ .../libcst/matchers/_return_types.py | 382 + .../libcst/matchers/_visitors.py | 854 + .../libcst/matchers/tests/__init__.py | 4 + .../libcst/matchers/tests/test_decorators.py | 1011 + .../libcst/matchers/tests/test_extract.py | 458 + .../libcst/matchers/tests/test_findall.py | 211 + .../libcst/matchers/tests/test_matchers.py | 1467 ++ .../tests/test_matchers_with_metadata.py | 638 + .../libcst/matchers/tests/test_replace.py | 282 + .../libcst/matchers/tests/test_visitors.py | 510 + .../site-packages/libcst/metadata/__init__.py | 96 + .../libcst/metadata/accessor_provider.py | 19 + .../libcst/metadata/base_provider.py | 171 + .../metadata/expression_context_provider.py | 223 + .../libcst/metadata/file_path_provider.py | 55 + .../libcst/metadata/full_repo_manager.py | 115 + .../libcst/metadata/name_provider.py | 197 + .../libcst/metadata/parent_node_provider.py | 26 + .../libcst/metadata/position_provider.py | 137 + .../libcst/metadata/reentrant_codegen.py | 209 + .../libcst/metadata/scope_provider.py | 1254 ++ .../libcst/metadata/span_provider.py | 111 + .../libcst/metadata/tests/__init__.py | 4 + .../metadata/tests/test_accessor_provider.py | 68 + .../metadata/tests/test_base_provider.py | 138 + .../tests/test_expression_context_provider.py | 433 + .../metadata/tests/test_file_path_provider.py | 145 + .../metadata/tests/test_full_repo_manager.py | 61 + .../metadata/tests/test_metadata_provider.py | 349 + .../metadata/tests/test_metadata_wrapper.py | 130 + .../metadata/tests/test_name_provider.py | 575 + .../tests/test_parent_node_provider.py | 64 + .../metadata/tests/test_position_provider.py | 215 + .../metadata/tests/test_reentrant_codegen.py | 110 + .../metadata/tests/test_scope_provider.py | 2239 +++ .../metadata/tests/test_span_provider.py | 107 + .../tests/test_type_inference_provider.py | 103 + .../metadata/type_inference_provider.py | 126 + .../site-packages/libcst/metadata/wrapper.py | 221 + .../python3.10/site-packages/libcst/py.typed | 0 .../site-packages/libcst/testing/__init__.py | 4 + .../site-packages/libcst/testing/utils.py | 173 + .../site-packages/libcst/tests/__init__.py | 4 + .../site-packages/libcst/tests/__main__.py | 10 + .../libcst/tests/pyre/.pyre_configuration | 6 + .../libcst/tests/pyre/simple_class.json | 485 + .../libcst/tests/pyre/simple_class.py | 23 + .../libcst/tests/test_add_slots.py | 46 + .../libcst/tests/test_batched_visitor.py | 72 + .../libcst/tests/test_deep_clone.py | 54 + .../libcst/tests/test_deep_replace.py | 137 + .../site-packages/libcst/tests/test_e2e.py | 92 + .../libcst/tests/test_exceptions.py | 93 + .../site-packages/libcst/tests/test_fuzz.py | 194 + .../site-packages/libcst/tests/test_import.py | 12 + .../libcst/tests/test_pyre_integration.py | 118 + .../libcst/tests/test_roundtrip.py | 43 + .../site-packages/libcst/tests/test_tabs.py | 24 + .../libcst/tests/test_type_enforce.py | 204 + .../libcst/tests/test_visitor.py | 98 + .../python3.10/site-packages/libcst/tool.py | 694 + .../site-packages/markdown_it/__init__.py | 6 + .../site-packages/markdown_it/_compat.py | 1 + .../site-packages/markdown_it/_punycode.py | 67 + .../site-packages/markdown_it/cli/__init__.py | 0 .../site-packages/markdown_it/cli/parse.py | 110 + .../markdown_it/common/__init__.py | 0 .../markdown_it/common/entities.py | 5 + .../markdown_it/common/html_blocks.py | 69 + .../markdown_it/common/html_re.py | 39 + .../markdown_it/common/normalize_url.py | 81 + .../site-packages/markdown_it/common/utils.py | 313 + .../markdown_it/helpers/__init__.py | 6 + .../helpers/parse_link_destination.py | 83 + .../markdown_it/helpers/parse_link_label.py | 44 + .../markdown_it/helpers/parse_link_title.py | 75 + .../site-packages/markdown_it/main.py | 350 + .../site-packages/markdown_it/parser_block.py | 113 + .../site-packages/markdown_it/parser_core.py | 46 + .../markdown_it/parser_inline.py | 148 + .../site-packages/markdown_it/port.yaml | 48 + .../markdown_it/presets/__init__.py | 28 + .../markdown_it/presets/commonmark.py | 75 + .../markdown_it/presets/default.py | 36 + .../site-packages/markdown_it/presets/zero.py | 44 + .../site-packages/markdown_it/py.typed | 1 + .../site-packages/markdown_it/renderer.py | 336 + .../site-packages/markdown_it/ruler.py | 275 + .../markdown_it/rules_block/__init__.py | 27 + .../markdown_it/rules_block/blockquote.py | 299 + .../markdown_it/rules_block/code.py | 36 + .../markdown_it/rules_block/fence.py | 101 + .../markdown_it/rules_block/heading.py | 69 + .../markdown_it/rules_block/hr.py | 56 + .../markdown_it/rules_block/html_block.py | 90 + .../markdown_it/rules_block/lheading.py | 86 + .../markdown_it/rules_block/list.py | 345 + .../markdown_it/rules_block/paragraph.py | 66 + .../markdown_it/rules_block/reference.py | 235 + .../markdown_it/rules_block/state_block.py | 261 + .../markdown_it/rules_block/table.py | 250 + .../markdown_it/rules_core/__init__.py | 19 + .../markdown_it/rules_core/block.py | 13 + .../markdown_it/rules_core/inline.py | 10 + .../markdown_it/rules_core/linkify.py | 149 + .../markdown_it/rules_core/normalize.py | 19 + .../markdown_it/rules_core/replacements.py | 127 + .../markdown_it/rules_core/smartquotes.py | 202 + .../markdown_it/rules_core/state_core.py | 25 + .../markdown_it/rules_core/text_join.py | 35 + .../markdown_it/rules_inline/__init__.py | 31 + .../markdown_it/rules_inline/autolink.py | 77 + .../markdown_it/rules_inline/backticks.py | 72 + .../markdown_it/rules_inline/balance_pairs.py | 138 + .../markdown_it/rules_inline/emphasis.py | 102 + .../markdown_it/rules_inline/entity.py | 53 + .../markdown_it/rules_inline/escape.py | 93 + .../rules_inline/fragments_join.py | 43 + .../markdown_it/rules_inline/html_inline.py | 43 + .../markdown_it/rules_inline/image.py | 148 + .../markdown_it/rules_inline/link.py | 149 + .../markdown_it/rules_inline/linkify.py | 62 + .../markdown_it/rules_inline/newline.py | 44 + .../markdown_it/rules_inline/state_inline.py | 165 + .../markdown_it/rules_inline/strikethrough.py | 127 + .../markdown_it/rules_inline/text.py | 62 + .../site-packages/markdown_it/token.py | 178 + .../site-packages/markdown_it/tree.py | 333 + .../site-packages/markdown_it/utils.py | 186 + .../markdown_it_py-4.0.0.dist-info/INSTALLER | 1 + .../markdown_it_py-4.0.0.dist-info/METADATA | 219 + .../markdown_it_py-4.0.0.dist-info/RECORD | 142 + .../markdown_it_py-4.0.0.dist-info/WHEEL | 4 + .../entry_points.txt | 3 + .../licenses/LICENSE | 21 + .../licenses/LICENSE.markdown-it | 22 + .../markupsafe-3.0.3.dist-info/INSTALLER | 1 + .../markupsafe-3.0.3.dist-info/METADATA | 74 + .../markupsafe-3.0.3.dist-info/RECORD | 14 + .../markupsafe-3.0.3.dist-info/WHEEL | 6 + .../licenses/LICENSE.txt | 28 + .../markupsafe-3.0.3.dist-info/top_level.txt | 1 + .../site-packages/markupsafe/__init__.py | 396 + .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 200 + .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../mdurl-0.1.2.dist-info/INSTALLER | 1 + .../mdurl-0.1.2.dist-info/LICENSE | 46 + .../mdurl-0.1.2.dist-info/METADATA | 32 + .../mdurl-0.1.2.dist-info/RECORD | 18 + .../site-packages/mdurl-0.1.2.dist-info/WHEEL | 4 + .../site-packages/mdurl/__init__.py | 18 + .../python3.10/site-packages/mdurl/_decode.py | 104 + .../python3.10/site-packages/mdurl/_encode.py | 85 + .../python3.10/site-packages/mdurl/_format.py | 27 + .../python3.10/site-packages/mdurl/_parse.py | 304 + .../python3.10/site-packages/mdurl/_url.py | 14 + .../python3.10/site-packages/mdurl/py.typed | 1 + .../mistletoe-1.4.0.dist-info/INSTALLER | 1 + .../mistletoe-1.4.0.dist-info/LICENSE | 21 + .../mistletoe-1.4.0.dist-info/METADATA | 27 + .../mistletoe-1.4.0.dist-info/RECORD | 58 + .../mistletoe-1.4.0.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../mistletoe-1.4.0.dist-info/top_level.txt | 1 + .../site-packages/mistletoe/__init__.py | 24 + .../site-packages/mistletoe/__main__.py | 17 + .../site-packages/mistletoe/ast_renderer.py | 53 + .../site-packages/mistletoe/base_renderer.py | 205 + .../site-packages/mistletoe/block_token.py | 1109 + .../mistletoe/block_tokenizer.py | 118 + .../python3.10/site-packages/mistletoe/cli.py | 92 + .../mistletoe/contrib/__init__.py | 0 .../mistletoe/contrib/github_wiki.py | 33 + .../mistletoe/contrib/jira_renderer.py | 243 + .../mistletoe/contrib/mathjax.py | 34 + .../mistletoe/contrib/md2jira.py | 108 + .../mistletoe/contrib/pygments_renderer.py | 44 + .../site-packages/mistletoe/contrib/scheme.py | 155 + .../mistletoe/contrib/toc_renderer.py | 76 + .../mistletoe/contrib/xwiki20_renderer.py | 237 + .../site-packages/mistletoe/core_tokens.py | 487 + .../site-packages/mistletoe/html_renderer.py | 244 + .../site-packages/mistletoe/latex_renderer.py | 199 + .../site-packages/mistletoe/latex_token.py | 11 + .../mistletoe/markdown_renderer.py | 563 + .../site-packages/mistletoe/span_token.py | 331 + .../site-packages/mistletoe/span_tokenizer.py | 127 + .../site-packages/mistletoe/token.py | 98 + .../site-packages/mistletoe/utils.py | 33 + .../pip-25.2.dist-info/INSTALLER | 1 + .../site-packages/pip-25.2.dist-info/METADATA | 112 + .../site-packages/pip-25.2.dist-info/RECORD | 860 + .../pip-25.2.dist-info/REQUESTED | 0 .../site-packages/pip-25.2.dist-info/WHEEL | 5 + .../pip-25.2.dist-info/entry_points.txt | 3 + .../pip-25.2.dist-info/licenses/AUTHORS.txt | 833 + .../pip-25.2.dist-info/licenses/LICENSE.txt | 20 + .../src/pip/_vendor/cachecontrol/LICENSE.txt | 13 + .../licenses/src/pip/_vendor/certifi/LICENSE | 20 + .../pip/_vendor/dependency_groups/LICENSE.txt | 9 + .../src/pip/_vendor/distlib/LICENSE.txt | 284 + .../licenses/src/pip/_vendor/distro/LICENSE | 202 + .../licenses/src/pip/_vendor/idna/LICENSE.md | 31 + .../licenses/src/pip/_vendor/msgpack/COPYING | 14 + .../src/pip/_vendor/packaging/LICENSE | 3 + .../src/pip/_vendor/packaging/LICENSE.APACHE | 177 + .../src/pip/_vendor/packaging/LICENSE.BSD | 23 + .../src/pip/_vendor/pkg_resources/LICENSE | 17 + .../src/pip/_vendor/platformdirs/LICENSE | 21 + .../licenses/src/pip/_vendor/pygments/LICENSE | 25 + .../src/pip/_vendor/pyproject_hooks/LICENSE | 21 + .../licenses/src/pip/_vendor/requests/LICENSE | 175 + .../src/pip/_vendor/resolvelib/LICENSE | 13 + .../licenses/src/pip/_vendor/rich/LICENSE | 19 + .../licenses/src/pip/_vendor/tomli/LICENSE | 21 + .../src/pip/_vendor/tomli/LICENSE-HEADER | 3 + .../licenses/src/pip/_vendor/tomli_w/LICENSE | 21 + .../src/pip/_vendor/truststore/LICENSE | 21 + .../src/pip/_vendor/urllib3/LICENSE.txt | 21 + .../pip-25.2.dist-info/top_level.txt | 1 + .../python3.10/site-packages/pip/__init__.py | 13 + .../python3.10/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../site-packages/pip/_internal/__init__.py | 18 + .../site-packages/pip/_internal/build_env.py | 349 + .../site-packages/pip/_internal/cache.py | 291 + .../pip/_internal/cli/__init__.py | 3 + .../pip/_internal/cli/autocompletion.py | 184 + .../pip/_internal/cli/base_command.py | 244 + .../pip/_internal/cli/cmdoptions.py | 1138 ++ .../pip/_internal/cli/command_context.py | 28 + .../pip/_internal/cli/index_command.py | 175 + .../site-packages/pip/_internal/cli/main.py | 80 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 298 + .../pip/_internal/cli/progress_bars.py | 151 + .../pip/_internal/cli/req_command.py | 351 + .../pip/_internal/cli/spinners.py | 235 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 139 + .../pip/_internal/commands/cache.py | 231 + .../pip/_internal/commands/check.py | 66 + .../pip/_internal/commands/completion.py | 135 + .../pip/_internal/commands/configuration.py | 288 + .../pip/_internal/commands/debug.py | 203 + .../pip/_internal/commands/download.py | 145 + .../pip/_internal/commands/freeze.py | 107 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 40 + .../pip/_internal/commands/index.py | 159 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 798 + .../pip/_internal/commands/list.py | 400 + .../pip/_internal/commands/lock.py | 170 + .../pip/_internal/commands/search.py | 178 + .../pip/_internal/commands/show.py | 231 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 181 + .../pip/_internal/configuration.py | 397 + .../pip/_internal/distributions/__init__.py | 21 + .../pip/_internal/distributions/base.py | 55 + .../pip/_internal/distributions/installed.py | 33 + .../pip/_internal/distributions/sdist.py | 165 + .../pip/_internal/distributions/wheel.py | 44 + .../site-packages/pip/_internal/exceptions.py | 881 + .../pip/_internal/index/__init__.py | 1 + .../pip/_internal/index/collector.py | 489 + .../pip/_internal/index/package_finder.py | 1059 + .../pip/_internal/index/sources.py | 287 + .../pip/_internal/locations/__init__.py | 441 + .../pip/_internal/locations/_distutils.py | 173 + .../pip/_internal/locations/_sysconfig.py | 215 + .../pip/_internal/locations/base.py | 82 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 164 + .../pip/_internal/metadata/_json.py | 87 + .../pip/_internal/metadata/base.py | 685 + .../_internal/metadata/importlib/__init__.py | 6 + .../_internal/metadata/importlib/_compat.py | 87 + .../_internal/metadata/importlib/_dists.py | 223 + .../pip/_internal/metadata/importlib/_envs.py | 143 + .../pip/_internal/metadata/pkg_resources.py | 298 + .../pip/_internal/models/__init__.py | 1 + .../pip/_internal/models/candidate.py | 25 + .../pip/_internal/models/direct_url.py | 227 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 57 + .../pip/_internal/models/link.py | 613 + .../pip/_internal/models/pylock.py | 188 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 126 + .../pip/_internal/models/selection_prefs.py | 53 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 141 + .../pip/_internal/network/__init__.py | 1 + .../pip/_internal/network/auth.py | 564 + .../pip/_internal/network/cache.py | 133 + .../pip/_internal/network/download.py | 342 + .../pip/_internal/network/lazy_wheel.py | 213 + .../pip/_internal/network/session.py | 528 + .../pip/_internal/network/utils.py | 98 + .../pip/_internal/network/xmlrpc.py | 61 + .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 175 + .../pip/_internal/operations/freeze.py | 259 + .../_internal/operations/install/__init__.py | 1 + .../operations/install/editable_legacy.py | 48 + .../pip/_internal/operations/install/wheel.py | 746 + .../pip/_internal/operations/prepare.py | 742 + .../site-packages/pip/_internal/pyproject.py | 182 + .../pip/_internal/req/__init__.py | 105 + .../pip/_internal/req/constructors.py | 562 + .../pip/_internal/req/req_dependency_group.py | 75 + .../pip/_internal/req/req_file.py | 620 + .../pip/_internal/req/req_install.py | 937 + .../pip/_internal/req/req_set.py | 81 + .../pip/_internal/req/req_uninstall.py | 639 + .../pip/_internal/resolution/__init__.py | 0 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../_internal/resolution/resolvelib/base.py | 142 + .../resolution/resolvelib/candidates.py | 582 + .../resolution/resolvelib/factory.py | 814 + .../resolution/resolvelib/found_candidates.py | 166 + .../resolution/resolvelib/provider.py | 276 + .../resolution/resolvelib/reporter.py | 85 + .../resolution/resolvelib/requirements.py | 247 + .../resolution/resolvelib/resolver.py | 336 + .../pip/_internal/self_outdated_check.py | 254 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 85 + .../pip/_internal/utils/compatibility_tags.py | 201 + .../pip/_internal/utils/datetime.py | 10 + .../pip/_internal/utils/deprecation.py | 126 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 81 + .../pip/_internal/utils/entrypoints.py | 88 + .../pip/_internal/utils/filesystem.py | 152 + .../pip/_internal/utils/filetypes.py | 24 + .../pip/_internal/utils/glibc.py | 102 + .../pip/_internal/utils/hashes.py | 150 + .../pip/_internal/utils/logging.py | 364 + .../site-packages/pip/_internal/utils/misc.py | 765 + .../pip/_internal/utils/packaging.py | 44 + .../pip/_internal/utils/retry.py | 45 + .../pip/_internal/utils/setuptools_build.py | 149 + .../pip/_internal/utils/subprocess.py | 248 + .../pip/_internal/utils/temp_dir.py | 294 + .../pip/_internal/utils/unpacking.py | 337 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 105 + .../pip/_internal/utils/wheel.py | 132 + .../pip/_internal/vcs/__init__.py | 15 + .../site-packages/pip/_internal/vcs/bazaar.py | 130 + .../site-packages/pip/_internal/vcs/git.py | 571 + .../pip/_internal/vcs/mercurial.py | 186 + .../pip/_internal/vcs/subversion.py | 335 + .../pip/_internal/vcs/versioncontrol.py | 693 + .../pip/_internal/wheel_builder.py | 334 + .../site-packages/pip/_vendor/__init__.py | 117 + .../pip/_vendor/cachecontrol/__init__.py | 29 + .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 168 + .../pip/_vendor/cachecontrol/cache.py | 75 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../_vendor/cachecontrol/caches/file_cache.py | 145 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 511 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 157 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../pip/_vendor/certifi/cacert.pem | 4778 +++++ .../site-packages/pip/_vendor/certifi/core.py | 83 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/dependency_groups/__init__.py | 13 + .../pip/_vendor/dependency_groups/__main__.py | 65 + .../dependency_groups/_implementation.py | 209 + .../_lint_dependency_groups.py | 59 + .../_vendor/dependency_groups/_pip_wrapper.py | 62 + .../_vendor/dependency_groups/_toml_compat.py | 9 + .../pip/_vendor/dependency_groups/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 + .../pip/_vendor/distlib/compat.py | 1137 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 447 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1984 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../pip/_vendor/distro/distro.py | 1403 ++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 45 + .../site-packages/pip/_vendor/idna/codec.py | 122 + .../site-packages/pip/_vendor/idna/compat.py | 15 + .../site-packages/pip/_vendor/idna/core.py | 437 + .../pip/_vendor/idna/idnadata.py | 4243 ++++ .../pip/_vendor/idna/intranges.py | 57 + .../pip/_vendor/idna/package_data.py | 1 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8681 ++++++++ .../pip/_vendor/msgpack/__init__.py | 55 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 170 + .../pip/_vendor/msgpack/fallback.py | 929 + .../pip/_vendor/packaging/__init__.py | 15 + .../pip/_vendor/packaging/_elffile.py | 109 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 353 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/_tokenizer.py | 195 + .../_vendor/packaging/licenses/__init__.py | 145 + .../pip/_vendor/packaging/licenses/_spdx.py | 759 + .../pip/_vendor/packaging/markers.py | 362 + .../pip/_vendor/packaging/metadata.py | 862 + .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 + .../pip/_vendor/packaging/specifiers.py | 1019 + .../pip/_vendor/packaging/tags.py | 656 + .../pip/_vendor/packaging/utils.py | 163 + .../pip/_vendor/packaging/version.py | 582 + .../pip/_vendor/pkg_resources/__init__.py | 3676 ++++ .../pip/_vendor/platformdirs/__init__.py | 631 + .../pip/_vendor/platformdirs/__main__.py | 55 + .../pip/_vendor/platformdirs/android.py | 249 + .../pip/_vendor/platformdirs/api.py | 299 + .../pip/_vendor/platformdirs/macos.py | 144 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 272 + .../pip/_vendor/platformdirs/version.py | 21 + .../pip/_vendor/platformdirs/windows.py | 272 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 940 + .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/lexer.py | 963 + .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../pip/_vendor/pygments/lexers/_mapping.py | 602 + .../pip/_vendor/pygments/lexers/python.py | 1201 ++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 72 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/__init__.py | 31 + .../pip/_vendor/pyproject_hooks/_impl.py | 410 + .../pyproject_hooks/_in_process/__init__.py | 21 + .../_in_process/_in_process.py | 389 + .../pip/_vendor/pyproject_hooks/py.typed | 0 .../pip/_vendor/requests/__init__.py | 179 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 719 + .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 314 + .../pip/_vendor/requests/certs.py | 17 + .../pip/_vendor/requests/compat.py | 90 + .../pip/_vendor/requests/cookies.py | 561 + .../pip/_vendor/requests/exceptions.py | 151 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1039 + .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/sessions.py | 831 + .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1086 + .../pip/_vendor/resolvelib/__init__.py | 27 + .../pip/_vendor/resolvelib/providers.py | 196 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 55 + .../_vendor/resolvelib/resolvers/__init__.py | 27 + .../_vendor/resolvelib/resolvers/abstract.py | 47 + .../_vendor/resolvelib/resolvers/criterion.py | 48 + .../resolvelib/resolvers/exceptions.py | 57 + .../resolvelib/resolvers/resolution.py | 622 + .../pip/_vendor/resolvelib/structs.py | 209 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 245 + .../pip/_vendor/rich/_cell_widths.py | 454 + .../pip/_vendor/rich/_emoji_codes.py | 3610 ++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 268 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 153 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 661 + .../pip/_vendor/rich/_windows.py | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 306 + .../site-packages/pip/_vendor/rich/ansi.py | 241 + .../site-packages/pip/_vendor/rich/bar.py | 93 + .../site-packages/pip/_vendor/rich/box.py | 474 + .../site-packages/pip/_vendor/rich/cells.py | 174 + .../site-packages/pip/_vendor/rich/color.py | 621 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2680 +++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 219 + .../pip/_vendor/rich/default_styles.py | 193 + .../pip/_vendor/rich/diagnose.py | 39 + .../site-packages/pip/_vendor/rich/emoji.py | 91 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 88 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 400 + .../pip/_vendor/rich/live_render.py | 106 + .../site-packages/pip/_vendor/rich/logging.py | 297 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 317 + .../site-packages/pip/_vendor/rich/pretty.py | 1016 + .../pip/_vendor/rich/progress.py | 1715 ++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 400 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 752 + .../site-packages/pip/_vendor/rich/spinner.py | 132 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 796 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 985 + .../site-packages/pip/_vendor/rich/table.py | 1006 + .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1361 ++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 899 + .../site-packages/pip/_vendor/rich/tree.py | 257 + .../pip/_vendor/tomli/__init__.py | 8 + .../pip/_vendor/tomli/_parser.py | 770 + .../site-packages/pip/_vendor/tomli/_re.py | 112 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/tomli_w/__init__.py | 4 + .../pip/_vendor/tomli_w/_writer.py | 229 + .../pip/_vendor/tomli_w/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 36 + .../pip/_vendor/truststore/_api.py | 333 + .../pip/_vendor/truststore/_macos.py | 571 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 567 + .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/urllib3/__init__.py | 102 + .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 + .../pip/_vendor/urllib3/connectionpool.py | 1140 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 920 + .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 + .../pip/_vendor/urllib3/poolmanager.py | 540 + .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 + .../pip/_vendor/urllib3/util/__init__.py | 49 + .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 + .../pip/_vendor/urllib3/util/ssl_.py | 504 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 19 + env/lib/python3.10/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3713 ++++ .../site-packages/pkg_resources/api_tests.txt | 424 + .../site-packages/pkg_resources/py.typed | 0 .../pkg_resources/tests/__init__.py | 0 .../data/my-test-package-source/setup.cfg | 0 .../data/my-test-package-source/setup.py | 7 + .../my-test-package-zip/my-test-package.zip | Bin 0 -> 1809 bytes .../tests/test_find_distributions.py | 56 + .../tests/test_integration_zope_interface.py | 54 + .../pkg_resources/tests/test_markers.py | 8 + .../pkg_resources/tests/test_pkg_resources.py | 485 + .../pkg_resources/tests/test_resources.py | 869 + .../pkg_resources/tests/test_working_set.py | 505 + .../pygments-2.19.2.dist-info/INSTALLER | 1 + .../pygments-2.19.2.dist-info/METADATA | 58 + .../pygments-2.19.2.dist-info/RECORD | 684 + .../pygments-2.19.2.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/AUTHORS | 291 + .../licenses/LICENSE | 25 + .../site-packages/pygments/__init__.py | 82 + .../site-packages/pygments/__main__.py | 17 + .../site-packages/pygments/cmdline.py | 668 + .../site-packages/pygments/console.py | 70 + .../site-packages/pygments/filter.py | 70 + .../pygments/filters/__init__.py | 940 + .../site-packages/pygments/formatter.py | 129 + .../pygments/formatters/__init__.py | 157 + .../pygments/formatters/_mapping.py | 23 + .../pygments/formatters/bbcode.py | 108 + .../pygments/formatters/groff.py | 170 + .../site-packages/pygments/formatters/html.py | 995 + .../site-packages/pygments/formatters/img.py | 686 + .../site-packages/pygments/formatters/irc.py | 154 + .../pygments/formatters/latex.py | 518 + .../pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../site-packages/pygments/formatters/rtf.py | 349 + .../site-packages/pygments/formatters/svg.py | 185 + .../pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../site-packages/pygments/lexer.py | 961 + .../site-packages/pygments/lexers/__init__.py | 362 + .../pygments/lexers/_ada_builtins.py | 103 + .../pygments/lexers/_asy_builtins.py | 1644 ++ .../pygments/lexers/_cl_builtins.py | 231 + .../pygments/lexers/_cocoa_builtins.py | 75 + .../pygments/lexers/_csound_builtins.py | 1780 ++ .../pygments/lexers/_css_builtins.py | 558 + .../pygments/lexers/_googlesql_builtins.py | 918 + .../pygments/lexers/_julia_builtins.py | 411 + .../pygments/lexers/_lasso_builtins.py | 5326 +++++ .../pygments/lexers/_lilypond_builtins.py | 4932 +++++ .../pygments/lexers/_lua_builtins.py | 285 + .../pygments/lexers/_luau_builtins.py | 62 + .../site-packages/pygments/lexers/_mapping.py | 602 + .../pygments/lexers/_mql_builtins.py | 1171 ++ .../pygments/lexers/_mysql_builtins.py | 1335 ++ .../pygments/lexers/_openedge_builtins.py | 2600 +++ .../pygments/lexers/_php_builtins.py | 3325 +++ .../pygments/lexers/_postgres_builtins.py | 739 + .../pygments/lexers/_qlik_builtins.py | 666 + .../pygments/lexers/_scheme_builtins.py | 1609 ++ .../pygments/lexers/_scilab_builtins.py | 3093 +++ .../pygments/lexers/_sourcemod_builtins.py | 1151 ++ .../pygments/lexers/_sql_builtins.py | 106 + .../pygments/lexers/_stan_builtins.py | 648 + .../pygments/lexers/_stata_builtins.py | 457 + .../pygments/lexers/_tsql_builtins.py | 1003 + .../pygments/lexers/_usd_builtins.py | 112 + .../pygments/lexers/_vbscript_builtins.py | 279 + .../pygments/lexers/_vim_builtins.py | 1938 ++ .../pygments/lexers/actionscript.py | 243 + .../site-packages/pygments/lexers/ada.py | 144 + .../site-packages/pygments/lexers/agile.py | 25 + .../site-packages/pygments/lexers/algebra.py | 299 + .../site-packages/pygments/lexers/ambient.py | 75 + .../site-packages/pygments/lexers/amdgpu.py | 54 + .../site-packages/pygments/lexers/ampl.py | 87 + .../site-packages/pygments/lexers/apdlexer.py | 593 + .../site-packages/pygments/lexers/apl.py | 103 + .../pygments/lexers/archetype.py | 315 + .../site-packages/pygments/lexers/arrow.py | 116 + .../site-packages/pygments/lexers/arturo.py | 249 + .../site-packages/pygments/lexers/asc.py | 55 + .../site-packages/pygments/lexers/asm.py | 1051 + .../site-packages/pygments/lexers/asn1.py | 178 + .../pygments/lexers/automation.py | 379 + .../site-packages/pygments/lexers/bare.py | 101 + .../site-packages/pygments/lexers/basic.py | 656 + .../site-packages/pygments/lexers/bdd.py | 57 + .../site-packages/pygments/lexers/berry.py | 99 + .../site-packages/pygments/lexers/bibtex.py | 159 + .../pygments/lexers/blueprint.py | 173 + .../site-packages/pygments/lexers/boa.py | 97 + .../site-packages/pygments/lexers/bqn.py | 112 + .../site-packages/pygments/lexers/business.py | 625 + .../site-packages/pygments/lexers/c_cpp.py | 414 + .../site-packages/pygments/lexers/c_like.py | 738 + .../pygments/lexers/capnproto.py | 74 + .../site-packages/pygments/lexers/carbon.py | 95 + .../site-packages/pygments/lexers/cddl.py | 172 + .../site-packages/pygments/lexers/chapel.py | 139 + .../site-packages/pygments/lexers/clean.py | 180 + .../site-packages/pygments/lexers/codeql.py | 80 + .../site-packages/pygments/lexers/comal.py | 81 + .../site-packages/pygments/lexers/compiled.py | 35 + .../site-packages/pygments/lexers/configs.py | 1433 ++ .../site-packages/pygments/lexers/console.py | 114 + .../site-packages/pygments/lexers/cplint.py | 43 + .../site-packages/pygments/lexers/crystal.py | 364 + .../site-packages/pygments/lexers/csound.py | 466 + .../site-packages/pygments/lexers/css.py | 602 + .../site-packages/pygments/lexers/d.py | 259 + .../site-packages/pygments/lexers/dalvik.py | 126 + .../site-packages/pygments/lexers/data.py | 763 + .../site-packages/pygments/lexers/dax.py | 135 + .../pygments/lexers/devicetree.py | 108 + .../site-packages/pygments/lexers/diff.py | 169 + .../site-packages/pygments/lexers/dns.py | 109 + .../site-packages/pygments/lexers/dotnet.py | 873 + .../site-packages/pygments/lexers/dsls.py | 970 + .../site-packages/pygments/lexers/dylan.py | 279 + .../site-packages/pygments/lexers/ecl.py | 144 + .../site-packages/pygments/lexers/eiffel.py | 68 + .../site-packages/pygments/lexers/elm.py | 123 + .../site-packages/pygments/lexers/elpi.py | 175 + .../site-packages/pygments/lexers/email.py | 132 + .../site-packages/pygments/lexers/erlang.py | 526 + .../site-packages/pygments/lexers/esoteric.py | 300 + .../site-packages/pygments/lexers/ezhil.py | 76 + .../site-packages/pygments/lexers/factor.py | 363 + .../site-packages/pygments/lexers/fantom.py | 251 + .../site-packages/pygments/lexers/felix.py | 275 + .../site-packages/pygments/lexers/fift.py | 68 + .../pygments/lexers/floscript.py | 81 + .../site-packages/pygments/lexers/forth.py | 178 + .../site-packages/pygments/lexers/fortran.py | 212 + .../site-packages/pygments/lexers/foxpro.py | 427 + .../site-packages/pygments/lexers/freefem.py | 893 + .../site-packages/pygments/lexers/func.py | 110 + .../pygments/lexers/functional.py | 21 + .../site-packages/pygments/lexers/futhark.py | 105 + .../pygments/lexers/gcodelexer.py | 35 + .../site-packages/pygments/lexers/gdscript.py | 189 + .../site-packages/pygments/lexers/gleam.py | 74 + .../site-packages/pygments/lexers/go.py | 97 + .../pygments/lexers/grammar_notation.py | 262 + .../site-packages/pygments/lexers/graph.py | 108 + .../site-packages/pygments/lexers/graphics.py | 794 + .../site-packages/pygments/lexers/graphql.py | 176 + .../site-packages/pygments/lexers/graphviz.py | 58 + .../site-packages/pygments/lexers/gsql.py | 103 + .../site-packages/pygments/lexers/hare.py | 73 + .../site-packages/pygments/lexers/haskell.py | 866 + .../site-packages/pygments/lexers/haxe.py | 935 + .../site-packages/pygments/lexers/hdl.py | 466 + .../site-packages/pygments/lexers/hexdump.py | 102 + .../site-packages/pygments/lexers/html.py | 670 + .../site-packages/pygments/lexers/idl.py | 284 + .../site-packages/pygments/lexers/igor.py | 435 + .../site-packages/pygments/lexers/inferno.py | 95 + .../pygments/lexers/installers.py | 352 + .../pygments/lexers/int_fiction.py | 1370 ++ .../site-packages/pygments/lexers/iolang.py | 61 + .../site-packages/pygments/lexers/j.py | 151 + .../pygments/lexers/javascript.py | 1591 ++ .../site-packages/pygments/lexers/jmespath.py | 69 + .../site-packages/pygments/lexers/jslt.py | 94 + .../site-packages/pygments/lexers/json5.py | 83 + .../site-packages/pygments/lexers/jsonnet.py | 169 + .../site-packages/pygments/lexers/jsx.py | 100 + .../site-packages/pygments/lexers/julia.py | 294 + .../site-packages/pygments/lexers/jvm.py | 1802 ++ .../site-packages/pygments/lexers/kuin.py | 332 + .../site-packages/pygments/lexers/kusto.py | 93 + .../site-packages/pygments/lexers/ldap.py | 155 + .../site-packages/pygments/lexers/lean.py | 241 + .../site-packages/pygments/lexers/lilypond.py | 225 + .../site-packages/pygments/lexers/lisp.py | 3146 +++ .../pygments/lexers/macaulay2.py | 1814 ++ .../site-packages/pygments/lexers/make.py | 212 + .../site-packages/pygments/lexers/maple.py | 291 + .../site-packages/pygments/lexers/markup.py | 1654 ++ .../site-packages/pygments/lexers/math.py | 21 + .../site-packages/pygments/lexers/matlab.py | 3307 +++ .../site-packages/pygments/lexers/maxima.py | 84 + .../site-packages/pygments/lexers/meson.py | 139 + .../site-packages/pygments/lexers/mime.py | 210 + .../pygments/lexers/minecraft.py | 391 + .../site-packages/pygments/lexers/mips.py | 130 + .../site-packages/pygments/lexers/ml.py | 958 + .../site-packages/pygments/lexers/modeling.py | 366 + .../site-packages/pygments/lexers/modula2.py | 1579 ++ .../site-packages/pygments/lexers/mojo.py | 707 + .../site-packages/pygments/lexers/monte.py | 203 + .../site-packages/pygments/lexers/mosel.py | 447 + .../site-packages/pygments/lexers/ncl.py | 894 + .../site-packages/pygments/lexers/nimrod.py | 199 + .../site-packages/pygments/lexers/nit.py | 63 + .../site-packages/pygments/lexers/nix.py | 144 + .../site-packages/pygments/lexers/numbair.py | 63 + .../site-packages/pygments/lexers/oberon.py | 120 + .../pygments/lexers/objective.py | 513 + .../site-packages/pygments/lexers/ooc.py | 84 + .../site-packages/pygments/lexers/openscad.py | 96 + .../site-packages/pygments/lexers/other.py | 41 + .../site-packages/pygments/lexers/parasail.py | 78 + .../site-packages/pygments/lexers/parsers.py | 798 + .../site-packages/pygments/lexers/pascal.py | 644 + .../site-packages/pygments/lexers/pawn.py | 202 + .../site-packages/pygments/lexers/pddl.py | 82 + .../site-packages/pygments/lexers/perl.py | 733 + .../site-packages/pygments/lexers/phix.py | 363 + .../site-packages/pygments/lexers/php.py | 334 + .../pygments/lexers/pointless.py | 70 + .../site-packages/pygments/lexers/pony.py | 93 + .../site-packages/pygments/lexers/praat.py | 303 + .../site-packages/pygments/lexers/procfile.py | 41 + .../site-packages/pygments/lexers/prolog.py | 318 + .../site-packages/pygments/lexers/promql.py | 176 + .../site-packages/pygments/lexers/prql.py | 251 + .../site-packages/pygments/lexers/ptx.py | 119 + .../site-packages/pygments/lexers/python.py | 1201 ++ .../site-packages/pygments/lexers/q.py | 187 + .../site-packages/pygments/lexers/qlik.py | 117 + .../site-packages/pygments/lexers/qvt.py | 153 + .../site-packages/pygments/lexers/r.py | 196 + .../site-packages/pygments/lexers/rdf.py | 468 + .../site-packages/pygments/lexers/rebol.py | 419 + .../site-packages/pygments/lexers/rego.py | 57 + .../site-packages/pygments/lexers/resource.py | 83 + .../site-packages/pygments/lexers/ride.py | 138 + .../site-packages/pygments/lexers/rita.py | 42 + .../site-packages/pygments/lexers/rnc.py | 66 + .../site-packages/pygments/lexers/roboconf.py | 81 + .../pygments/lexers/robotframework.py | 551 + .../site-packages/pygments/lexers/ruby.py | 518 + .../site-packages/pygments/lexers/rust.py | 222 + .../site-packages/pygments/lexers/sas.py | 227 + .../site-packages/pygments/lexers/savi.py | 171 + .../site-packages/pygments/lexers/scdoc.py | 85 + .../pygments/lexers/scripting.py | 1616 ++ .../site-packages/pygments/lexers/sgf.py | 59 + .../site-packages/pygments/lexers/shell.py | 902 + .../site-packages/pygments/lexers/sieve.py | 78 + .../site-packages/pygments/lexers/slash.py | 183 + .../pygments/lexers/smalltalk.py | 194 + .../site-packages/pygments/lexers/smithy.py | 77 + .../site-packages/pygments/lexers/smv.py | 78 + .../site-packages/pygments/lexers/snobol.py | 82 + .../site-packages/pygments/lexers/solidity.py | 87 + .../site-packages/pygments/lexers/soong.py | 78 + .../site-packages/pygments/lexers/sophia.py | 102 + .../site-packages/pygments/lexers/special.py | 122 + .../site-packages/pygments/lexers/spice.py | 70 + .../site-packages/pygments/lexers/sql.py | 1109 + .../site-packages/pygments/lexers/srcinfo.py | 62 + .../site-packages/pygments/lexers/stata.py | 170 + .../pygments/lexers/supercollider.py | 94 + .../site-packages/pygments/lexers/tablegen.py | 177 + .../site-packages/pygments/lexers/tact.py | 303 + .../site-packages/pygments/lexers/tal.py | 77 + .../site-packages/pygments/lexers/tcl.py | 148 + .../site-packages/pygments/lexers/teal.py | 88 + .../pygments/lexers/templates.py | 2355 +++ .../site-packages/pygments/lexers/teraterm.py | 325 + .../site-packages/pygments/lexers/testing.py | 209 + .../site-packages/pygments/lexers/text.py | 27 + .../site-packages/pygments/lexers/textedit.py | 205 + .../site-packages/pygments/lexers/textfmts.py | 436 + .../site-packages/pygments/lexers/theorem.py | 410 + .../site-packages/pygments/lexers/thingsdb.py | 140 + .../site-packages/pygments/lexers/tlb.py | 59 + .../site-packages/pygments/lexers/tls.py | 54 + .../site-packages/pygments/lexers/tnt.py | 270 + .../pygments/lexers/trafficscript.py | 51 + .../pygments/lexers/typoscript.py | 216 + .../site-packages/pygments/lexers/typst.py | 160 + .../site-packages/pygments/lexers/ul4.py | 309 + .../site-packages/pygments/lexers/unicon.py | 413 + .../site-packages/pygments/lexers/urbi.py | 145 + .../site-packages/pygments/lexers/usd.py | 85 + .../site-packages/pygments/lexers/varnish.py | 189 + .../pygments/lexers/verification.py | 113 + .../site-packages/pygments/lexers/verifpal.py | 65 + .../site-packages/pygments/lexers/vip.py | 150 + .../site-packages/pygments/lexers/vyper.py | 140 + .../site-packages/pygments/lexers/web.py | 24 + .../pygments/lexers/webassembly.py | 119 + .../site-packages/pygments/lexers/webidl.py | 298 + .../site-packages/pygments/lexers/webmisc.py | 1006 + .../site-packages/pygments/lexers/wgsl.py | 406 + .../site-packages/pygments/lexers/whiley.py | 115 + .../site-packages/pygments/lexers/wowtoc.py | 120 + .../site-packages/pygments/lexers/wren.py | 98 + .../site-packages/pygments/lexers/x10.py | 66 + .../site-packages/pygments/lexers/xorg.py | 38 + .../site-packages/pygments/lexers/yang.py | 103 + .../site-packages/pygments/lexers/yara.py | 69 + .../site-packages/pygments/lexers/zig.py | 125 + .../site-packages/pygments/modeline.py | 43 + .../site-packages/pygments/plugin.py | 72 + .../site-packages/pygments/regexopt.py | 91 + .../site-packages/pygments/scanner.py | 104 + .../site-packages/pygments/sphinxext.py | 247 + .../site-packages/pygments/style.py | 203 + .../site-packages/pygments/styles/__init__.py | 61 + .../site-packages/pygments/styles/_mapping.py | 54 + .../site-packages/pygments/styles/abap.py | 32 + .../site-packages/pygments/styles/algol.py | 65 + .../site-packages/pygments/styles/algol_nu.py | 65 + .../site-packages/pygments/styles/arduino.py | 100 + .../site-packages/pygments/styles/autumn.py | 67 + .../site-packages/pygments/styles/borland.py | 53 + .../site-packages/pygments/styles/bw.py | 52 + .../site-packages/pygments/styles/coffee.py | 80 + .../site-packages/pygments/styles/colorful.py | 83 + .../site-packages/pygments/styles/default.py | 76 + .../site-packages/pygments/styles/dracula.py | 90 + .../site-packages/pygments/styles/emacs.py | 75 + .../site-packages/pygments/styles/friendly.py | 76 + .../pygments/styles/friendly_grayscale.py | 80 + .../site-packages/pygments/styles/fruity.py | 47 + .../site-packages/pygments/styles/gh_dark.py | 113 + .../site-packages/pygments/styles/gruvbox.py | 118 + .../site-packages/pygments/styles/igor.py | 32 + .../site-packages/pygments/styles/inkpot.py | 72 + .../pygments/styles/lightbulb.py | 110 + .../site-packages/pygments/styles/lilypond.py | 62 + .../site-packages/pygments/styles/lovelace.py | 100 + .../site-packages/pygments/styles/manni.py | 79 + .../site-packages/pygments/styles/material.py | 124 + .../site-packages/pygments/styles/monokai.py | 112 + .../site-packages/pygments/styles/murphy.py | 82 + .../site-packages/pygments/styles/native.py | 70 + .../site-packages/pygments/styles/nord.py | 156 + .../site-packages/pygments/styles/onedark.py | 63 + .../pygments/styles/paraiso_dark.py | 124 + .../pygments/styles/paraiso_light.py | 124 + .../site-packages/pygments/styles/pastie.py | 78 + .../site-packages/pygments/styles/perldoc.py | 73 + .../pygments/styles/rainbow_dash.py | 95 + .../site-packages/pygments/styles/rrt.py | 40 + .../site-packages/pygments/styles/sas.py | 46 + .../pygments/styles/solarized.py | 144 + .../pygments/styles/staroffice.py | 31 + .../pygments/styles/stata_dark.py | 42 + .../pygments/styles/stata_light.py | 42 + .../site-packages/pygments/styles/tango.py | 143 + .../site-packages/pygments/styles/trac.py | 66 + .../site-packages/pygments/styles/vim.py | 67 + .../site-packages/pygments/styles/vs.py | 41 + .../site-packages/pygments/styles/xcode.py | 53 + .../site-packages/pygments/styles/zenburn.py | 83 + .../site-packages/pygments/token.py | 214 + .../site-packages/pygments/unistring.py | 153 + .../python3.10/site-packages/pygments/util.py | 324 + .../pyyaml-6.0.3.dist-info/INSTALLER | 1 + .../pyyaml-6.0.3.dist-info/METADATA | 59 + .../pyyaml-6.0.3.dist-info/RECORD | 43 + .../pyyaml-6.0.3.dist-info/WHEEL | 6 + .../pyyaml-6.0.3.dist-info/licenses/LICENSE | 20 + .../pyyaml-6.0.3.dist-info/top_level.txt | 2 + .../rich-13.9.4.dist-info/INSTALLER | 1 + .../rich-13.9.4.dist-info/LICENSE | 19 + .../rich-13.9.4.dist-info/METADATA | 473 + .../rich-13.9.4.dist-info/RECORD | 162 + .../site-packages/rich-13.9.4.dist-info/WHEEL | 4 + .../python3.10/site-packages/rich/__init__.py | 177 + .../python3.10/site-packages/rich/__main__.py | 273 + .../site-packages/rich/_cell_widths.py | 454 + .../site-packages/rich/_emoji_codes.py | 3610 ++++ .../site-packages/rich/_emoji_replace.py | 32 + .../site-packages/rich/_export_format.py | 76 + .../site-packages/rich/_extension.py | 10 + .../python3.10/site-packages/rich/_fileno.py | 24 + .../python3.10/site-packages/rich/_inspect.py | 268 + .../site-packages/rich/_log_render.py | 94 + .../python3.10/site-packages/rich/_loop.py | 43 + .../site-packages/rich/_null_file.py | 69 + .../site-packages/rich/_palettes.py | 309 + .../python3.10/site-packages/rich/_pick.py | 17 + .../python3.10/site-packages/rich/_ratio.py | 159 + .../site-packages/rich/_spinners.py | 482 + .../python3.10/site-packages/rich/_stack.py | 16 + .../python3.10/site-packages/rich/_timer.py | 19 + .../site-packages/rich/_win32_console.py | 661 + .../python3.10/site-packages/rich/_windows.py | 71 + .../site-packages/rich/_windows_renderer.py | 56 + .../python3.10/site-packages/rich/_wrap.py | 93 + env/lib/python3.10/site-packages/rich/abc.py | 33 + .../python3.10/site-packages/rich/align.py | 312 + env/lib/python3.10/site-packages/rich/ansi.py | 241 + env/lib/python3.10/site-packages/rich/bar.py | 93 + env/lib/python3.10/site-packages/rich/box.py | 480 + .../python3.10/site-packages/rich/cells.py | 174 + .../python3.10/site-packages/rich/color.py | 621 + .../site-packages/rich/color_triplet.py | 38 + .../python3.10/site-packages/rich/columns.py | 187 + .../python3.10/site-packages/rich/console.py | 2661 +++ .../site-packages/rich/constrain.py | 37 + .../site-packages/rich/containers.py | 167 + .../python3.10/site-packages/rich/control.py | 225 + .../site-packages/rich/default_styles.py | 191 + .../python3.10/site-packages/rich/diagnose.py | 37 + .../python3.10/site-packages/rich/emoji.py | 96 + .../python3.10/site-packages/rich/errors.py | 34 + .../site-packages/rich/file_proxy.py | 57 + .../python3.10/site-packages/rich/filesize.py | 88 + .../site-packages/rich/highlighter.py | 232 + env/lib/python3.10/site-packages/rich/json.py | 139 + .../python3.10/site-packages/rich/jupyter.py | 101 + .../python3.10/site-packages/rich/layout.py | 442 + env/lib/python3.10/site-packages/rich/live.py | 375 + .../site-packages/rich/live_render.py | 112 + .../python3.10/site-packages/rich/logging.py | 297 + .../python3.10/site-packages/rich/markdown.py | 784 + .../python3.10/site-packages/rich/markup.py | 251 + .../python3.10/site-packages/rich/measure.py | 151 + .../python3.10/site-packages/rich/padding.py | 141 + .../python3.10/site-packages/rich/pager.py | 34 + .../python3.10/site-packages/rich/palette.py | 100 + .../python3.10/site-packages/rich/panel.py | 318 + .../python3.10/site-packages/rich/pretty.py | 1016 + .../python3.10/site-packages/rich/progress.py | 1715 ++ .../site-packages/rich/progress_bar.py | 223 + .../python3.10/site-packages/rich/prompt.py | 400 + .../python3.10/site-packages/rich/protocol.py | 42 + .../python3.10/site-packages/rich/py.typed | 0 .../python3.10/site-packages/rich/region.py | 10 + env/lib/python3.10/site-packages/rich/repr.py | 149 + env/lib/python3.10/site-packages/rich/rule.py | 130 + .../python3.10/site-packages/rich/scope.py | 86 + .../python3.10/site-packages/rich/screen.py | 54 + .../python3.10/site-packages/rich/segment.py | 752 + .../python3.10/site-packages/rich/spinner.py | 138 + .../python3.10/site-packages/rich/status.py | 131 + .../python3.10/site-packages/rich/style.py | 796 + .../python3.10/site-packages/rich/styled.py | 42 + .../python3.10/site-packages/rich/syntax.py | 966 + .../python3.10/site-packages/rich/table.py | 1007 + .../site-packages/rich/terminal_theme.py | 153 + env/lib/python3.10/site-packages/rich/text.py | 1361 ++ .../python3.10/site-packages/rich/theme.py | 115 + .../python3.10/site-packages/rich/themes.py | 5 + .../site-packages/rich/traceback.py | 797 + env/lib/python3.10/site-packages/rich/tree.py | 257 + .../setuptools-80.9.0.dist-info/INSTALLER | 1 + .../setuptools-80.9.0.dist-info/METADATA | 141 + .../setuptools-80.9.0.dist-info/RECORD | 869 + .../setuptools-80.9.0.dist-info/REQUESTED | 0 .../setuptools-80.9.0.dist-info/WHEEL | 5 + .../entry_points.txt | 51 + .../licenses/LICENSE | 17 + .../setuptools-80.9.0.dist-info/top_level.txt | 3 + .../site-packages/setuptools/__init__.py | 248 + .../setuptools/_core_metadata.py | 337 + .../site-packages/setuptools/_discovery.py | 33 + .../setuptools/_distutils/__init__.py | 14 + .../setuptools/_distutils/_log.py | 3 + .../setuptools/_distutils/_macos_compat.py | 12 + .../setuptools/_distutils/_modified.py | 95 + .../setuptools/_distutils/_msvccompiler.py | 16 + .../setuptools/_distutils/archive_util.py | 294 + .../setuptools/_distutils/ccompiler.py | 26 + .../setuptools/_distutils/cmd.py | 554 + .../setuptools/_distutils/command/__init__.py | 23 + .../_distutils/command/_framework_compat.py | 54 + .../setuptools/_distutils/command/bdist.py | 167 + .../_distutils/command/bdist_dumb.py | 141 + .../_distutils/command/bdist_rpm.py | 598 + .../setuptools/_distutils/command/build.py | 156 + .../_distutils/command/build_clib.py | 201 + .../_distutils/command/build_ext.py | 812 + .../setuptools/_distutils/command/build_py.py | 407 + .../_distutils/command/build_scripts.py | 160 + .../setuptools/_distutils/command/check.py | 152 + .../setuptools/_distutils/command/clean.py | 77 + .../setuptools/_distutils/command/config.py | 358 + .../setuptools/_distutils/command/install.py | 805 + .../_distutils/command/install_data.py | 94 + .../_distutils/command/install_egg_info.py | 91 + .../_distutils/command/install_headers.py | 46 + .../_distutils/command/install_lib.py | 238 + .../_distutils/command/install_scripts.py | 62 + .../setuptools/_distutils/command/sdist.py | 521 + .../setuptools/_distutils/compat/__init__.py | 18 + .../setuptools/_distutils/compat/numpy.py | 2 + .../setuptools/_distutils/compat/py39.py | 66 + .../setuptools/_distutils/compilers/C/base.py | 1394 ++ .../_distutils/compilers/C/cygwin.py | 340 + .../_distutils/compilers/C/errors.py | 24 + .../setuptools/_distutils/compilers/C/msvc.py | 614 + .../_distutils/compilers/C/tests/test_base.py | 83 + .../compilers/C/tests/test_cygwin.py | 76 + .../compilers/C/tests/test_mingw.py | 48 + .../_distutils/compilers/C/tests/test_msvc.py | 136 + .../_distutils/compilers/C/tests/test_unix.py | 413 + .../setuptools/_distutils/compilers/C/unix.py | 422 + .../setuptools/_distutils/compilers/C/zos.py | 230 + .../setuptools/_distutils/core.py | 289 + .../setuptools/_distutils/cygwinccompiler.py | 31 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 14 + .../setuptools/_distutils/dir_util.py | 244 + .../setuptools/_distutils/dist.py | 1386 ++ .../setuptools/_distutils/errors.py | 108 + .../setuptools/_distutils/extension.py | 258 + .../setuptools/_distutils/fancy_getopt.py | 471 + .../setuptools/_distutils/file_util.py | 236 + .../setuptools/_distutils/filelist.py | 431 + .../setuptools/_distutils/log.py | 56 + .../setuptools/_distutils/spawn.py | 134 + .../setuptools/_distutils/sysconfig.py | 598 + .../setuptools/_distutils/tests/__init__.py | 42 + .../_distutils/tests/compat/__init__.py | 0 .../_distutils/tests/compat/py39.py | 40 + .../setuptools/_distutils/tests/support.py | 134 + .../_distutils/tests/test_archive_util.py | 353 + .../setuptools/_distutils/tests/test_bdist.py | 47 + .../_distutils/tests/test_bdist_dumb.py | 78 + .../_distutils/tests/test_bdist_rpm.py | 127 + .../setuptools/_distutils/tests/test_build.py | 49 + .../_distutils/tests/test_build_clib.py | 134 + .../_distutils/tests/test_build_ext.py | 628 + .../_distutils/tests/test_build_py.py | 196 + .../_distutils/tests/test_build_scripts.py | 96 + .../setuptools/_distutils/tests/test_check.py | 194 + .../setuptools/_distutils/tests/test_clean.py | 45 + .../setuptools/_distutils/tests/test_cmd.py | 107 + .../_distutils/tests/test_config_cmd.py | 87 + .../setuptools/_distutils/tests/test_core.py | 130 + .../_distutils/tests/test_dir_util.py | 139 + .../setuptools/_distutils/tests/test_dist.py | 552 + .../_distutils/tests/test_extension.py | 117 + .../_distutils/tests/test_file_util.py | 95 + .../_distutils/tests/test_filelist.py | 336 + .../_distutils/tests/test_install.py | 245 + .../_distutils/tests/test_install_data.py | 74 + .../_distutils/tests/test_install_headers.py | 33 + .../_distutils/tests/test_install_lib.py | 110 + .../_distutils/tests/test_install_scripts.py | 52 + .../setuptools/_distutils/tests/test_log.py | 12 + .../_distutils/tests/test_modified.py | 126 + .../setuptools/_distutils/tests/test_sdist.py | 470 + .../setuptools/_distutils/tests/test_spawn.py | 141 + .../_distutils/tests/test_sysconfig.py | 319 + .../_distutils/tests/test_text_file.py | 127 + .../setuptools/_distutils/tests/test_util.py | 243 + .../_distutils/tests/test_version.py | 80 + .../_distutils/tests/test_versionpredicate.py | 0 .../_distutils/tests/unix_compat.py | 17 + .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 9 + .../setuptools/_distutils/util.py | 518 + .../setuptools/_distutils/version.py | 348 + .../setuptools/_distutils/versionpredicate.py | 175 + .../setuptools/_distutils/zosccompiler.py | 3 + .../site-packages/setuptools/_entry_points.py | 94 + .../site-packages/setuptools/_imp.py | 87 + .../site-packages/setuptools/_importlib.py | 9 + .../site-packages/setuptools/_itertools.py | 23 + .../setuptools/_normalization.py | 177 + .../site-packages/setuptools/_path.py | 93 + .../site-packages/setuptools/_reqs.py | 42 + .../site-packages/setuptools/_scripts.py | 361 + .../site-packages/setuptools/_shutil.py | 59 + .../site-packages/setuptools/_static.py | 188 + .../autocommand-2.2.2.dist-info/INSTALLER | 1 + .../autocommand-2.2.2.dist-info/LICENSE | 166 + .../autocommand-2.2.2.dist-info/METADATA | 420 + .../autocommand-2.2.2.dist-info/RECORD | 18 + .../_vendor/autocommand-2.2.2.dist-info/WHEEL | 5 + .../autocommand-2.2.2.dist-info/top_level.txt | 1 + .../_vendor/autocommand/__init__.py | 27 + .../_vendor/autocommand/autoasync.py | 142 + .../_vendor/autocommand/autocommand.py | 70 + .../_vendor/autocommand/automain.py | 59 + .../_vendor/autocommand/autoparse.py | 333 + .../setuptools/_vendor/autocommand/errors.py | 23 + .../INSTALLER | 1 + .../backports.tarfile-1.2.0.dist-info/LICENSE | 17 + .../METADATA | 46 + .../backports.tarfile-1.2.0.dist-info/RECORD | 17 + .../REQUESTED | 0 .../backports.tarfile-1.2.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../setuptools/_vendor/backports/__init__.py | 1 + .../_vendor/backports/tarfile/__init__.py | 2937 +++ .../_vendor/backports/tarfile/__main__.py | 5 + .../backports/tarfile/compat/__init__.py | 0 .../_vendor/backports/tarfile/compat/py38.py | 24 + .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 129 + .../importlib_metadata-8.0.0.dist-info/RECORD | 32 + .../REQUESTED | 0 .../importlib_metadata-8.0.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../_vendor/importlib_metadata/__init__.py | 1083 + .../_vendor/importlib_metadata/_adapters.py | 83 + .../importlib_metadata/_collections.py | 30 + .../_vendor/importlib_metadata/_compat.py | 57 + .../_vendor/importlib_metadata/_functools.py | 104 + .../_vendor/importlib_metadata/_itertools.py | 73 + .../_vendor/importlib_metadata/_meta.py | 67 + .../_vendor/importlib_metadata/_text.py | 99 + .../importlib_metadata/compat/__init__.py | 0 .../importlib_metadata/compat/py311.py | 22 + .../_vendor/importlib_metadata/compat/py39.py | 36 + .../_vendor/importlib_metadata/diagnose.py | 21 + .../_vendor/importlib_metadata/py.typed | 0 .../_vendor/inflect-7.3.1.dist-info/INSTALLER | 1 + .../_vendor/inflect-7.3.1.dist-info/LICENSE | 17 + .../_vendor/inflect-7.3.1.dist-info/METADATA | 591 + .../_vendor/inflect-7.3.1.dist-info/RECORD | 13 + .../_vendor/inflect-7.3.1.dist-info/WHEEL | 5 + .../inflect-7.3.1.dist-info/top_level.txt | 1 + .../setuptools/_vendor/inflect/__init__.py | 3986 ++++ .../_vendor/inflect/compat/__init__.py | 0 .../setuptools/_vendor/inflect/compat/py38.py | 7 + .../setuptools/_vendor/inflect/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 17 + .../METADATA | 85 + .../jaraco.collections-5.1.0.dist-info/RECORD | 10 + .../REQUESTED | 0 .../jaraco.collections-5.1.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../jaraco.context-5.3.0.dist-info/INSTALLER | 1 + .../jaraco.context-5.3.0.dist-info/LICENSE | 17 + .../jaraco.context-5.3.0.dist-info/METADATA | 75 + .../jaraco.context-5.3.0.dist-info/RECORD | 8 + .../jaraco.context-5.3.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../INSTALLER | 1 + .../jaraco.functools-4.0.1.dist-info/LICENSE | 17 + .../jaraco.functools-4.0.1.dist-info/METADATA | 64 + .../jaraco.functools-4.0.1.dist-info/RECORD | 10 + .../jaraco.functools-4.0.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../jaraco.text-3.12.1.dist-info/INSTALLER | 1 + .../jaraco.text-3.12.1.dist-info/LICENSE | 17 + .../jaraco.text-3.12.1.dist-info/METADATA | 95 + .../jaraco.text-3.12.1.dist-info/RECORD | 20 + .../jaraco.text-3.12.1.dist-info/REQUESTED | 0 .../jaraco.text-3.12.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../_vendor/jaraco/collections/__init__.py | 1091 + .../_vendor/jaraco/collections/py.typed | 0 .../setuptools/_vendor/jaraco/context.py | 361 + .../_vendor/jaraco/functools/__init__.py | 633 + .../_vendor/jaraco/functools/__init__.pyi | 125 + .../_vendor/jaraco/functools/py.typed | 0 .../_vendor/jaraco/text/Lorem ipsum.txt | 2 + .../_vendor/jaraco/text/__init__.py | 624 + .../setuptools/_vendor/jaraco/text/layouts.py | 25 + .../_vendor/jaraco/text/show-newlines.py | 33 + .../_vendor/jaraco/text/strip-prefix.py | 21 + .../_vendor/jaraco/text/to-dvorak.py | 6 + .../_vendor/jaraco/text/to-qwerty.py | 6 + .../more_itertools-10.3.0.dist-info/INSTALLER | 1 + .../more_itertools-10.3.0.dist-info/LICENSE | 19 + .../more_itertools-10.3.0.dist-info/METADATA | 266 + .../more_itertools-10.3.0.dist-info/RECORD | 16 + .../more_itertools-10.3.0.dist-info/REQUESTED | 0 .../more_itertools-10.3.0.dist-info/WHEEL | 4 + .../_vendor/more_itertools/__init__.py | 6 + .../_vendor/more_itertools/__init__.pyi | 2 + .../setuptools/_vendor/more_itertools/more.py | 4806 +++++ .../_vendor/more_itertools/more.pyi | 709 + .../_vendor/more_itertools/py.typed | 0 .../_vendor/more_itertools/recipes.py | 1046 + .../_vendor/more_itertools/recipes.pyi | 136 + .../packaging-24.2.dist-info/INSTALLER | 1 + .../_vendor/packaging-24.2.dist-info/LICENSE | 3 + .../packaging-24.2.dist-info/LICENSE.APACHE | 177 + .../packaging-24.2.dist-info/LICENSE.BSD | 23 + .../_vendor/packaging-24.2.dist-info/METADATA | 102 + .../_vendor/packaging-24.2.dist-info/RECORD | 25 + .../packaging-24.2.dist-info/REQUESTED | 0 .../_vendor/packaging-24.2.dist-info/WHEEL | 4 + .../setuptools/_vendor/packaging/__init__.py | 15 + .../setuptools/_vendor/packaging/_elffile.py | 110 + .../_vendor/packaging/_manylinux.py | 263 + .../_vendor/packaging/_musllinux.py | 85 + .../setuptools/_vendor/packaging/_parser.py | 354 + .../_vendor/packaging/_structures.py | 61 + .../_vendor/packaging/_tokenizer.py | 194 + .../_vendor/packaging/licenses/__init__.py | 145 + .../_vendor/packaging/licenses/_spdx.py | 759 + .../setuptools/_vendor/packaging/markers.py | 331 + .../setuptools/_vendor/packaging/metadata.py | 863 + .../setuptools/_vendor/packaging/py.typed | 0 .../_vendor/packaging/requirements.py | 91 + .../_vendor/packaging/specifiers.py | 1020 + .../setuptools/_vendor/packaging/tags.py | 617 + .../setuptools/_vendor/packaging/utils.py | 163 + .../setuptools/_vendor/packaging/version.py | 582 + .../platformdirs-4.2.2.dist-info/INSTALLER | 1 + .../platformdirs-4.2.2.dist-info/METADATA | 319 + .../platformdirs-4.2.2.dist-info/RECORD | 23 + .../platformdirs-4.2.2.dist-info/REQUESTED | 0 .../platformdirs-4.2.2.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../_vendor/platformdirs/__init__.py | 627 + .../_vendor/platformdirs/__main__.py | 55 + .../_vendor/platformdirs/android.py | 249 + .../setuptools/_vendor/platformdirs/api.py | 292 + .../setuptools/_vendor/platformdirs/macos.py | 130 + .../setuptools/_vendor/platformdirs/py.typed | 0 .../setuptools/_vendor/platformdirs/unix.py | 275 + .../_vendor/platformdirs/version.py | 16 + .../_vendor/platformdirs/windows.py | 272 + .../_vendor/tomli-2.0.1.dist-info/INSTALLER | 1 + .../_vendor/tomli-2.0.1.dist-info/LICENSE | 21 + .../_vendor/tomli-2.0.1.dist-info/METADATA | 206 + .../_vendor/tomli-2.0.1.dist-info/RECORD | 15 + .../_vendor/tomli-2.0.1.dist-info/REQUESTED | 0 .../_vendor/tomli-2.0.1.dist-info/WHEEL | 4 + .../setuptools/_vendor/tomli/__init__.py | 11 + .../setuptools/_vendor/tomli/_parser.py | 691 + .../setuptools/_vendor/tomli/_re.py | 107 + .../setuptools/_vendor/tomli/_types.py | 10 + .../setuptools/_vendor/tomli/py.typed | 1 + .../typeguard-4.3.0.dist-info/INSTALLER | 1 + .../_vendor/typeguard-4.3.0.dist-info/LICENSE | 19 + .../typeguard-4.3.0.dist-info/METADATA | 81 + .../_vendor/typeguard-4.3.0.dist-info/RECORD | 34 + .../_vendor/typeguard-4.3.0.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../typeguard-4.3.0.dist-info/top_level.txt | 1 + .../setuptools/_vendor/typeguard/__init__.py | 48 + .../setuptools/_vendor/typeguard/_checkers.py | 993 + .../setuptools/_vendor/typeguard/_config.py | 108 + .../_vendor/typeguard/_decorators.py | 235 + .../_vendor/typeguard/_exceptions.py | 42 + .../_vendor/typeguard/_functions.py | 308 + .../_vendor/typeguard/_importhook.py | 213 + .../setuptools/_vendor/typeguard/_memo.py | 48 + .../_vendor/typeguard/_pytest_plugin.py | 127 + .../_vendor/typeguard/_suppression.py | 86 + .../_vendor/typeguard/_transformer.py | 1229 ++ .../_vendor/typeguard/_union_transformer.py | 55 + .../setuptools/_vendor/typeguard/_utils.py | 173 + .../setuptools/_vendor/typeguard/py.typed | 0 .../INSTALLER | 1 + .../LICENSE | 279 + .../METADATA | 67 + .../typing_extensions-4.12.2.dist-info/RECORD | 7 + .../typing_extensions-4.12.2.dist-info/WHEEL | 4 + .../setuptools/_vendor/typing_extensions.py | 3641 ++++ .../_vendor/wheel-0.45.1.dist-info/INSTALLER | 1 + .../wheel-0.45.1.dist-info/LICENSE.txt | 21 + .../_vendor/wheel-0.45.1.dist-info/METADATA | 66 + .../_vendor/wheel-0.45.1.dist-info/RECORD | 68 + .../_vendor/wheel-0.45.1.dist-info/REQUESTED | 0 .../_vendor/wheel-0.45.1.dist-info/WHEEL | 4 + .../wheel-0.45.1.dist-info/entry_points.txt | 6 + .../setuptools/_vendor/wheel/__init__.py | 3 + .../setuptools/_vendor/wheel/__main__.py | 23 + .../setuptools/_vendor/wheel/_bdist_wheel.py | 613 + .../_vendor/wheel/_setuptools_logging.py | 26 + .../setuptools/_vendor/wheel/bdist_wheel.py | 26 + .../setuptools/_vendor/wheel/cli/__init__.py | 155 + .../setuptools/_vendor/wheel/cli/convert.py | 332 + .../setuptools/_vendor/wheel/cli/pack.py | 85 + .../setuptools/_vendor/wheel/cli/tags.py | 139 + .../setuptools/_vendor/wheel/cli/unpack.py | 30 + .../_vendor/wheel/macosx_libfile.py | 482 + .../setuptools/_vendor/wheel/metadata.py | 183 + .../setuptools/_vendor/wheel/util.py | 17 + .../_vendor/wheel/vendored/__init__.py | 0 .../_vendor/wheel/vendored/packaging/LICENSE | 3 + .../wheel/vendored/packaging/LICENSE.APACHE | 177 + .../wheel/vendored/packaging/LICENSE.BSD | 23 + .../wheel/vendored/packaging/__init__.py | 0 .../wheel/vendored/packaging/_elffile.py | 108 + .../wheel/vendored/packaging/_manylinux.py | 260 + .../wheel/vendored/packaging/_musllinux.py | 83 + .../wheel/vendored/packaging/_parser.py | 356 + .../wheel/vendored/packaging/_structures.py | 61 + .../wheel/vendored/packaging/_tokenizer.py | 192 + .../wheel/vendored/packaging/markers.py | 253 + .../wheel/vendored/packaging/requirements.py | 90 + .../wheel/vendored/packaging/specifiers.py | 1011 + .../_vendor/wheel/vendored/packaging/tags.py | 571 + .../_vendor/wheel/vendored/packaging/utils.py | 172 + .../wheel/vendored/packaging/version.py | 561 + .../_vendor/wheel/vendored/vendor.txt | 1 + .../setuptools/_vendor/wheel/wheelfile.py | 227 + .../_vendor/zipp-3.19.2.dist-info/INSTALLER | 1 + .../_vendor/zipp-3.19.2.dist-info/LICENSE | 17 + .../_vendor/zipp-3.19.2.dist-info/METADATA | 102 + .../_vendor/zipp-3.19.2.dist-info/RECORD | 15 + .../_vendor/zipp-3.19.2.dist-info/REQUESTED | 0 .../_vendor/zipp-3.19.2.dist-info/WHEEL | 5 + .../zipp-3.19.2.dist-info/top_level.txt | 1 + .../setuptools/_vendor/zipp/__init__.py | 501 + .../_vendor/zipp/compat/__init__.py | 0 .../setuptools/_vendor/zipp/compat/py310.py | 11 + .../setuptools/_vendor/zipp/glob.py | 106 + .../site-packages/setuptools/archive_util.py | 219 + .../site-packages/setuptools/build_meta.py | 548 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 11776 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 14336 bytes .../site-packages/setuptools/cli-arm64.exe | Bin 0 -> 13824 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 11776 bytes .../setuptools/command/__init__.py | 21 + .../setuptools/command/_requirestxt.py | 131 + .../site-packages/setuptools/command/alias.py | 77 + .../setuptools/command/bdist_egg.py | 477 + .../setuptools/command/bdist_rpm.py | 42 + .../setuptools/command/bdist_wheel.py | 604 + .../site-packages/setuptools/command/build.py | 135 + .../setuptools/command/build_clib.py | 103 + .../setuptools/command/build_ext.py | 470 + .../setuptools/command/build_py.py | 400 + .../setuptools/command/develop.py | 55 + .../setuptools/command/dist_info.py | 103 + .../setuptools/command/easy_install.py | 30 + .../setuptools/command/editable_wheel.py | 908 + .../setuptools/command/egg_info.py | 718 + .../setuptools/command/install.py | 131 + .../setuptools/command/install_egg_info.py | 58 + .../setuptools/command/install_lib.py | 137 + .../setuptools/command/install_scripts.py | 67 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/rotate.py | 65 + .../setuptools/command/saveopts.py | 21 + .../site-packages/setuptools/command/sdist.py | 217 + .../setuptools/command/setopt.py | 141 + .../site-packages/setuptools/command/test.py | 45 + .../setuptools/compat/__init__.py | 0 .../site-packages/setuptools/compat/py310.py | 20 + .../site-packages/setuptools/compat/py311.py | 27 + .../site-packages/setuptools/compat/py312.py | 13 + .../site-packages/setuptools/compat/py39.py | 9 + .../site-packages/setuptools/config/NOTICE | 10 + .../setuptools/config/__init__.py | 43 + .../setuptools/config/_apply_pyprojecttoml.py | 526 + .../config/_validate_pyproject/NOTICE | 438 + .../config/_validate_pyproject/__init__.py | 34 + .../_validate_pyproject/error_reporting.py | 336 + .../_validate_pyproject/extra_validations.py | 82 + .../fastjsonschema_exceptions.py | 51 + .../fastjsonschema_validations.py | 1412 ++ .../config/_validate_pyproject/formats.py | 402 + .../setuptools/config/distutils.schema.json | 26 + .../site-packages/setuptools/config/expand.py | 452 + .../setuptools/config/pyprojecttoml.py | 468 + .../setuptools/config/setupcfg.py | 780 + .../setuptools/config/setuptools.schema.json | 433 + .../site-packages/setuptools/depends.py | 185 + .../site-packages/setuptools/discovery.py | 614 + .../site-packages/setuptools/dist.py | 1119 ++ .../site-packages/setuptools/errors.py | 67 + .../site-packages/setuptools/extension.py | 177 + .../site-packages/setuptools/glob.py | 185 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 11776 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 14336 bytes .../site-packages/setuptools/gui-arm64.exe | Bin 0 -> 13824 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 11776 bytes .../site-packages/setuptools/installer.py | 155 + .../site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/logging.py | 40 + .../site-packages/setuptools/modified.py | 18 + .../site-packages/setuptools/monkey.py | 126 + .../site-packages/setuptools/msvc.py | 1536 ++ .../site-packages/setuptools/namespaces.py | 106 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../setuptools/tests/__init__.py | 13 + .../setuptools/tests/compat/__init__.py | 0 .../setuptools/tests/compat/py39.py | 3 + .../setuptools/tests/config/__init__.py | 0 .../tests/config/setupcfg_examples.txt | 22 + .../tests/config/test_apply_pyprojecttoml.py | 772 + .../setuptools/tests/config/test_expand.py | 247 + .../tests/config/test_pyprojecttoml.py | 396 + .../config/test_pyprojecttoml_dynamic_deps.py | 109 + .../setuptools/tests/config/test_setupcfg.py | 980 + .../setuptools/tests/contexts.py | 131 + .../setuptools/tests/environment.py | 95 + .../setuptools/tests/fixtures.py | 392 + .../indexes/test_links_priority/external.html | 3 + .../simple/foobar/index.html | 4 + .../setuptools/tests/integration/__init__.py | 0 .../setuptools/tests/integration/helpers.py | 77 + .../setuptools/tests/integration/test_pbr.py | 20 + .../integration/test_pip_install_sdist.py | 223 + .../setuptools/tests/mod_with_constant.py | 1 + .../setuptools/tests/namespaces.py | 90 + .../setuptools/tests/script-with-bom.py | 1 + .../setuptools/tests/test_archive_util.py | 36 + .../tests/test_bdist_deprecations.py | 28 + .../setuptools/tests/test_bdist_egg.py | 73 + .../setuptools/tests/test_bdist_wheel.py | 708 + .../setuptools/tests/test_build.py | 33 + .../setuptools/tests/test_build_clib.py | 84 + .../setuptools/tests/test_build_ext.py | 293 + .../setuptools/tests/test_build_meta.py | 959 + .../setuptools/tests/test_build_py.py | 480 + .../setuptools/tests/test_config_discovery.py | 647 + .../setuptools/tests/test_core_metadata.py | 622 + .../setuptools/tests/test_depends.py | 15 + .../setuptools/tests/test_develop.py | 112 + .../setuptools/tests/test_dist.py | 278 + .../setuptools/tests/test_dist_info.py | 147 + .../tests/test_distutils_adoption.py | 198 + .../setuptools/tests/test_editable_install.py | 1263 ++ .../setuptools/tests/test_egg_info.py | 1306 ++ .../setuptools/tests/test_extern.py | 15 + .../setuptools/tests/test_find_packages.py | 218 + .../setuptools/tests/test_find_py_modules.py | 73 + .../setuptools/tests/test_glob.py | 45 + .../setuptools/tests/test_install_scripts.py | 89 + .../setuptools/tests/test_logging.py | 76 + .../setuptools/tests/test_manifest.py | 622 + .../setuptools/tests/test_namespaces.py | 138 + .../setuptools/tests/test_scripts.py | 12 + .../setuptools/tests/test_sdist.py | 984 + .../setuptools/tests/test_setopt.py | 40 + .../setuptools/tests/test_setuptools.py | 290 + .../setuptools/tests/test_shutil_wrapper.py | 23 + .../setuptools/tests/test_unicode_utils.py | 10 + .../setuptools/tests/test_virtualenv.py | 113 + .../setuptools/tests/test_warnings.py | 106 + .../setuptools/tests/test_wheel.py | 690 + .../setuptools/tests/test_windows_wrappers.py | 258 + .../site-packages/setuptools/tests/text.py | 4 + .../setuptools/tests/textwrap.py | 6 + .../site-packages/setuptools/unicode_utils.py | 102 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/warnings.py | 110 + .../site-packages/setuptools/wheel.py | 261 + .../setuptools/windows_support.py | 30 + .../tomli-2.2.1.dist-info/INSTALLER | 1 + .../tomli-2.2.1.dist-info/LICENSE | 21 + .../tomli-2.2.1.dist-info/METADATA | 268 + .../tomli-2.2.1.dist-info/RECORD | 14 + .../site-packages/tomli-2.2.1.dist-info/WHEEL | 4 + .../site-packages/tomli/__init__.py | 8 + .../python3.10/site-packages/tomli/_parser.py | 770 + env/lib/python3.10/site-packages/tomli/_re.py | 112 + .../python3.10/site-packages/tomli/_types.py | 10 + .../python3.10/site-packages/tomli/py.typed | 1 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++++ .../python3.10/site-packages/yaml/__init__.py | 390 + .../python3.10/site-packages/yaml/composer.py | 139 + .../site-packages/yaml/constructor.py | 748 + .../python3.10/site-packages/yaml/cyaml.py | 101 + .../python3.10/site-packages/yaml/dumper.py | 62 + .../python3.10/site-packages/yaml/emitter.py | 1137 ++ .../python3.10/site-packages/yaml/error.py | 75 + .../python3.10/site-packages/yaml/events.py | 86 + .../python3.10/site-packages/yaml/loader.py | 63 + .../python3.10/site-packages/yaml/nodes.py | 49 + .../python3.10/site-packages/yaml/parser.py | 589 + .../python3.10/site-packages/yaml/reader.py | 185 + .../site-packages/yaml/representer.py | 389 + .../python3.10/site-packages/yaml/resolver.py | 227 + .../python3.10/site-packages/yaml/scanner.py | 1435 ++ .../site-packages/yaml/serializer.py | 111 + .../python3.10/site-packages/yaml/tokens.py | 104 + env/pyvenv.cfg | 3 + src/docc/plugins/html/__init__.py | 165 +- test_non_transaparent_tags.py | 82 + 1964 files changed, 536830 insertions(+), 5 deletions(-) create mode 100644 env/bin/Activate.ps1 create mode 100644 env/bin/activate create mode 100644 env/bin/activate.csh create mode 100644 env/bin/activate.fish create mode 100755 env/bin/docc create mode 100755 env/bin/markdown-it create mode 100755 env/bin/mistletoe create mode 100755 env/bin/pip create mode 100755 env/bin/pip3 create mode 100755 env/bin/pip3.10 create mode 100755 env/bin/pygmentize create mode 120000 env/bin/python create mode 120000 env/bin/python3 create mode 120000 env/bin/python3.10 create mode 100644 env/lib/python3.10/site-packages/__editable__.docc-0.3.1.pth create mode 100644 env/lib/python3.10/site-packages/_distutils_hack/__init__.py create mode 100644 env/lib/python3.10/site-packages/_distutils_hack/override.py create mode 100644 env/lib/python3.10/site-packages/_yaml/__init__.py create mode 100644 env/lib/python3.10/site-packages/distutils-precedence.pth create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/direct_url.json create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/licenses/LICENSE.md create mode 100644 env/lib/python3.10/site-packages/docc-0.3.1.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/importlib_resources/__init__.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/_adapters.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/_common.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/_functional.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/_itertools.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/abc.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/future/__init__.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/future/adapters.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/py.typed create mode 100644 env/lib/python3.10/site-packages/importlib_resources/readers.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/simple.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/_path.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/compat/py312.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_compatibilty_files.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_contents.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_custom.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_files.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_functional.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_open.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_path.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_read.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_reader.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_resource.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/test_util.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/util.py create mode 100644 env/lib/python3.10/site-packages/importlib_resources/tests/zip.py create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/inflection.py create mode 100644 env/lib/python3.10/site-packages/inflection/__init__.py create mode 100644 env/lib/python3.10/site-packages/inflection/py.typed create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/jinja2/__init__.py create mode 100644 env/lib/python3.10/site-packages/jinja2/_identifier.py create mode 100644 env/lib/python3.10/site-packages/jinja2/async_utils.py create mode 100644 env/lib/python3.10/site-packages/jinja2/bccache.py create mode 100644 env/lib/python3.10/site-packages/jinja2/compiler.py create mode 100644 env/lib/python3.10/site-packages/jinja2/constants.py create mode 100644 env/lib/python3.10/site-packages/jinja2/debug.py create mode 100644 env/lib/python3.10/site-packages/jinja2/defaults.py create mode 100644 env/lib/python3.10/site-packages/jinja2/environment.py create mode 100644 env/lib/python3.10/site-packages/jinja2/exceptions.py create mode 100644 env/lib/python3.10/site-packages/jinja2/ext.py create mode 100644 env/lib/python3.10/site-packages/jinja2/filters.py create mode 100644 env/lib/python3.10/site-packages/jinja2/idtracking.py create mode 100644 env/lib/python3.10/site-packages/jinja2/lexer.py create mode 100644 env/lib/python3.10/site-packages/jinja2/loaders.py create mode 100644 env/lib/python3.10/site-packages/jinja2/meta.py create mode 100644 env/lib/python3.10/site-packages/jinja2/nativetypes.py create mode 100644 env/lib/python3.10/site-packages/jinja2/nodes.py create mode 100644 env/lib/python3.10/site-packages/jinja2/optimizer.py create mode 100644 env/lib/python3.10/site-packages/jinja2/parser.py create mode 100644 env/lib/python3.10/site-packages/jinja2/py.typed create mode 100644 env/lib/python3.10/site-packages/jinja2/runtime.py create mode 100644 env/lib/python3.10/site-packages/jinja2/sandbox.py create mode 100644 env/lib/python3.10/site-packages/jinja2/tests.py create mode 100644 env/lib/python3.10/site-packages/jinja2/utils.py create mode 100644 env/lib/python3.10/site-packages/jinja2/visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/libcst-1.8.5.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/libcst/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_add_slots.py create mode 100644 env/lib/python3.10/site-packages/libcst/_batched_visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst/_exceptions.py create mode 100644 env/lib/python3.10/site-packages/libcst/_flatten_sentinel.py create mode 100644 env/lib/python3.10/site-packages/libcst/_maybe_sentinel.py create mode 100644 env/lib/python3.10/site-packages/libcst/_metadata_dependent.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/base.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/deep_equals.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/expression.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/internal.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/module.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/op.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/statement.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/base.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_assert.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_assign.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_atom.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_attribute.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_await.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_binary_op.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_boolean_op.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_call.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_classdef.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_comment.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_comparison.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_cst_node.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_del.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_dict.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_dict_comp.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_docstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_else.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_empty_line.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_flatten_behavior.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_for.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_funcdef.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_global.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_if.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_ifexp.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_import.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_indented_block.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_lambda.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_leaf_small_statements.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_list.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_match.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_matrix_multiply.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_module.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_namedexpr.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_newline.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_nonlocal.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_number.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_raise.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_removal_behavior.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_return.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_set.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_simple_comp.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_simple_statement.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_simple_string.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_simple_whitespace.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_small_statement.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_subscript.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_template_strings.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_trailing_whitespace.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_try.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_tuple.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_type_alias.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_unary_op.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_while.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_with.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/tests/test_yield.py create mode 100644 env/lib/python3.10/site-packages/libcst/_nodes/whitespace.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/_parsing_check.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/base_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/README.md create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/expression.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/module.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/params.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/statement.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/conversions/terminals.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/custom_itertools.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/detect_config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/entrypoints.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/grammar.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/pgen2/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/pgen2/generator.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/pgen2/grammar_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/python/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/python/py_token.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/python/token.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/python/tokenize.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/tests/test_fstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/tests/test_tokenize.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/tests/test_utils.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/parso/utils.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/production_decorator.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/py_whitespace_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/python_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_detect_config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_footer_behavior.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_node_identity.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_parse_errors.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_version_compare.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_whitespace_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/tests/test_wrapped_tokenize.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/conversions.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/partials.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/production.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/py_config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/py_token.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/py_whitespace_state.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/tests/test_config.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/token.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/types/whitespace_state.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/whitespace_parser.py create mode 100644 env/lib/python3.10/site-packages/libcst/_parser/wrapped_tokenize.py create mode 100644 env/lib/python3.10/site-packages/libcst/_position.py create mode 100644 env/lib/python3.10/site-packages/libcst/_removal_sentinel.py create mode 100644 env/lib/python3.10/site-packages/libcst/_tabs.py create mode 100644 env/lib/python3.10/site-packages/libcst/_type_enforce.py create mode 100644 env/lib/python3.10/site-packages/libcst/_typed_visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst/_typed_visitor_base.py create mode 100644 env/lib/python3.10/site-packages/libcst/_types.py create mode 100644 env/lib/python3.10/site-packages/libcst/_version.py create mode 100644 env/lib/python3.10/site-packages/libcst/_visitors.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/gather.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/gen_matcher_classes.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/gen_type_mapping.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/gen_visitor_functions.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/generate.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/tests/test_codegen_clean.py create mode 100644 env/lib/python3.10/site-packages/libcst/codegen/transforms.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_cli.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_codemod.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_command.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_context.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_dummy_pool.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_runner.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_testing.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/_visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/add_pyre_directive.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/add_trailing_commas.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/convert_format_to_fstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/convert_namedtuple_to_dataclass.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/convert_percent_format_to_fstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/convert_type_comments.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/convert_union_to_or.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/ensure_import_present.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/fix_pyre_directives.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/fix_variadic_callable.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/noop.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/remove_pyre_directive.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/remove_unused_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/rename.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/rename_typing_generic_aliases.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/strip_strings_from_types.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_add_pyre_directive.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_add_trailing_commas.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_convert_format_to_fstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_convert_namedtuple_to_dataclass.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_convert_percent_format_to_fstring.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_convert_type_comments.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_convert_union_to_or.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_ensure_import_present.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_fix_pyre_directives.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_fix_variadic_callable.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_noop.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_remove_pyre_directive.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_remove_unused_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_rename.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_rename_typing_generic_aliases.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_strip_strings_from_types.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/tests/test_unnecessary_format_string.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/commands/unnecessary_format_string.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/codemod_formatter_error_input.py.txt create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/test_codemod.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/test_codemod_cli.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/test_metadata.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/tests/test_runner.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_add_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_apply_type_annotations.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_comments.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_exports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_global_names.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_string_annotation_names.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_gather_unused_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/_remove_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_add_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_apply_type_annotations.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_comments.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_exports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_global_names.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_string_annotation_names.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_gather_unused_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/codemod/visitors/tests/test_remove_imports.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/graphviz.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/tests/test_dump_graphviz.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/tests/test_dump_text.py create mode 100644 env/lib/python3.10/site-packages/libcst/display/text.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/_template.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/common.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/expression.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/matchers.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/module.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/node_fields.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/paths.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_expression.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_matchers.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_module.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_node_fields.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_paths.py create mode 100644 env/lib/python3.10/site-packages/libcst/helpers/tests/test_template.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/_decorators.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/_matcher_base.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/_return_types.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/_visitors.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_decorators.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_extract.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_findall.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_matchers.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_matchers_with_metadata.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_replace.py create mode 100644 env/lib/python3.10/site-packages/libcst/matchers/tests/test_visitors.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/accessor_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/base_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/expression_context_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/file_path_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/full_repo_manager.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/name_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/parent_node_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/position_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/reentrant_codegen.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/scope_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/span_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_accessor_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_base_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_expression_context_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_file_path_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_full_repo_manager.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_metadata_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_metadata_wrapper.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_name_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_parent_node_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_position_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_reentrant_codegen.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_scope_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_span_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/tests/test_type_inference_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/type_inference_provider.py create mode 100644 env/lib/python3.10/site-packages/libcst/metadata/wrapper.py create mode 100644 env/lib/python3.10/site-packages/libcst/py.typed create mode 100644 env/lib/python3.10/site-packages/libcst/testing/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/testing/utils.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/__main__.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/pyre/.pyre_configuration create mode 100644 env/lib/python3.10/site-packages/libcst/tests/pyre/simple_class.json create mode 100644 env/lib/python3.10/site-packages/libcst/tests/pyre/simple_class.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_add_slots.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_batched_visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_deep_clone.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_deep_replace.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_e2e.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_exceptions.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_fuzz.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_import.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_pyre_integration.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_roundtrip.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_tabs.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_type_enforce.py create mode 100644 env/lib/python3.10/site-packages/libcst/tests/test_visitor.py create mode 100644 env/lib/python3.10/site-packages/libcst/tool.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/_compat.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/_punycode.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/cli/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/cli/parse.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/entities.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/html_blocks.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/html_re.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/normalize_url.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/common/utils.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/helpers/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/helpers/parse_link_destination.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/helpers/parse_link_label.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/helpers/parse_link_title.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/main.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/parser_block.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/parser_core.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/parser_inline.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/port.yaml create mode 100644 env/lib/python3.10/site-packages/markdown_it/presets/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/presets/commonmark.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/presets/default.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/presets/zero.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/py.typed create mode 100644 env/lib/python3.10/site-packages/markdown_it/renderer.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/ruler.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/blockquote.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/code.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/fence.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/heading.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/hr.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/html_block.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/lheading.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/list.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/paragraph.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/reference.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/state_block.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_block/table.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/block.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/inline.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/linkify.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/normalize.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/replacements.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/smartquotes.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/state_core.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_core/text_join.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/__init__.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/autolink.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/backticks.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/balance_pairs.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/emphasis.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/entity.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/escape.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/fragments_join.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/html_inline.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/image.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/link.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/linkify.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/newline.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/state_inline.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/strikethrough.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/rules_inline/text.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/token.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/tree.py create mode 100644 env/lib/python3.10/site-packages/markdown_it/utils.py create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/markdown_it_py-4.0.0.dist-info/licenses/LICENSE.markdown-it create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/markupsafe-3.0.3.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/markupsafe/__init__.py create mode 100644 env/lib/python3.10/site-packages/markupsafe/_native.py create mode 100644 env/lib/python3.10/site-packages/markupsafe/_speedups.c create mode 100644 env/lib/python3.10/site-packages/markupsafe/_speedups.pyi create mode 100644 env/lib/python3.10/site-packages/markupsafe/py.typed create mode 100644 env/lib/python3.10/site-packages/mdurl-0.1.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/mdurl-0.1.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/mdurl-0.1.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/mdurl-0.1.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/mdurl-0.1.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/mdurl/__init__.py create mode 100644 env/lib/python3.10/site-packages/mdurl/_decode.py create mode 100644 env/lib/python3.10/site-packages/mdurl/_encode.py create mode 100644 env/lib/python3.10/site-packages/mdurl/_format.py create mode 100644 env/lib/python3.10/site-packages/mdurl/_parse.py create mode 100644 env/lib/python3.10/site-packages/mdurl/_url.py create mode 100644 env/lib/python3.10/site-packages/mdurl/py.typed create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/mistletoe-1.4.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/mistletoe/__init__.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/__main__.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/ast_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/base_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/block_token.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/block_tokenizer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/cli.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/__init__.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/github_wiki.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/jira_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/mathjax.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/md2jira.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/pygments_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/scheme.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/toc_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/contrib/xwiki20_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/core_tokens.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/html_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/latex_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/latex_token.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/markdown_renderer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/span_token.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/span_tokenizer.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/token.py create mode 100644 env/lib/python3.10/site-packages/mistletoe/utils.py create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/AUTHORS.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/certifi/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distro/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/msgpack/COPYING create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pygments/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/requests/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/rich/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/truststore/LICENSE create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/pip-25.2.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/pip/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/__pip-runner__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/build_env.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/base_command.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/command_context.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/index_command.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/main.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/parser.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/req_command.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/spinners.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/check.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/completion.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/configuration.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/debug.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/download.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/freeze.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/hash.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/help.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/index.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/inspect.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/install.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/list.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/lock.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/search.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/show.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/commands/wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/configuration.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/distributions/base.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/distributions/installed.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/exceptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/index/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/index/collector.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/index/package_finder.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/index/sources.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/locations/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/locations/base.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/main.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/_json.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/base.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/candidate.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/direct_url.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/format_control.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/index.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/installation_report.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/link.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/pylock.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/scheme.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/search_scope.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/target_python.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/models/wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/auth.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/download.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/session.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/utils.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/check.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/freeze.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/operations/prepare.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/pyproject.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/constructors.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/req_dependency_group.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/req_file.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/req_install.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/req_set.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/base.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/_log.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/datetime.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/glibc.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/hashes.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/logging.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/misc.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/packaging.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/retry.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/urls.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/utils/wheel.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/git.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 env/lib/python3.10/site-packages/pip/_internal/wheel_builder.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/certifi/core.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/certifi/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_implementation.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/_toml_compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/dependency_groups/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/resources.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/util.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distro/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distro/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distro/distro.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/distro/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/codec.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/core.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/intranges.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/package_data.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/licenses/_spdx.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/markers.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/tags.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/utils.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/packaging/version.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/console.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/filter.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/style.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/token.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pygments/util.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/__version__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/adapters.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/api.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/auth.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/certs.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/compat.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/cookies.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/help.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/hooks.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/models.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/packages.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/sessions.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/structures.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/requests/utils.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/__main__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_extension.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_loop.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_pick.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_stack.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_timer.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_windows.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/abc.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/align.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/ansi.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/bar.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/box.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/cells.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/color.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/columns.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/console.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/constrain.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/containers.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/control.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/emoji.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/errors.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/filesize.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/json.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/layout.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/live.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/live_render.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/logging.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/markup.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/measure.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/padding.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/pager.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/palette.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/panel.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/pretty.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/progress.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/prompt.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/protocol.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/region.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/repr.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/rule.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/scope.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/screen.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/segment.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/spinner.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/status.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/style.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/styled.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/syntax.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/table.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/text.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/theme.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/themes.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/traceback.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/rich/tree.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli/_re.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli/_types.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli_w/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli_w/_writer.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/tomli_w/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/_api.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/truststore/py.typed create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/request.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/response.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 env/lib/python3.10/site-packages/pip/_vendor/vendor.txt create mode 100644 env/lib/python3.10/site-packages/pip/py.typed create mode 100644 env/lib/python3.10/site-packages/pkg_resources/__init__.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/api_tests.txt create mode 100644 env/lib/python3.10/site-packages/pkg_resources/py.typed create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/setup.cfg create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/data/my-test-package-zip/my-test-package.zip create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_find_distributions.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_integration_zope_interface.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_markers.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_pkg_resources.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_resources.py create mode 100644 env/lib/python3.10/site-packages/pkg_resources/tests/test_working_set.py create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/licenses/AUTHORS create mode 100644 env/lib/python3.10/site-packages/pygments-2.19.2.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/pygments/__init__.py create mode 100644 env/lib/python3.10/site-packages/pygments/__main__.py create mode 100644 env/lib/python3.10/site-packages/pygments/cmdline.py create mode 100644 env/lib/python3.10/site-packages/pygments/console.py create mode 100644 env/lib/python3.10/site-packages/pygments/filter.py create mode 100644 env/lib/python3.10/site-packages/pygments/filters/__init__.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatter.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/__init__.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/bbcode.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/groff.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/html.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/img.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/irc.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/latex.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/other.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/pangomarkup.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/rtf.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/svg.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/terminal.py create mode 100644 env/lib/python3.10/site-packages/pygments/formatters/terminal256.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexer.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/__init__.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_ada_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_css_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_googlesql_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_julia_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_lilypond_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_luau_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_mysql_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_php_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_qlik_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_scheme_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_sql_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_usd_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/actionscript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ada.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/agile.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/algebra.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ambient.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/amdgpu.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ampl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/apdlexer.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/apl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/archetype.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/arrow.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/arturo.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/asc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/asm.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/asn1.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/automation.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/bare.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/basic.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/bdd.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/berry.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/bibtex.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/blueprint.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/boa.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/bqn.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/business.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/c_cpp.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/c_like.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/capnproto.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/carbon.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/cddl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/chapel.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/clean.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/codeql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/comal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/compiled.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/configs.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/console.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/cplint.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/crystal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/csound.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/css.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/d.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dalvik.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/data.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dax.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/devicetree.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/diff.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dns.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dotnet.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dsls.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/dylan.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ecl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/eiffel.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/elm.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/elpi.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/email.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/erlang.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/esoteric.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ezhil.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/factor.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/fantom.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/felix.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/fift.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/floscript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/forth.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/fortran.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/foxpro.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/freefem.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/func.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/functional.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/futhark.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/gcodelexer.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/gdscript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/gleam.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/go.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/grammar_notation.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/graph.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/graphics.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/graphql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/graphviz.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/gsql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/hare.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/haskell.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/haxe.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/hdl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/hexdump.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/html.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/idl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/igor.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/inferno.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/installers.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/int_fiction.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/iolang.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/j.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/javascript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/jmespath.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/jslt.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/json5.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/jsonnet.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/jsx.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/julia.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/jvm.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/kuin.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/kusto.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ldap.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/lean.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/lilypond.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/lisp.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/macaulay2.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/make.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/maple.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/markup.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/math.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/matlab.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/maxima.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/meson.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/mime.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/minecraft.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/mips.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ml.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/modeling.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/modula2.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/mojo.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/monte.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/mosel.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ncl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/nimrod.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/nit.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/nix.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/numbair.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/oberon.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/objective.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ooc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/openscad.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/other.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/parasail.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/parsers.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/pascal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/pawn.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/pddl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/perl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/phix.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/php.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/pointless.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/pony.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/praat.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/procfile.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/prolog.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/promql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/prql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ptx.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/python.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/q.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/qlik.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/qvt.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/r.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rdf.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rebol.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rego.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/resource.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ride.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rita.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rnc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/roboconf.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/robotframework.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ruby.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/rust.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/sas.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/savi.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/scdoc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/scripting.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/sgf.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/shell.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/sieve.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/slash.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/smalltalk.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/smithy.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/smv.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/snobol.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/solidity.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/soong.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/sophia.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/special.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/spice.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/sql.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/srcinfo.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/stata.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/supercollider.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tablegen.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tact.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tcl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/teal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/templates.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/teraterm.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/testing.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/text.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/textedit.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/textfmts.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/theorem.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/thingsdb.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tlb.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tls.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/tnt.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/trafficscript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/typoscript.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/typst.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/ul4.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/unicon.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/urbi.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/usd.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/varnish.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/verification.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/verifpal.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/vip.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/vyper.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/web.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/webassembly.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/webidl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/webmisc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/wgsl.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/whiley.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/wowtoc.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/wren.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/x10.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/xorg.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/yang.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/yara.py create mode 100644 env/lib/python3.10/site-packages/pygments/lexers/zig.py create mode 100644 env/lib/python3.10/site-packages/pygments/modeline.py create mode 100644 env/lib/python3.10/site-packages/pygments/plugin.py create mode 100644 env/lib/python3.10/site-packages/pygments/regexopt.py create mode 100644 env/lib/python3.10/site-packages/pygments/scanner.py create mode 100644 env/lib/python3.10/site-packages/pygments/sphinxext.py create mode 100644 env/lib/python3.10/site-packages/pygments/style.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/__init__.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/_mapping.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/abap.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/algol.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/algol_nu.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/arduino.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/autumn.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/borland.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/bw.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/coffee.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/colorful.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/default.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/dracula.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/emacs.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/friendly.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/friendly_grayscale.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/fruity.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/gh_dark.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/gruvbox.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/igor.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/inkpot.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/lightbulb.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/lilypond.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/lovelace.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/manni.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/material.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/monokai.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/murphy.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/native.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/nord.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/onedark.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/paraiso_dark.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/paraiso_light.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/pastie.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/perldoc.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/rainbow_dash.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/rrt.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/sas.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/solarized.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/staroffice.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/stata_dark.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/stata_light.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/tango.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/trac.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/vim.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/vs.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/xcode.py create mode 100644 env/lib/python3.10/site-packages/pygments/styles/zenburn.py create mode 100644 env/lib/python3.10/site-packages/pygments/token.py create mode 100644 env/lib/python3.10/site-packages/pygments/unistring.py create mode 100644 env/lib/python3.10/site-packages/pygments/util.py create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/pyyaml-6.0.3.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/rich-13.9.4.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/rich-13.9.4.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/rich-13.9.4.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/rich-13.9.4.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/rich-13.9.4.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/rich/__init__.py create mode 100644 env/lib/python3.10/site-packages/rich/__main__.py create mode 100644 env/lib/python3.10/site-packages/rich/_cell_widths.py create mode 100644 env/lib/python3.10/site-packages/rich/_emoji_codes.py create mode 100644 env/lib/python3.10/site-packages/rich/_emoji_replace.py create mode 100644 env/lib/python3.10/site-packages/rich/_export_format.py create mode 100644 env/lib/python3.10/site-packages/rich/_extension.py create mode 100644 env/lib/python3.10/site-packages/rich/_fileno.py create mode 100644 env/lib/python3.10/site-packages/rich/_inspect.py create mode 100644 env/lib/python3.10/site-packages/rich/_log_render.py create mode 100644 env/lib/python3.10/site-packages/rich/_loop.py create mode 100644 env/lib/python3.10/site-packages/rich/_null_file.py create mode 100644 env/lib/python3.10/site-packages/rich/_palettes.py create mode 100644 env/lib/python3.10/site-packages/rich/_pick.py create mode 100644 env/lib/python3.10/site-packages/rich/_ratio.py create mode 100644 env/lib/python3.10/site-packages/rich/_spinners.py create mode 100644 env/lib/python3.10/site-packages/rich/_stack.py create mode 100644 env/lib/python3.10/site-packages/rich/_timer.py create mode 100644 env/lib/python3.10/site-packages/rich/_win32_console.py create mode 100644 env/lib/python3.10/site-packages/rich/_windows.py create mode 100644 env/lib/python3.10/site-packages/rich/_windows_renderer.py create mode 100644 env/lib/python3.10/site-packages/rich/_wrap.py create mode 100644 env/lib/python3.10/site-packages/rich/abc.py create mode 100644 env/lib/python3.10/site-packages/rich/align.py create mode 100644 env/lib/python3.10/site-packages/rich/ansi.py create mode 100644 env/lib/python3.10/site-packages/rich/bar.py create mode 100644 env/lib/python3.10/site-packages/rich/box.py create mode 100644 env/lib/python3.10/site-packages/rich/cells.py create mode 100644 env/lib/python3.10/site-packages/rich/color.py create mode 100644 env/lib/python3.10/site-packages/rich/color_triplet.py create mode 100644 env/lib/python3.10/site-packages/rich/columns.py create mode 100644 env/lib/python3.10/site-packages/rich/console.py create mode 100644 env/lib/python3.10/site-packages/rich/constrain.py create mode 100644 env/lib/python3.10/site-packages/rich/containers.py create mode 100644 env/lib/python3.10/site-packages/rich/control.py create mode 100644 env/lib/python3.10/site-packages/rich/default_styles.py create mode 100644 env/lib/python3.10/site-packages/rich/diagnose.py create mode 100644 env/lib/python3.10/site-packages/rich/emoji.py create mode 100644 env/lib/python3.10/site-packages/rich/errors.py create mode 100644 env/lib/python3.10/site-packages/rich/file_proxy.py create mode 100644 env/lib/python3.10/site-packages/rich/filesize.py create mode 100644 env/lib/python3.10/site-packages/rich/highlighter.py create mode 100644 env/lib/python3.10/site-packages/rich/json.py create mode 100644 env/lib/python3.10/site-packages/rich/jupyter.py create mode 100644 env/lib/python3.10/site-packages/rich/layout.py create mode 100644 env/lib/python3.10/site-packages/rich/live.py create mode 100644 env/lib/python3.10/site-packages/rich/live_render.py create mode 100644 env/lib/python3.10/site-packages/rich/logging.py create mode 100644 env/lib/python3.10/site-packages/rich/markdown.py create mode 100644 env/lib/python3.10/site-packages/rich/markup.py create mode 100644 env/lib/python3.10/site-packages/rich/measure.py create mode 100644 env/lib/python3.10/site-packages/rich/padding.py create mode 100644 env/lib/python3.10/site-packages/rich/pager.py create mode 100644 env/lib/python3.10/site-packages/rich/palette.py create mode 100644 env/lib/python3.10/site-packages/rich/panel.py create mode 100644 env/lib/python3.10/site-packages/rich/pretty.py create mode 100644 env/lib/python3.10/site-packages/rich/progress.py create mode 100644 env/lib/python3.10/site-packages/rich/progress_bar.py create mode 100644 env/lib/python3.10/site-packages/rich/prompt.py create mode 100644 env/lib/python3.10/site-packages/rich/protocol.py create mode 100644 env/lib/python3.10/site-packages/rich/py.typed create mode 100644 env/lib/python3.10/site-packages/rich/region.py create mode 100644 env/lib/python3.10/site-packages/rich/repr.py create mode 100644 env/lib/python3.10/site-packages/rich/rule.py create mode 100644 env/lib/python3.10/site-packages/rich/scope.py create mode 100644 env/lib/python3.10/site-packages/rich/screen.py create mode 100644 env/lib/python3.10/site-packages/rich/segment.py create mode 100644 env/lib/python3.10/site-packages/rich/spinner.py create mode 100644 env/lib/python3.10/site-packages/rich/status.py create mode 100644 env/lib/python3.10/site-packages/rich/style.py create mode 100644 env/lib/python3.10/site-packages/rich/styled.py create mode 100644 env/lib/python3.10/site-packages/rich/syntax.py create mode 100644 env/lib/python3.10/site-packages/rich/table.py create mode 100644 env/lib/python3.10/site-packages/rich/terminal_theme.py create mode 100644 env/lib/python3.10/site-packages/rich/text.py create mode 100644 env/lib/python3.10/site-packages/rich/theme.py create mode 100644 env/lib/python3.10/site-packages/rich/themes.py create mode 100644 env/lib/python3.10/site-packages/rich/traceback.py create mode 100644 env/lib/python3.10/site-packages/rich/tree.py create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools-80.9.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_core_metadata.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_discovery.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/_log.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/_macos_compat.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/_modified.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/archive_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/cmd.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/_framework_compat.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/build.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/check.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/clean.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/config.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compat/numpy.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/base.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/cygwin.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/errors.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/msvc.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/unix.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/compilers/C/zos.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/core.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/debug.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/dep_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/dir_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/dist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/errors.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/extension.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/file_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/filelist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/log.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/spawn.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/support.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_archive_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_bdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build_clib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build_ext.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build_py.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_check.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_clean.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_cmd.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_config_cmd.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_core.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_dir_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_dist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_extension.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_file_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_filelist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_install.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_install_data.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_install_headers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_install_lib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_install_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_log.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_modified.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_sdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_spawn.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_sysconfig.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_text_file.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/test_versionpredicate.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/tests/unix_compat.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/text_file.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_distutils/zosccompiler.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_entry_points.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_imp.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_importlib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_itertools.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_normalization.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_path.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_reqs.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_shutil.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_static.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/autoasync.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/autocommand.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/automain.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/autoparse.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/autocommand/errors.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports/tarfile/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports/tarfile/__main__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_collections.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_compat.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_functools.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_meta.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/_text.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/importlib_metadata/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect-7.3.1.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect/compat/py38.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/inflect/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.collections-5.1.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.context-5.3.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.functools-4.0.1.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco.text-3.12.1.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/collections/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/collections/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/context.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/functools/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/functools/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/Lorem ipsum.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/layouts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools-10.3.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/__init__.pyi create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/more.pyi create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/more_itertools/recipes.pyi create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/LICENSE.APACHE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/LICENSE.BSD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging-24.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_elffile.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_manylinux.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_musllinux.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_parser.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/_tokenizer.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/licenses/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/metadata.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs-4.2.2.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/__main__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/android.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/api.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/macos.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/unix.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/platformdirs/windows.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli-2.0.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli/_parser.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli/_re.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli/_types.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/tomli/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard-4.3.0.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_checkers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_config.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_decorators.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_exceptions.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_functions.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_importhook.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_memo.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_suppression.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_transformer.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_union_transformer.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/_utils.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typeguard/py.typed create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions-4.12.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/typing_extensions.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/LICENSE.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel-0.45.1.dist-info/entry_points.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/__main__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/bdist_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/cli/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/cli/convert.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/cli/pack.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/cli/tags.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/cli/unpack.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/macosx_libfile.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/metadata.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/LICENSE.APACHE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/LICENSE.BSD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/vendored/vendor.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/wheel/wheelfile.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/REQUESTED create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp-3.19.2.dist-info/top_level.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp/compat/py310.py create mode 100644 env/lib/python3.10/site-packages/setuptools/_vendor/zipp/glob.py create mode 100644 env/lib/python3.10/site-packages/setuptools/archive_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/build_meta.py create mode 100644 env/lib/python3.10/site-packages/setuptools/cli-32.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/cli-64.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/cli-arm64.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/cli.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/command/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/_requirestxt.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/alias.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/bdist_egg.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/bdist_rpm.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/bdist_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/build.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/build_clib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/build_ext.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/build_py.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/develop.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/dist_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/easy_install.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/editable_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/egg_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/install.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/install_egg_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/install_lib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/install_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/launcher manifest.xml create mode 100644 env/lib/python3.10/site-packages/setuptools/command/rotate.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/saveopts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/sdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/setopt.py create mode 100644 env/lib/python3.10/site-packages/setuptools/command/test.py create mode 100644 env/lib/python3.10/site-packages/setuptools/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/compat/py310.py create mode 100644 env/lib/python3.10/site-packages/setuptools/compat/py311.py create mode 100644 env/lib/python3.10/site-packages/setuptools/compat/py312.py create mode 100644 env/lib/python3.10/site-packages/setuptools/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/NOTICE create mode 100644 env/lib/python3.10/site-packages/setuptools/config/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_apply_pyprojecttoml.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/NOTICE create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/error_reporting.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/extra_validations.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/_validate_pyproject/formats.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/distutils.schema.json create mode 100644 env/lib/python3.10/site-packages/setuptools/config/expand.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/pyprojecttoml.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/setupcfg.py create mode 100644 env/lib/python3.10/site-packages/setuptools/config/setuptools.schema.json create mode 100644 env/lib/python3.10/site-packages/setuptools/depends.py create mode 100644 env/lib/python3.10/site-packages/setuptools/discovery.py create mode 100644 env/lib/python3.10/site-packages/setuptools/dist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/errors.py create mode 100644 env/lib/python3.10/site-packages/setuptools/extension.py create mode 100644 env/lib/python3.10/site-packages/setuptools/glob.py create mode 100644 env/lib/python3.10/site-packages/setuptools/gui-32.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/gui-64.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/gui-arm64.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/gui.exe create mode 100644 env/lib/python3.10/site-packages/setuptools/installer.py create mode 100644 env/lib/python3.10/site-packages/setuptools/launch.py create mode 100644 env/lib/python3.10/site-packages/setuptools/logging.py create mode 100644 env/lib/python3.10/site-packages/setuptools/modified.py create mode 100644 env/lib/python3.10/site-packages/setuptools/monkey.py create mode 100644 env/lib/python3.10/site-packages/setuptools/msvc.py create mode 100644 env/lib/python3.10/site-packages/setuptools/namespaces.py create mode 100644 env/lib/python3.10/site-packages/setuptools/script (dev).tmpl create mode 100644 env/lib/python3.10/site-packages/setuptools/script.tmpl create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/compat/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/compat/py39.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/setupcfg_examples.txt create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/test_expand.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/test_pyprojecttoml.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/config/test_setupcfg.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/contexts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/environment.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/fixtures.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/indexes/test_links_priority/external.html create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/integration/__init__.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/integration/helpers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/integration/test_pbr.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/integration/test_pip_install_sdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/mod_with_constant.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/namespaces.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/script-with-bom.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_archive_util.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_bdist_deprecations.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_bdist_egg.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_bdist_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_build.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_build_clib.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_build_ext.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_build_meta.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_build_py.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_config_discovery.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_core_metadata.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_depends.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_develop.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_dist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_dist_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_distutils_adoption.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_editable_install.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_egg_info.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_extern.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_find_packages.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_find_py_modules.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_glob.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_install_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_logging.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_manifest.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_namespaces.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_scripts.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_sdist.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_setopt.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_setuptools.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_shutil_wrapper.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_unicode_utils.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_virtualenv.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_warnings.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/test_windows_wrappers.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/text.py create mode 100644 env/lib/python3.10/site-packages/setuptools/tests/textwrap.py create mode 100644 env/lib/python3.10/site-packages/setuptools/unicode_utils.py create mode 100644 env/lib/python3.10/site-packages/setuptools/version.py create mode 100644 env/lib/python3.10/site-packages/setuptools/warnings.py create mode 100644 env/lib/python3.10/site-packages/setuptools/wheel.py create mode 100644 env/lib/python3.10/site-packages/setuptools/windows_support.py create mode 100644 env/lib/python3.10/site-packages/tomli-2.2.1.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/tomli-2.2.1.dist-info/LICENSE create mode 100644 env/lib/python3.10/site-packages/tomli-2.2.1.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/tomli-2.2.1.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/tomli-2.2.1.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/tomli/__init__.py create mode 100644 env/lib/python3.10/site-packages/tomli/_parser.py create mode 100644 env/lib/python3.10/site-packages/tomli/_re.py create mode 100644 env/lib/python3.10/site-packages/tomli/_types.py create mode 100644 env/lib/python3.10/site-packages/tomli/py.typed create mode 100644 env/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 env/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 env/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 env/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 env/lib/python3.10/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 env/lib/python3.10/site-packages/typing_extensions.py create mode 100644 env/lib/python3.10/site-packages/yaml/__init__.py create mode 100644 env/lib/python3.10/site-packages/yaml/composer.py create mode 100644 env/lib/python3.10/site-packages/yaml/constructor.py create mode 100644 env/lib/python3.10/site-packages/yaml/cyaml.py create mode 100644 env/lib/python3.10/site-packages/yaml/dumper.py create mode 100644 env/lib/python3.10/site-packages/yaml/emitter.py create mode 100644 env/lib/python3.10/site-packages/yaml/error.py create mode 100644 env/lib/python3.10/site-packages/yaml/events.py create mode 100644 env/lib/python3.10/site-packages/yaml/loader.py create mode 100644 env/lib/python3.10/site-packages/yaml/nodes.py create mode 100644 env/lib/python3.10/site-packages/yaml/parser.py create mode 100644 env/lib/python3.10/site-packages/yaml/reader.py create mode 100644 env/lib/python3.10/site-packages/yaml/representer.py create mode 100644 env/lib/python3.10/site-packages/yaml/resolver.py create mode 100644 env/lib/python3.10/site-packages/yaml/scanner.py create mode 100644 env/lib/python3.10/site-packages/yaml/serializer.py create mode 100644 env/lib/python3.10/site-packages/yaml/tokens.py create mode 100644 env/pyvenv.cfg create mode 100644 test_non_transaparent_tags.py diff --git a/env/bin/Activate.ps1 b/env/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/env/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/env/bin/activate b/env/bin/activate new file mode 100644 index 0000000..d51c063 --- /dev/null +++ b/env/bin/activate @@ -0,0 +1,69 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV=/Users/oluwatumininu/Desktop/docc/env +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(env) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(env) ' + export VIRTUAL_ENV_PROMPT +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/env/bin/activate.csh b/env/bin/activate.csh new file mode 100644 index 0000000..ac3cb7f --- /dev/null +++ b/env/bin/activate.csh @@ -0,0 +1,26 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /Users/oluwatumininu/Desktop/docc/env + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(env) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(env) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/env/bin/activate.fish b/env/bin/activate.fish new file mode 100644 index 0000000..7ea6bee --- /dev/null +++ b/env/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/); you cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /Users/oluwatumininu/Desktop/docc/env + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(env) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(env) ' +end diff --git a/env/bin/docc b/env/bin/docc new file mode 100755 index 0000000..8ac04d3 --- /dev/null +++ b/env/bin/docc @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from docc.cli import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/markdown-it b/env/bin/markdown-it new file mode 100755 index 0000000..3e9a0bd --- /dev/null +++ b/env/bin/markdown-it @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from markdown_it.cli.parse import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/mistletoe b/env/bin/mistletoe new file mode 100755 index 0000000..b4f4a66 --- /dev/null +++ b/env/bin/mistletoe @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from mistletoe.__main__ import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/pip b/env/bin/pip new file mode 100755 index 0000000..39ba8d7 --- /dev/null +++ b/env/bin/pip @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/pip3 b/env/bin/pip3 new file mode 100755 index 0000000..39ba8d7 --- /dev/null +++ b/env/bin/pip3 @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/pip3.10 b/env/bin/pip3.10 new file mode 100755 index 0000000..39ba8d7 --- /dev/null +++ b/env/bin/pip3.10 @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/pygmentize b/env/bin/pygmentize new file mode 100755 index 0000000..b0ac975 --- /dev/null +++ b/env/bin/pygmentize @@ -0,0 +1,7 @@ +#!/Users/oluwatumininu/Desktop/docc/env/bin/python3.10 +import sys +from pygments.cmdline import main +if __name__ == '__main__': + if sys.argv[0].endswith('.exe'): + sys.argv[0] = sys.argv[0][:-4] + sys.exit(main()) diff --git a/env/bin/python b/env/bin/python new file mode 120000 index 0000000..c3cc991 --- /dev/null +++ b/env/bin/python @@ -0,0 +1 @@ +python3.10 \ No newline at end of file diff --git a/env/bin/python3 b/env/bin/python3 new file mode 120000 index 0000000..c3cc991 --- /dev/null +++ b/env/bin/python3 @@ -0,0 +1 @@ +python3.10 \ No newline at end of file diff --git a/env/bin/python3.10 b/env/bin/python3.10 new file mode 120000 index 0000000..ef50bb7 --- /dev/null +++ b/env/bin/python3.10 @@ -0,0 +1 @@ +/usr/local/opt/python@3.10/bin/python3.10 \ No newline at end of file diff --git a/env/lib/python3.10/site-packages/__editable__.docc-0.3.1.pth b/env/lib/python3.10/site-packages/__editable__.docc-0.3.1.pth new file mode 100644 index 0000000..17bdf0a --- /dev/null +++ b/env/lib/python3.10/site-packages/__editable__.docc-0.3.1.pth @@ -0,0 +1 @@ +/Users/oluwatumininu/Desktop/docc/src diff --git a/env/lib/python3.10/site-packages/_distutils_hack/__init__.py b/env/lib/python3.10/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..94f71b9 --- /dev/null +++ b/env/lib/python3.10/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,239 @@ +# don't import any costly modules +import os +import sys + +report_url = ( + "https://github.com/pypa/setuptools/issues/new?template=distutils-deprecation.yml" +) + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils." + ) + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + import warnings + + warnings.warn( + "Setuptools is replacing distutils. Support for replacing " + "an already imported distutils is deprecated. In the future, " + "this condition will fail. " + f"Register concerns at {report_url}" + ) + mods = [ + name + for name in sys.modules + if name == "distutils" or name.startswith("distutils.") + ] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') + if which == 'stdlib': + import warnings + + warnings.warn( + "Reliance on distutils from stdlib is deprecated. Users " + "must rely on setuptools to provide the distutils module. " + "Avoid importing distutils or import setuptools first, " + "and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. " + f"Register concerns at {report_url}" + ) + return which == 'local' + + +def ensure_local_distutils(): + import importlib + + clear_distutils() + + # With the DistutilsMetaFinder in place, + # perform an import to cause distutils to be + # loaded from setuptools._distutils. Ref #2906. + with shim(): + importlib.import_module('distutils') + + # check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + assert 'setuptools._distutils.log' not in sys.modules + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class _TrivialRe: + def __init__(self, *patterns) -> None: + self._patterns = patterns + + def match(self, string): + return all(pat in string for pat in self._patterns) + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + # optimization: only consider top level modules and those + # found in the CPython test suite. + if path is not None and not fullname.startswith('test.'): + return None + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + if self.is_cpython(): + return None + + import importlib + import importlib.abc + import importlib.util + + try: + mod = importlib.import_module('setuptools._distutils') + except Exception: + # There are a couple of cases where setuptools._distutils + # may not be present: + # - An older Setuptools without a local distutils is + # taking precedence. Ref #2957. + # - Path manipulation during sitecustomize removes + # setuptools from the path but only after the hook + # has been loaded. Ref #2980. + # In either case, fall back to stdlib behavior. + return None + + class DistutilsLoader(importlib.abc.Loader): + def create_module(self, spec): + mod.__name__ = 'distutils' + return mod + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader( + 'distutils', DistutilsLoader(), origin=mod.__file__ + ) + + @staticmethod + def is_cpython(): + """ + Suppress supplying distutils for CPython (build and tests). + Ref #2965 and #3007. + """ + return os.path.isfile('pybuilddir.txt') + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if sys.version_info >= (3, 12) or self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @classmethod + def pip_imported_during_build(cls): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + + return any( + cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) + ) + + @staticmethod + def frame_file_is_setup(frame): + """ + Return True if the indicated frame suggests a setup.py file. + """ + # some frames may not have __file__ (#2940) + return frame.f_globals.get('__file__', '').endswith('setup.py') + + def spec_for_sensitive_tests(self): + """ + Ensure stdlib distutils when running select tests under CPython. + + python/cpython#91169 + """ + clear_distutils() + self.spec_for_distutils = lambda: None + + sensitive_tests = ( + [ + 'test.test_distutils', + 'test.test_peg_generator', + 'test.test_importlib', + ] + if sys.version_info < (3, 10) + else [ + 'test.test_distutils', + ] + ) + + +for name in DistutilsMetaFinder.sensitive_tests: + setattr( + DistutilsMetaFinder, + f'spec_for_{name}', + DistutilsMetaFinder.spec_for_sensitive_tests, + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + DISTUTILS_FINDER in sys.meta_path or insert_shim() + + +class shim: + def __enter__(self) -> None: + insert_shim() + + def __exit__(self, exc: object, value: object, tb: object) -> None: + _remove_shim() + + +def insert_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def _remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass + + +if sys.version_info < (3, 12): + # DistutilsMetaFinder can only be disabled in Python < 3.12 (PEP 632) + remove_shim = _remove_shim diff --git a/env/lib/python3.10/site-packages/_distutils_hack/override.py b/env/lib/python3.10/site-packages/_distutils_hack/override.py new file mode 100644 index 0000000..2cc433a --- /dev/null +++ b/env/lib/python3.10/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/env/lib/python3.10/site-packages/_yaml/__init__.py b/env/lib/python3.10/site-packages/_yaml/__init__.py new file mode 100644 index 0000000..7baa8c4 --- /dev/null +++ b/env/lib/python3.10/site-packages/_yaml/__init__.py @@ -0,0 +1,33 @@ +# This is a stub package designed to roughly emulate the _yaml +# extension module, which previously existed as a standalone module +# and has been moved into the `yaml` package namespace. +# It does not perfectly mimic its old counterpart, but should get +# close enough for anyone who's relying on it even when they shouldn't. +import yaml + +# in some circumstances, the yaml module we imoprted may be from a different version, so we need +# to tread carefully when poking at it here (it may not have the attributes we expect) +if not getattr(yaml, '__with_libyaml__', False): + from sys import version_info + + exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError + raise exc("No module named '_yaml'") +else: + from yaml._yaml import * + import warnings + warnings.warn( + 'The _yaml extension module is now located at yaml._yaml' + ' and its location is subject to change. To use the' + ' LibYAML-based parser and emitter, import from `yaml`:' + ' `from yaml import CLoader as Loader, CDumper as Dumper`.', + DeprecationWarning + ) + del warnings + # Don't `del yaml` here because yaml is actually an existing + # namespace member of _yaml. + +__name__ = '_yaml' +# If the module is top-level (i.e. not a part of any specific package) +# then the attribute should be set to ''. +# https://docs.python.org/3.8/library/types.html +__package__ = '' diff --git a/env/lib/python3.10/site-packages/distutils-precedence.pth b/env/lib/python3.10/site-packages/distutils-precedence.pth new file mode 100644 index 0000000..7f009fe --- /dev/null +++ b/env/lib/python3.10/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/INSTALLER b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/METADATA b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/METADATA new file mode 100644 index 0000000..d3b40a5 --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/METADATA @@ -0,0 +1,67 @@ +Metadata-Version: 2.4 +Name: docc +Version: 0.3.1 +Summary: Python code documentation compiler +Home-page: https://github.com/SamWilsn/docc +Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) +Requires-Python: >=3.10 +Description-Content-Type: text/markdown +License-File: LICENSE.md +Requires-Dist: libcst<2,>=1.0.1 +Requires-Dist: mistletoe<2,>=1.2.1 +Requires-Dist: importlib-resources<7,>=6.0.1 +Requires-Dist: tomli<3,>=2.0.1 +Requires-Dist: rich<14,>=13.5.2 +Requires-Dist: Jinja2<4,>=3.1.2 +Requires-Dist: inflection<0.6,>=0.5.1 +Requires-Dist: typing-extensions<5,>=4.7.1 +Provides-Extra: lint +Requires-Dist: isort<6,>=5.12.0; extra == "lint" +Requires-Dist: pyre-check<0.10,>=0.9.18; extra == "lint" +Requires-Dist: click<8.2.0,>=8.0; extra == "lint" +Requires-Dist: types-setuptools>=68.1; extra == "lint" +Requires-Dist: black<24,>=23.7.0; extra == "lint" +Requires-Dist: flake8-spellcheck<0.29,>=0.28; extra == "lint" +Requires-Dist: flake8-docstrings<2,>=1.7; extra == "lint" +Requires-Dist: flake8-bugbear<24.0.0,>=23.7.10; extra == "lint" +Requires-Dist: flake8<7,>=6.1.0; extra == "lint" +Dynamic: license-file + +docc +==== + +[![documentation badge][docs-badge]][docs] + +The documentation compiler. + +## Python Quickstart + +### Installing + +```bash +pip install docc +``` + +### Configuring + +Add the following to your [`pyproject.toml`]: + +```toml +[tool.docc.plugins."docc.python.discover"] +paths = [ "" ] + +[tool.docc.output] +path = "" +``` + +### Building + +Finally, to generate the documentation: + +```bash +docc +``` + +[docs-badge]: https://github.com/SamWilsn/docc/actions/workflows/gh-pages.yaml/badge.svg?branch=master +[docs]: https://samwilsn.github.io/docc/ +[`pyproject.toml`]: https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/RECORD b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/RECORD new file mode 100644 index 0000000..6b67905 --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/RECORD @@ -0,0 +1,11 @@ +../../../bin/docc,sha256=ObZ0IOeIeJi8DMxwU3BAkKe38ZUHELj0a4nIrlOtCrs,216 +__editable__.docc-0.3.1.pth,sha256=WWB6h5-hMKBPjO2DMC1CICZwGHbJ_1Mf69NiyoHoE5M,38 +docc-0.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +docc-0.3.1.dist-info/METADATA,sha256=AV18zg8baPOZeo60iOO6z1R-1KI4DHuhDw8ebgYjj6w,1861 +docc-0.3.1.dist-info/RECORD,, +docc-0.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +docc-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +docc-0.3.1.dist-info/direct_url.json,sha256=UD7kLM68kC_uOoC6tHOJrckVaccK-rsIAg6iVjMXSdY,83 +docc-0.3.1.dist-info/entry_points.txt,sha256=FVlkcn7VF328vMIzw4gXGEmftGYvC-Co3qrjiS2vLTg,3173 +docc-0.3.1.dist-info/licenses/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916 +docc-0.3.1.dist-info/top_level.txt,sha256=tKecI8_IAqeXpTOywFR6P_zJfpqauYt0qrO7eyxHNE0,5 diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/REQUESTED b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/WHEEL b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/WHEEL new file mode 100644 index 0000000..e7fa31b --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/direct_url.json b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/direct_url.json new file mode 100644 index 0000000..cf701b6 --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/direct_url.json @@ -0,0 +1 @@ +{"dir_info": {"editable": true}, "url": "file:///Users/oluwatumininu/Desktop/docc"} \ No newline at end of file diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/entry_points.txt b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/entry_points.txt new file mode 100644 index 0000000..c9dba0d --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/entry_points.txt @@ -0,0 +1,53 @@ +[console_scripts] +docc = docc.cli:main + +[docc.plugins] +docc.debug.transform = docc.plugins.debug:DebugTransform +docc.files.build = docc.plugins.files:FilesBuilder +docc.files.discover = docc.plugins.files:FilesDiscover +docc.html.context = docc.plugins.html:HTMLContext +docc.html.discover = docc.plugins.html:HTMLDiscover +docc.html.transform = docc.plugins.html:HTMLTransform +docc.listing.build = docc.plugins.listing:ListingBuilder +docc.listing.discover = docc.plugins.listing:ListingDiscover +docc.mistletoe.reference = docc.plugins.mistletoe:ReferenceTransform +docc.mistletoe.transform = docc.plugins.mistletoe:DocstringTransform +docc.python.build = docc.plugins.python:PythonBuilder +docc.python.discover = docc.plugins.python:PythonDiscover +docc.python.transform = docc.plugins.python:PythonTransform +docc.references.context = docc.plugins.references:IndexContext +docc.references.index = docc.plugins.references:IndexTransform +docc.resources.build = docc.plugins.resources:ResourceBuilder +docc.search.build = docc.plugins.search:SearchBuilder +docc.search.context = docc.plugins.search:SearchContext +docc.search.discover = docc.plugins.search:SearchDiscover +docc.search.transform = docc.plugins.search:SearchTransform +docc.verbatim.transform = docc.plugins.verbatim:Transcribe + +[docc.plugins.html] +docc.document:BlankNode = docc.plugins.html:blank_node +docc.document:ListNode = docc.plugins.html:list_node +docc.plugins.html:HTMLTag = docc.plugins.html:html_tag +docc.plugins.html:TextNode = docc.plugins.html:text_node +docc.plugins.listing:ListingNode = docc.plugins.listing:render_html +docc.plugins.mistletoe:MarkdownNode = docc.plugins.mistletoe:render_html +docc.plugins.python.nodes:Access = docc.plugins.python.html:render_access +docc.plugins.python.nodes:Attribute = docc.plugins.python.html:render_attribute +docc.plugins.python.nodes:BinaryOperation = docc.plugins.python.html:render_binary_operation +docc.plugins.python.nodes:BitOr = docc.plugins.python.html:render_bit_or +docc.plugins.python.nodes:Class = docc.plugins.python.html:render_class +docc.plugins.python.nodes:Docstring = docc.plugins.python.html:render_docstring +docc.plugins.python.nodes:Function = docc.plugins.python.html:render_function +docc.plugins.python.nodes:List = docc.plugins.python.html:render_list +docc.plugins.python.nodes:Module = docc.plugins.python.html:render_module +docc.plugins.python.nodes:Name = docc.plugins.python.html:render_name +docc.plugins.python.nodes:Parameter = docc.plugins.python.html:render_parameter +docc.plugins.python.nodes:Subscript = docc.plugins.python.html:render_subscript +docc.plugins.python.nodes:Tuple = docc.plugins.python.html:render_tuple +docc.plugins.python.nodes:Type = docc.plugins.python.html:render_type +docc.plugins.references:Definition = docc.plugins.html:references_definition +docc.plugins.references:Reference = docc.plugins.html:references_reference +docc.plugins.verbatim:Highlight = docc.plugins.verbatim.html:render_highlight +docc.plugins.verbatim:Line = docc.plugins.verbatim.html:render_line +docc.plugins.verbatim:Text = docc.plugins.verbatim.html:render_text +docc.plugins.verbatim:Transcribed = docc.plugins.verbatim.html:render_transcribed diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/licenses/LICENSE.md b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..2fb2e74 --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/licenses/LICENSE.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/top_level.txt b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/top_level.txt new file mode 100644 index 0000000..2ee0b4b --- /dev/null +++ b/env/lib/python3.10/site-packages/docc-0.3.1.dist-info/top_level.txt @@ -0,0 +1 @@ +docc diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/INSTALLER b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/LICENSE b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/METADATA b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/METADATA new file mode 100644 index 0000000..474de80 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/METADATA @@ -0,0 +1,103 @@ +Metadata-Version: 2.1 +Name: importlib_resources +Version: 6.5.2 +Summary: Read resources from Python packages +Author-email: Barry Warsaw +Maintainer-email: "Jason R. Coombs" +Project-URL: Source, https://github.com/python/importlib_resources +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: zipp>=3.1.0; python_version < "3.10" +Provides-Extra: test +Requires-Dist: pytest!=8.1.*,>=6; extra == "test" +Requires-Dist: zipp>=3.17; extra == "test" +Requires-Dist: jaraco.test>=5.4; extra == "test" +Provides-Extra: doc +Requires-Dist: sphinx>=3.5; extra == "doc" +Requires-Dist: jaraco.packaging>=9.3; extra == "doc" +Requires-Dist: rst.linker>=1.9; extra == "doc" +Requires-Dist: furo; extra == "doc" +Requires-Dist: sphinx-lint; extra == "doc" +Requires-Dist: jaraco.tidelift>=1.4; extra == "doc" +Provides-Extra: check +Requires-Dist: pytest-checkdocs>=2.4; extra == "check" +Requires-Dist: pytest-ruff>=0.2.1; sys_platform != "cygwin" and extra == "check" +Provides-Extra: cover +Requires-Dist: pytest-cov; extra == "cover" +Provides-Extra: enabler +Requires-Dist: pytest-enabler>=2.2; extra == "enabler" +Provides-Extra: type +Requires-Dist: pytest-mypy; extra == "type" + +.. image:: https://img.shields.io/pypi/v/importlib_resources.svg + :target: https://pypi.org/project/importlib_resources + +.. image:: https://img.shields.io/pypi/pyversions/importlib_resources.svg + +.. image:: https://github.com/python/importlib_resources/actions/workflows/main.yml/badge.svg + :target: https://github.com/python/importlib_resources/actions?query=workflow%3A%22tests%22 + :alt: tests + +.. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json + :target: https://github.com/astral-sh/ruff + :alt: Ruff + +.. image:: https://readthedocs.org/projects/importlib-resources/badge/?version=latest + :target: https://importlib-resources.readthedocs.io/en/latest/?badge=latest + +.. image:: https://img.shields.io/badge/skeleton-2025-informational + :target: https://blog.jaraco.com/skeleton + +.. image:: https://tidelift.com/badges/package/pypi/importlib-resources + :target: https://tidelift.com/subscription/pkg/pypi-importlib-resources?utm_source=pypi-importlib-resources&utm_medium=readme + +``importlib_resources`` is a backport of Python standard library +`importlib.resources +`_ +module for older Pythons. + +The key goal of this module is to replace parts of `pkg_resources +`_ with a +solution in Python's stdlib that relies on well-defined APIs. This makes +reading resources included in packages easier, with more stable and consistent +semantics. + +Compatibility +============= + +New features are introduced in this third-party library and later merged +into CPython. The following table indicates which versions of this library +were contributed to different versions in the standard library: + +.. list-table:: + :header-rows: 1 + + * - importlib_resources + - stdlib + * - 6.0 + - 3.13 + * - 5.12 + - 3.12 + * - 5.7 + - 3.11 + * - 5.0 + - 3.10 + * - 1.3 + - 3.9 + * - 0.5 (?) + - 3.7 + +For Enterprise +============== + +Available as part of the Tidelift Subscription. + +This project and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. + +`Learn more `_. diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/RECORD b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/RECORD new file mode 100644 index 0000000..ce1fffd --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/RECORD @@ -0,0 +1,67 @@ +importlib_resources-6.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +importlib_resources-6.5.2.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358 +importlib_resources-6.5.2.dist-info/METADATA,sha256=yglT_7S_PsrSQaVTgZKQYfomaUlD-pV74f_9Ld0RjoY,3947 +importlib_resources-6.5.2.dist-info/RECORD,, +importlib_resources-6.5.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91 +importlib_resources-6.5.2.dist-info/top_level.txt,sha256=fHIjHU1GZwAjvcydpmUnUrTnbvdiWjG4OEVZK8by0TQ,20 +importlib_resources/__init__.py,sha256=F6SOMZILiez96lK3h9duE_c5kRTEydzHvI6D7TRcOJE,700 +importlib_resources/__pycache__/__init__.cpython-310.pyc,, +importlib_resources/__pycache__/_adapters.cpython-310.pyc,, +importlib_resources/__pycache__/_common.cpython-310.pyc,, +importlib_resources/__pycache__/_functional.cpython-310.pyc,, +importlib_resources/__pycache__/_itertools.cpython-310.pyc,, +importlib_resources/__pycache__/abc.cpython-310.pyc,, +importlib_resources/__pycache__/readers.cpython-310.pyc,, +importlib_resources/__pycache__/simple.cpython-310.pyc,, +importlib_resources/_adapters.py,sha256=vprJGbUeHbajX6XCuMP6J3lMrqCi-P_MTlziJUR7jfk,4482 +importlib_resources/_common.py,sha256=Vfmmdk5ICrZ8odgfWEuUHG-P7ZbJ-5x3pRLCVwVk8Tg,5624 +importlib_resources/_functional.py,sha256=nMop9Zc7g1Yhiyk5oqr9ukvfJcOx4vnvqD7nh24hV7Y,2743 +importlib_resources/_itertools.py,sha256=eDisV6RqiNZOogLSXf6LOGHOYc79FGgPrKNLzFLmCrU,1277 +importlib_resources/abc.py,sha256=inhYsYj6LrYHn4kCraZq8zqXFQnDX4stNnLTruhf6NU,5549 +importlib_resources/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/compat/__pycache__/__init__.cpython-310.pyc,, +importlib_resources/compat/__pycache__/py39.cpython-310.pyc,, +importlib_resources/compat/py39.py,sha256=gx5NE25XH1pQrTRJDY7QJUngZpD7OotsK9F6pZy5KjM,151 +importlib_resources/future/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/future/__pycache__/__init__.cpython-310.pyc,, +importlib_resources/future/__pycache__/adapters.cpython-310.pyc,, +importlib_resources/future/adapters.py,sha256=UFIMxEuLo4PqcVbtoV3e_k9BcxCS-mmG22f8U2Vtkx4,3285 +importlib_resources/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/readers.py,sha256=uHf9X-smA3CtxdB9IHWH0z-O53379wlcEMmzA2UXzqE,6250 +importlib_resources/simple.py,sha256=wJm2qGZ9EMPFhRLiJBa9Em5tVKbD7Q8ibWtt4ZNgWBU,2590 +importlib_resources/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/__pycache__/__init__.cpython-310.pyc,, +importlib_resources/tests/__pycache__/_path.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_compatibilty_files.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_contents.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_custom.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_files.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_functional.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_open.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_path.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_read.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_reader.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_resource.cpython-310.pyc,, +importlib_resources/tests/__pycache__/test_util.cpython-310.pyc,, +importlib_resources/tests/__pycache__/util.cpython-310.pyc,, +importlib_resources/tests/__pycache__/zip.cpython-310.pyc,, +importlib_resources/tests/_path.py,sha256=IK3o6J_4UaN-4DPuwKr0lOb2KWpoUjwIyQkOtGqZWzs,2250 +importlib_resources/tests/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +importlib_resources/tests/compat/__pycache__/__init__.cpython-310.pyc,, +importlib_resources/tests/compat/__pycache__/py312.cpython-310.pyc,, +importlib_resources/tests/compat/__pycache__/py39.cpython-310.pyc,, +importlib_resources/tests/compat/py312.py,sha256=qcWjpZhQo2oEsdwIlRRQHrsMGDltkFTnETeG7fLdUS8,364 +importlib_resources/tests/compat/py39.py,sha256=nOjut4CZDtRgZEblX9hWhupo9vli_CA1270_JwdQzRo,441 +importlib_resources/tests/test_compatibilty_files.py,sha256=cOLwa5kU6ucxNfiNsAQSpLHCE8asuqAHui6Aw9mxKX8,3313 +importlib_resources/tests/test_contents.py,sha256=r8kVH1k7DHrco2JVTUMCbsWK0JvvjKt0zgrmH56c4Vg,838 +importlib_resources/tests/test_custom.py,sha256=ep5mGT6uT6O1gPdM-b3mXo9HWDnCLD90uc4H1bU68oI,1222 +importlib_resources/tests/test_files.py,sha256=u4vMrXPpaWGJY8DyFJBkgg78lr_l9sfjzatP_7mkn88,5741 +importlib_resources/tests/test_functional.py,sha256=B3cFWFztSkMh4Y58MyOex_lcEooIPR-ezTaA9xzI6Y4,9070 +importlib_resources/tests/test_open.py,sha256=dT-cZmJoGbMMIVVWkNXt8KUxWcQn9Cd0emb85U4CiBA,2682 +importlib_resources/tests/test_path.py,sha256=orETYbmGyYNgXA8Dslj9MM3XjGUDRW8u4dJhIBy0qdU,1986 +importlib_resources/tests/test_read.py,sha256=o3uXJCUTYmUZeaFoQyXeRxTPpwhbjgRz-aALAg_btz8,3046 +importlib_resources/tests/test_reader.py,sha256=1RFB-rJs1hCDSy6qgv2z3LDm42gbQmj2n718CCdn1JY,4655 +importlib_resources/tests/test_resource.py,sha256=ZgpXCuYs4GZpSCElJyhZlMkb8oOfMZX1cnPLoinzis0,7687 +importlib_resources/tests/test_util.py,sha256=VotLNbngOyFg03FKVTzIZKd4Gz4UO-dMEr0G-vHMiuI,1105 +importlib_resources/tests/util.py,sha256=PKybGEyCo53mMu7A-5vC6n0e3nc9R8DS2NtvO-JCyxY,9804 +importlib_resources/tests/zip.py,sha256=nG9D6u_4nu67NrEUFfMt7vzba0qO_-QPyAAWc6W4gP4,577 diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/WHEEL b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/WHEEL new file mode 100644 index 0000000..ae527e7 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.6.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/top_level.txt b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/top_level.txt new file mode 100644 index 0000000..58ad1bd --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources-6.5.2.dist-info/top_level.txt @@ -0,0 +1 @@ +importlib_resources diff --git a/env/lib/python3.10/site-packages/importlib_resources/__init__.py b/env/lib/python3.10/site-packages/importlib_resources/__init__.py new file mode 100644 index 0000000..27d6c7f --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/__init__.py @@ -0,0 +1,40 @@ +""" +Read resources contained within a package. + +This codebase is shared between importlib.resources in the stdlib +and importlib_resources in PyPI. See +https://github.com/python/importlib_metadata/wiki/Development-Methodology +for more detail. +""" + +from ._common import ( + Anchor, + Package, + as_file, + files, +) +from ._functional import ( + contents, + is_resource, + open_binary, + open_text, + path, + read_binary, + read_text, +) +from .abc import ResourceReader + +__all__ = [ + 'Package', + 'Anchor', + 'ResourceReader', + 'as_file', + 'files', + 'contents', + 'is_resource', + 'open_binary', + 'open_text', + 'path', + 'read_binary', + 'read_text', +] diff --git a/env/lib/python3.10/site-packages/importlib_resources/_adapters.py b/env/lib/python3.10/site-packages/importlib_resources/_adapters.py new file mode 100644 index 0000000..50688fb --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/_adapters.py @@ -0,0 +1,168 @@ +from contextlib import suppress +from io import TextIOWrapper + +from . import abc + + +class SpecLoaderAdapter: + """ + Adapt a package spec to adapt the underlying loader. + """ + + def __init__(self, spec, adapter=lambda spec: spec.loader): + self.spec = spec + self.loader = adapter(spec) + + def __getattr__(self, name): + return getattr(self.spec, name) + + +class TraversableResourcesLoader: + """ + Adapt a loader to provide TraversableResources. + """ + + def __init__(self, spec): + self.spec = spec + + def get_resource_reader(self, name): + return CompatibilityFiles(self.spec)._native() + + +def _io_wrapper(file, mode='r', *args, **kwargs): + if mode == 'r': + return TextIOWrapper(file, *args, **kwargs) + elif mode == 'rb': + return file + raise ValueError(f"Invalid mode value '{mode}', only 'r' and 'rb' are supported") + + +class CompatibilityFiles: + """ + Adapter for an existing or non-existent resource reader + to provide a compatibility .files(). + """ + + class SpecPath(abc.Traversable): + """ + Path tied to a module spec. + Can be read and exposes the resource reader children. + """ + + def __init__(self, spec, reader): + self._spec = spec + self._reader = reader + + def iterdir(self): + if not self._reader: + return iter(()) + return iter( + CompatibilityFiles.ChildPath(self._reader, path) + for path in self._reader.contents() + ) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + if not self._reader: + return CompatibilityFiles.OrphanPath(other) + return CompatibilityFiles.ChildPath(self._reader, other) + + @property + def name(self): + return self._spec.name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper(self._reader.open_resource(None), mode, *args, **kwargs) + + class ChildPath(abc.Traversable): + """ + Path tied to a resource reader child. + Can be read but doesn't expose any meaningful children. + """ + + def __init__(self, reader, name): + self._reader = reader + self._name = name + + def iterdir(self): + return iter(()) + + def is_file(self): + return self._reader.is_resource(self.name) + + def is_dir(self): + return not self.is_file() + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(self.name, other) + + @property + def name(self): + return self._name + + def open(self, mode='r', *args, **kwargs): + return _io_wrapper( + self._reader.open_resource(self.name), mode, *args, **kwargs + ) + + class OrphanPath(abc.Traversable): + """ + Orphan path, not tied to a module spec or resource reader. + Can't be read and doesn't expose any meaningful children. + """ + + def __init__(self, *path_parts): + if len(path_parts) < 1: + raise ValueError('Need at least one path part to construct a path') + self._path = path_parts + + def iterdir(self): + return iter(()) + + def is_file(self): + return False + + is_dir = is_file + + def joinpath(self, other): + return CompatibilityFiles.OrphanPath(*self._path, other) + + @property + def name(self): + return self._path[-1] + + def open(self, mode='r', *args, **kwargs): + raise FileNotFoundError("Can't open orphan path") + + def __init__(self, spec): + self.spec = spec + + @property + def _reader(self): + with suppress(AttributeError): + return self.spec.loader.get_resource_reader(self.spec.name) + + def _native(self): + """ + Return the native reader if it supports files(). + """ + reader = self._reader + return reader if hasattr(reader, 'files') else self + + def __getattr__(self, attr): + return getattr(self._reader, attr) + + def files(self): + return CompatibilityFiles.SpecPath(self.spec, self._reader) + + +def wrap_spec(package): + """ + Construct a package spec with traversable compatibility + on the spec/loader/reader. + """ + return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) diff --git a/env/lib/python3.10/site-packages/importlib_resources/_common.py b/env/lib/python3.10/site-packages/importlib_resources/_common.py new file mode 100644 index 0000000..5f41c26 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/_common.py @@ -0,0 +1,211 @@ +import contextlib +import functools +import importlib +import inspect +import itertools +import os +import pathlib +import tempfile +import types +import warnings +from typing import Optional, Union, cast + +from .abc import ResourceReader, Traversable + +Package = Union[types.ModuleType, str] +Anchor = Package + + +def package_to_anchor(func): + """ + Replace 'package' parameter as 'anchor' and warn about the change. + + Other errors should fall through. + + >>> files('a', 'b') + Traceback (most recent call last): + TypeError: files() takes from 0 to 1 positional arguments but 2 were given + + Remove this compatibility in Python 3.14. + """ + undefined = object() + + @functools.wraps(func) + def wrapper(anchor=undefined, package=undefined): + if package is not undefined: + if anchor is not undefined: + return func(anchor, package) + warnings.warn( + "First parameter to files is renamed to 'anchor'", + DeprecationWarning, + stacklevel=2, + ) + return func(package) + elif anchor is undefined: + return func() + return func(anchor) + + return wrapper + + +@package_to_anchor +def files(anchor: Optional[Anchor] = None) -> Traversable: + """ + Get a Traversable resource for an anchor. + """ + return from_package(resolve(anchor)) + + +def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]: + """ + Return the package's loader if it's a ResourceReader. + """ + # We can't use + # a issubclass() check here because apparently abc.'s __subclasscheck__() + # hook wants to create a weak reference to the object, but + # zipimport.zipimporter does not support weak references, resulting in a + # TypeError. That seems terrible. + spec = package.__spec__ + reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore[union-attr] + if reader is None: + return None + return reader(spec.name) # type: ignore[union-attr] + + +@functools.singledispatch +def resolve(cand: Optional[Anchor]) -> types.ModuleType: + return cast(types.ModuleType, cand) + + +@resolve.register +def _(cand: str) -> types.ModuleType: + return importlib.import_module(cand) + + +@resolve.register +def _(cand: None) -> types.ModuleType: + return resolve(_infer_caller().f_globals['__name__']) + + +def _infer_caller(): + """ + Walk the stack and find the frame of the first caller not in this module. + """ + + def is_this_file(frame_info): + return frame_info.filename == stack[0].filename + + def is_wrapper(frame_info): + return frame_info.function == 'wrapper' + + stack = inspect.stack() + not_this_file = itertools.filterfalse(is_this_file, stack) + # also exclude 'wrapper' due to singledispatch in the call stack + callers = itertools.filterfalse(is_wrapper, not_this_file) + return next(callers).frame + + +def from_package(package: types.ModuleType): + """ + Return a Traversable object for the given package. + + """ + # deferred for performance (python/cpython#109829) + from .future.adapters import wrap_spec + + spec = wrap_spec(package) + reader = spec.loader.get_resource_reader(spec.name) + return reader.files() + + +@contextlib.contextmanager +def _tempfile( + reader, + suffix='', + # gh-93353: Keep a reference to call os.remove() in late Python + # finalization. + *, + _os_remove=os.remove, +): + # Not using tempfile.NamedTemporaryFile as it leads to deeper 'try' + # blocks due to the need to close the temporary file to work on Windows + # properly. + fd, raw_path = tempfile.mkstemp(suffix=suffix) + try: + try: + os.write(fd, reader()) + finally: + os.close(fd) + del reader + yield pathlib.Path(raw_path) + finally: + try: + _os_remove(raw_path) + except FileNotFoundError: + pass + + +def _temp_file(path): + return _tempfile(path.read_bytes, suffix=path.name) + + +def _is_present_dir(path: Traversable) -> bool: + """ + Some Traversables implement ``is_dir()`` to raise an + exception (i.e. ``FileNotFoundError``) when the + directory doesn't exist. This function wraps that call + to always return a boolean and only return True + if there's a dir and it exists. + """ + with contextlib.suppress(FileNotFoundError): + return path.is_dir() + return False + + +@functools.singledispatch +def as_file(path): + """ + Given a Traversable object, return that object as a + path on the local file system in a context manager. + """ + return _temp_dir(path) if _is_present_dir(path) else _temp_file(path) + + +@as_file.register(pathlib.Path) +@contextlib.contextmanager +def _(path): + """ + Degenerate behavior for pathlib.Path objects. + """ + yield path + + +@contextlib.contextmanager +def _temp_path(dir: tempfile.TemporaryDirectory): + """ + Wrap tempfile.TemporaryDirectory to return a pathlib object. + """ + with dir as result: + yield pathlib.Path(result) + + +@contextlib.contextmanager +def _temp_dir(path): + """ + Given a traversable dir, recursively replicate the whole tree + to the file system in a context manager. + """ + assert path.is_dir() + with _temp_path(tempfile.TemporaryDirectory()) as temp_dir: + yield _write_contents(temp_dir, path) + + +def _write_contents(target, source): + child = target.joinpath(source.name) + if source.is_dir(): + child.mkdir() + for item in source.iterdir(): + _write_contents(child, item) + else: + child.write_bytes(source.read_bytes()) + return child diff --git a/env/lib/python3.10/site-packages/importlib_resources/_functional.py b/env/lib/python3.10/site-packages/importlib_resources/_functional.py new file mode 100644 index 0000000..b08a5c6 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/_functional.py @@ -0,0 +1,84 @@ +"""Simplified function-based API for importlib.resources""" + +import warnings + +from ._common import as_file, files +from .abc import TraversalError + +_MISSING = object() + + +def open_binary(anchor, *path_names): + """Open for binary reading the *resource* within *package*.""" + return _get_resource(anchor, path_names).open('rb') + + +def open_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Open for text reading the *resource* within *package*.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.open('r', encoding=encoding, errors=errors) + + +def read_binary(anchor, *path_names): + """Read and return contents of *resource* within *package* as bytes.""" + return _get_resource(anchor, path_names).read_bytes() + + +def read_text(anchor, *path_names, encoding=_MISSING, errors='strict'): + """Read and return contents of *resource* within *package* as str.""" + encoding = _get_encoding_arg(path_names, encoding) + resource = _get_resource(anchor, path_names) + return resource.read_text(encoding=encoding, errors=errors) + + +def path(anchor, *path_names): + """Return the path to the *resource* as an actual file system path.""" + return as_file(_get_resource(anchor, path_names)) + + +def is_resource(anchor, *path_names): + """Return ``True`` if there is a resource named *name* in the package, + + Otherwise returns ``False``. + """ + try: + return _get_resource(anchor, path_names).is_file() + except TraversalError: + return False + + +def contents(anchor, *path_names): + """Return an iterable over the named resources within the package. + + The iterable returns :class:`str` resources (e.g. files). + The iterable does not recurse into subdirectories. + """ + warnings.warn( + "importlib.resources.contents is deprecated. " + "Use files(anchor).iterdir() instead.", + DeprecationWarning, + stacklevel=1, + ) + return (resource.name for resource in _get_resource(anchor, path_names).iterdir()) + + +def _get_encoding_arg(path_names, encoding): + # For compatibility with versions where *encoding* was a positional + # argument, it needs to be given explicitly when there are multiple + # *path_names*. + # This limitation can be removed in Python 3.15. + if encoding is _MISSING: + if len(path_names) > 1: + raise TypeError( + "'encoding' argument required with multiple path names", + ) + else: + return 'utf-8' + return encoding + + +def _get_resource(anchor, path_names): + if anchor is None: + raise TypeError("anchor must be module or string, got None") + return files(anchor).joinpath(*path_names) diff --git a/env/lib/python3.10/site-packages/importlib_resources/_itertools.py b/env/lib/python3.10/site-packages/importlib_resources/_itertools.py new file mode 100644 index 0000000..7b775ef --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/_itertools.py @@ -0,0 +1,38 @@ +# from more_itertools 9.0 +def only(iterable, default=None, too_long=None): + """If *iterable* has only one item, return it. + If it has zero items, return *default*. + If it has more than one item, raise the exception given by *too_long*, + which is ``ValueError`` by default. + >>> only([], default='missing') + 'missing' + >>> only([1]) + 1 + >>> only([1, 2]) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + ValueError: Expected exactly one item in iterable, but got 1, 2, + and perhaps more.' + >>> only([1, 2], too_long=TypeError) # doctest: +IGNORE_EXCEPTION_DETAIL + Traceback (most recent call last): + ... + TypeError + Note that :func:`only` attempts to advance *iterable* twice to ensure there + is only one item. See :func:`spy` or :func:`peekable` to check + iterable contents less destructively. + """ + it = iter(iterable) + first_value = next(it, default) + + try: + second_value = next(it) + except StopIteration: + pass + else: + msg = ( + 'Expected exactly one item in iterable, but got {!r}, {!r}, ' + 'and perhaps more.'.format(first_value, second_value) + ) + raise too_long or ValueError(msg) + + return first_value diff --git a/env/lib/python3.10/site-packages/importlib_resources/abc.py b/env/lib/python3.10/site-packages/importlib_resources/abc.py new file mode 100644 index 0000000..883d332 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/abc.py @@ -0,0 +1,193 @@ +import abc +import itertools +import os +import pathlib +from typing import ( + Any, + BinaryIO, + Iterable, + Iterator, + NoReturn, + Literal, + Optional, + Protocol, + Text, + TextIO, + Union, + overload, + runtime_checkable, +) + +StrPath = Union[str, os.PathLike[str]] + +__all__ = ["ResourceReader", "Traversable", "TraversableResources"] + + +class ResourceReader(metaclass=abc.ABCMeta): + """Abstract base class for loaders to provide resource reading support.""" + + @abc.abstractmethod + def open_resource(self, resource: Text) -> BinaryIO: + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name. + If the resource cannot be found, FileNotFoundError is raised. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource: Text) -> Text: + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name. + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + # This deliberately raises FileNotFoundError instead of + # NotImplementedError so that if this method is accidentally called, + # it'll still do the right thing. + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, path: Text) -> bool: + """Return True if the named 'path' is a resource. + + Files are resources, directories are not. + """ + raise FileNotFoundError + + @abc.abstractmethod + def contents(self) -> Iterable[str]: + """Return an iterable of entries in `package`.""" + raise FileNotFoundError + + +class TraversalError(Exception): + pass + + +@runtime_checkable +class Traversable(Protocol): + """ + An object with a subset of pathlib.Path methods suitable for + traversing directories and opening files. + + Any exceptions that occur when accessing the backing resource + may propagate unaltered. + """ + + @abc.abstractmethod + def iterdir(self) -> Iterator["Traversable"]: + """ + Yield Traversable objects in self + """ + + def read_bytes(self) -> bytes: + """ + Read contents of self as bytes + """ + with self.open('rb') as strm: + return strm.read() + + def read_text( + self, encoding: Optional[str] = None, errors: Optional[str] = None + ) -> str: + """ + Read contents of self as text + """ + with self.open(encoding=encoding, errors=errors) as strm: + return strm.read() + + @abc.abstractmethod + def is_dir(self) -> bool: + """ + Return True if self is a directory + """ + + @abc.abstractmethod + def is_file(self) -> bool: + """ + Return True if self is a file + """ + + def joinpath(self, *descendants: StrPath) -> "Traversable": + """ + Return Traversable resolved with any descendants applied. + + Each descendant should be a path segment relative to self + and each may contain multiple levels separated by + ``posixpath.sep`` (``/``). + """ + if not descendants: + return self + names = itertools.chain.from_iterable( + path.parts for path in map(pathlib.PurePosixPath, descendants) + ) + target = next(names) + matches = ( + traversable for traversable in self.iterdir() if traversable.name == target + ) + try: + match = next(matches) + except StopIteration: + raise TraversalError( + "Target not found during traversal.", target, list(names) + ) + return match.joinpath(*names) + + def __truediv__(self, child: StrPath) -> "Traversable": + """ + Return Traversable child in self + """ + return self.joinpath(child) + + @overload + def open(self, mode: Literal['r'] = 'r', *args: Any, **kwargs: Any) -> TextIO: ... + + @overload + def open(self, mode: Literal['rb'], *args: Any, **kwargs: Any) -> BinaryIO: ... + + @abc.abstractmethod + def open( + self, mode: str = 'r', *args: Any, **kwargs: Any + ) -> Union[TextIO, BinaryIO]: + """ + mode may be 'r' or 'rb' to open as text or binary. Return a handle + suitable for reading (same as pathlib.Path.open). + + When opening as text, accepts encoding parameters such as those + accepted by io.TextIOWrapper. + """ + + @property + @abc.abstractmethod + def name(self) -> str: + """ + The base name of this object without any parent references. + """ + + +class TraversableResources(ResourceReader): + """ + The required interface for providing traversable + resources. + """ + + @abc.abstractmethod + def files(self) -> "Traversable": + """Return a Traversable object for the loaded package.""" + + def open_resource(self, resource: StrPath) -> BinaryIO: + return self.files().joinpath(resource).open('rb') + + def resource_path(self, resource: Any) -> NoReturn: + raise FileNotFoundError(resource) + + def is_resource(self, path: StrPath) -> bool: + return self.files().joinpath(path).is_file() + + def contents(self) -> Iterator[str]: + return (item.name for item in self.files().iterdir()) diff --git a/env/lib/python3.10/site-packages/importlib_resources/compat/__init__.py b/env/lib/python3.10/site-packages/importlib_resources/compat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/importlib_resources/compat/py39.py b/env/lib/python3.10/site-packages/importlib_resources/compat/py39.py new file mode 100644 index 0000000..684d3c6 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/compat/py39.py @@ -0,0 +1,9 @@ +import sys + +__all__ = ['ZipPath'] + + +if sys.version_info >= (3, 10): + from zipfile import Path as ZipPath +else: + from zipp import Path as ZipPath diff --git a/env/lib/python3.10/site-packages/importlib_resources/future/__init__.py b/env/lib/python3.10/site-packages/importlib_resources/future/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/importlib_resources/future/adapters.py b/env/lib/python3.10/site-packages/importlib_resources/future/adapters.py new file mode 100644 index 0000000..239e52b --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/future/adapters.py @@ -0,0 +1,102 @@ +import functools +import pathlib +from contextlib import suppress +from types import SimpleNamespace + +from .. import _adapters, readers + + +def _block_standard(reader_getter): + """ + Wrap _adapters.TraversableResourcesLoader.get_resource_reader + and intercept any standard library readers. + """ + + @functools.wraps(reader_getter) + def wrapper(*args, **kwargs): + """ + If the reader is from the standard library, return None to allow + allow likely newer implementations in this library to take precedence. + """ + try: + reader = reader_getter(*args, **kwargs) + except NotADirectoryError: + # MultiplexedPath may fail on zip subdirectory + return + except ValueError as exc: + # NamespaceReader in stdlib may fail for editable installs + # (python/importlib_resources#311, python/importlib_resources#318) + # Remove after bugfix applied to Python 3.13. + if "not enough values to unpack" not in str(exc): + raise + return + # Python 3.10+ + mod_name = reader.__class__.__module__ + if mod_name.startswith('importlib.') and mod_name.endswith('readers'): + return + # Python 3.8, 3.9 + if isinstance(reader, _adapters.CompatibilityFiles) and ( + reader.spec.loader.__class__.__module__.startswith('zipimport') + or reader.spec.loader.__class__.__module__.startswith( + '_frozen_importlib_external' + ) + ): + return + return reader + + return wrapper + + +def _skip_degenerate(reader): + """ + Mask any degenerate reader. Ref #298. + """ + is_degenerate = ( + isinstance(reader, _adapters.CompatibilityFiles) and not reader._reader + ) + return reader if not is_degenerate else None + + +class TraversableResourcesLoader(_adapters.TraversableResourcesLoader): + """ + Adapt loaders to provide TraversableResources and other + compatibility. + + Ensures the readers from importlib_resources are preferred + over stdlib readers. + """ + + def get_resource_reader(self, name): + return ( + _skip_degenerate(_block_standard(super().get_resource_reader)(name)) + or self._standard_reader() + or super().get_resource_reader(name) + ) + + def _standard_reader(self): + return self._zip_reader() or self._namespace_reader() or self._file_reader() + + def _zip_reader(self): + with suppress(AttributeError): + return readers.ZipReader(self.spec.loader, self.spec.name) + + def _namespace_reader(self): + with suppress(AttributeError, ValueError): + return readers.NamespaceReader(self.spec.submodule_search_locations) + + def _file_reader(self): + try: + path = pathlib.Path(self.spec.origin) + except TypeError: + return None + if path.exists(): + return readers.FileReader(SimpleNamespace(path=path)) + + +def wrap_spec(package): + """ + Override _adapters.wrap_spec to use TraversableResourcesLoader + from above. Ensures that future behavior is always available on older + Pythons. + """ + return _adapters.SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader) diff --git a/env/lib/python3.10/site-packages/importlib_resources/py.typed b/env/lib/python3.10/site-packages/importlib_resources/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/importlib_resources/readers.py b/env/lib/python3.10/site-packages/importlib_resources/readers.py new file mode 100644 index 0000000..99884b6 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/readers.py @@ -0,0 +1,202 @@ +from __future__ import annotations + +import collections +import contextlib +import itertools +import operator +import pathlib +import re +import warnings +from collections.abc import Iterator + +from . import abc +from ._itertools import only +from .compat.py39 import ZipPath + + +def remove_duplicates(items): + return iter(collections.OrderedDict.fromkeys(items)) + + +class FileReader(abc.TraversableResources): + def __init__(self, loader): + self.path = pathlib.Path(loader.path).parent + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path + + +class ZipReader(abc.TraversableResources): + def __init__(self, loader, module): + self.prefix = loader.prefix.replace('\\', '/') + if loader.is_package(module): + _, _, name = module.rpartition('.') + self.prefix += name + '/' + self.archive = loader.archive + + def open_resource(self, resource): + try: + return super().open_resource(resource) + except KeyError as exc: + raise FileNotFoundError(exc.args[0]) + + def is_resource(self, path): + """ + Workaround for `zipfile.Path.is_file` returning true + for non-existent paths. + """ + target = self.files().joinpath(path) + return target.is_file() and target.exists() + + def files(self): + return ZipPath(self.archive, self.prefix) + + +class MultiplexedPath(abc.Traversable): + """ + Given a series of Traversable objects, implement a merged + version of the interface across all objects. Useful for + namespace packages which may be multihomed at a single + name. + """ + + def __init__(self, *paths): + self._paths = list(map(_ensure_traversable, remove_duplicates(paths))) + if not self._paths: + message = 'MultiplexedPath must contain at least one path' + raise FileNotFoundError(message) + if not all(path.is_dir() for path in self._paths): + raise NotADirectoryError('MultiplexedPath only supports directories') + + def iterdir(self): + children = (child for path in self._paths for child in path.iterdir()) + by_name = operator.attrgetter('name') + groups = itertools.groupby(sorted(children, key=by_name), key=by_name) + return map(self._follow, (locs for name, locs in groups)) + + def read_bytes(self): + raise FileNotFoundError(f'{self} is not a file') + + def read_text(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + def is_dir(self): + return True + + def is_file(self): + return False + + def joinpath(self, *descendants): + try: + return super().joinpath(*descendants) + except abc.TraversalError: + # One of the paths did not resolve (a directory does not exist). + # Just return something that will not exist. + return self._paths[0].joinpath(*descendants) + + @classmethod + def _follow(cls, children): + """ + Construct a MultiplexedPath if needed. + + If children contains a sole element, return it. + Otherwise, return a MultiplexedPath of the items. + Unless one of the items is not a Directory, then return the first. + """ + subdirs, one_dir, one_file = itertools.tee(children, 3) + + try: + return only(one_dir) + except ValueError: + try: + return cls(*subdirs) + except NotADirectoryError: + return next(one_file) + + def open(self, *args, **kwargs): + raise FileNotFoundError(f'{self} is not a file') + + @property + def name(self): + return self._paths[0].name + + def __repr__(self): + paths = ', '.join(f"'{path}'" for path in self._paths) + return f'MultiplexedPath({paths})' + + +class NamespaceReader(abc.TraversableResources): + def __init__(self, namespace_path): + if 'NamespacePath' not in str(namespace_path): + raise ValueError('Invalid path') + self.path = MultiplexedPath(*filter(bool, map(self._resolve, namespace_path))) + + @classmethod + def _resolve(cls, path_str) -> abc.Traversable | None: + r""" + Given an item from a namespace path, resolve it to a Traversable. + + path_str might be a directory on the filesystem or a path to a + zipfile plus the path within the zipfile, e.g. ``/foo/bar`` or + ``/foo/baz.zip/inner_dir`` or ``foo\baz.zip\inner_dir\sub``. + + path_str might also be a sentinel used by editable packages to + trigger other behaviors (see python/importlib_resources#311). + In that case, return None. + """ + dirs = (cand for cand in cls._candidate_paths(path_str) if cand.is_dir()) + return next(dirs, None) + + @classmethod + def _candidate_paths(cls, path_str: str) -> Iterator[abc.Traversable]: + yield pathlib.Path(path_str) + yield from cls._resolve_zip_path(path_str) + + @staticmethod + def _resolve_zip_path(path_str: str): + for match in reversed(list(re.finditer(r'[\\/]', path_str))): + with contextlib.suppress( + FileNotFoundError, + IsADirectoryError, + NotADirectoryError, + PermissionError, + ): + inner = path_str[match.end() :].replace('\\', '/') + '/' + yield ZipPath(path_str[: match.start()], inner.lstrip('/')) + + def resource_path(self, resource): + """ + Return the file system path to prevent + `resources.path()` from creating a temporary + copy. + """ + return str(self.path.joinpath(resource)) + + def files(self): + return self.path + + +def _ensure_traversable(path): + """ + Convert deprecated string arguments to traversables (pathlib.Path). + + Remove with Python 3.15. + """ + if not isinstance(path, str): + return path + + warnings.warn( + "String arguments are deprecated. Pass a Traversable instead.", + DeprecationWarning, + stacklevel=3, + ) + + return pathlib.Path(path) diff --git a/env/lib/python3.10/site-packages/importlib_resources/simple.py b/env/lib/python3.10/site-packages/importlib_resources/simple.py new file mode 100644 index 0000000..2e75299 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/simple.py @@ -0,0 +1,106 @@ +""" +Interface adapters for low-level readers. +""" + +import abc +import io +import itertools +from typing import BinaryIO, List + +from .abc import Traversable, TraversableResources + + +class SimpleReader(abc.ABC): + """ + The minimum, low-level interface required from a resource + provider. + """ + + @property + @abc.abstractmethod + def package(self) -> str: + """ + The name of the package for which this reader loads resources. + """ + + @abc.abstractmethod + def children(self) -> List['SimpleReader']: + """ + Obtain an iterable of SimpleReader for available + child containers (e.g. directories). + """ + + @abc.abstractmethod + def resources(self) -> List[str]: + """ + Obtain available named resources for this virtual package. + """ + + @abc.abstractmethod + def open_binary(self, resource: str) -> BinaryIO: + """ + Obtain a File-like for a named resource. + """ + + @property + def name(self): + return self.package.split('.')[-1] + + +class ResourceContainer(Traversable): + """ + Traversable container for a package's resources via its reader. + """ + + def __init__(self, reader: SimpleReader): + self.reader = reader + + def is_dir(self): + return True + + def is_file(self): + return False + + def iterdir(self): + files = (ResourceHandle(self, name) for name in self.reader.resources) + dirs = map(ResourceContainer, self.reader.children()) + return itertools.chain(files, dirs) + + def open(self, *args, **kwargs): + raise IsADirectoryError() + + +class ResourceHandle(Traversable): + """ + Handle to a named resource in a ResourceReader. + """ + + def __init__(self, parent: ResourceContainer, name: str): + self.parent = parent + self.name = name # type: ignore[misc] + + def is_file(self): + return True + + def is_dir(self): + return False + + def open(self, mode='r', *args, **kwargs): + stream = self.parent.reader.open_binary(self.name) + if 'b' not in mode: + stream = io.TextIOWrapper(stream, *args, **kwargs) + return stream + + def joinpath(self, name): + raise RuntimeError("Cannot traverse into a resource") + + +class TraversableReader(TraversableResources, SimpleReader): + """ + A TraversableResources based on SimpleReader. Resource providers + may derive from this class to provide the TraversableResources + interface by supplying the SimpleReader interface. + """ + + def files(self): + return ResourceContainer(self) diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/__init__.py b/env/lib/python3.10/site-packages/importlib_resources/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/_path.py b/env/lib/python3.10/site-packages/importlib_resources/tests/_path.py new file mode 100644 index 0000000..0033983 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/_path.py @@ -0,0 +1,90 @@ +import functools +import pathlib +from typing import Dict, Protocol, Union, runtime_checkable + +#### +# from jaraco.path 3.7.1 + + +class Symlink(str): + """ + A string indicating the target of a symlink. + """ + + +FilesSpec = Dict[str, Union[str, bytes, Symlink, 'FilesSpec']] + + +@runtime_checkable +class TreeMaker(Protocol): + def __truediv__(self, *args, **kwargs): ... # pragma: no cover + + def mkdir(self, **kwargs): ... # pragma: no cover + + def write_text(self, content, **kwargs): ... # pragma: no cover + + def write_bytes(self, content): ... # pragma: no cover + + def symlink_to(self, target): ... # pragma: no cover + + +def _ensure_tree_maker(obj: Union[str, TreeMaker]) -> TreeMaker: + return obj if isinstance(obj, TreeMaker) else pathlib.Path(obj) # type: ignore[return-value] + + +def build( + spec: FilesSpec, + prefix: Union[str, TreeMaker] = pathlib.Path(), # type: ignore[assignment] +): + """ + Build a set of files/directories, as described by the spec. + + Each key represents a pathname, and the value represents + the content. Content may be a nested directory. + + >>> spec = { + ... 'README.txt': "A README file", + ... "foo": { + ... "__init__.py": "", + ... "bar": { + ... "__init__.py": "", + ... }, + ... "baz.py": "# Some code", + ... "bar.py": Symlink("baz.py"), + ... }, + ... "bing": Symlink("foo"), + ... } + >>> target = getfixture('tmp_path') + >>> build(spec, target) + >>> target.joinpath('foo/baz.py').read_text(encoding='utf-8') + '# Some code' + >>> target.joinpath('bing/bar.py').read_text(encoding='utf-8') + '# Some code' + """ + for name, contents in spec.items(): + create(contents, _ensure_tree_maker(prefix) / name) + + +@functools.singledispatch +def create(content: Union[str, bytes, FilesSpec], path): + path.mkdir(exist_ok=True) + build(content, prefix=path) # type: ignore[arg-type] + + +@create.register +def _(content: bytes, path): + path.write_bytes(content) + + +@create.register +def _(content: str, path): + path.write_text(content, encoding='utf-8') + + +@create.register +def _(content: Symlink, path): + path.symlink_to(content) + + +# end from jaraco.path +#### diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/compat/__init__.py b/env/lib/python3.10/site-packages/importlib_resources/tests/compat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py312.py b/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py312.py new file mode 100644 index 0000000..ea9a58b --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py312.py @@ -0,0 +1,18 @@ +import contextlib + +from .py39 import import_helper + + +@contextlib.contextmanager +def isolated_modules(): + """ + Save modules on entry and cleanup on exit. + """ + (saved,) = import_helper.modules_setup() + try: + yield + finally: + import_helper.modules_cleanup(saved) + + +vars(import_helper).setdefault('isolated_modules', isolated_modules) diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py39.py b/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py39.py new file mode 100644 index 0000000..e01d276 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/compat/py39.py @@ -0,0 +1,13 @@ +""" +Backward-compatability shims to support Python 3.9 and earlier. +""" + +from jaraco.test.cpython import from_test_support, try_import + +import_helper = try_import('import_helper') or from_test_support( + 'modules_setup', 'modules_cleanup', 'DirsOnSysPath' +) +os_helper = try_import('os_helper') or from_test_support('temp_dir') +warnings_helper = try_import('warnings_helper') or from_test_support( + 'ignore_warnings', 'check_warnings' +) diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_compatibilty_files.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_compatibilty_files.py new file mode 100644 index 0000000..e8aac28 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_compatibilty_files.py @@ -0,0 +1,103 @@ +import io +import unittest + +import importlib_resources as resources +from importlib_resources._adapters import ( + CompatibilityFiles, + wrap_spec, +) + +from . import util + + +class CompatibilityFilesTests(unittest.TestCase): + @property + def package(self): + bytes_data = io.BytesIO(b'Hello, world!') + return util.create_package( + file=bytes_data, + path='some_path', + contents=('a', 'b', 'c'), + ) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_iter(self): + self.assertEqual( + sorted(path.name for path in self.files.iterdir()), + ['a', 'b', 'c'], + ) + + def test_child_path_iter(self): + self.assertEqual(list((self.files / 'a').iterdir()), []) + + def test_orphan_path_iter(self): + self.assertEqual(list((self.files / 'a' / 'a').iterdir()), []) + self.assertEqual(list((self.files / 'a' / 'a' / 'a').iterdir()), []) + + def test_spec_path_is(self): + self.assertFalse(self.files.is_file()) + self.assertFalse(self.files.is_dir()) + + def test_child_path_is(self): + self.assertTrue((self.files / 'a').is_file()) + self.assertFalse((self.files / 'a').is_dir()) + + def test_orphan_path_is(self): + self.assertFalse((self.files / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a').is_dir()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_file()) + self.assertFalse((self.files / 'a' / 'a' / 'a').is_dir()) + + def test_spec_path_name(self): + self.assertEqual(self.files.name, 'testingpackage') + + def test_child_path_name(self): + self.assertEqual((self.files / 'a').name, 'a') + + def test_orphan_path_name(self): + self.assertEqual((self.files / 'a' / 'b').name, 'b') + self.assertEqual((self.files / 'a' / 'b' / 'c').name, 'c') + + def test_spec_path_open(self): + self.assertEqual(self.files.read_bytes(), b'Hello, world!') + self.assertEqual(self.files.read_text(encoding='utf-8'), 'Hello, world!') + + def test_child_path_open(self): + self.assertEqual((self.files / 'a').read_bytes(), b'Hello, world!') + self.assertEqual( + (self.files / 'a').read_text(encoding='utf-8'), 'Hello, world!' + ) + + def test_orphan_path_open(self): + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b').read_bytes() + with self.assertRaises(FileNotFoundError): + (self.files / 'a' / 'b' / 'c').read_bytes() + + def test_open_invalid_mode(self): + with self.assertRaises(ValueError): + self.files.open('0') + + def test_orphan_path_invalid(self): + with self.assertRaises(ValueError): + CompatibilityFiles.OrphanPath() + + def test_wrap_spec(self): + spec = wrap_spec(self.package) + self.assertIsInstance(spec.loader.get_resource_reader(None), CompatibilityFiles) + + +class CompatibilityFilesNoReaderTests(unittest.TestCase): + @property + def package(self): + return util.create_package_from_loader(None) + + @property + def files(self): + return resources.files(self.package) + + def test_spec_path_joinpath(self): + self.assertIsInstance(self.files / 'a', CompatibilityFiles.OrphanPath) diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_contents.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_contents.py new file mode 100644 index 0000000..dcb872e --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_contents.py @@ -0,0 +1,39 @@ +import unittest + +import importlib_resources as resources + +from . import util + + +class ContentsTests: + expected = { + '__init__.py', + 'binary.file', + 'subdirectory', + 'utf-16.file', + 'utf-8.file', + } + + def test_contents(self): + contents = {path.name for path in resources.files(self.data).iterdir()} + assert self.expected <= contents + + +class ContentsDiskTests(ContentsTests, util.DiskSetup, unittest.TestCase): + pass + + +class ContentsZipTests(ContentsTests, util.ZipSetup, unittest.TestCase): + pass + + +class ContentsNamespaceTests(ContentsTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + expected = { + # no __init__ because of namespace design + 'binary.file', + 'subdirectory', + 'utf-16.file', + 'utf-8.file', + } diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_custom.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_custom.py new file mode 100644 index 0000000..25ae0e7 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_custom.py @@ -0,0 +1,48 @@ +import contextlib +import pathlib +import unittest + +import importlib_resources as resources + +from .. import abc +from ..abc import ResourceReader, TraversableResources +from . import util +from .compat.py39 import os_helper + + +class SimpleLoader: + """ + A simple loader that only implements a resource reader. + """ + + def __init__(self, reader: ResourceReader): + self.reader = reader + + def get_resource_reader(self, package): + return self.reader + + +class MagicResources(TraversableResources): + """ + Magically returns the resources at path. + """ + + def __init__(self, path: pathlib.Path): + self.path = path + + def files(self): + return self.path + + +class CustomTraversableResourcesTests(unittest.TestCase): + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + def test_custom_loader(self): + temp_dir = pathlib.Path(self.fixtures.enter_context(os_helper.temp_dir())) + loader = SimpleLoader(MagicResources(temp_dir)) + pkg = util.create_package_from_loader(loader) + files = resources.files(pkg) + assert isinstance(files, abc.Traversable) + assert list(files.iterdir()) == [] diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_files.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_files.py new file mode 100644 index 0000000..be20660 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_files.py @@ -0,0 +1,194 @@ +import contextlib +import importlib +import pathlib +import py_compile +import textwrap +import unittest +import warnings + +import importlib_resources as resources + +from ..abc import Traversable +from . import util +from .compat.py39 import import_helper, os_helper + + +@contextlib.contextmanager +def suppress_known_deprecation(): + with warnings.catch_warnings(record=True) as ctx: + warnings.simplefilter('default', category=DeprecationWarning) + yield ctx + + +class FilesTests: + def test_read_bytes(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_bytes() + assert actual == b'Hello, UTF-8 world!\n' + + def test_read_text(self): + files = resources.files(self.data) + actual = files.joinpath('utf-8.file').read_text(encoding='utf-8') + assert actual == 'Hello, UTF-8 world!\n' + + def test_traversable(self): + assert isinstance(resources.files(self.data), Traversable) + + def test_joinpath_with_multiple_args(self): + files = resources.files(self.data) + binfile = files.joinpath('subdirectory', 'binary.file') + self.assertTrue(binfile.is_file()) + + def test_old_parameter(self): + """ + Files used to take a 'package' parameter. Make sure anyone + passing by name is still supported. + """ + with suppress_known_deprecation(): + resources.files(package=self.data) + + +class OpenDiskTests(FilesTests, util.DiskSetup, unittest.TestCase): + pass + + +class OpenZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + pass + + +class OpenNamespaceTests(FilesTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def test_non_paths_in_dunder_path(self): + """ + Non-path items in a namespace package's ``__path__`` are ignored. + + As reported in python/importlib_resources#311, some tools + like Setuptools, when creating editable packages, will inject + non-paths into a namespace package's ``__path__``, a + sentinel like + ``__editable__.sample_namespace-1.0.finder.__path_hook__`` + to cause the ``PathEntryFinder`` to be called when searching + for packages. In that case, resources should still be loadable. + """ + import namespacedata01 # type: ignore[import-not-found] + + namespacedata01.__path__.append( + '__editable__.sample_namespace-1.0.finder.__path_hook__' + ) + + resources.files(namespacedata01) + + +class OpenNamespaceZipTests(FilesTests, util.ZipSetup, unittest.TestCase): + ZIP_MODULE = 'namespacedata01' + + +class DirectSpec: + """ + Override behavior of ModuleSetup to write a full spec directly. + """ + + MODULE = 'unused' + + def load_fixture(self, name): + self.tree_on_path(self.spec) + + +class ModulesFiles: + spec = { + 'mod.py': '', + 'res.txt': 'resources are the best', + } + + def test_module_resources(self): + """ + A module can have resources found adjacent to the module. + """ + import mod # type: ignore[import-not-found] + + actual = resources.files(mod).joinpath('res.txt').read_text(encoding='utf-8') + assert actual == self.spec['res.txt'] + + +class ModuleFilesDiskTests(DirectSpec, util.DiskSetup, ModulesFiles, unittest.TestCase): + pass + + +class ModuleFilesZipTests(DirectSpec, util.ZipSetup, ModulesFiles, unittest.TestCase): + pass + + +class ImplicitContextFiles: + set_val = textwrap.dedent( + f""" + import {resources.__name__} as res + val = res.files().joinpath('res.txt').read_text(encoding='utf-8') + """ + ) + spec = { + 'somepkg': { + '__init__.py': set_val, + 'submod.py': set_val, + 'res.txt': 'resources are the best', + }, + 'frozenpkg': { + '__init__.py': set_val.replace(resources.__name__, 'c_resources'), + 'res.txt': 'resources are the best', + }, + } + + def test_implicit_files_package(self): + """ + Without any parameter, files() will infer the location as the caller. + """ + assert importlib.import_module('somepkg').val == 'resources are the best' + + def test_implicit_files_submodule(self): + """ + Without any parameter, files() will infer the location as the caller. + """ + assert importlib.import_module('somepkg.submod').val == 'resources are the best' + + def _compile_importlib(self): + """ + Make a compiled-only copy of the importlib resources package. + + Currently only code is copied, as importlib resources doesn't itself + have any resources. + """ + bin_site = self.fixtures.enter_context(os_helper.temp_dir()) + c_resources = pathlib.Path(bin_site, 'c_resources') + sources = pathlib.Path(resources.__file__).parent + + for source_path in sources.glob('**/*.py'): + c_path = c_resources.joinpath(source_path.relative_to(sources)).with_suffix( + '.pyc' + ) + py_compile.compile(source_path, c_path) + self.fixtures.enter_context(import_helper.DirsOnSysPath(bin_site)) + + def test_implicit_files_with_compiled_importlib(self): + """ + Caller detection works for compiled-only resources module. + + python/cpython#123085 + """ + self._compile_importlib() + assert importlib.import_module('frozenpkg').val == 'resources are the best' + + +class ImplicitContextFilesDiskTests( + DirectSpec, util.DiskSetup, ImplicitContextFiles, unittest.TestCase +): + pass + + +class ImplicitContextFilesZipTests( + DirectSpec, util.ZipSetup, ImplicitContextFiles, unittest.TestCase +): + pass + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_functional.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_functional.py new file mode 100644 index 0000000..9eb2d81 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_functional.py @@ -0,0 +1,267 @@ +import importlib +import os +import unittest + +import importlib_resources as resources + +from . import util +from .compat.py39 import warnings_helper + + +class StringAnchorMixin: + anchor01 = 'data01' + anchor02 = 'data02' + + +class ModuleAnchorMixin: + @property + def anchor01(self): + return importlib.import_module('data01') + + @property + def anchor02(self): + return importlib.import_module('data02') + + +class FunctionalAPIBase: + def setUp(self): + super().setUp() + self.load_fixture('data02') + + def _gen_resourcetxt_path_parts(self): + """Yield various names of a text file in anchor02, each in a subTest""" + for path_parts in ( + ('subdirectory', 'subsubdir', 'resource.txt'), + ('subdirectory/subsubdir/resource.txt',), + ('subdirectory/subsubdir', 'resource.txt'), + ): + with self.subTest(path_parts=path_parts): + yield path_parts + + def assertEndsWith(self, string, suffix): + """Assert that `string` ends with `suffix`. + + Used to ignore an architecture-specific UTF-16 byte-order mark.""" + self.assertEqual(string[-len(suffix) :], suffix) + + def test_read_text(self): + self.assertEqual( + resources.read_text(self.anchor01, 'utf-8.file'), + 'Hello, UTF-8 world!\n', + ) + self.assertEqual( + resources.read_text( + self.anchor02, + 'subdirectory', + 'subsubdir', + 'resource.txt', + encoding='utf-8', + ), + 'a resource', + ) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertEqual( + resources.read_text( + self.anchor02, + *path_parts, + encoding='utf-8', + ), + 'a resource', + ) + # Use generic OSError, since e.g. attempting to read a directory can + # fail with PermissionError rather than IsADirectoryError + with self.assertRaises(OSError): + resources.read_text(self.anchor01) + with self.assertRaises((OSError, resources.abc.TraversalError)): + resources.read_text(self.anchor01, 'no-such-file') + with self.assertRaises(UnicodeDecodeError): + resources.read_text(self.anchor01, 'utf-16.file') + self.assertEqual( + resources.read_text( + self.anchor01, + 'binary.file', + encoding='latin1', + ), + '\x00\x01\x02\x03', + ) + self.assertEndsWith( # ignore the BOM + resources.read_text( + self.anchor01, + 'utf-16.file', + errors='backslashreplace', + ), + 'Hello, UTF-16 world!\n'.encode('utf-16-le').decode( + errors='backslashreplace', + ), + ) + + def test_read_binary(self): + self.assertEqual( + resources.read_binary(self.anchor01, 'utf-8.file'), + b'Hello, UTF-8 world!\n', + ) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertEqual( + resources.read_binary(self.anchor02, *path_parts), + b'a resource', + ) + + def test_open_text(self): + with resources.open_text(self.anchor01, 'utf-8.file') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + for path_parts in self._gen_resourcetxt_path_parts(): + with resources.open_text( + self.anchor02, + *path_parts, + encoding='utf-8', + ) as f: + self.assertEqual(f.read(), 'a resource') + # Use generic OSError, since e.g. attempting to read a directory can + # fail with PermissionError rather than IsADirectoryError + with self.assertRaises(OSError): + resources.open_text(self.anchor01) + with self.assertRaises((OSError, resources.abc.TraversalError)): + resources.open_text(self.anchor01, 'no-such-file') + with resources.open_text(self.anchor01, 'utf-16.file') as f: + with self.assertRaises(UnicodeDecodeError): + f.read() + with resources.open_text( + self.anchor01, + 'binary.file', + encoding='latin1', + ) as f: + self.assertEqual(f.read(), '\x00\x01\x02\x03') + with resources.open_text( + self.anchor01, + 'utf-16.file', + errors='backslashreplace', + ) as f: + self.assertEndsWith( # ignore the BOM + f.read(), + 'Hello, UTF-16 world!\n'.encode('utf-16-le').decode( + errors='backslashreplace', + ), + ) + + def test_open_binary(self): + with resources.open_binary(self.anchor01, 'utf-8.file') as f: + self.assertEqual(f.read(), b'Hello, UTF-8 world!\n') + for path_parts in self._gen_resourcetxt_path_parts(): + with resources.open_binary( + self.anchor02, + *path_parts, + ) as f: + self.assertEqual(f.read(), b'a resource') + + def test_path(self): + with resources.path(self.anchor01, 'utf-8.file') as path: + with open(str(path), encoding='utf-8') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + with resources.path(self.anchor01) as path: + with open(os.path.join(path, 'utf-8.file'), encoding='utf-8') as f: + self.assertEqual(f.read(), 'Hello, UTF-8 world!\n') + + def test_is_resource(self): + is_resource = resources.is_resource + self.assertTrue(is_resource(self.anchor01, 'utf-8.file')) + self.assertFalse(is_resource(self.anchor01, 'no_such_file')) + self.assertFalse(is_resource(self.anchor01)) + self.assertFalse(is_resource(self.anchor01, 'subdirectory')) + for path_parts in self._gen_resourcetxt_path_parts(): + self.assertTrue(is_resource(self.anchor02, *path_parts)) + + def test_contents(self): + with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)): + c = resources.contents(self.anchor01) + self.assertGreaterEqual( + set(c), + {'utf-8.file', 'utf-16.file', 'binary.file', 'subdirectory'}, + ) + with ( + self.assertRaises(OSError), + warnings_helper.check_warnings(( + ".*contents.*", + DeprecationWarning, + )), + ): + list(resources.contents(self.anchor01, 'utf-8.file')) + + for path_parts in self._gen_resourcetxt_path_parts(): + with ( + self.assertRaises((OSError, resources.abc.TraversalError)), + warnings_helper.check_warnings(( + ".*contents.*", + DeprecationWarning, + )), + ): + list(resources.contents(self.anchor01, *path_parts)) + with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)): + c = resources.contents(self.anchor01, 'subdirectory') + self.assertGreaterEqual( + set(c), + {'binary.file'}, + ) + + @warnings_helper.ignore_warnings(category=DeprecationWarning) + def test_common_errors(self): + for func in ( + resources.read_text, + resources.read_binary, + resources.open_text, + resources.open_binary, + resources.path, + resources.is_resource, + resources.contents, + ): + with self.subTest(func=func): + # Rejecting None anchor + with self.assertRaises(TypeError): + func(None) + # Rejecting invalid anchor type + with self.assertRaises((TypeError, AttributeError)): + func(1234) + # Unknown module + with self.assertRaises(ModuleNotFoundError): + func('$missing module$') + + def test_text_errors(self): + for func in ( + resources.read_text, + resources.open_text, + ): + with self.subTest(func=func): + # Multiple path arguments need explicit encoding argument. + with self.assertRaises(TypeError): + func( + self.anchor02, + 'subdirectory', + 'subsubdir', + 'resource.txt', + ) + + +class FunctionalAPITest_StringAnchor_Disk( + StringAnchorMixin, + FunctionalAPIBase, + util.DiskSetup, + unittest.TestCase, +): + pass + + +class FunctionalAPITest_ModuleAnchor_Disk( + ModuleAnchorMixin, + FunctionalAPIBase, + util.DiskSetup, + unittest.TestCase, +): + pass + + +class FunctionalAPITest_StringAnchor_Memory( + StringAnchorMixin, + FunctionalAPIBase, + util.MemorySetup, + unittest.TestCase, +): + pass diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_open.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_open.py new file mode 100644 index 0000000..8a4b68e --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_open.py @@ -0,0 +1,85 @@ +import unittest + +import importlib_resources as resources + +from . import util + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open('rb'): + pass + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + target = resources.files(package).joinpath(path) + with target.open(encoding='utf-8'): + pass + + +class OpenTests: + def test_open_binary(self): + target = resources.files(self.data) / 'binary.file' + with target.open('rb') as fp: + result = fp.read() + self.assertEqual(result, bytes(range(4))) + + def test_open_text_default_encoding(self): + target = resources.files(self.data) / 'utf-8.file' + with target.open(encoding='utf-8') as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_open_text_given_encoding(self): + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-16', errors='strict') as fp: + result = fp.read() + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_open_text_with_errors(self): + """ + Raises UnicodeError without the 'errors' argument. + """ + target = resources.files(self.data) / 'utf-16.file' + with target.open(encoding='utf-8', errors='strict') as fp: + self.assertRaises(UnicodeError, fp.read) + with target.open(encoding='utf-8', errors='ignore') as fp: + result = fp.read() + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + def test_open_binary_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + with self.assertRaises(FileNotFoundError): + target.open('rb') + + def test_open_text_FileNotFoundError(self): + target = resources.files(self.data) / 'does-not-exist' + with self.assertRaises(FileNotFoundError): + target.open(encoding='utf-8') + + +class OpenDiskTests(OpenTests, util.DiskSetup, unittest.TestCase): + pass + + +class OpenDiskNamespaceTests(OpenTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + +class OpenZipTests(OpenTests, util.ZipSetup, unittest.TestCase): + pass + + +class OpenNamespaceZipTests(OpenTests, util.ZipSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_path.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_path.py new file mode 100644 index 0000000..0be673d --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_path.py @@ -0,0 +1,63 @@ +import io +import pathlib +import unittest + +import importlib_resources as resources + +from . import util + + +class CommonTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + with resources.as_file(resources.files(package).joinpath(path)): + pass + + +class PathTests: + def test_reading(self): + """ + Path should be readable and a pathlib.Path instance. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + self.assertIsInstance(path, pathlib.Path) + self.assertTrue(path.name.endswith("utf-8.file"), repr(path)) + self.assertEqual('Hello, UTF-8 world!\n', path.read_text(encoding='utf-8')) + + +class PathDiskTests(PathTests, util.DiskSetup, unittest.TestCase): + def test_natural_path(self): + """ + Guarantee the internal implementation detail that + file-system-backed resources do not get the tempdir + treatment. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + assert 'data' in str(path) + + +class PathMemoryTests(PathTests, unittest.TestCase): + def setUp(self): + file = io.BytesIO(b'Hello, UTF-8 world!\n') + self.addCleanup(file.close) + self.data = util.create_package( + file=file, path=FileNotFoundError("package exists only in memory") + ) + self.data.__spec__.origin = None + self.data.__spec__.has_location = False + + +class PathZipTests(PathTests, util.ZipSetup, unittest.TestCase): + def test_remove_in_context_manager(self): + """ + It is not an error if the file that was temporarily stashed on the + file system is removed inside the `with` stanza. + """ + target = resources.files(self.data) / 'utf-8.file' + with resources.as_file(target) as path: + path.unlink() + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_read.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_read.py new file mode 100644 index 0000000..216c8fe --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_read.py @@ -0,0 +1,94 @@ +import unittest +from importlib import import_module + +import importlib_resources as resources + +from . import util + + +class CommonBinaryTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_bytes() + + +class CommonTextTests(util.CommonTests, unittest.TestCase): + def execute(self, package, path): + resources.files(package).joinpath(path).read_text(encoding='utf-8') + + +class ReadTests: + def test_read_bytes(self): + result = resources.files(self.data).joinpath('binary.file').read_bytes() + self.assertEqual(result, bytes(range(4))) + + def test_read_text_default_encoding(self): + result = ( + resources.files(self.data) + .joinpath('utf-8.file') + .read_text(encoding='utf-8') + ) + self.assertEqual(result, 'Hello, UTF-8 world!\n') + + def test_read_text_given_encoding(self): + result = ( + resources.files(self.data) + .joinpath('utf-16.file') + .read_text(encoding='utf-16') + ) + self.assertEqual(result, 'Hello, UTF-16 world!\n') + + def test_read_text_with_errors(self): + """ + Raises UnicodeError without the 'errors' argument. + """ + target = resources.files(self.data) / 'utf-16.file' + self.assertRaises(UnicodeError, target.read_text, encoding='utf-8') + result = target.read_text(encoding='utf-8', errors='ignore') + self.assertEqual( + result, + 'H\x00e\x00l\x00l\x00o\x00,\x00 ' + '\x00U\x00T\x00F\x00-\x001\x006\x00 ' + '\x00w\x00o\x00r\x00l\x00d\x00!\x00\n\x00', + ) + + +class ReadDiskTests(ReadTests, util.DiskSetup, unittest.TestCase): + pass + + +class ReadZipTests(ReadTests, util.ZipSetup, unittest.TestCase): + def test_read_submodule_resource(self): + submodule = import_module('data01.subdirectory') + result = resources.files(submodule).joinpath('binary.file').read_bytes() + self.assertEqual(result, bytes(range(4, 8))) + + def test_read_submodule_resource_by_name(self): + result = ( + resources.files('data01.subdirectory').joinpath('binary.file').read_bytes() + ) + self.assertEqual(result, bytes(range(4, 8))) + + +class ReadNamespaceTests(ReadTests, util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + +class ReadNamespaceZipTests(ReadTests, util.ZipSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def test_read_submodule_resource(self): + submodule = import_module('namespacedata01.subdirectory') + result = resources.files(submodule).joinpath('binary.file').read_bytes() + self.assertEqual(result, bytes(range(12, 16))) + + def test_read_submodule_resource_by_name(self): + result = ( + resources.files('namespacedata01.subdirectory') + .joinpath('binary.file') + .read_bytes() + ) + self.assertEqual(result, bytes(range(12, 16))) + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_reader.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_reader.py new file mode 100644 index 0000000..f8cfd8d --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_reader.py @@ -0,0 +1,137 @@ +import os.path +import pathlib +import unittest +from importlib import import_module + +from importlib_resources.readers import MultiplexedPath, NamespaceReader + +from . import util + + +class MultiplexedPathTest(util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def setUp(self): + super().setUp() + self.folder = pathlib.Path(self.data.__path__[0]) + self.data01 = pathlib.Path(self.load_fixture('data01').__file__).parent + self.data02 = pathlib.Path(self.load_fixture('data02').__file__).parent + + def test_init_no_paths(self): + with self.assertRaises(FileNotFoundError): + MultiplexedPath() + + def test_init_file(self): + with self.assertRaises(NotADirectoryError): + MultiplexedPath(self.folder / 'binary.file') + + def test_iterdir(self): + contents = {path.name for path in MultiplexedPath(self.folder).iterdir()} + try: + contents.remove('__pycache__') + except (KeyError, ValueError): + pass + self.assertEqual( + contents, {'subdirectory', 'binary.file', 'utf-16.file', 'utf-8.file'} + ) + + def test_iterdir_duplicate(self): + contents = { + path.name for path in MultiplexedPath(self.folder, self.data01).iterdir() + } + for remove in ('__pycache__', '__init__.pyc'): + try: + contents.remove(remove) + except (KeyError, ValueError): + pass + self.assertEqual( + contents, + {'__init__.py', 'binary.file', 'subdirectory', 'utf-16.file', 'utf-8.file'}, + ) + + def test_is_dir(self): + self.assertEqual(MultiplexedPath(self.folder).is_dir(), True) + + def test_is_file(self): + self.assertEqual(MultiplexedPath(self.folder).is_file(), False) + + def test_open_file(self): + path = MultiplexedPath(self.folder) + with self.assertRaises(FileNotFoundError): + path.read_bytes() + with self.assertRaises(FileNotFoundError): + path.read_text() + with self.assertRaises(FileNotFoundError): + path.open() + + def test_join_path(self): + prefix = str(self.folder.parent) + path = MultiplexedPath(self.folder, self.data01) + self.assertEqual( + str(path.joinpath('binary.file'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'binary.file'), + ) + sub = path.joinpath('subdirectory') + assert isinstance(sub, MultiplexedPath) + assert 'namespacedata01' in str(sub) + assert 'data01' in str(sub) + self.assertEqual( + str(path.joinpath('imaginary'))[len(prefix) + 1 :], + os.path.join('namespacedata01', 'imaginary'), + ) + self.assertEqual(path.joinpath(), path) + + def test_join_path_compound(self): + path = MultiplexedPath(self.folder) + assert not path.joinpath('imaginary/foo.py').exists() + + def test_join_path_common_subdir(self): + prefix = str(self.data02.parent) + path = MultiplexedPath(self.data01, self.data02) + self.assertIsInstance(path.joinpath('subdirectory'), MultiplexedPath) + self.assertEqual( + str(path.joinpath('subdirectory', 'subsubdir'))[len(prefix) + 1 :], + os.path.join('data02', 'subdirectory', 'subsubdir'), + ) + + def test_repr(self): + self.assertEqual( + repr(MultiplexedPath(self.folder)), + f"MultiplexedPath('{self.folder}')", + ) + + def test_name(self): + self.assertEqual( + MultiplexedPath(self.folder).name, + os.path.basename(self.folder), + ) + + +class NamespaceReaderTest(util.DiskSetup, unittest.TestCase): + MODULE = 'namespacedata01' + + def test_init_error(self): + with self.assertRaises(ValueError): + NamespaceReader(['path1', 'path2']) + + def test_resource_path(self): + namespacedata01 = import_module('namespacedata01') + reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations) + + root = self.data.__path__[0] + self.assertEqual( + reader.resource_path('binary.file'), os.path.join(root, 'binary.file') + ) + self.assertEqual( + reader.resource_path('imaginary'), os.path.join(root, 'imaginary') + ) + + def test_files(self): + reader = NamespaceReader(self.data.__spec__.submodule_search_locations) + root = self.data.__path__[0] + self.assertIsInstance(reader.files(), MultiplexedPath) + self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')") + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_resource.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_resource.py new file mode 100644 index 0000000..c80afdc --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_resource.py @@ -0,0 +1,238 @@ +import unittest +from importlib import import_module + +import importlib_resources as resources + +from . import util + + +class ResourceTests: + # Subclasses are expected to set the `data` attribute. + + def test_is_file_exists(self): + target = resources.files(self.data) / 'binary.file' + self.assertTrue(target.is_file()) + + def test_is_file_missing(self): + target = resources.files(self.data) / 'not-a-file' + self.assertFalse(target.is_file()) + + def test_is_dir(self): + target = resources.files(self.data) / 'subdirectory' + self.assertFalse(target.is_file()) + self.assertTrue(target.is_dir()) + + +class ResourceDiskTests(ResourceTests, util.DiskSetup, unittest.TestCase): + pass + + +class ResourceZipTests(ResourceTests, util.ZipSetup, unittest.TestCase): + pass + + +def names(traversable): + return {item.name for item in traversable.iterdir()} + + +class ResourceLoaderTests(util.DiskSetup, unittest.TestCase): + def test_resource_contents(self): + package = util.create_package( + file=self.data, path=self.data.__file__, contents=['A', 'B', 'C'] + ) + self.assertEqual(names(resources.files(package)), {'A', 'B', 'C'}) + + def test_is_file(self): + package = util.create_package( + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], + ) + self.assertTrue(resources.files(package).joinpath('B').is_file()) + + def test_is_dir(self): + package = util.create_package( + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], + ) + self.assertTrue(resources.files(package).joinpath('D').is_dir()) + + def test_resource_missing(self): + package = util.create_package( + file=self.data, + path=self.data.__file__, + contents=['A', 'B', 'C', 'D/E', 'D/F'], + ) + self.assertFalse(resources.files(package).joinpath('Z').is_file()) + + +class ResourceCornerCaseTests(util.DiskSetup, unittest.TestCase): + def test_package_has_no_reader_fallback(self): + """ + Test odd ball packages which: + # 1. Do not have a ResourceReader as a loader + # 2. Are not on the file system + # 3. Are not in a zip file + """ + module = util.create_package( + file=self.data, path=self.data.__file__, contents=['A', 'B', 'C'] + ) + # Give the module a dummy loader. + module.__loader__ = object() + # Give the module a dummy origin. + module.__file__ = '/path/which/shall/not/be/named' + module.__spec__.loader = module.__loader__ + module.__spec__.origin = module.__file__ + self.assertFalse(resources.files(module).joinpath('A').is_file()) + + +class ResourceFromZipsTest01(util.ZipSetup, unittest.TestCase): + def test_is_submodule_resource(self): + submodule = import_module('data01.subdirectory') + self.assertTrue(resources.files(submodule).joinpath('binary.file').is_file()) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('data01.subdirectory').joinpath('binary.file').is_file() + ) + + def test_submodule_contents(self): + submodule = import_module('data01.subdirectory') + self.assertEqual( + names(resources.files(submodule)), {'__init__.py', 'binary.file'} + ) + + def test_submodule_contents_by_name(self): + self.assertEqual( + names(resources.files('data01.subdirectory')), + {'__init__.py', 'binary.file'}, + ) + + def test_as_file_directory(self): + with resources.as_file(resources.files('data01')) as data: + assert data.name == 'data01' + assert data.is_dir() + assert data.joinpath('subdirectory').is_dir() + assert len(list(data.iterdir())) + assert not data.parent.exists() + + +class ResourceFromZipsTest02(util.ZipSetup, unittest.TestCase): + MODULE = 'data02' + + def test_unrelated_contents(self): + """ + Test thata zip with two unrelated subpackages return + distinct resources. Ref python/importlib_resources#44. + """ + self.assertEqual( + names(resources.files('data02.one')), + {'__init__.py', 'resource1.txt'}, + ) + self.assertEqual( + names(resources.files('data02.two')), + {'__init__.py', 'resource2.txt'}, + ) + + +class DeletingZipsTest(util.ZipSetup, unittest.TestCase): + """Having accessed resources in a zip file should not keep an open + reference to the zip. + """ + + def test_iterdir_does_not_keep_open(self): + [item.name for item in resources.files('data01').iterdir()] + + def test_is_file_does_not_keep_open(self): + resources.files('data01').joinpath('binary.file').is_file() + + def test_is_file_failure_does_not_keep_open(self): + resources.files('data01').joinpath('not-present').is_file() + + @unittest.skip("Desired but not supported.") + def test_as_file_does_not_keep_open(self): # pragma: no cover + resources.as_file(resources.files('data01') / 'binary.file') + + def test_entered_path_does_not_keep_open(self): + """ + Mimic what certifi does on import to make its bundle + available for the process duration. + """ + resources.as_file(resources.files('data01') / 'binary.file').__enter__() + + def test_read_binary_does_not_keep_open(self): + resources.files('data01').joinpath('binary.file').read_bytes() + + def test_read_text_does_not_keep_open(self): + resources.files('data01').joinpath('utf-8.file').read_text(encoding='utf-8') + + +class ResourceFromNamespaceTests: + def test_is_submodule_resource(self): + self.assertTrue( + resources.files(import_module('namespacedata01')) + .joinpath('binary.file') + .is_file() + ) + + def test_read_submodule_resource_by_name(self): + self.assertTrue( + resources.files('namespacedata01').joinpath('binary.file').is_file() + ) + + def test_submodule_contents(self): + contents = names(resources.files(import_module('namespacedata01'))) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual( + contents, {'subdirectory', 'binary.file', 'utf-8.file', 'utf-16.file'} + ) + + def test_submodule_contents_by_name(self): + contents = names(resources.files('namespacedata01')) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual( + contents, {'subdirectory', 'binary.file', 'utf-8.file', 'utf-16.file'} + ) + + def test_submodule_sub_contents(self): + contents = names(resources.files(import_module('namespacedata01.subdirectory'))) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file'}) + + def test_submodule_sub_contents_by_name(self): + contents = names(resources.files('namespacedata01.subdirectory')) + try: + contents.remove('__pycache__') + except KeyError: + pass + self.assertEqual(contents, {'binary.file'}) + + +class ResourceFromNamespaceDiskTests( + util.DiskSetup, + ResourceFromNamespaceTests, + unittest.TestCase, +): + MODULE = 'namespacedata01' + + +class ResourceFromNamespaceZipTests( + util.ZipSetup, + ResourceFromNamespaceTests, + unittest.TestCase, +): + MODULE = 'namespacedata01' + + +if __name__ == '__main__': + unittest.main() diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/test_util.py b/env/lib/python3.10/site-packages/importlib_resources/tests/test_util.py new file mode 100644 index 0000000..de304b6 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/test_util.py @@ -0,0 +1,29 @@ +import unittest + +from .util import MemorySetup, Traversable + + +class TestMemoryTraversableImplementation(unittest.TestCase): + def test_concrete_methods_are_not_overridden(self): + """`MemoryTraversable` must not override `Traversable` concrete methods. + + This test is not an attempt to enforce a particular `Traversable` protocol; + it merely catches changes in the `Traversable` abstract/concrete methods + that have not been mirrored in the `MemoryTraversable` subclass. + """ + + traversable_concrete_methods = { + method + for method, value in Traversable.__dict__.items() + if callable(value) and method not in Traversable.__abstractmethods__ + } + memory_traversable_concrete_methods = { + method + for method, value in MemorySetup.MemoryTraversable.__dict__.items() + if callable(value) and not method.startswith("__") + } + overridden_methods = ( + memory_traversable_concrete_methods & traversable_concrete_methods + ) + + assert not overridden_methods diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/util.py b/env/lib/python3.10/site-packages/importlib_resources/tests/util.py new file mode 100644 index 0000000..0340c15 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/util.py @@ -0,0 +1,308 @@ +import abc +import contextlib +import functools +import importlib +import io +import pathlib +import sys +import types +from importlib.machinery import ModuleSpec + +from ..abc import ResourceReader, Traversable, TraversableResources +from . import _path +from . import zip as zip_ +from .compat.py39 import import_helper, os_helper + + +class Reader(ResourceReader): + def __init__(self, **kwargs): + vars(self).update(kwargs) + + def get_resource_reader(self, package): + return self + + def open_resource(self, path): + self._path = path + if isinstance(self.file, Exception): + raise self.file + return self.file + + def resource_path(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + return self.path + + def is_resource(self, path_): + self._path = path_ + if isinstance(self.path, Exception): + raise self.path + + def part(entry): + return entry.split('/') + + return any( + len(parts) == 1 and parts[0] == path_ for parts in map(part, self._contents) + ) + + def contents(self): + if isinstance(self.path, Exception): + raise self.path + yield from self._contents + + +def create_package_from_loader(loader, is_package=True): + name = 'testingpackage' + module = types.ModuleType(name) + spec = ModuleSpec(name, loader, origin='does-not-exist', is_package=is_package) + module.__spec__ = spec + module.__loader__ = loader + return module + + +def create_package(file=None, path=None, is_package=True, contents=()): + return create_package_from_loader( + Reader(file=file, path=path, _contents=contents), + is_package, + ) + + +class CommonTestsBase(metaclass=abc.ABCMeta): + """ + Tests shared by test_open, test_path, and test_read. + """ + + @abc.abstractmethod + def execute(self, package, path): + """ + Call the pertinent legacy API function (e.g. open_text, path) + on package and path. + """ + + def test_package_name(self): + """ + Passing in the package name should succeed. + """ + self.execute(self.data.__name__, 'utf-8.file') + + def test_package_object(self): + """ + Passing in the package itself should succeed. + """ + self.execute(self.data, 'utf-8.file') + + def test_string_path(self): + """ + Passing in a string for the path should succeed. + """ + path = 'utf-8.file' + self.execute(self.data, path) + + def test_pathlib_path(self): + """ + Passing in a pathlib.PurePath object for the path should succeed. + """ + path = pathlib.PurePath('utf-8.file') + self.execute(self.data, path) + + def test_importing_module_as_side_effect(self): + """ + The anchor package can already be imported. + """ + del sys.modules[self.data.__name__] + self.execute(self.data.__name__, 'utf-8.file') + + def test_missing_path(self): + """ + Attempting to open or read or request the path for a + non-existent path should succeed if open_resource + can return a viable data stream. + """ + bytes_data = io.BytesIO(b'Hello, world!') + package = create_package(file=bytes_data, path=FileNotFoundError()) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_extant_path(self): + # Attempting to open or read or request the path when the + # path does exist should still succeed. Does not assert + # anything about the result. + bytes_data = io.BytesIO(b'Hello, world!') + # any path that exists + path = __file__ + package = create_package(file=bytes_data, path=path) + self.execute(package, 'utf-8.file') + self.assertEqual(package.__loader__._path, 'utf-8.file') + + def test_useless_loader(self): + package = create_package(file=FileNotFoundError(), path=FileNotFoundError()) + with self.assertRaises(FileNotFoundError): + self.execute(package, 'utf-8.file') + + +fixtures = dict( + data01={ + '__init__.py': '', + 'binary.file': bytes(range(4)), + 'utf-16.file': '\ufeffHello, UTF-16 world!\n'.encode('utf-16-le'), + 'utf-8.file': 'Hello, UTF-8 world!\n'.encode('utf-8'), + 'subdirectory': { + '__init__.py': '', + 'binary.file': bytes(range(4, 8)), + }, + }, + data02={ + '__init__.py': '', + 'one': {'__init__.py': '', 'resource1.txt': 'one resource'}, + 'two': {'__init__.py': '', 'resource2.txt': 'two resource'}, + 'subdirectory': {'subsubdir': {'resource.txt': 'a resource'}}, + }, + namespacedata01={ + 'binary.file': bytes(range(4)), + 'utf-16.file': '\ufeffHello, UTF-16 world!\n'.encode('utf-16-le'), + 'utf-8.file': 'Hello, UTF-8 world!\n'.encode('utf-8'), + 'subdirectory': { + 'binary.file': bytes(range(12, 16)), + }, + }, +) + + +class ModuleSetup: + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + self.fixtures.enter_context(import_helper.isolated_modules()) + self.data = self.load_fixture(self.MODULE) + + def load_fixture(self, module): + self.tree_on_path({module: fixtures[module]}) + return importlib.import_module(module) + + +class ZipSetup(ModuleSetup): + MODULE = 'data01' + + def tree_on_path(self, spec): + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + modules = pathlib.Path(temp_dir) / 'zipped modules.zip' + self.fixtures.enter_context( + import_helper.DirsOnSysPath(str(zip_.make_zip_file(spec, modules))) + ) + + +class DiskSetup(ModuleSetup): + MODULE = 'data01' + + def tree_on_path(self, spec): + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + _path.build(spec, pathlib.Path(temp_dir)) + self.fixtures.enter_context(import_helper.DirsOnSysPath(temp_dir)) + + +class MemorySetup(ModuleSetup): + """Support loading a module in memory.""" + + MODULE = 'data01' + + def load_fixture(self, module): + self.fixtures.enter_context(self.augment_sys_metapath(module)) + return importlib.import_module(module) + + @contextlib.contextmanager + def augment_sys_metapath(self, module): + finder_instance = self.MemoryFinder(module) + sys.meta_path.append(finder_instance) + yield + sys.meta_path.remove(finder_instance) + + class MemoryFinder(importlib.abc.MetaPathFinder): + def __init__(self, module): + self._module = module + + def find_spec(self, fullname, path, target=None): + if fullname != self._module: + return None + + return importlib.machinery.ModuleSpec( + name=fullname, + loader=MemorySetup.MemoryLoader(self._module), + is_package=True, + ) + + class MemoryLoader(importlib.abc.Loader): + def __init__(self, module): + self._module = module + + def exec_module(self, module): + pass + + def get_resource_reader(self, fullname): + return MemorySetup.MemoryTraversableResources(self._module, fullname) + + class MemoryTraversableResources(TraversableResources): + def __init__(self, module, fullname): + self._module = module + self._fullname = fullname + + def files(self): + return MemorySetup.MemoryTraversable(self._module, self._fullname) + + class MemoryTraversable(Traversable): + """Implement only the abstract methods of `Traversable`. + + Besides `.__init__()`, no other methods may be implemented or overridden. + This is critical for validating the concrete `Traversable` implementations. + """ + + def __init__(self, module, fullname): + self._module = module + self._fullname = fullname + + def _resolve(self): + """ + Fully traverse the `fixtures` dictionary. + + This should be wrapped in a `try/except KeyError` + but it is not currently needed and lowers the code coverage numbers. + """ + path = pathlib.PurePosixPath(self._fullname) + return functools.reduce(lambda d, p: d[p], path.parts, fixtures) + + def iterdir(self): + directory = self._resolve() + if not isinstance(directory, dict): + # Filesystem openers raise OSError, and that exception is mirrored here. + raise OSError(f"{self._fullname} is not a directory") + for path in directory: + yield MemorySetup.MemoryTraversable( + self._module, f"{self._fullname}/{path}" + ) + + def is_dir(self) -> bool: + return isinstance(self._resolve(), dict) + + def is_file(self) -> bool: + return not self.is_dir() + + def open(self, mode='r', encoding=None, errors=None, *_, **__): + contents = self._resolve() + if isinstance(contents, dict): + # Filesystem openers raise OSError when attempting to open a directory, + # and that exception is mirrored here. + raise OSError(f"{self._fullname} is a directory") + if isinstance(contents, str): + contents = contents.encode("utf-8") + result = io.BytesIO(contents) + if "b" in mode: + return result + return io.TextIOWrapper(result, encoding=encoding, errors=errors) + + @property + def name(self): + return pathlib.PurePosixPath(self._fullname).name + + +class CommonTests(DiskSetup, CommonTestsBase): + pass diff --git a/env/lib/python3.10/site-packages/importlib_resources/tests/zip.py b/env/lib/python3.10/site-packages/importlib_resources/tests/zip.py new file mode 100644 index 0000000..51ee564 --- /dev/null +++ b/env/lib/python3.10/site-packages/importlib_resources/tests/zip.py @@ -0,0 +1,26 @@ +""" +Generate zip test data files. +""" + +import zipfile + +import zipp + + +def make_zip_file(tree, dst): + """ + Zip the files in tree into a new zipfile at dst. + """ + with zipfile.ZipFile(dst, 'w') as zf: + for name, contents in walk(tree): + zf.writestr(name, contents) + zipp.CompleteDirs.inject(zf) + return dst + + +def walk(tree, prefix=''): + for name, contents in tree.items(): + if isinstance(contents, dict): + yield from walk(contents, prefix=f'{prefix}{name}/') + else: + yield f'{prefix}{name}', contents diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/INSTALLER b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/LICENSE b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/LICENSE new file mode 100644 index 0000000..74c7482 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2012-2020 Janne Vanhala + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/METADATA b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/METADATA new file mode 100644 index 0000000..9b15e08 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/METADATA @@ -0,0 +1,49 @@ +Metadata-Version: 2.1 +Name: inflection +Version: 0.5.1 +Summary: A port of Ruby on Rails inflector to Python +Home-page: https://github.com/jpvanhal/inflection +Author: Janne Vanhala +Author-email: janne.vanhala@gmail.com +License: MIT +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=3.5 + +Inflection +========== + +|build status|_ + +.. |build status| image:: https://travis-ci.org/jpvanhal/inflection.svg?branch=master + :alt: Build Status +.. _build status: http://travis-ci.org/jpvanhal/inflection + +Inflection is a string transformation library. It singularizes and pluralizes +English words, and transforms strings from CamelCase to underscored string. +Inflection is a port of `Ruby on Rails`_' `inflector`_ to Python. + +.. _Ruby on Rails: http://rubyonrails.org +.. _inflector: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html + +Resources +--------- + +- `Documentation `_ +- `Issue Tracker `_ +- `Code `_ +- `Development Version + `_ + + diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/RECORD b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/RECORD new file mode 100644 index 0000000..cdebf7c --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/RECORD @@ -0,0 +1,11 @@ +__pycache__/inflection.cpython-310.pyc,, +inflection-0.5.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +inflection-0.5.1.dist-info/LICENSE,sha256=np-bSy51Q60UhvEyi_nsUOWl4rucrOtZZSSW3WHmQTM,1062 +inflection-0.5.1.dist-info/METADATA,sha256=HzhEOEIN1xKH0DD-z9mPJ2_4ZXu_mYk4DVDxmcHiDCU,1730 +inflection-0.5.1.dist-info/RECORD,, +inflection-0.5.1.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110 +inflection-0.5.1.dist-info/top_level.txt,sha256=AT2vYRZGMGYnasNdj4oJbpSddltYSZ3cZGH8Bjo7xQo,11 +inflection.py,sha256=kJmjhziRjCeORghR4iWBJQqmXLOpFRwseGVW6gFheas,11437 +inflection/__init__.py,sha256=Py387trh0P9zmcI45w2gLrDAplji9kmtGr5s7DY3TD8,11437 +inflection/__pycache__/__init__.cpython-310.pyc,, +inflection/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/WHEEL b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/WHEEL new file mode 100644 index 0000000..6d38aa0 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/top_level.txt b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/top_level.txt new file mode 100644 index 0000000..8d3ece7 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection-0.5.1.dist-info/top_level.txt @@ -0,0 +1 @@ +inflection diff --git a/env/lib/python3.10/site-packages/inflection.py b/env/lib/python3.10/site-packages/inflection.py new file mode 100644 index 0000000..252b024 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection.py @@ -0,0 +1,426 @@ +# -*- coding: utf-8 -*- +""" + inflection + ~~~~~~~~~~~~ + + A port of Ruby on Rails' inflector to Python. + + :copyright: (c) 2012-2020 by Janne Vanhala + + :license: MIT, see LICENSE for more details. +""" +import re +import unicodedata + +__version__ = '0.5.0' + +PLURALS = [ + (r"(?i)(quiz)$", r'\1zes'), + (r"(?i)^(oxen)$", r'\1'), + (r"(?i)^(ox)$", r'\1en'), + (r"(?i)(m|l)ice$", r'\1ice'), + (r"(?i)(m|l)ouse$", r'\1ice'), + (r"(?i)(passer)s?by$", r'\1sby'), + (r"(?i)(matr|vert|ind)(?:ix|ex)$", r'\1ices'), + (r"(?i)(x|ch|ss|sh)$", r'\1es'), + (r"(?i)([^aeiouy]|qu)y$", r'\1ies'), + (r"(?i)(hive)$", r'\1s'), + (r"(?i)([lr])f$", r'\1ves'), + (r"(?i)([^f])fe$", r'\1ves'), + (r"(?i)sis$", 'ses'), + (r"(?i)([ti])a$", r'\1a'), + (r"(?i)([ti])um$", r'\1a'), + (r"(?i)(buffal|potat|tomat)o$", r'\1oes'), + (r"(?i)(bu)s$", r'\1ses'), + (r"(?i)(alias|status)$", r'\1es'), + (r"(?i)(octop|vir)i$", r'\1i'), + (r"(?i)(octop|vir)us$", r'\1i'), + (r"(?i)^(ax|test)is$", r'\1es'), + (r"(?i)s$", 's'), + (r"$", 's'), +] + +SINGULARS = [ + (r"(?i)(database)s$", r'\1'), + (r"(?i)(quiz)zes$", r'\1'), + (r"(?i)(matr)ices$", r'\1ix'), + (r"(?i)(vert|ind)ices$", r'\1ex'), + (r"(?i)(passer)sby$", r'\1by'), + (r"(?i)^(ox)en", r'\1'), + (r"(?i)(alias|status)(es)?$", r'\1'), + (r"(?i)(octop|vir)(us|i)$", r'\1us'), + (r"(?i)^(a)x[ie]s$", r'\1xis'), + (r"(?i)(cris|test)(is|es)$", r'\1is'), + (r"(?i)(shoe)s$", r'\1'), + (r"(?i)(o)es$", r'\1'), + (r"(?i)(bus)(es)?$", r'\1'), + (r"(?i)(m|l)ice$", r'\1ouse'), + (r"(?i)(x|ch|ss|sh)es$", r'\1'), + (r"(?i)(m)ovies$", r'\1ovie'), + (r"(?i)(s)eries$", r'\1eries'), + (r"(?i)([^aeiouy]|qu)ies$", r'\1y'), + (r"(?i)([lr])ves$", r'\1f'), + (r"(?i)(tive)s$", r'\1'), + (r"(?i)(hive)s$", r'\1'), + (r"(?i)([^f])ves$", r'\1fe'), + (r"(?i)(t)he(sis|ses)$", r"\1hesis"), + (r"(?i)(s)ynop(sis|ses)$", r"\1ynopsis"), + (r"(?i)(p)rogno(sis|ses)$", r"\1rognosis"), + (r"(?i)(p)arenthe(sis|ses)$", r"\1arenthesis"), + (r"(?i)(d)iagno(sis|ses)$", r"\1iagnosis"), + (r"(?i)(b)a(sis|ses)$", r"\1asis"), + (r"(?i)(a)naly(sis|ses)$", r"\1nalysis"), + (r"(?i)([ti])a$", r'\1um'), + (r"(?i)(n)ews$", r'\1ews'), + (r"(?i)(ss)$", r'\1'), + (r"(?i)s$", ''), +] + +UNCOUNTABLES = { + 'equipment', + 'fish', + 'information', + 'jeans', + 'money', + 'rice', + 'series', + 'sheep', + 'species'} + + +def _irregular(singular: str, plural: str) -> None: + """ + A convenience function to add appropriate rules to plurals and singular + for irregular words. + + :param singular: irregular word in singular form + :param plural: irregular word in plural form + """ + def caseinsensitive(string: str) -> str: + return ''.join('[' + char + char.upper() + ']' for char in string) + + if singular[0].upper() == plural[0].upper(): + PLURALS.insert(0, ( + r"(?i)({}){}$".format(singular[0], singular[1:]), + r'\1' + plural[1:] + )) + PLURALS.insert(0, ( + r"(?i)({}){}$".format(plural[0], plural[1:]), + r'\1' + plural[1:] + )) + SINGULARS.insert(0, ( + r"(?i)({}){}$".format(plural[0], plural[1:]), + r'\1' + singular[1:] + )) + else: + PLURALS.insert(0, ( + r"{}{}$".format(singular[0].upper(), + caseinsensitive(singular[1:])), + plural[0].upper() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(singular[0].lower(), + caseinsensitive(singular[1:])), + plural[0].lower() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(plural[0].upper(), caseinsensitive(plural[1:])), + plural[0].upper() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(plural[0].lower(), caseinsensitive(plural[1:])), + plural[0].lower() + plural[1:] + )) + SINGULARS.insert(0, ( + r"{}{}$".format(plural[0].upper(), caseinsensitive(plural[1:])), + singular[0].upper() + singular[1:] + )) + SINGULARS.insert(0, ( + r"{}{}$".format(plural[0].lower(), caseinsensitive(plural[1:])), + singular[0].lower() + singular[1:] + )) + + +def camelize(string: str, uppercase_first_letter: bool = True) -> str: + """ + Convert strings to CamelCase. + + Examples:: + + >>> camelize("device_type") + 'DeviceType' + >>> camelize("device_type", False) + 'deviceType' + + :func:`camelize` can be thought of as a inverse of :func:`underscore`, + although there are some cases where that does not hold:: + + >>> camelize(underscore("IOError")) + 'IoError' + + :param uppercase_first_letter: if set to `True` :func:`camelize` converts + strings to UpperCamelCase. If set to `False` :func:`camelize` produces + lowerCamelCase. Defaults to `True`. + """ + if uppercase_first_letter: + return re.sub(r"(?:^|_)(.)", lambda m: m.group(1).upper(), string) + else: + return string[0].lower() + camelize(string)[1:] + + +def dasherize(word: str) -> str: + """Replace underscores with dashes in the string. + + Example:: + + >>> dasherize("puni_puni") + 'puni-puni' + + """ + return word.replace('_', '-') + + +def humanize(word: str) -> str: + """ + Capitalize the first word and turn underscores into spaces and strip a + trailing ``"_id"``, if any. Like :func:`titleize`, this is meant for + creating pretty output. + + Examples:: + + >>> humanize("employee_salary") + 'Employee salary' + >>> humanize("author_id") + 'Author' + + """ + word = re.sub(r"_id$", "", word) + word = word.replace('_', ' ') + word = re.sub(r"(?i)([a-z\d]*)", lambda m: m.group(1).lower(), word) + word = re.sub(r"^\w", lambda m: m.group(0).upper(), word) + return word + + +def ordinal(number: int) -> str: + """ + Return the suffix that should be added to a number to denote the position + in an ordered sequence such as 1st, 2nd, 3rd, 4th. + + Examples:: + + >>> ordinal(1) + 'st' + >>> ordinal(2) + 'nd' + >>> ordinal(1002) + 'nd' + >>> ordinal(1003) + 'rd' + >>> ordinal(-11) + 'th' + >>> ordinal(-1021) + 'st' + + """ + number = abs(int(number)) + if number % 100 in (11, 12, 13): + return "th" + else: + return { + 1: "st", + 2: "nd", + 3: "rd", + }.get(number % 10, "th") + + +def ordinalize(number: int) -> str: + """ + Turn a number into an ordinal string used to denote the position in an + ordered sequence such as 1st, 2nd, 3rd, 4th. + + Examples:: + + >>> ordinalize(1) + '1st' + >>> ordinalize(2) + '2nd' + >>> ordinalize(1002) + '1002nd' + >>> ordinalize(1003) + '1003rd' + >>> ordinalize(-11) + '-11th' + >>> ordinalize(-1021) + '-1021st' + + """ + return "{}{}".format(number, ordinal(number)) + + +def parameterize(string: str, separator: str = '-') -> str: + """ + Replace special characters in a string so that it may be used as part of a + 'pretty' URL. + + Example:: + + >>> parameterize(u"Donald E. Knuth") + 'donald-e-knuth' + + """ + string = transliterate(string) + # Turn unwanted chars into the separator + string = re.sub(r"(?i)[^a-z0-9\-_]+", separator, string) + if separator: + re_sep = re.escape(separator) + # No more than one of the separator in a row. + string = re.sub(r'%s{2,}' % re_sep, separator, string) + # Remove leading/trailing separator. + string = re.sub(r"(?i)^{sep}|{sep}$".format(sep=re_sep), '', string) + + return string.lower() + + +def pluralize(word: str) -> str: + """ + Return the plural form of a word. + + Examples:: + + >>> pluralize("posts") + 'posts' + >>> pluralize("octopus") + 'octopi' + >>> pluralize("sheep") + 'sheep' + >>> pluralize("CamelOctopus") + 'CamelOctopi' + + """ + if not word or word.lower() in UNCOUNTABLES: + return word + else: + for rule, replacement in PLURALS: + if re.search(rule, word): + return re.sub(rule, replacement, word) + return word + + +def singularize(word: str) -> str: + """ + Return the singular form of a word, the reverse of :func:`pluralize`. + + Examples:: + + >>> singularize("posts") + 'post' + >>> singularize("octopi") + 'octopus' + >>> singularize("sheep") + 'sheep' + >>> singularize("word") + 'word' + >>> singularize("CamelOctopi") + 'CamelOctopus' + + """ + for inflection in UNCOUNTABLES: + if re.search(r'(?i)\b(%s)\Z' % inflection, word): + return word + + for rule, replacement in SINGULARS: + if re.search(rule, word): + return re.sub(rule, replacement, word) + return word + + +def tableize(word: str) -> str: + """ + Create the name of a table like Rails does for models to table names. This + method uses the :func:`pluralize` method on the last word in the string. + + Examples:: + + >>> tableize('RawScaledScorer') + 'raw_scaled_scorers' + >>> tableize('egg_and_ham') + 'egg_and_hams' + >>> tableize('fancyCategory') + 'fancy_categories' + """ + return pluralize(underscore(word)) + + +def titleize(word: str) -> str: + """ + Capitalize all the words and replace some characters in the string to + create a nicer looking title. :func:`titleize` is meant for creating pretty + output. + + Examples:: + + >>> titleize("man from the boondocks") + 'Man From The Boondocks' + >>> titleize("x-men: the last stand") + 'X Men: The Last Stand' + >>> titleize("TheManWithoutAPast") + 'The Man Without A Past' + >>> titleize("raiders_of_the_lost_ark") + 'Raiders Of The Lost Ark' + + """ + return re.sub( + r"\b('?\w)", + lambda match: match.group(1).capitalize(), + humanize(underscore(word)).title() + ) + + +def transliterate(string: str) -> str: + """ + Replace non-ASCII characters with an ASCII approximation. If no + approximation exists, the non-ASCII character is ignored. The string must + be ``unicode``. + + Examples:: + + >>> transliterate('älämölö') + 'alamolo' + >>> transliterate('Ærøskøbing') + 'rskbing' + + """ + normalized = unicodedata.normalize('NFKD', string) + return normalized.encode('ascii', 'ignore').decode('ascii') + + +def underscore(word: str) -> str: + """ + Make an underscored, lowercase form from the expression in the string. + + Example:: + + >>> underscore("DeviceType") + 'device_type' + + As a rule of thumb you can think of :func:`underscore` as the inverse of + :func:`camelize`, though there are cases where that does not hold:: + + >>> camelize(underscore("IOError")) + 'IoError' + + """ + word = re.sub(r"([A-Z]+)([A-Z][a-z])", r'\1_\2', word) + word = re.sub(r"([a-z\d])([A-Z])", r'\1_\2', word) + word = word.replace("-", "_") + return word.lower() + + +_irregular('person', 'people') +_irregular('man', 'men') +_irregular('human', 'humans') +_irregular('child', 'children') +_irregular('sex', 'sexes') +_irregular('move', 'moves') +_irregular('cow', 'kine') +_irregular('zombie', 'zombies') diff --git a/env/lib/python3.10/site-packages/inflection/__init__.py b/env/lib/python3.10/site-packages/inflection/__init__.py new file mode 100644 index 0000000..c18a0b6 --- /dev/null +++ b/env/lib/python3.10/site-packages/inflection/__init__.py @@ -0,0 +1,426 @@ +# -*- coding: utf-8 -*- +""" + inflection + ~~~~~~~~~~~~ + + A port of Ruby on Rails' inflector to Python. + + :copyright: (c) 2012-2020 by Janne Vanhala + + :license: MIT, see LICENSE for more details. +""" +import re +import unicodedata + +__version__ = '0.5.1' + +PLURALS = [ + (r"(?i)(quiz)$", r'\1zes'), + (r"(?i)^(oxen)$", r'\1'), + (r"(?i)^(ox)$", r'\1en'), + (r"(?i)(m|l)ice$", r'\1ice'), + (r"(?i)(m|l)ouse$", r'\1ice'), + (r"(?i)(passer)s?by$", r'\1sby'), + (r"(?i)(matr|vert|ind)(?:ix|ex)$", r'\1ices'), + (r"(?i)(x|ch|ss|sh)$", r'\1es'), + (r"(?i)([^aeiouy]|qu)y$", r'\1ies'), + (r"(?i)(hive)$", r'\1s'), + (r"(?i)([lr])f$", r'\1ves'), + (r"(?i)([^f])fe$", r'\1ves'), + (r"(?i)sis$", 'ses'), + (r"(?i)([ti])a$", r'\1a'), + (r"(?i)([ti])um$", r'\1a'), + (r"(?i)(buffal|potat|tomat)o$", r'\1oes'), + (r"(?i)(bu)s$", r'\1ses'), + (r"(?i)(alias|status)$", r'\1es'), + (r"(?i)(octop|vir)i$", r'\1i'), + (r"(?i)(octop|vir)us$", r'\1i'), + (r"(?i)^(ax|test)is$", r'\1es'), + (r"(?i)s$", 's'), + (r"$", 's'), +] + +SINGULARS = [ + (r"(?i)(database)s$", r'\1'), + (r"(?i)(quiz)zes$", r'\1'), + (r"(?i)(matr)ices$", r'\1ix'), + (r"(?i)(vert|ind)ices$", r'\1ex'), + (r"(?i)(passer)sby$", r'\1by'), + (r"(?i)^(ox)en", r'\1'), + (r"(?i)(alias|status)(es)?$", r'\1'), + (r"(?i)(octop|vir)(us|i)$", r'\1us'), + (r"(?i)^(a)x[ie]s$", r'\1xis'), + (r"(?i)(cris|test)(is|es)$", r'\1is'), + (r"(?i)(shoe)s$", r'\1'), + (r"(?i)(o)es$", r'\1'), + (r"(?i)(bus)(es)?$", r'\1'), + (r"(?i)(m|l)ice$", r'\1ouse'), + (r"(?i)(x|ch|ss|sh)es$", r'\1'), + (r"(?i)(m)ovies$", r'\1ovie'), + (r"(?i)(s)eries$", r'\1eries'), + (r"(?i)([^aeiouy]|qu)ies$", r'\1y'), + (r"(?i)([lr])ves$", r'\1f'), + (r"(?i)(tive)s$", r'\1'), + (r"(?i)(hive)s$", r'\1'), + (r"(?i)([^f])ves$", r'\1fe'), + (r"(?i)(t)he(sis|ses)$", r"\1hesis"), + (r"(?i)(s)ynop(sis|ses)$", r"\1ynopsis"), + (r"(?i)(p)rogno(sis|ses)$", r"\1rognosis"), + (r"(?i)(p)arenthe(sis|ses)$", r"\1arenthesis"), + (r"(?i)(d)iagno(sis|ses)$", r"\1iagnosis"), + (r"(?i)(b)a(sis|ses)$", r"\1asis"), + (r"(?i)(a)naly(sis|ses)$", r"\1nalysis"), + (r"(?i)([ti])a$", r'\1um'), + (r"(?i)(n)ews$", r'\1ews'), + (r"(?i)(ss)$", r'\1'), + (r"(?i)s$", ''), +] + +UNCOUNTABLES = { + 'equipment', + 'fish', + 'information', + 'jeans', + 'money', + 'rice', + 'series', + 'sheep', + 'species'} + + +def _irregular(singular: str, plural: str) -> None: + """ + A convenience function to add appropriate rules to plurals and singular + for irregular words. + + :param singular: irregular word in singular form + :param plural: irregular word in plural form + """ + def caseinsensitive(string: str) -> str: + return ''.join('[' + char + char.upper() + ']' for char in string) + + if singular[0].upper() == plural[0].upper(): + PLURALS.insert(0, ( + r"(?i)({}){}$".format(singular[0], singular[1:]), + r'\1' + plural[1:] + )) + PLURALS.insert(0, ( + r"(?i)({}){}$".format(plural[0], plural[1:]), + r'\1' + plural[1:] + )) + SINGULARS.insert(0, ( + r"(?i)({}){}$".format(plural[0], plural[1:]), + r'\1' + singular[1:] + )) + else: + PLURALS.insert(0, ( + r"{}{}$".format(singular[0].upper(), + caseinsensitive(singular[1:])), + plural[0].upper() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(singular[0].lower(), + caseinsensitive(singular[1:])), + plural[0].lower() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(plural[0].upper(), caseinsensitive(plural[1:])), + plural[0].upper() + plural[1:] + )) + PLURALS.insert(0, ( + r"{}{}$".format(plural[0].lower(), caseinsensitive(plural[1:])), + plural[0].lower() + plural[1:] + )) + SINGULARS.insert(0, ( + r"{}{}$".format(plural[0].upper(), caseinsensitive(plural[1:])), + singular[0].upper() + singular[1:] + )) + SINGULARS.insert(0, ( + r"{}{}$".format(plural[0].lower(), caseinsensitive(plural[1:])), + singular[0].lower() + singular[1:] + )) + + +def camelize(string: str, uppercase_first_letter: bool = True) -> str: + """ + Convert strings to CamelCase. + + Examples:: + + >>> camelize("device_type") + 'DeviceType' + >>> camelize("device_type", False) + 'deviceType' + + :func:`camelize` can be thought of as a inverse of :func:`underscore`, + although there are some cases where that does not hold:: + + >>> camelize(underscore("IOError")) + 'IoError' + + :param uppercase_first_letter: if set to `True` :func:`camelize` converts + strings to UpperCamelCase. If set to `False` :func:`camelize` produces + lowerCamelCase. Defaults to `True`. + """ + if uppercase_first_letter: + return re.sub(r"(?:^|_)(.)", lambda m: m.group(1).upper(), string) + else: + return string[0].lower() + camelize(string)[1:] + + +def dasherize(word: str) -> str: + """Replace underscores with dashes in the string. + + Example:: + + >>> dasherize("puni_puni") + 'puni-puni' + + """ + return word.replace('_', '-') + + +def humanize(word: str) -> str: + """ + Capitalize the first word and turn underscores into spaces and strip a + trailing ``"_id"``, if any. Like :func:`titleize`, this is meant for + creating pretty output. + + Examples:: + + >>> humanize("employee_salary") + 'Employee salary' + >>> humanize("author_id") + 'Author' + + """ + word = re.sub(r"_id$", "", word) + word = word.replace('_', ' ') + word = re.sub(r"(?i)([a-z\d]*)", lambda m: m.group(1).lower(), word) + word = re.sub(r"^\w", lambda m: m.group(0).upper(), word) + return word + + +def ordinal(number: int) -> str: + """ + Return the suffix that should be added to a number to denote the position + in an ordered sequence such as 1st, 2nd, 3rd, 4th. + + Examples:: + + >>> ordinal(1) + 'st' + >>> ordinal(2) + 'nd' + >>> ordinal(1002) + 'nd' + >>> ordinal(1003) + 'rd' + >>> ordinal(-11) + 'th' + >>> ordinal(-1021) + 'st' + + """ + number = abs(int(number)) + if number % 100 in (11, 12, 13): + return "th" + else: + return { + 1: "st", + 2: "nd", + 3: "rd", + }.get(number % 10, "th") + + +def ordinalize(number: int) -> str: + """ + Turn a number into an ordinal string used to denote the position in an + ordered sequence such as 1st, 2nd, 3rd, 4th. + + Examples:: + + >>> ordinalize(1) + '1st' + >>> ordinalize(2) + '2nd' + >>> ordinalize(1002) + '1002nd' + >>> ordinalize(1003) + '1003rd' + >>> ordinalize(-11) + '-11th' + >>> ordinalize(-1021) + '-1021st' + + """ + return "{}{}".format(number, ordinal(number)) + + +def parameterize(string: str, separator: str = '-') -> str: + """ + Replace special characters in a string so that it may be used as part of a + 'pretty' URL. + + Example:: + + >>> parameterize(u"Donald E. Knuth") + 'donald-e-knuth' + + """ + string = transliterate(string) + # Turn unwanted chars into the separator + string = re.sub(r"(?i)[^a-z0-9\-_]+", separator, string) + if separator: + re_sep = re.escape(separator) + # No more than one of the separator in a row. + string = re.sub(r'%s{2,}' % re_sep, separator, string) + # Remove leading/trailing separator. + string = re.sub(r"(?i)^{sep}|{sep}$".format(sep=re_sep), '', string) + + return string.lower() + + +def pluralize(word: str) -> str: + """ + Return the plural form of a word. + + Examples:: + + >>> pluralize("posts") + 'posts' + >>> pluralize("octopus") + 'octopi' + >>> pluralize("sheep") + 'sheep' + >>> pluralize("CamelOctopus") + 'CamelOctopi' + + """ + if not word or word.lower() in UNCOUNTABLES: + return word + else: + for rule, replacement in PLURALS: + if re.search(rule, word): + return re.sub(rule, replacement, word) + return word + + +def singularize(word: str) -> str: + """ + Return the singular form of a word, the reverse of :func:`pluralize`. + + Examples:: + + >>> singularize("posts") + 'post' + >>> singularize("octopi") + 'octopus' + >>> singularize("sheep") + 'sheep' + >>> singularize("word") + 'word' + >>> singularize("CamelOctopi") + 'CamelOctopus' + + """ + for inflection in UNCOUNTABLES: + if re.search(r'(?i)\b(%s)\Z' % inflection, word): + return word + + for rule, replacement in SINGULARS: + if re.search(rule, word): + return re.sub(rule, replacement, word) + return word + + +def tableize(word: str) -> str: + """ + Create the name of a table like Rails does for models to table names. This + method uses the :func:`pluralize` method on the last word in the string. + + Examples:: + + >>> tableize('RawScaledScorer') + 'raw_scaled_scorers' + >>> tableize('egg_and_ham') + 'egg_and_hams' + >>> tableize('fancyCategory') + 'fancy_categories' + """ + return pluralize(underscore(word)) + + +def titleize(word: str) -> str: + """ + Capitalize all the words and replace some characters in the string to + create a nicer looking title. :func:`titleize` is meant for creating pretty + output. + + Examples:: + + >>> titleize("man from the boondocks") + 'Man From The Boondocks' + >>> titleize("x-men: the last stand") + 'X Men: The Last Stand' + >>> titleize("TheManWithoutAPast") + 'The Man Without A Past' + >>> titleize("raiders_of_the_lost_ark") + 'Raiders Of The Lost Ark' + + """ + return re.sub( + r"\b('?\w)", + lambda match: match.group(1).capitalize(), + humanize(underscore(word)).title() + ) + + +def transliterate(string: str) -> str: + """ + Replace non-ASCII characters with an ASCII approximation. If no + approximation exists, the non-ASCII character is ignored. The string must + be ``unicode``. + + Examples:: + + >>> transliterate('älämölö') + 'alamolo' + >>> transliterate('Ærøskøbing') + 'rskbing' + + """ + normalized = unicodedata.normalize('NFKD', string) + return normalized.encode('ascii', 'ignore').decode('ascii') + + +def underscore(word: str) -> str: + """ + Make an underscored, lowercase form from the expression in the string. + + Example:: + + >>> underscore("DeviceType") + 'device_type' + + As a rule of thumb you can think of :func:`underscore` as the inverse of + :func:`camelize`, though there are cases where that does not hold:: + + >>> camelize(underscore("IOError")) + 'IoError' + + """ + word = re.sub(r"([A-Z]+)([A-Z][a-z])", r'\1_\2', word) + word = re.sub(r"([a-z\d])([A-Z])", r'\1_\2', word) + word = word.replace("-", "_") + return word.lower() + + +_irregular('person', 'people') +_irregular('man', 'men') +_irregular('human', 'humans') +_irregular('child', 'children') +_irregular('sex', 'sexes') +_irregular('move', 'moves') +_irregular('cow', 'kine') +_irregular('zombie', 'zombies') diff --git a/env/lib/python3.10/site-packages/inflection/py.typed b/env/lib/python3.10/site-packages/inflection/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA new file mode 100644 index 0000000..ffef2ff --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/METADATA @@ -0,0 +1,84 @@ +Metadata-Version: 2.4 +Name: Jinja2 +Version: 3.1.6 +Summary: A very fast and expressive template engine. +Maintainer-email: Pallets +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Typing :: Typed +License-File: LICENSE.txt +Requires-Dist: MarkupSafe>=2.0 +Requires-Dist: Babel>=2.7 ; extra == "i18n" +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Chat, https://discord.gg/pallets +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Source, https://github.com/pallets/jinja/ +Provides-Extra: i18n + +# Jinja + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +## In A Nutshell + +```jinja +{% extends "base.html" %} +{% block title %}Members{% endblock %} +{% block content %} + +{% endblock %} +``` + +## Donate + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, [please +donate today][]. + +[please donate today]: https://palletsprojects.com/donate + +## Contributing + +See our [detailed contributing documentation][contrib] for many ways to +contribute, including reporting issues, requesting features, asking or answering +questions, and making PRs. + +[contrib]: https://palletsprojects.com/contributing/ + diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD new file mode 100644 index 0000000..20d4fee --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/RECORD @@ -0,0 +1,57 @@ +jinja2-3.1.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +jinja2-3.1.6.dist-info/METADATA,sha256=aMVUj7Z8QTKhOJjZsx7FDGvqKr3ZFdkh8hQ1XDpkmcg,2871 +jinja2-3.1.6.dist-info/RECORD,, +jinja2-3.1.6.dist-info/WHEEL,sha256=_2ozNFCLWc93bK4WKHCO-eDUENDlo-dgc9cU3qokYO4,82 +jinja2-3.1.6.dist-info/entry_points.txt,sha256=OL85gYU1eD8cuPlikifFngXpeBjaxl6rIJ8KkC_3r-I,58 +jinja2-3.1.6.dist-info/licenses/LICENSE.txt,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +jinja2/__init__.py,sha256=xxepO9i7DHsqkQrgBEduLtfoz2QCuT6_gbL4XSN1hbU,1928 +jinja2/__pycache__/__init__.cpython-310.pyc,, +jinja2/__pycache__/_identifier.cpython-310.pyc,, +jinja2/__pycache__/async_utils.cpython-310.pyc,, +jinja2/__pycache__/bccache.cpython-310.pyc,, +jinja2/__pycache__/compiler.cpython-310.pyc,, +jinja2/__pycache__/constants.cpython-310.pyc,, +jinja2/__pycache__/debug.cpython-310.pyc,, +jinja2/__pycache__/defaults.cpython-310.pyc,, +jinja2/__pycache__/environment.cpython-310.pyc,, +jinja2/__pycache__/exceptions.cpython-310.pyc,, +jinja2/__pycache__/ext.cpython-310.pyc,, +jinja2/__pycache__/filters.cpython-310.pyc,, +jinja2/__pycache__/idtracking.cpython-310.pyc,, +jinja2/__pycache__/lexer.cpython-310.pyc,, +jinja2/__pycache__/loaders.cpython-310.pyc,, +jinja2/__pycache__/meta.cpython-310.pyc,, +jinja2/__pycache__/nativetypes.cpython-310.pyc,, +jinja2/__pycache__/nodes.cpython-310.pyc,, +jinja2/__pycache__/optimizer.cpython-310.pyc,, +jinja2/__pycache__/parser.cpython-310.pyc,, +jinja2/__pycache__/runtime.cpython-310.pyc,, +jinja2/__pycache__/sandbox.cpython-310.pyc,, +jinja2/__pycache__/tests.cpython-310.pyc,, +jinja2/__pycache__/utils.cpython-310.pyc,, +jinja2/__pycache__/visitor.cpython-310.pyc,, +jinja2/_identifier.py,sha256=_zYctNKzRqlk_murTNlzrju1FFJL7Va_Ijqqd7ii2lU,1958 +jinja2/async_utils.py,sha256=vK-PdsuorOMnWSnEkT3iUJRIkTnYgO2T6MnGxDgHI5o,2834 +jinja2/bccache.py,sha256=gh0qs9rulnXo0PhX5jTJy2UHzI8wFnQ63o_vw7nhzRg,14061 +jinja2/compiler.py,sha256=9RpCQl5X88BHllJiPsHPh295Hh0uApvwFJNQuutULeM,74131 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=CnHqCDHd-BVGvti_8ZsTolnXNhA3ECsY-6n_2pwU8Hw,6297 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=9nhrP7Ch-NbGX00wvyr4yy-uhNHq2OCc60ggGrni_fk,61513 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=5PF5eHfh8mXAIxXHHRB2xXbXohi8pE3nHSOxa66uS7E,31875 +jinja2/filters.py,sha256=PQ_Egd9n9jSgtnGQYyF4K5j2nYwhUIulhPnyimkdr-k,55212 +jinja2/idtracking.py,sha256=-ll5lIp73pML3ErUYiIJj7tdmWxcH_IlDv3yA_hiZYo,10555 +jinja2/lexer.py,sha256=LYiYio6br-Tep9nPcupWXsPEtjluw3p1mU-lNBVRUfk,29786 +jinja2/loaders.py,sha256=wIrnxjvcbqh5VwW28NSkfotiDq8qNCxIOSFbGUiSLB4,24055 +jinja2/meta.py,sha256=OTDPkaFvU2Hgvx-6akz7154F8BIWaRmvJcBFvwopHww,4397 +jinja2/nativetypes.py,sha256=7GIGALVJgdyL80oZJdQUaUfwSt5q2lSSZbXt0dNf_M4,4210 +jinja2/nodes.py,sha256=m1Duzcr6qhZI8JQ6VyJgUNinjAf5bQzijSmDnMsvUx8,34579 +jinja2/optimizer.py,sha256=rJnCRlQ7pZsEEmMhsQDgC_pKyDHxP5TPS6zVPGsgcu8,1651 +jinja2/parser.py,sha256=lLOFy3sEmHc5IaEHRiH1sQVnId2moUQzhyeJZTtdY30,40383 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=gDk-GvdriJXqgsGbHgrcKTP0Yp6zPXzhzrIpCFH3jAU,34249 +jinja2/sandbox.py,sha256=Mw2aitlY2I8la7FYhcX2YG9BtUYcLnD0Gh3d29cDWrY,15009 +jinja2/tests.py,sha256=VLsBhVFnWg-PxSBz1MhRnNWgP1ovXk3neO1FLQMeC9Q,5926 +jinja2/utils.py,sha256=rRp3o9e7ZKS4fyrWRbELyLcpuGVTFcnooaOa1qx_FIk,24129 +jinja2/visitor.py,sha256=EcnL1PIwf_4RVCOMxsRNuR8AXHbS1qfAdMOE2ngKJz4,3557 diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL new file mode 100644 index 0000000..23d2d7e --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: flit 3.11.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt new file mode 100644 index 0000000..abc3eae --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2=jinja2.ext:babel_extract[i18n] + diff --git a/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/env/lib/python3.10/site-packages/jinja2/__init__.py b/env/lib/python3.10/site-packages/jinja2/__init__.py new file mode 100644 index 0000000..1a423a3 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/__init__.py @@ -0,0 +1,38 @@ +"""Jinja is a template engine written in pure Python. It provides a +non-XML syntax that supports inline expressions and an optional +sandboxed environment. +""" + +from .bccache import BytecodeCache as BytecodeCache +from .bccache import FileSystemBytecodeCache as FileSystemBytecodeCache +from .bccache import MemcachedBytecodeCache as MemcachedBytecodeCache +from .environment import Environment as Environment +from .environment import Template as Template +from .exceptions import TemplateAssertionError as TemplateAssertionError +from .exceptions import TemplateError as TemplateError +from .exceptions import TemplateNotFound as TemplateNotFound +from .exceptions import TemplateRuntimeError as TemplateRuntimeError +from .exceptions import TemplatesNotFound as TemplatesNotFound +from .exceptions import TemplateSyntaxError as TemplateSyntaxError +from .exceptions import UndefinedError as UndefinedError +from .loaders import BaseLoader as BaseLoader +from .loaders import ChoiceLoader as ChoiceLoader +from .loaders import DictLoader as DictLoader +from .loaders import FileSystemLoader as FileSystemLoader +from .loaders import FunctionLoader as FunctionLoader +from .loaders import ModuleLoader as ModuleLoader +from .loaders import PackageLoader as PackageLoader +from .loaders import PrefixLoader as PrefixLoader +from .runtime import ChainableUndefined as ChainableUndefined +from .runtime import DebugUndefined as DebugUndefined +from .runtime import make_logging_undefined as make_logging_undefined +from .runtime import StrictUndefined as StrictUndefined +from .runtime import Undefined as Undefined +from .utils import clear_caches as clear_caches +from .utils import is_undefined as is_undefined +from .utils import pass_context as pass_context +from .utils import pass_environment as pass_environment +from .utils import pass_eval_context as pass_eval_context +from .utils import select_autoescape as select_autoescape + +__version__ = "3.1.6" diff --git a/env/lib/python3.10/site-packages/jinja2/_identifier.py b/env/lib/python3.10/site-packages/jinja2/_identifier.py new file mode 100644 index 0000000..928c150 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/_identifier.py @@ -0,0 +1,6 @@ +import re + +# generated by scripts/generate_identifier_pattern.py +pattern = re.compile( + r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950 +) diff --git a/env/lib/python3.10/site-packages/jinja2/async_utils.py b/env/lib/python3.10/site-packages/jinja2/async_utils.py new file mode 100644 index 0000000..f0c1402 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/async_utils.py @@ -0,0 +1,99 @@ +import inspect +import typing as t +from functools import WRAPPER_ASSIGNMENTS +from functools import wraps + +from .utils import _PassArg +from .utils import pass_eval_context + +if t.TYPE_CHECKING: + import typing_extensions as te + +V = t.TypeVar("V") + + +def async_variant(normal_func): # type: ignore + def decorator(async_func): # type: ignore + pass_arg = _PassArg.from_obj(normal_func) + need_eval_context = pass_arg is None + + if pass_arg is _PassArg.environment: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].is_async) + + else: + + def is_async(args: t.Any) -> bool: + return t.cast(bool, args[0].environment.is_async) + + # Take the doc and annotations from the sync function, but the + # name from the async function. Pallets-Sphinx-Themes + # build_function_directive expects __wrapped__ to point to the + # sync function. + async_func_attrs = ("__module__", "__name__", "__qualname__") + normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs)) + + @wraps(normal_func, assigned=normal_func_attrs) + @wraps(async_func, assigned=async_func_attrs, updated=()) + def wrapper(*args, **kwargs): # type: ignore + b = is_async(args) + + if need_eval_context: + args = args[1:] + + if b: + return async_func(*args, **kwargs) + + return normal_func(*args, **kwargs) + + if need_eval_context: + wrapper = pass_eval_context(wrapper) + + wrapper.jinja_async_variant = True # type: ignore[attr-defined] + return wrapper + + return decorator + + +_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} + + +async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": + # Avoid a costly call to isawaitable + if type(value) in _common_primitives: + return t.cast("V", value) + + if inspect.isawaitable(value): + return await t.cast("t.Awaitable[V]", value) + + return value + + +class _IteratorToAsyncIterator(t.Generic[V]): + def __init__(self, iterator: "t.Iterator[V]"): + self._iterator = iterator + + def __aiter__(self) -> "te.Self": + return self + + async def __anext__(self) -> V: + try: + return next(self._iterator) + except StopIteration as e: + raise StopAsyncIteration(e.value) from e + + +def auto_aiter( + iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> "t.AsyncIterator[V]": + if hasattr(iterable, "__aiter__"): + return iterable.__aiter__() + else: + return _IteratorToAsyncIterator(iter(iterable)) + + +async def auto_to_list( + value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", +) -> t.List["V"]: + return [x async for x in auto_aiter(value)] diff --git a/env/lib/python3.10/site-packages/jinja2/bccache.py b/env/lib/python3.10/site-packages/jinja2/bccache.py new file mode 100644 index 0000000..ada8b09 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/bccache.py @@ -0,0 +1,408 @@ +"""The optional bytecode cache system. This is useful if you have very +complex template situations and the compilation of all those templates +slows down your application too much. + +Situations where this is useful are often forking web applications that +are initialized on the first request. +""" + +import errno +import fnmatch +import marshal +import os +import pickle +import stat +import sys +import tempfile +import typing as t +from hashlib import sha1 +from io import BytesIO +from types import CodeType + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + + class _MemcachedClient(te.Protocol): + def get(self, key: str) -> bytes: ... + + def set( + self, key: str, value: bytes, timeout: t.Optional[int] = None + ) -> None: ... + + +bc_version = 5 +# Magic bytes to identify Jinja bytecode cache files. Contains the +# Python major and minor version to avoid loading incompatible bytecode +# if a project upgrades its Python version. +bc_magic = ( + b"j2" + + pickle.dumps(bc_version, 2) + + pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1], 2) +) + + +class Bucket: + """Buckets are used to store the bytecode for one template. It's created + and initialized by the bytecode cache and passed to the loading functions. + + The buckets get an internal checksum from the cache assigned and use this + to automatically reject outdated cache material. Individual bytecode + cache subclasses don't have to care about cache invalidation. + """ + + def __init__(self, environment: "Environment", key: str, checksum: str) -> None: + self.environment = environment + self.key = key + self.checksum = checksum + self.reset() + + def reset(self) -> None: + """Resets the bucket (unloads the bytecode).""" + self.code: t.Optional[CodeType] = None + + def load_bytecode(self, f: t.BinaryIO) -> None: + """Loads bytecode from a file or file like object.""" + # make sure the magic header is correct + magic = f.read(len(bc_magic)) + if magic != bc_magic: + self.reset() + return + # the source code of the file changed, we need to reload + checksum = pickle.load(f) + if self.checksum != checksum: + self.reset() + return + # if marshal_load fails then we need to reload + try: + self.code = marshal.load(f) + except (EOFError, ValueError, TypeError): + self.reset() + return + + def write_bytecode(self, f: t.IO[bytes]) -> None: + """Dump the bytecode into the file or file like object passed.""" + if self.code is None: + raise TypeError("can't write empty bucket") + f.write(bc_magic) + pickle.dump(self.checksum, f, 2) + marshal.dump(self.code, f) + + def bytecode_from_string(self, string: bytes) -> None: + """Load bytecode from bytes.""" + self.load_bytecode(BytesIO(string)) + + def bytecode_to_string(self) -> bytes: + """Return the bytecode as bytes.""" + out = BytesIO() + self.write_bytecode(out) + return out.getvalue() + + +class BytecodeCache: + """To implement your own bytecode cache you have to subclass this class + and override :meth:`load_bytecode` and :meth:`dump_bytecode`. Both of + these methods are passed a :class:`~jinja2.bccache.Bucket`. + + A very basic bytecode cache that saves the bytecode on the file system:: + + from os import path + + class MyCache(BytecodeCache): + + def __init__(self, directory): + self.directory = directory + + def load_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + if path.exists(filename): + with open(filename, 'rb') as f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket): + filename = path.join(self.directory, bucket.key) + with open(filename, 'wb') as f: + bucket.write_bytecode(f) + + A more advanced version of a filesystem based bytecode cache is part of + Jinja. + """ + + def load_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to load bytecode into a + bucket. If they are not able to find code in the cache for the + bucket, it must not do anything. + """ + raise NotImplementedError() + + def dump_bytecode(self, bucket: Bucket) -> None: + """Subclasses have to override this method to write the bytecode + from a bucket back to the cache. If it unable to do so it must not + fail silently but raise an exception. + """ + raise NotImplementedError() + + def clear(self) -> None: + """Clears the cache. This method is not used by Jinja but should be + implemented to allow applications to clear the bytecode cache used + by a particular environment. + """ + + def get_cache_key( + self, name: str, filename: t.Optional[t.Union[str]] = None + ) -> str: + """Returns the unique hash key for this template name.""" + hash = sha1(name.encode("utf-8")) + + if filename is not None: + hash.update(f"|{filename}".encode()) + + return hash.hexdigest() + + def get_source_checksum(self, source: str) -> str: + """Returns a checksum for the source.""" + return sha1(source.encode("utf-8")).hexdigest() + + def get_bucket( + self, + environment: "Environment", + name: str, + filename: t.Optional[str], + source: str, + ) -> Bucket: + """Return a cache bucket for the given template. All arguments are + mandatory but filename may be `None`. + """ + key = self.get_cache_key(name, filename) + checksum = self.get_source_checksum(source) + bucket = Bucket(environment, key, checksum) + self.load_bytecode(bucket) + return bucket + + def set_bucket(self, bucket: Bucket) -> None: + """Put the bucket into the cache.""" + self.dump_bytecode(bucket) + + +class FileSystemBytecodeCache(BytecodeCache): + """A bytecode cache that stores bytecode on the filesystem. It accepts + two arguments: The directory where the cache items are stored and a + pattern string that is used to build the filename. + + If no directory is specified a default cache directory is selected. On + Windows the user's temp directory is used, on UNIX systems a directory + is created for the user in the system temp directory. + + The pattern can be used to have multiple separate caches operate on the + same directory. The default pattern is ``'__jinja2_%s.cache'``. ``%s`` + is replaced with the cache key. + + >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache') + + This bytecode cache supports clearing of the cache using the clear method. + """ + + def __init__( + self, directory: t.Optional[str] = None, pattern: str = "__jinja2_%s.cache" + ) -> None: + if directory is None: + directory = self._get_default_cache_dir() + self.directory = directory + self.pattern = pattern + + def _get_default_cache_dir(self) -> str: + def _unsafe_dir() -> "te.NoReturn": + raise RuntimeError( + "Cannot determine safe temp directory. You " + "need to explicitly provide one." + ) + + tmpdir = tempfile.gettempdir() + + # On windows the temporary directory is used specific unless + # explicitly forced otherwise. We can just use that. + if os.name == "nt": + return tmpdir + if not hasattr(os, "getuid"): + _unsafe_dir() + + dirname = f"_jinja2-cache-{os.getuid()}" + actual_dir = os.path.join(tmpdir, dirname) + + try: + os.mkdir(actual_dir, stat.S_IRWXU) + except OSError as e: + if e.errno != errno.EEXIST: + raise + try: + os.chmod(actual_dir, stat.S_IRWXU) + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + except OSError as e: + if e.errno != errno.EEXIST: + raise + + actual_dir_stat = os.lstat(actual_dir) + if ( + actual_dir_stat.st_uid != os.getuid() + or not stat.S_ISDIR(actual_dir_stat.st_mode) + or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU + ): + _unsafe_dir() + + return actual_dir + + def _get_cache_filename(self, bucket: Bucket) -> str: + return os.path.join(self.directory, self.pattern % (bucket.key,)) + + def load_bytecode(self, bucket: Bucket) -> None: + filename = self._get_cache_filename(bucket) + + # Don't test for existence before opening the file, since the + # file could disappear after the test before the open. + try: + f = open(filename, "rb") + except (FileNotFoundError, IsADirectoryError, PermissionError): + # PermissionError can occur on Windows when an operation is + # in progress, such as calling clear(). + return + + with f: + bucket.load_bytecode(f) + + def dump_bytecode(self, bucket: Bucket) -> None: + # Write to a temporary file, then rename to the real name after + # writing. This avoids another process reading the file before + # it is fully written. + name = self._get_cache_filename(bucket) + f = tempfile.NamedTemporaryFile( + mode="wb", + dir=os.path.dirname(name), + prefix=os.path.basename(name), + suffix=".tmp", + delete=False, + ) + + def remove_silent() -> None: + try: + os.remove(f.name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + pass + + try: + with f: + bucket.write_bytecode(f) + except BaseException: + remove_silent() + raise + + try: + os.replace(f.name, name) + except OSError: + # Another process may have called clear(). On Windows, + # another program may be holding the file open. + remove_silent() + except BaseException: + remove_silent() + raise + + def clear(self) -> None: + # imported lazily here because google app-engine doesn't support + # write access on the file system and the function does not exist + # normally. + from os import remove + + files = fnmatch.filter(os.listdir(self.directory), self.pattern % ("*",)) + for filename in files: + try: + remove(os.path.join(self.directory, filename)) + except OSError: + pass + + +class MemcachedBytecodeCache(BytecodeCache): + """This class implements a bytecode cache that uses a memcache cache for + storing the information. It does not enforce a specific memcache library + (tummy's memcache or cmemcache) but will accept any class that provides + the minimal interface required. + + Libraries compatible with this class: + + - `cachelib `_ + - `python-memcached `_ + + (Unfortunately the django cache interface is not compatible because it + does not support storing binary data, only text. You can however pass + the underlying cache client to the bytecode cache which is available + as `django.core.cache.cache._client`.) + + The minimal interface for the client passed to the constructor is this: + + .. class:: MinimalClientInterface + + .. method:: set(key, value[, timeout]) + + Stores the bytecode in the cache. `value` is a string and + `timeout` the timeout of the key. If timeout is not provided + a default timeout or no timeout should be assumed, if it's + provided it's an integer with the number of seconds the cache + item should exist. + + .. method:: get(key) + + Returns the value for the cache key. If the item does not + exist in the cache the return value must be `None`. + + The other arguments to the constructor are the prefix for all keys that + is added before the actual cache key and the timeout for the bytecode in + the cache system. We recommend a high (or no) timeout. + + This bytecode cache does not support clearing of used items in the cache. + The clear method is a no-operation function. + + .. versionadded:: 2.7 + Added support for ignoring memcache errors through the + `ignore_memcache_errors` parameter. + """ + + def __init__( + self, + client: "_MemcachedClient", + prefix: str = "jinja2/bytecode/", + timeout: t.Optional[int] = None, + ignore_memcache_errors: bool = True, + ): + self.client = client + self.prefix = prefix + self.timeout = timeout + self.ignore_memcache_errors = ignore_memcache_errors + + def load_bytecode(self, bucket: Bucket) -> None: + try: + code = self.client.get(self.prefix + bucket.key) + except Exception: + if not self.ignore_memcache_errors: + raise + else: + bucket.bytecode_from_string(code) + + def dump_bytecode(self, bucket: Bucket) -> None: + key = self.prefix + bucket.key + value = bucket.bytecode_to_string() + + try: + if self.timeout is not None: + self.client.set(key, value, self.timeout) + else: + self.client.set(key, value) + except Exception: + if not self.ignore_memcache_errors: + raise diff --git a/env/lib/python3.10/site-packages/jinja2/compiler.py b/env/lib/python3.10/site-packages/jinja2/compiler.py new file mode 100644 index 0000000..a4ff6a1 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/compiler.py @@ -0,0 +1,1998 @@ +"""Compiles nodes from the parser into Python code.""" + +import typing as t +from contextlib import contextmanager +from functools import update_wrapper +from io import StringIO +from itertools import chain +from keyword import iskeyword as is_python_keyword + +from markupsafe import escape +from markupsafe import Markup + +from . import nodes +from .exceptions import TemplateAssertionError +from .idtracking import Symbols +from .idtracking import VAR_LOAD_ALIAS +from .idtracking import VAR_LOAD_PARAMETER +from .idtracking import VAR_LOAD_RESOLVE +from .idtracking import VAR_LOAD_UNDEFINED +from .nodes import EvalContext +from .optimizer import Optimizer +from .utils import _PassArg +from .utils import concat +from .visitor import NodeVisitor + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .environment import Environment + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + +operators = { + "eq": "==", + "ne": "!=", + "gt": ">", + "gteq": ">=", + "lt": "<", + "lteq": "<=", + "in": "in", + "notin": "not in", +} + + +def optimizeconst(f: F) -> F: + def new_func( + self: "CodeGenerator", node: nodes.Expr, frame: "Frame", **kwargs: t.Any + ) -> t.Any: + # Only optimize if the frame is not volatile + if self.optimizer is not None and not frame.eval_ctx.volatile: + new_node = self.optimizer.visit(node, frame.eval_ctx) + + if new_node != node: + return self.visit(new_node, frame) + + return f(self, node, frame, **kwargs) + + return update_wrapper(new_func, f) # type: ignore[return-value] + + +def _make_binop(op: str) -> t.Callable[["CodeGenerator", nodes.BinExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.BinExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_binops # type: ignore + ): + self.write(f"environment.call_binop(context, {op!r}, ") + self.visit(node.left, frame) + self.write(", ") + self.visit(node.right, frame) + else: + self.write("(") + self.visit(node.left, frame) + self.write(f" {op} ") + self.visit(node.right, frame) + + self.write(")") + + return visitor + + +def _make_unop( + op: str, +) -> t.Callable[["CodeGenerator", nodes.UnaryExpr, "Frame"], None]: + @optimizeconst + def visitor(self: "CodeGenerator", node: nodes.UnaryExpr, frame: Frame) -> None: + if ( + self.environment.sandboxed and op in self.environment.intercepted_unops # type: ignore + ): + self.write(f"environment.call_unop(context, {op!r}, ") + self.visit(node.node, frame) + else: + self.write("(" + op) + self.visit(node.node, frame) + + self.write(")") + + return visitor + + +def generate( + node: nodes.Template, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, +) -> t.Optional[str]: + """Generate the python source for a node tree.""" + if not isinstance(node, nodes.Template): + raise TypeError("Can't compile non template nodes") + + generator = environment.code_generator_class( + environment, name, filename, stream, defer_init, optimized + ) + generator.visit(node) + + if stream is None: + return generator.stream.getvalue() # type: ignore + + return None + + +def has_safe_repr(value: t.Any) -> bool: + """Does the node have a safe representation?""" + if value is None or value is NotImplemented or value is Ellipsis: + return True + + if type(value) in {bool, int, float, complex, range, str, Markup}: + return True + + if type(value) in {tuple, list, set, frozenset}: + return all(has_safe_repr(v) for v in value) + + if type(value) is dict: # noqa E721 + return all(has_safe_repr(k) and has_safe_repr(v) for k, v in value.items()) + + return False + + +def find_undeclared( + nodes: t.Iterable[nodes.Node], names: t.Iterable[str] +) -> t.Set[str]: + """Check if the names passed are accessed undeclared. The return value + is a set of all the undeclared names from the sequence of names found. + """ + visitor = UndeclaredNameVisitor(names) + try: + for node in nodes: + visitor.visit(node) + except VisitorExit: + pass + return visitor.undeclared + + +class MacroRef: + def __init__(self, node: t.Union[nodes.Macro, nodes.CallBlock]) -> None: + self.node = node + self.accesses_caller = False + self.accesses_kwargs = False + self.accesses_varargs = False + + +class Frame: + """Holds compile time information for us.""" + + def __init__( + self, + eval_ctx: EvalContext, + parent: t.Optional["Frame"] = None, + level: t.Optional[int] = None, + ) -> None: + self.eval_ctx = eval_ctx + + # the parent of this frame + self.parent = parent + + if parent is None: + self.symbols = Symbols(level=level) + + # in some dynamic inheritance situations the compiler needs to add + # write tests around output statements. + self.require_output_check = False + + # inside some tags we are using a buffer rather than yield statements. + # this for example affects {% filter %} or {% macro %}. If a frame + # is buffered this variable points to the name of the list used as + # buffer. + self.buffer: t.Optional[str] = None + + # the name of the block we're in, otherwise None. + self.block: t.Optional[str] = None + + else: + self.symbols = Symbols(parent.symbols, level=level) + self.require_output_check = parent.require_output_check + self.buffer = parent.buffer + self.block = parent.block + + # a toplevel frame is the root + soft frames such as if conditions. + self.toplevel = False + + # the root frame is basically just the outermost frame, so no if + # conditions. This information is used to optimize inheritance + # situations. + self.rootlevel = False + + # variables set inside of loops and blocks should not affect outer frames, + # but they still needs to be kept track of as part of the active context. + self.loop_frame = False + self.block_frame = False + + # track whether the frame is being used in an if-statement or conditional + # expression as it determines which errors should be raised during runtime + # or compile time. + self.soft_frame = False + + def copy(self) -> "te.Self": + """Create a copy of the current one.""" + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.symbols = self.symbols.copy() + return rv + + def inner(self, isolated: bool = False) -> "Frame": + """Return an inner frame.""" + if isolated: + return Frame(self.eval_ctx, level=self.symbols.level + 1) + return Frame(self.eval_ctx, self) + + def soft(self) -> "te.Self": + """Return a soft frame. A soft frame may not be modified as + standalone thing as it shares the resources with the frame it + was created of, but it's not a rootlevel frame any longer. + + This is only used to implement if-statements and conditional + expressions. + """ + rv = self.copy() + rv.rootlevel = False + rv.soft_frame = True + return rv + + __copy__ = copy + + +class VisitorExit(RuntimeError): + """Exception used by the `UndeclaredNameVisitor` to signal a stop.""" + + +class DependencyFinderVisitor(NodeVisitor): + """A visitor that collects filter and test calls.""" + + def __init__(self) -> None: + self.filters: t.Set[str] = set() + self.tests: t.Set[str] = set() + + def visit_Filter(self, node: nodes.Filter) -> None: + self.generic_visit(node) + self.filters.add(node.name) + + def visit_Test(self, node: nodes.Test) -> None: + self.generic_visit(node) + self.tests.add(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting at blocks.""" + + +class UndeclaredNameVisitor(NodeVisitor): + """A visitor that checks if a name is accessed without being + declared. This is different from the frame visitor as it will + not stop at closure frames. + """ + + def __init__(self, names: t.Iterable[str]) -> None: + self.names = set(names) + self.undeclared: t.Set[str] = set() + + def visit_Name(self, node: nodes.Name) -> None: + if node.ctx == "load" and node.name in self.names: + self.undeclared.add(node.name) + if self.undeclared == self.names: + raise VisitorExit() + else: + self.names.discard(node.name) + + def visit_Block(self, node: nodes.Block) -> None: + """Stop visiting a blocks.""" + + +class CompilerExit(Exception): + """Raised if the compiler encountered a situation where it just + doesn't make sense to further process the code. Any block that + raises such an exception is not further processed. + """ + + +class CodeGenerator(NodeVisitor): + def __init__( + self, + environment: "Environment", + name: t.Optional[str], + filename: t.Optional[str], + stream: t.Optional[t.TextIO] = None, + defer_init: bool = False, + optimized: bool = True, + ) -> None: + if stream is None: + stream = StringIO() + self.environment = environment + self.name = name + self.filename = filename + self.stream = stream + self.created_block_context = False + self.defer_init = defer_init + self.optimizer: t.Optional[Optimizer] = None + + if optimized: + self.optimizer = Optimizer(environment) + + # aliases for imports + self.import_aliases: t.Dict[str, str] = {} + + # a registry for all blocks. Because blocks are moved out + # into the global python scope they are registered here + self.blocks: t.Dict[str, nodes.Block] = {} + + # the number of extends statements so far + self.extends_so_far = 0 + + # some templates have a rootlevel extends. In this case we + # can safely assume that we're a child template and do some + # more optimizations. + self.has_known_extends = False + + # the current line number + self.code_lineno = 1 + + # registry of all filters and tests (global, not block local) + self.tests: t.Dict[str, str] = {} + self.filters: t.Dict[str, str] = {} + + # the debug information + self.debug_info: t.List[t.Tuple[int, int]] = [] + self._write_debug_info: t.Optional[int] = None + + # the number of new lines before the next write() + self._new_lines = 0 + + # the line number of the last written statement + self._last_line = 0 + + # true if nothing was written so far. + self._first_write = True + + # used by the `temporary_identifier` method to get new + # unique, temporary identifier + self._last_identifier = 0 + + # the current indentation + self._indentation = 0 + + # Tracks toplevel assignments + self._assign_stack: t.List[t.Set[str]] = [] + + # Tracks parameter definition blocks + self._param_def_block: t.List[t.Set[str]] = [] + + # Tracks the current context. + self._context_reference_stack = ["context"] + + @property + def optimized(self) -> bool: + return self.optimizer is not None + + # -- Various compilation helpers + + def fail(self, msg: str, lineno: int) -> "te.NoReturn": + """Fail with a :exc:`TemplateAssertionError`.""" + raise TemplateAssertionError(msg, lineno, self.name, self.filename) + + def temporary_identifier(self) -> str: + """Get a new unique identifier.""" + self._last_identifier += 1 + return f"t_{self._last_identifier}" + + def buffer(self, frame: Frame) -> None: + """Enable buffering for the frame from that point onwards.""" + frame.buffer = self.temporary_identifier() + self.writeline(f"{frame.buffer} = []") + + def return_buffer_contents( + self, frame: Frame, force_unescaped: bool = False + ) -> None: + """Return the buffer contents of the frame.""" + if not force_unescaped: + if frame.eval_ctx.volatile: + self.writeline("if context.eval_ctx.autoescape:") + self.indent() + self.writeline(f"return Markup(concat({frame.buffer}))") + self.outdent() + self.writeline("else:") + self.indent() + self.writeline(f"return concat({frame.buffer})") + self.outdent() + return + elif frame.eval_ctx.autoescape: + self.writeline(f"return Markup(concat({frame.buffer}))") + return + self.writeline(f"return concat({frame.buffer})") + + def indent(self) -> None: + """Indent by one.""" + self._indentation += 1 + + def outdent(self, step: int = 1) -> None: + """Outdent by step.""" + self._indentation -= step + + def start_write(self, frame: Frame, node: t.Optional[nodes.Node] = None) -> None: + """Yield or write into the frame buffer.""" + if frame.buffer is None: + self.writeline("yield ", node) + else: + self.writeline(f"{frame.buffer}.append(", node) + + def end_write(self, frame: Frame) -> None: + """End the writing process started by `start_write`.""" + if frame.buffer is not None: + self.write(")") + + def simple_write( + self, s: str, frame: Frame, node: t.Optional[nodes.Node] = None + ) -> None: + """Simple shortcut for start_write + write + end_write.""" + self.start_write(frame, node) + self.write(s) + self.end_write(frame) + + def blockvisit(self, nodes: t.Iterable[nodes.Node], frame: Frame) -> None: + """Visit a list of nodes as block in a frame. If the current frame + is no buffer a dummy ``if 0: yield None`` is written automatically. + """ + try: + self.writeline("pass") + for node in nodes: + self.visit(node, frame) + except CompilerExit: + pass + + def write(self, x: str) -> None: + """Write a string into the output stream.""" + if self._new_lines: + if not self._first_write: + self.stream.write("\n" * self._new_lines) + self.code_lineno += self._new_lines + if self._write_debug_info is not None: + self.debug_info.append((self._write_debug_info, self.code_lineno)) + self._write_debug_info = None + self._first_write = False + self.stream.write(" " * self._indentation) + self._new_lines = 0 + self.stream.write(x) + + def writeline( + self, x: str, node: t.Optional[nodes.Node] = None, extra: int = 0 + ) -> None: + """Combination of newline and write.""" + self.newline(node, extra) + self.write(x) + + def newline(self, node: t.Optional[nodes.Node] = None, extra: int = 0) -> None: + """Add one or more newlines before the next write.""" + self._new_lines = max(self._new_lines, 1 + extra) + if node is not None and node.lineno != self._last_line: + self._write_debug_info = node.lineno + self._last_line = node.lineno + + def signature( + self, + node: t.Union[nodes.Call, nodes.Filter, nodes.Test], + frame: Frame, + extra_kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + ) -> None: + """Writes a function call to the stream for the current node. + A leading comma is added automatically. The extra keyword + arguments may not include python keywords otherwise a syntax + error could occur. The extra keyword arguments should be given + as python dict. + """ + # if any of the given keyword arguments is a python keyword + # we have to make sure that no invalid call is created. + kwarg_workaround = any( + is_python_keyword(t.cast(str, k)) + for k in chain((x.key for x in node.kwargs), extra_kwargs or ()) + ) + + for arg in node.args: + self.write(", ") + self.visit(arg, frame) + + if not kwarg_workaround: + for kwarg in node.kwargs: + self.write(", ") + self.visit(kwarg, frame) + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f", {key}={value}") + if node.dyn_args: + self.write(", *") + self.visit(node.dyn_args, frame) + + if kwarg_workaround: + if node.dyn_kwargs is not None: + self.write(", **dict({") + else: + self.write(", **{") + for kwarg in node.kwargs: + self.write(f"{kwarg.key!r}: ") + self.visit(kwarg.value, frame) + self.write(", ") + if extra_kwargs is not None: + for key, value in extra_kwargs.items(): + self.write(f"{key!r}: {value}, ") + if node.dyn_kwargs is not None: + self.write("}, **") + self.visit(node.dyn_kwargs, frame) + self.write(")") + else: + self.write("}") + + elif node.dyn_kwargs is not None: + self.write(", **") + self.visit(node.dyn_kwargs, frame) + + def pull_dependencies(self, nodes: t.Iterable[nodes.Node]) -> None: + """Find all filter and test names used in the template and + assign them to variables in the compiled namespace. Checking + that the names are registered with the environment is done when + compiling the Filter and Test nodes. If the node is in an If or + CondExpr node, the check is done at runtime instead. + + .. versionchanged:: 3.0 + Filters and tests in If and CondExpr nodes are checked at + runtime instead of compile time. + """ + visitor = DependencyFinderVisitor() + + for node in nodes: + visitor.visit(node) + + for id_map, names, dependency in ( + (self.filters, visitor.filters, "filters"), + ( + self.tests, + visitor.tests, + "tests", + ), + ): + for name in sorted(names): + if name not in id_map: + id_map[name] = self.temporary_identifier() + + # add check during runtime that dependencies used inside of executed + # blocks are defined, as this step may be skipped during compile time + self.writeline("try:") + self.indent() + self.writeline(f"{id_map[name]} = environment.{dependency}[{name!r}]") + self.outdent() + self.writeline("except KeyError:") + self.indent() + self.writeline("@internalcode") + self.writeline(f"def {id_map[name]}(*unused):") + self.indent() + self.writeline( + f'raise TemplateRuntimeError("No {dependency[:-1]}' + f' named {name!r} found.")' + ) + self.outdent() + self.outdent() + + def enter_frame(self, frame: Frame) -> None: + undefs = [] + for target, (action, param) in frame.symbols.loads.items(): + if action == VAR_LOAD_PARAMETER: + pass + elif action == VAR_LOAD_RESOLVE: + self.writeline(f"{target} = {self.get_resolve_func()}({param!r})") + elif action == VAR_LOAD_ALIAS: + self.writeline(f"{target} = {param}") + elif action == VAR_LOAD_UNDEFINED: + undefs.append(target) + else: + raise NotImplementedError("unknown load instruction") + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def leave_frame(self, frame: Frame, with_python_scope: bool = False) -> None: + if not with_python_scope: + undefs = [] + for target in frame.symbols.loads: + undefs.append(target) + if undefs: + self.writeline(f"{' = '.join(undefs)} = missing") + + def choose_async(self, async_value: str = "async ", sync_value: str = "") -> str: + return async_value if self.environment.is_async else sync_value + + def func(self, name: str) -> str: + return f"{self.choose_async()}def {name}" + + def macro_body( + self, node: t.Union[nodes.Macro, nodes.CallBlock], frame: Frame + ) -> t.Tuple[Frame, MacroRef]: + """Dump the function def of a macro or call block.""" + frame = frame.inner() + frame.symbols.analyze_node(node) + macro_ref = MacroRef(node) + + explicit_caller = None + skip_special_params = set() + args = [] + + for idx, arg in enumerate(node.args): + if arg.name == "caller": + explicit_caller = idx + if arg.name in ("kwargs", "varargs"): + skip_special_params.add(arg.name) + args.append(frame.symbols.ref(arg.name)) + + undeclared = find_undeclared(node.body, ("caller", "kwargs", "varargs")) + + if "caller" in undeclared: + # In older Jinja versions there was a bug that allowed caller + # to retain the special behavior even if it was mentioned in + # the argument list. However thankfully this was only really + # working if it was the last argument. So we are explicitly + # checking this now and error out if it is anywhere else in + # the argument list. + if explicit_caller is not None: + try: + node.defaults[explicit_caller - len(node.args)] + except IndexError: + self.fail( + "When defining macros or call blocks the " + 'special "caller" argument must be omitted ' + "or be given a default.", + node.lineno, + ) + else: + args.append(frame.symbols.declare_parameter("caller")) + macro_ref.accesses_caller = True + if "kwargs" in undeclared and "kwargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("kwargs")) + macro_ref.accesses_kwargs = True + if "varargs" in undeclared and "varargs" not in skip_special_params: + args.append(frame.symbols.declare_parameter("varargs")) + macro_ref.accesses_varargs = True + + # macros are delayed, they never require output checks + frame.require_output_check = False + frame.symbols.analyze_node(node) + self.writeline(f"{self.func('macro')}({', '.join(args)}):", node) + self.indent() + + self.buffer(frame) + self.enter_frame(frame) + + self.push_parameter_definitions(frame) + for idx, arg in enumerate(node.args): + ref = frame.symbols.ref(arg.name) + self.writeline(f"if {ref} is missing:") + self.indent() + try: + default = node.defaults[idx - len(node.args)] + except IndexError: + self.writeline( + f'{ref} = undefined("parameter {arg.name!r} was not provided",' + f" name={arg.name!r})" + ) + else: + self.writeline(f"{ref} = ") + self.visit(default, frame) + self.mark_parameter_stored(ref) + self.outdent() + self.pop_parameter_definitions() + + self.blockvisit(node.body, frame) + self.return_buffer_contents(frame, force_unescaped=True) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + return frame, macro_ref + + def macro_def(self, macro_ref: MacroRef, frame: Frame) -> None: + """Dump the macro definition for the def created by macro_body.""" + arg_tuple = ", ".join(repr(x.name) for x in macro_ref.node.args) + name = getattr(macro_ref.node, "name", None) + if len(macro_ref.node.args) == 1: + arg_tuple += "," + self.write( + f"Macro(environment, macro, {name!r}, ({arg_tuple})," + f" {macro_ref.accesses_kwargs!r}, {macro_ref.accesses_varargs!r}," + f" {macro_ref.accesses_caller!r}, context.eval_ctx.autoescape)" + ) + + def position(self, node: nodes.Node) -> str: + """Return a human readable position for the node.""" + rv = f"line {node.lineno}" + if self.name is not None: + rv = f"{rv} in {self.name!r}" + return rv + + def dump_local_context(self, frame: Frame) -> str: + items_kv = ", ".join( + f"{name!r}: {target}" + for name, target in frame.symbols.dump_stores().items() + ) + return f"{{{items_kv}}}" + + def write_commons(self) -> None: + """Writes a common preamble that is used by root and block functions. + Primarily this sets up common local helpers and enforces a generator + through a dead branch. + """ + self.writeline("resolve = context.resolve_or_missing") + self.writeline("undefined = environment.undefined") + self.writeline("concat = environment.concat") + # always use the standard Undefined class for the implicit else of + # conditional expressions + self.writeline("cond_expr_undefined = Undefined") + self.writeline("if 0: yield None") + + def push_parameter_definitions(self, frame: Frame) -> None: + """Pushes all parameter targets from the given frame into a local + stack that permits tracking of yet to be assigned parameters. In + particular this enables the optimization from `visit_Name` to skip + undefined expressions for parameters in macros as macros can reference + otherwise unbound parameters. + """ + self._param_def_block.append(frame.symbols.dump_param_targets()) + + def pop_parameter_definitions(self) -> None: + """Pops the current parameter definitions set.""" + self._param_def_block.pop() + + def mark_parameter_stored(self, target: str) -> None: + """Marks a parameter in the current parameter definitions as stored. + This will skip the enforced undefined checks. + """ + if self._param_def_block: + self._param_def_block[-1].discard(target) + + def push_context_reference(self, target: str) -> None: + self._context_reference_stack.append(target) + + def pop_context_reference(self) -> None: + self._context_reference_stack.pop() + + def get_context_ref(self) -> str: + return self._context_reference_stack[-1] + + def get_resolve_func(self) -> str: + target = self._context_reference_stack[-1] + if target == "context": + return "resolve" + return f"{target}.resolve" + + def derive_context(self, frame: Frame) -> str: + return f"{self.get_context_ref()}.derived({self.dump_local_context(frame)})" + + def parameter_is_undeclared(self, target: str) -> bool: + """Checks if a given target is an undeclared parameter.""" + if not self._param_def_block: + return False + return target in self._param_def_block[-1] + + def push_assign_tracking(self) -> None: + """Pushes a new layer for assignment tracking.""" + self._assign_stack.append(set()) + + def pop_assign_tracking(self, frame: Frame) -> None: + """Pops the topmost level for assignment tracking and updates the + context variables if necessary. + """ + vars = self._assign_stack.pop() + if ( + not frame.block_frame + and not frame.loop_frame + and not frame.toplevel + or not vars + ): + return + public_names = [x for x in vars if x[:1] != "_"] + if len(vars) == 1: + name = next(iter(vars)) + ref = frame.symbols.ref(name) + if frame.loop_frame: + self.writeline(f"_loop_vars[{name!r}] = {ref}") + return + if frame.block_frame: + self.writeline(f"_block_vars[{name!r}] = {ref}") + return + self.writeline(f"context.vars[{name!r}] = {ref}") + else: + if frame.loop_frame: + self.writeline("_loop_vars.update({") + elif frame.block_frame: + self.writeline("_block_vars.update({") + else: + self.writeline("context.vars.update({") + for idx, name in enumerate(sorted(vars)): + if idx: + self.write(", ") + ref = frame.symbols.ref(name) + self.write(f"{name!r}: {ref}") + self.write("})") + if not frame.block_frame and not frame.loop_frame and public_names: + if len(public_names) == 1: + self.writeline(f"context.exported_vars.add({public_names[0]!r})") + else: + names_str = ", ".join(map(repr, sorted(public_names))) + self.writeline(f"context.exported_vars.update(({names_str}))") + + # -- Statement Visitors + + def visit_Template( + self, node: nodes.Template, frame: t.Optional[Frame] = None + ) -> None: + assert frame is None, "no root frame allowed" + eval_ctx = EvalContext(self.environment, self.name) + + from .runtime import async_exported + from .runtime import exported + + if self.environment.is_async: + exported_names = sorted(exported + async_exported) + else: + exported_names = sorted(exported) + + self.writeline("from jinja2.runtime import " + ", ".join(exported_names)) + + # if we want a deferred initialization we cannot move the + # environment into a local name + envenv = "" if self.defer_init else ", environment=environment" + + # do we have an extends tag at all? If not, we can save some + # overhead by just not processing any inheritance code. + have_extends = node.find(nodes.Extends) is not None + + # find all blocks + for block in node.find_all(nodes.Block): + if block.name in self.blocks: + self.fail(f"block {block.name!r} defined twice", block.lineno) + self.blocks[block.name] = block + + # find all imports and import them + for import_ in node.find_all(nodes.ImportedName): + if import_.importname not in self.import_aliases: + imp = import_.importname + self.import_aliases[imp] = alias = self.temporary_identifier() + if "." in imp: + module, obj = imp.rsplit(".", 1) + self.writeline(f"from {module} import {obj} as {alias}") + else: + self.writeline(f"import {imp} as {alias}") + + # add the load name + self.writeline(f"name = {self.name!r}") + + # generate the root render function. + self.writeline( + f"{self.func('root')}(context, missing=missing{envenv}):", extra=1 + ) + self.indent() + self.write_commons() + + # process the root + frame = Frame(eval_ctx) + if "self" in find_undeclared(node.body, ("self",)): + ref = frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + frame.symbols.analyze_node(node) + frame.toplevel = frame.rootlevel = True + frame.require_output_check = have_extends and not self.has_known_extends + if have_extends: + self.writeline("parent_template = None") + self.enter_frame(frame) + self.pull_dependencies(node.body) + self.blockvisit(node.body, frame) + self.leave_frame(frame, with_python_scope=True) + self.outdent() + + # make sure that the parent root is called. + if have_extends: + if not self.has_known_extends: + self.indent() + self.writeline("if parent_template is not None:") + self.indent() + if not self.environment.is_async: + self.writeline("yield from parent_template.root_render_func(context)") + else: + self.writeline("agen = parent_template.root_render_func(context)") + self.writeline("try:") + self.indent() + self.writeline("async for event in agen:") + self.indent() + self.writeline("yield event") + self.outdent() + self.outdent() + self.writeline("finally: await agen.aclose()") + self.outdent(1 + (not self.has_known_extends)) + + # at this point we now have the blocks collected and can visit them too. + for name, block in self.blocks.items(): + self.writeline( + f"{self.func('block_' + name)}(context, missing=missing{envenv}):", + block, + 1, + ) + self.indent() + self.write_commons() + # It's important that we do not make this frame a child of the + # toplevel template. This would cause a variety of + # interesting issues with identifier tracking. + block_frame = Frame(eval_ctx) + block_frame.block_frame = True + undeclared = find_undeclared(block.body, ("self", "super")) + if "self" in undeclared: + ref = block_frame.symbols.declare_parameter("self") + self.writeline(f"{ref} = TemplateReference(context)") + if "super" in undeclared: + ref = block_frame.symbols.declare_parameter("super") + self.writeline(f"{ref} = context.super({name!r}, block_{name})") + block_frame.symbols.analyze_node(block) + block_frame.block = name + self.writeline("_block_vars = {}") + self.enter_frame(block_frame) + self.pull_dependencies(block.body) + self.blockvisit(block.body, block_frame) + self.leave_frame(block_frame, with_python_scope=True) + self.outdent() + + blocks_kv_str = ", ".join(f"{x!r}: block_{x}" for x in self.blocks) + self.writeline(f"blocks = {{{blocks_kv_str}}}", extra=1) + debug_kv_str = "&".join(f"{k}={v}" for k, v in self.debug_info) + self.writeline(f"debug_info = {debug_kv_str!r}") + + def visit_Block(self, node: nodes.Block, frame: Frame) -> None: + """Call a block and register it for the template.""" + level = 0 + if frame.toplevel: + # if we know that we are a child template, there is no need to + # check if we are one + if self.has_known_extends: + return + if self.extends_so_far > 0: + self.writeline("if parent_template is None:") + self.indent() + level += 1 + + if node.scoped: + context = self.derive_context(frame) + else: + context = self.get_context_ref() + + if node.required: + self.writeline(f"if len(context.blocks[{node.name!r}]) <= 1:", node) + self.indent() + self.writeline( + f'raise TemplateRuntimeError("Required block {node.name!r} not found")', + node, + ) + self.outdent() + + if not self.environment.is_async and frame.buffer is None: + self.writeline( + f"yield from context.blocks[{node.name!r}][0]({context})", node + ) + else: + self.writeline(f"gen = context.blocks[{node.name!r}][0]({context})") + self.writeline("try:") + self.indent() + self.writeline( + f"{self.choose_async()}for event in gen:", + node, + ) + self.indent() + self.simple_write("event", frame) + self.outdent() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + + self.outdent(level) + + def visit_Extends(self, node: nodes.Extends, frame: Frame) -> None: + """Calls the extender.""" + if not frame.toplevel: + self.fail("cannot use extend from a non top-level scope", node.lineno) + + # if the number of extends statements in general is zero so + # far, we don't have to add a check if something extended + # the template before this one. + if self.extends_so_far > 0: + # if we have a known extends we just add a template runtime + # error into the generated code. We could catch that at compile + # time too, but i welcome it not to confuse users by throwing the + # same error at different times just "because we can". + if not self.has_known_extends: + self.writeline("if parent_template is not None:") + self.indent() + self.writeline('raise TemplateRuntimeError("extended multiple times")') + + # if we have a known extends already we don't need that code here + # as we know that the template execution will end here. + if self.has_known_extends: + raise CompilerExit() + else: + self.outdent() + + self.writeline("parent_template = environment.get_template(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + self.writeline("for name, parent_block in parent_template.blocks.items():") + self.indent() + self.writeline("context.blocks.setdefault(name, []).append(parent_block)") + self.outdent() + + # if this extends statement was in the root level we can take + # advantage of that information and simplify the generated code + # in the top level from this point onwards + if frame.rootlevel: + self.has_known_extends = True + + # and now we have one more + self.extends_so_far += 1 + + def visit_Include(self, node: nodes.Include, frame: Frame) -> None: + """Handles includes.""" + if node.ignore_missing: + self.writeline("try:") + self.indent() + + func_name = "get_or_select_template" + if isinstance(node.template, nodes.Const): + if isinstance(node.template.value, str): + func_name = "get_template" + elif isinstance(node.template.value, (tuple, list)): + func_name = "select_template" + elif isinstance(node.template, (nodes.Tuple, nodes.List)): + func_name = "select_template" + + self.writeline(f"template = environment.{func_name}(", node) + self.visit(node.template, frame) + self.write(f", {self.name!r})") + if node.ignore_missing: + self.outdent() + self.writeline("except TemplateNotFound:") + self.indent() + self.writeline("pass") + self.outdent() + self.writeline("else:") + self.indent() + + def loop_body() -> None: + self.indent() + self.simple_write("event", frame) + self.outdent() + + if node.with_context: + self.writeline( + f"gen = template.root_render_func(" + "template.new_context(context.get_all(), True," + f" {self.dump_local_context(frame)}))" + ) + self.writeline("try:") + self.indent() + self.writeline(f"{self.choose_async()}for event in gen:") + loop_body() + self.outdent() + self.writeline( + f"finally: {self.choose_async('await gen.aclose()', 'gen.close()')}" + ) + elif self.environment.is_async: + self.writeline( + "for event in (await template._get_default_module_async())" + "._body_stream:" + ) + loop_body() + else: + self.writeline("yield from template._get_default_module()._body_stream") + + if node.ignore_missing: + self.outdent() + + def _import_common( + self, node: t.Union[nodes.Import, nodes.FromImport], frame: Frame + ) -> None: + self.write(f"{self.choose_async('await ')}environment.get_template(") + self.visit(node.template, frame) + self.write(f", {self.name!r}).") + + if node.with_context: + f_name = f"make_module{self.choose_async('_async')}" + self.write( + f"{f_name}(context.get_all(), True, {self.dump_local_context(frame)})" + ) + else: + self.write(f"_get_default_module{self.choose_async('_async')}(context)") + + def visit_Import(self, node: nodes.Import, frame: Frame) -> None: + """Visit regular imports.""" + self.writeline(f"{frame.symbols.ref(node.target)} = ", node) + if frame.toplevel: + self.write(f"context.vars[{node.target!r}] = ") + + self._import_common(node, frame) + + if frame.toplevel and not node.target.startswith("_"): + self.writeline(f"context.exported_vars.discard({node.target!r})") + + def visit_FromImport(self, node: nodes.FromImport, frame: Frame) -> None: + """Visit named imports.""" + self.newline(node) + self.write("included_template = ") + self._import_common(node, frame) + var_names = [] + discarded_names = [] + for name in node.names: + if isinstance(name, tuple): + name, alias = name + else: + alias = name + self.writeline( + f"{frame.symbols.ref(alias)} =" + f" getattr(included_template, {name!r}, missing)" + ) + self.writeline(f"if {frame.symbols.ref(alias)} is missing:") + self.indent() + # The position will contain the template name, and will be formatted + # into a string that will be compiled into an f-string. Curly braces + # in the name must be replaced with escapes so that they will not be + # executed as part of the f-string. + position = self.position(node).replace("{", "{{").replace("}", "}}") + message = ( + "the template {included_template.__name__!r}" + f" (imported on {position})" + f" does not export the requested name {name!r}" + ) + self.writeline( + f"{frame.symbols.ref(alias)} = undefined(f{message!r}, name={name!r})" + ) + self.outdent() + if frame.toplevel: + var_names.append(alias) + if not alias.startswith("_"): + discarded_names.append(alias) + + if var_names: + if len(var_names) == 1: + name = var_names[0] + self.writeline(f"context.vars[{name!r}] = {frame.symbols.ref(name)}") + else: + names_kv = ", ".join( + f"{name!r}: {frame.symbols.ref(name)}" for name in var_names + ) + self.writeline(f"context.vars.update({{{names_kv}}})") + if discarded_names: + if len(discarded_names) == 1: + self.writeline(f"context.exported_vars.discard({discarded_names[0]!r})") + else: + names_str = ", ".join(map(repr, discarded_names)) + self.writeline( + f"context.exported_vars.difference_update(({names_str}))" + ) + + def visit_For(self, node: nodes.For, frame: Frame) -> None: + loop_frame = frame.inner() + loop_frame.loop_frame = True + test_frame = frame.inner() + else_frame = frame.inner() + + # try to figure out if we have an extended loop. An extended loop + # is necessary if the loop is in recursive mode if the special loop + # variable is accessed in the body if the body is a scoped block. + extended_loop = ( + node.recursive + or "loop" + in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) + or any(block.scoped for block in node.find_all(nodes.Block)) + ) + + loop_ref = None + if extended_loop: + loop_ref = loop_frame.symbols.declare_parameter("loop") + + loop_frame.symbols.analyze_node(node, for_branch="body") + if node.else_: + else_frame.symbols.analyze_node(node, for_branch="else") + + if node.test: + loop_filter_func = self.temporary_identifier() + test_frame.symbols.analyze_node(node, for_branch="test") + self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) + self.indent() + self.enter_frame(test_frame) + self.writeline(self.choose_async("async for ", "for ")) + self.visit(node.target, loop_frame) + self.write(" in ") + self.write(self.choose_async("auto_aiter(fiter)", "fiter")) + self.write(":") + self.indent() + self.writeline("if ", node.test) + self.visit(node.test, test_frame) + self.write(":") + self.indent() + self.writeline("yield ") + self.visit(node.target, loop_frame) + self.outdent(3) + self.leave_frame(test_frame, with_python_scope=True) + + # if we don't have an recursive loop we have to find the shadowed + # variables at that point. Because loops can be nested but the loop + # variable is a special one we have to enforce aliasing for it. + if node.recursive: + self.writeline( + f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node + ) + self.indent() + self.buffer(loop_frame) + + # Use the same buffer for the else frame + else_frame.buffer = loop_frame.buffer + + # make sure the loop variable is a special one and raise a template + # assertion error if a loop tries to write to loop + if extended_loop: + self.writeline(f"{loop_ref} = missing") + + for name in node.find_all(nodes.Name): + if name.ctx == "store" and name.name == "loop": + self.fail( + "Can't assign to special loop variable in for-loop target", + name.lineno, + ) + + if node.else_: + iteration_indicator = self.temporary_identifier() + self.writeline(f"{iteration_indicator} = 1") + + self.writeline(self.choose_async("async for ", "for "), node) + self.visit(node.target, loop_frame) + if extended_loop: + self.write(f", {loop_ref} in {self.choose_async('Async')}LoopContext(") + else: + self.write(" in ") + + if node.test: + self.write(f"{loop_filter_func}(") + if node.recursive: + self.write("reciter") + else: + if self.environment.is_async and not extended_loop: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async and not extended_loop: + self.write(")") + if node.test: + self.write(")") + + if node.recursive: + self.write(", undefined, loop_render_func, depth):") + else: + self.write(", undefined):" if extended_loop else ":") + + self.indent() + self.enter_frame(loop_frame) + + self.writeline("_loop_vars = {}") + self.blockvisit(node.body, loop_frame) + if node.else_: + self.writeline(f"{iteration_indicator} = 0") + self.outdent() + self.leave_frame( + loop_frame, with_python_scope=node.recursive and not node.else_ + ) + + if node.else_: + self.writeline(f"if {iteration_indicator}:") + self.indent() + self.enter_frame(else_frame) + self.blockvisit(node.else_, else_frame) + self.leave_frame(else_frame) + self.outdent() + + # if the node was recursive we have to return the buffer contents + # and start the iteration code + if node.recursive: + self.return_buffer_contents(loop_frame) + self.outdent() + self.start_write(frame, node) + self.write(f"{self.choose_async('await ')}loop(") + if self.environment.is_async: + self.write("auto_aiter(") + self.visit(node.iter, frame) + if self.environment.is_async: + self.write(")") + self.write(", loop)") + self.end_write(frame) + + # at the end of the iteration, clear any assignments made in the + # loop from the top level + if self._assign_stack: + self._assign_stack[-1].difference_update(loop_frame.symbols.stores) + + def visit_If(self, node: nodes.If, frame: Frame) -> None: + if_frame = frame.soft() + self.writeline("if ", node) + self.visit(node.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(node.body, if_frame) + self.outdent() + for elif_ in node.elif_: + self.writeline("elif ", elif_) + self.visit(elif_.test, if_frame) + self.write(":") + self.indent() + self.blockvisit(elif_.body, if_frame) + self.outdent() + if node.else_: + self.writeline("else:") + self.indent() + self.blockvisit(node.else_, if_frame) + self.outdent() + + def visit_Macro(self, node: nodes.Macro, frame: Frame) -> None: + macro_frame, macro_ref = self.macro_body(node, frame) + self.newline() + if frame.toplevel: + if not node.name.startswith("_"): + self.write(f"context.exported_vars.add({node.name!r})") + self.writeline(f"context.vars[{node.name!r}] = ") + self.write(f"{frame.symbols.ref(node.name)} = ") + self.macro_def(macro_ref, macro_frame) + + def visit_CallBlock(self, node: nodes.CallBlock, frame: Frame) -> None: + call_frame, macro_ref = self.macro_body(node, frame) + self.writeline("caller = ") + self.macro_def(macro_ref, call_frame) + self.start_write(frame, node) + self.visit_Call(node.call, frame, forward_caller=True) + self.end_write(frame) + + def visit_FilterBlock(self, node: nodes.FilterBlock, frame: Frame) -> None: + filter_frame = frame.inner() + filter_frame.symbols.analyze_node(node) + self.enter_frame(filter_frame) + self.buffer(filter_frame) + self.blockvisit(node.body, filter_frame) + self.start_write(frame, node) + self.visit_Filter(node.filter, filter_frame) + self.end_write(frame) + self.leave_frame(filter_frame) + + def visit_With(self, node: nodes.With, frame: Frame) -> None: + with_frame = frame.inner() + with_frame.symbols.analyze_node(node) + self.enter_frame(with_frame) + for target, expr in zip(node.targets, node.values): + self.newline() + self.visit(target, with_frame) + self.write(" = ") + self.visit(expr, frame) + self.blockvisit(node.body, with_frame) + self.leave_frame(with_frame) + + def visit_ExprStmt(self, node: nodes.ExprStmt, frame: Frame) -> None: + self.newline(node) + self.visit(node.node, frame) + + class _FinalizeInfo(t.NamedTuple): + const: t.Optional[t.Callable[..., str]] + src: t.Optional[str] + + @staticmethod + def _default_finalize(value: t.Any) -> t.Any: + """The default finalize function if the environment isn't + configured with one. Or, if the environment has one, this is + called on that function's output for constants. + """ + return str(value) + + _finalize: t.Optional[_FinalizeInfo] = None + + def _make_finalize(self) -> _FinalizeInfo: + """Build the finalize function to be used on constants and at + runtime. Cached so it's only created once for all output nodes. + + Returns a ``namedtuple`` with the following attributes: + + ``const`` + A function to finalize constant data at compile time. + + ``src`` + Source code to output around nodes to be evaluated at + runtime. + """ + if self._finalize is not None: + return self._finalize + + finalize: t.Optional[t.Callable[..., t.Any]] + finalize = default = self._default_finalize + src = None + + if self.environment.finalize: + src = "environment.finalize(" + env_finalize = self.environment.finalize + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(env_finalize) # type: ignore + ) + finalize = None + + if pass_arg is None: + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(value)) + + else: + src = f"{src}{pass_arg}, " + + if pass_arg == "environment": + + def finalize(value: t.Any) -> t.Any: # noqa: F811 + return default(env_finalize(self.environment, value)) + + self._finalize = self._FinalizeInfo(finalize, src) + return self._finalize + + def _output_const_repr(self, group: t.Iterable[t.Any]) -> str: + """Given a group of constant values converted from ``Output`` + child nodes, produce a string to write to the template module + source. + """ + return repr(concat(group)) + + def _output_child_to_const( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> str: + """Try to optimize a child of an ``Output`` node by trying to + convert it to constant, finalized data at compile time. + + If :exc:`Impossible` is raised, the node is not constant and + will be evaluated at runtime. Any other exception will also be + evaluated at runtime for easier debugging. + """ + const = node.as_const(frame.eval_ctx) + + if frame.eval_ctx.autoescape: + const = escape(const) + + # Template data doesn't go through finalize. + if isinstance(node, nodes.TemplateData): + return str(const) + + return finalize.const(const) # type: ignore + + def _output_child_pre( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code before visiting a child of an + ``Output`` node. + """ + if frame.eval_ctx.volatile: + self.write("(escape if context.eval_ctx.autoescape else str)(") + elif frame.eval_ctx.autoescape: + self.write("escape(") + else: + self.write("str(") + + if finalize.src is not None: + self.write(finalize.src) + + def _output_child_post( + self, node: nodes.Expr, frame: Frame, finalize: _FinalizeInfo + ) -> None: + """Output extra source code after visiting a child of an + ``Output`` node. + """ + self.write(")") + + if finalize.src is not None: + self.write(")") + + def visit_Output(self, node: nodes.Output, frame: Frame) -> None: + # If an extends is active, don't render outside a block. + if frame.require_output_check: + # A top-level extends is known to exist at compile time. + if self.has_known_extends: + return + + self.writeline("if parent_template is None:") + self.indent() + + finalize = self._make_finalize() + body: t.List[t.Union[t.List[t.Any], nodes.Expr]] = [] + + # Evaluate constants at compile time if possible. Each item in + # body will be either a list of static data or a node to be + # evaluated at runtime. + for child in node.nodes: + try: + if not ( + # If the finalize function requires runtime context, + # constants can't be evaluated at compile time. + finalize.const + # Unless it's basic template data that won't be + # finalized anyway. + or isinstance(child, nodes.TemplateData) + ): + raise nodes.Impossible() + + const = self._output_child_to_const(child, frame, finalize) + except (nodes.Impossible, Exception): + # The node was not constant and needs to be evaluated at + # runtime. Or another error was raised, which is easier + # to debug at runtime. + body.append(child) + continue + + if body and isinstance(body[-1], list): + body[-1].append(const) + else: + body.append([const]) + + if frame.buffer is not None: + if len(body) == 1: + self.writeline(f"{frame.buffer}.append(") + else: + self.writeline(f"{frame.buffer}.extend((") + + self.indent() + + for item in body: + if isinstance(item, list): + # A group of constant data to join and output. + val = self._output_const_repr(item) + + if frame.buffer is None: + self.writeline("yield " + val) + else: + self.writeline(val + ",") + else: + if frame.buffer is None: + self.writeline("yield ", item) + else: + self.newline(item) + + # A node to be evaluated at runtime. + self._output_child_pre(item, frame, finalize) + self.visit(item, frame) + self._output_child_post(item, frame, finalize) + + if frame.buffer is not None: + self.write(",") + + if frame.buffer is not None: + self.outdent() + self.writeline(")" if len(body) == 1 else "))") + + if frame.require_output_check: + self.outdent() + + def visit_Assign(self, node: nodes.Assign, frame: Frame) -> None: + self.push_assign_tracking() + + # ``a.b`` is allowed for assignment, and is parsed as an NSRef. However, + # it is only valid if it references a Namespace object. Emit a check for + # that for each ref here, before assignment code is emitted. This can't + # be done in visit_NSRef as the ref could be in the middle of a tuple. + seen_refs: t.Set[str] = set() + + for nsref in node.find_all(nodes.NSRef): + if nsref.name in seen_refs: + # Only emit the check for each reference once, in case the same + # ref is used multiple times in a tuple, `ns.a, ns.b = c, d`. + continue + + seen_refs.add(nsref.name) + ref = frame.symbols.ref(nsref.name) + self.writeline(f"if not isinstance({ref}, Namespace):") + self.indent() + self.writeline( + "raise TemplateRuntimeError" + '("cannot assign attribute on non-namespace object")' + ) + self.outdent() + + self.newline(node) + self.visit(node.target, frame) + self.write(" = ") + self.visit(node.node, frame) + self.pop_assign_tracking(frame) + + def visit_AssignBlock(self, node: nodes.AssignBlock, frame: Frame) -> None: + self.push_assign_tracking() + block_frame = frame.inner() + # This is a special case. Since a set block always captures we + # will disable output checks. This way one can use set blocks + # toplevel even in extended templates. + block_frame.require_output_check = False + block_frame.symbols.analyze_node(node) + self.enter_frame(block_frame) + self.buffer(block_frame) + self.blockvisit(node.body, block_frame) + self.newline(node) + self.visit(node.target, frame) + self.write(" = (Markup if context.eval_ctx.autoescape else identity)(") + if node.filter is not None: + self.visit_Filter(node.filter, block_frame) + else: + self.write(f"concat({block_frame.buffer})") + self.write(")") + self.pop_assign_tracking(frame) + self.leave_frame(block_frame) + + # -- Expression Visitors + + def visit_Name(self, node: nodes.Name, frame: Frame) -> None: + if node.ctx == "store" and ( + frame.toplevel or frame.loop_frame or frame.block_frame + ): + if self._assign_stack: + self._assign_stack[-1].add(node.name) + ref = frame.symbols.ref(node.name) + + # If we are looking up a variable we might have to deal with the + # case where it's undefined. We can skip that case if the load + # instruction indicates a parameter which are always defined. + if node.ctx == "load": + load = frame.symbols.find_load(ref) + if not ( + load is not None + and load[0] == VAR_LOAD_PARAMETER + and not self.parameter_is_undeclared(ref) + ): + self.write( + f"(undefined(name={node.name!r}) if {ref} is missing else {ref})" + ) + return + + self.write(ref) + + def visit_NSRef(self, node: nodes.NSRef, frame: Frame) -> None: + # NSRef is a dotted assignment target a.b=c, but uses a[b]=c internally. + # visit_Assign emits code to validate that each ref is to a Namespace + # object only. That can't be emitted here as the ref could be in the + # middle of a tuple assignment. + ref = frame.symbols.ref(node.name) + self.writeline(f"{ref}[{node.attr!r}]") + + def visit_Const(self, node: nodes.Const, frame: Frame) -> None: + val = node.as_const(frame.eval_ctx) + if isinstance(val, float): + self.write(str(val)) + else: + self.write(repr(val)) + + def visit_TemplateData(self, node: nodes.TemplateData, frame: Frame) -> None: + try: + self.write(repr(node.as_const(frame.eval_ctx))) + except nodes.Impossible: + self.write( + f"(Markup if context.eval_ctx.autoescape else identity)({node.data!r})" + ) + + def visit_Tuple(self, node: nodes.Tuple, frame: Frame) -> None: + self.write("(") + idx = -1 + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write(",)" if idx == 0 else ")") + + def visit_List(self, node: nodes.List, frame: Frame) -> None: + self.write("[") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item, frame) + self.write("]") + + def visit_Dict(self, node: nodes.Dict, frame: Frame) -> None: + self.write("{") + for idx, item in enumerate(node.items): + if idx: + self.write(", ") + self.visit(item.key, frame) + self.write(": ") + self.visit(item.value, frame) + self.write("}") + + visit_Add = _make_binop("+") + visit_Sub = _make_binop("-") + visit_Mul = _make_binop("*") + visit_Div = _make_binop("/") + visit_FloorDiv = _make_binop("//") + visit_Pow = _make_binop("**") + visit_Mod = _make_binop("%") + visit_And = _make_binop("and") + visit_Or = _make_binop("or") + visit_Pos = _make_unop("+") + visit_Neg = _make_unop("-") + visit_Not = _make_unop("not ") + + @optimizeconst + def visit_Concat(self, node: nodes.Concat, frame: Frame) -> None: + if frame.eval_ctx.volatile: + func_name = "(markup_join if context.eval_ctx.volatile else str_join)" + elif frame.eval_ctx.autoescape: + func_name = "markup_join" + else: + func_name = "str_join" + self.write(f"{func_name}((") + for arg in node.nodes: + self.visit(arg, frame) + self.write(", ") + self.write("))") + + @optimizeconst + def visit_Compare(self, node: nodes.Compare, frame: Frame) -> None: + self.write("(") + self.visit(node.expr, frame) + for op in node.ops: + self.visit(op, frame) + self.write(")") + + def visit_Operand(self, node: nodes.Operand, frame: Frame) -> None: + self.write(f" {operators[node.op]} ") + self.visit(node.expr, frame) + + @optimizeconst + def visit_Getattr(self, node: nodes.Getattr, frame: Frame) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getattr(") + self.visit(node.node, frame) + self.write(f", {node.attr!r})") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Getitem(self, node: nodes.Getitem, frame: Frame) -> None: + # slices bypass the environment getitem method. + if isinstance(node.arg, nodes.Slice): + self.visit(node.node, frame) + self.write("[") + self.visit(node.arg, frame) + self.write("]") + else: + if self.environment.is_async: + self.write("(await auto_await(") + + self.write("environment.getitem(") + self.visit(node.node, frame) + self.write(", ") + self.visit(node.arg, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + def visit_Slice(self, node: nodes.Slice, frame: Frame) -> None: + if node.start is not None: + self.visit(node.start, frame) + self.write(":") + if node.stop is not None: + self.visit(node.stop, frame) + if node.step is not None: + self.write(":") + self.visit(node.step, frame) + + @contextmanager + def _filter_test_common( + self, node: t.Union[nodes.Filter, nodes.Test], frame: Frame, is_filter: bool + ) -> t.Iterator[None]: + if self.environment.is_async: + self.write("(await auto_await(") + + if is_filter: + self.write(f"{self.filters[node.name]}(") + func = self.environment.filters.get(node.name) + else: + self.write(f"{self.tests[node.name]}(") + func = self.environment.tests.get(node.name) + + # When inside an If or CondExpr frame, allow the filter to be + # undefined at compile time and only raise an error if it's + # actually called at runtime. See pull_dependencies. + if func is None and not frame.soft_frame: + type_name = "filter" if is_filter else "test" + self.fail(f"No {type_name} named {node.name!r}.", node.lineno) + + pass_arg = { + _PassArg.context: "context", + _PassArg.eval_context: "context.eval_ctx", + _PassArg.environment: "environment", + }.get( + _PassArg.from_obj(func) # type: ignore + ) + + if pass_arg is not None: + self.write(f"{pass_arg}, ") + + # Back to the visitor function to handle visiting the target of + # the filter or test. + yield + + self.signature(node, frame) + self.write(")") + + if self.environment.is_async: + self.write("))") + + @optimizeconst + def visit_Filter(self, node: nodes.Filter, frame: Frame) -> None: + with self._filter_test_common(node, frame, True): + # if the filter node is None we are inside a filter block + # and want to write to the current buffer + if node.node is not None: + self.visit(node.node, frame) + elif frame.eval_ctx.volatile: + self.write( + f"(Markup(concat({frame.buffer}))" + f" if context.eval_ctx.autoescape else concat({frame.buffer}))" + ) + elif frame.eval_ctx.autoescape: + self.write(f"Markup(concat({frame.buffer}))") + else: + self.write(f"concat({frame.buffer})") + + @optimizeconst + def visit_Test(self, node: nodes.Test, frame: Frame) -> None: + with self._filter_test_common(node, frame, False): + self.visit(node.node, frame) + + @optimizeconst + def visit_CondExpr(self, node: nodes.CondExpr, frame: Frame) -> None: + frame = frame.soft() + + def write_expr2() -> None: + if node.expr2 is not None: + self.visit(node.expr2, frame) + return + + self.write( + f'cond_expr_undefined("the inline if-expression on' + f" {self.position(node)} evaluated to false and no else" + f' section was defined.")' + ) + + self.write("(") + self.visit(node.expr1, frame) + self.write(" if ") + self.visit(node.test, frame) + self.write(" else ") + write_expr2() + self.write(")") + + @optimizeconst + def visit_Call( + self, node: nodes.Call, frame: Frame, forward_caller: bool = False + ) -> None: + if self.environment.is_async: + self.write("(await auto_await(") + if self.environment.sandboxed: + self.write("environment.call(context, ") + else: + self.write("context.call(") + self.visit(node.node, frame) + extra_kwargs = {"caller": "caller"} if forward_caller else None + loop_kwargs = {"_loop_vars": "_loop_vars"} if frame.loop_frame else {} + block_kwargs = {"_block_vars": "_block_vars"} if frame.block_frame else {} + if extra_kwargs: + extra_kwargs.update(loop_kwargs, **block_kwargs) + elif loop_kwargs or block_kwargs: + extra_kwargs = dict(loop_kwargs, **block_kwargs) + self.signature(node, frame, extra_kwargs) + self.write(")") + if self.environment.is_async: + self.write("))") + + def visit_Keyword(self, node: nodes.Keyword, frame: Frame) -> None: + self.write(node.key + "=") + self.visit(node.value, frame) + + # -- Unused nodes for extensions + + def visit_MarkSafe(self, node: nodes.MarkSafe, frame: Frame) -> None: + self.write("Markup(") + self.visit(node.expr, frame) + self.write(")") + + def visit_MarkSafeIfAutoescape( + self, node: nodes.MarkSafeIfAutoescape, frame: Frame + ) -> None: + self.write("(Markup if context.eval_ctx.autoescape else identity)(") + self.visit(node.expr, frame) + self.write(")") + + def visit_EnvironmentAttribute( + self, node: nodes.EnvironmentAttribute, frame: Frame + ) -> None: + self.write("environment." + node.name) + + def visit_ExtensionAttribute( + self, node: nodes.ExtensionAttribute, frame: Frame + ) -> None: + self.write(f"environment.extensions[{node.identifier!r}].{node.name}") + + def visit_ImportedName(self, node: nodes.ImportedName, frame: Frame) -> None: + self.write(self.import_aliases[node.importname]) + + def visit_InternalName(self, node: nodes.InternalName, frame: Frame) -> None: + self.write(node.name) + + def visit_ContextReference( + self, node: nodes.ContextReference, frame: Frame + ) -> None: + self.write("context") + + def visit_DerivedContextReference( + self, node: nodes.DerivedContextReference, frame: Frame + ) -> None: + self.write(self.derive_context(frame)) + + def visit_Continue(self, node: nodes.Continue, frame: Frame) -> None: + self.writeline("continue", node) + + def visit_Break(self, node: nodes.Break, frame: Frame) -> None: + self.writeline("break", node) + + def visit_Scope(self, node: nodes.Scope, frame: Frame) -> None: + scope_frame = frame.inner() + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + + def visit_OverlayScope(self, node: nodes.OverlayScope, frame: Frame) -> None: + ctx = self.temporary_identifier() + self.writeline(f"{ctx} = {self.derive_context(frame)}") + self.writeline(f"{ctx}.vars = ") + self.visit(node.context, frame) + self.push_context_reference(ctx) + + scope_frame = frame.inner(isolated=True) + scope_frame.symbols.analyze_node(node) + self.enter_frame(scope_frame) + self.blockvisit(node.body, scope_frame) + self.leave_frame(scope_frame) + self.pop_context_reference() + + def visit_EvalContextModifier( + self, node: nodes.EvalContextModifier, frame: Frame + ) -> None: + for keyword in node.options: + self.writeline(f"context.eval_ctx.{keyword.key} = ") + self.visit(keyword.value, frame) + try: + val = keyword.value.as_const(frame.eval_ctx) + except nodes.Impossible: + frame.eval_ctx.volatile = True + else: + setattr(frame.eval_ctx, keyword.key, val) + + def visit_ScopedEvalContextModifier( + self, node: nodes.ScopedEvalContextModifier, frame: Frame + ) -> None: + old_ctx_name = self.temporary_identifier() + saved_ctx = frame.eval_ctx.save() + self.writeline(f"{old_ctx_name} = context.eval_ctx.save()") + self.visit_EvalContextModifier(node, frame) + for child in node.body: + self.visit(child, frame) + frame.eval_ctx.revert(saved_ctx) + self.writeline(f"context.eval_ctx.revert({old_ctx_name})") diff --git a/env/lib/python3.10/site-packages/jinja2/constants.py b/env/lib/python3.10/site-packages/jinja2/constants.py new file mode 100644 index 0000000..41a1c23 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/constants.py @@ -0,0 +1,20 @@ +#: list of lorem ipsum words used by the lipsum() helper function +LOREM_IPSUM_WORDS = """\ +a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at +auctor augue bibendum blandit class commodo condimentum congue consectetuer +consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus +diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend +elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames +faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac +hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum +justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem +luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie +mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non +nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque +penatibus per pharetra phasellus placerat platea porta porttitor posuere +potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus +ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit +sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor +tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices +ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus +viverra volutpat vulputate""" diff --git a/env/lib/python3.10/site-packages/jinja2/debug.py b/env/lib/python3.10/site-packages/jinja2/debug.py new file mode 100644 index 0000000..eeeeee7 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/debug.py @@ -0,0 +1,191 @@ +import sys +import typing as t +from types import CodeType +from types import TracebackType + +from .exceptions import TemplateSyntaxError +from .utils import internal_code +from .utils import missing + +if t.TYPE_CHECKING: + from .runtime import Context + + +def rewrite_traceback_stack(source: t.Optional[str] = None) -> BaseException: + """Rewrite the current exception to replace any tracebacks from + within compiled template code with tracebacks that look like they + came from the template source. + + This must be called within an ``except`` block. + + :param source: For ``TemplateSyntaxError``, the original source if + known. + :return: The original exception with the rewritten traceback. + """ + _, exc_value, tb = sys.exc_info() + exc_value = t.cast(BaseException, exc_value) + tb = t.cast(TracebackType, tb) + + if isinstance(exc_value, TemplateSyntaxError) and not exc_value.translated: + exc_value.translated = True + exc_value.source = source + # Remove the old traceback, otherwise the frames from the + # compiler still show up. + exc_value.with_traceback(None) + # Outside of runtime, so the frame isn't executing template + # code, but it still needs to point at the template. + tb = fake_traceback( + exc_value, None, exc_value.filename or "", exc_value.lineno + ) + else: + # Skip the frame for the render function. + tb = tb.tb_next + + stack = [] + + # Build the stack of traceback object, replacing any in template + # code with the source file and line information. + while tb is not None: + # Skip frames decorated with @internalcode. These are internal + # calls that aren't useful in template debugging output. + if tb.tb_frame.f_code in internal_code: + tb = tb.tb_next + continue + + template = tb.tb_frame.f_globals.get("__jinja_template__") + + if template is not None: + lineno = template.get_corresponding_lineno(tb.tb_lineno) + fake_tb = fake_traceback(exc_value, tb, template.filename, lineno) + stack.append(fake_tb) + else: + stack.append(tb) + + tb = tb.tb_next + + tb_next = None + + # Assign tb_next in reverse to avoid circular references. + for tb in reversed(stack): + tb.tb_next = tb_next + tb_next = tb + + return exc_value.with_traceback(tb_next) + + +def fake_traceback( # type: ignore + exc_value: BaseException, tb: t.Optional[TracebackType], filename: str, lineno: int +) -> TracebackType: + """Produce a new traceback object that looks like it came from the + template source instead of the compiled code. The filename, line + number, and location name will point to the template, and the local + variables will be the current template context. + + :param exc_value: The original exception to be re-raised to create + the new traceback. + :param tb: The original traceback to get the local variables and + code info from. + :param filename: The template filename. + :param lineno: The line number in the template source. + """ + if tb is not None: + # Replace the real locals with the context that would be + # available at that point in the template. + locals = get_template_locals(tb.tb_frame.f_locals) + locals.pop("__jinja_exception__", None) + else: + locals = {} + + globals = { + "__name__": filename, + "__file__": filename, + "__jinja_exception__": exc_value, + } + # Raise an exception at the correct line number. + code: CodeType = compile( + "\n" * (lineno - 1) + "raise __jinja_exception__", filename, "exec" + ) + + # Build a new code object that points to the template file and + # replaces the location with a block name. + location = "template" + + if tb is not None: + function = tb.tb_frame.f_code.co_name + + if function == "root": + location = "top-level template code" + elif function.startswith("block_"): + location = f"block {function[6:]!r}" + + if sys.version_info >= (3, 8): + code = code.replace(co_name=location) + else: + code = CodeType( + code.co_argcount, + code.co_kwonlyargcount, + code.co_nlocals, + code.co_stacksize, + code.co_flags, + code.co_code, + code.co_consts, + code.co_names, + code.co_varnames, + code.co_filename, + location, + code.co_firstlineno, + code.co_lnotab, + code.co_freevars, + code.co_cellvars, + ) + + # Execute the new code, which is guaranteed to raise, and return + # the new traceback without this frame. + try: + exec(code, globals, locals) + except BaseException: + return sys.exc_info()[2].tb_next # type: ignore + + +def get_template_locals(real_locals: t.Mapping[str, t.Any]) -> t.Dict[str, t.Any]: + """Based on the runtime locals, get the context that would be + available at that point in the template. + """ + # Start with the current template context. + ctx: t.Optional[Context] = real_locals.get("context") + + if ctx is not None: + data: t.Dict[str, t.Any] = ctx.get_all().copy() + else: + data = {} + + # Might be in a derived context that only sets local variables + # rather than pushing a context. Local variables follow the scheme + # l_depth_name. Find the highest-depth local that has a value for + # each name. + local_overrides: t.Dict[str, t.Tuple[int, t.Any]] = {} + + for name, value in real_locals.items(): + if not name.startswith("l_") or value is missing: + # Not a template variable, or no longer relevant. + continue + + try: + _, depth_str, name = name.split("_", 2) + depth = int(depth_str) + except ValueError: + continue + + cur_depth = local_overrides.get(name, (-1,))[0] + + if cur_depth < depth: + local_overrides[name] = (depth, value) + + # Modify the context with any derived context. + for name, (_, value) in local_overrides.items(): + if value is missing: + data.pop(name, None) + else: + data[name] = value + + return data diff --git a/env/lib/python3.10/site-packages/jinja2/defaults.py b/env/lib/python3.10/site-packages/jinja2/defaults.py new file mode 100644 index 0000000..638cad3 --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/defaults.py @@ -0,0 +1,48 @@ +import typing as t + +from .filters import FILTERS as DEFAULT_FILTERS # noqa: F401 +from .tests import TESTS as DEFAULT_TESTS # noqa: F401 +from .utils import Cycler +from .utils import generate_lorem_ipsum +from .utils import Joiner +from .utils import Namespace + +if t.TYPE_CHECKING: + import typing_extensions as te + +# defaults for the parser / lexer +BLOCK_START_STRING = "{%" +BLOCK_END_STRING = "%}" +VARIABLE_START_STRING = "{{" +VARIABLE_END_STRING = "}}" +COMMENT_START_STRING = "{#" +COMMENT_END_STRING = "#}" +LINE_STATEMENT_PREFIX: t.Optional[str] = None +LINE_COMMENT_PREFIX: t.Optional[str] = None +TRIM_BLOCKS = False +LSTRIP_BLOCKS = False +NEWLINE_SEQUENCE: "te.Literal['\\n', '\\r\\n', '\\r']" = "\n" +KEEP_TRAILING_NEWLINE = False + +# default filters, tests and namespace + +DEFAULT_NAMESPACE = { + "range": range, + "dict": dict, + "lipsum": generate_lorem_ipsum, + "cycler": Cycler, + "joiner": Joiner, + "namespace": Namespace, +} + +# default policies +DEFAULT_POLICIES: t.Dict[str, t.Any] = { + "compiler.ascii_str": True, + "urlize.rel": "noopener", + "urlize.target": None, + "urlize.extra_schemes": None, + "truncate.leeway": 5, + "json.dumps_function": None, + "json.dumps_kwargs": {"sort_keys": True}, + "ext.i18n.trimmed": False, +} diff --git a/env/lib/python3.10/site-packages/jinja2/environment.py b/env/lib/python3.10/site-packages/jinja2/environment.py new file mode 100644 index 0000000..0fc6e5b --- /dev/null +++ b/env/lib/python3.10/site-packages/jinja2/environment.py @@ -0,0 +1,1672 @@ +"""Classes for managing templates and their runtime and compile time +options. +""" + +import os +import typing +import typing as t +import weakref +from collections import ChainMap +from functools import lru_cache +from functools import partial +from functools import reduce +from types import CodeType + +from markupsafe import Markup + +from . import nodes +from .compiler import CodeGenerator +from .compiler import generate +from .defaults import BLOCK_END_STRING +from .defaults import BLOCK_START_STRING +from .defaults import COMMENT_END_STRING +from .defaults import COMMENT_START_STRING +from .defaults import DEFAULT_FILTERS # type: ignore[attr-defined] +from .defaults import DEFAULT_NAMESPACE +from .defaults import DEFAULT_POLICIES +from .defaults import DEFAULT_TESTS # type: ignore[attr-defined] +from .defaults import KEEP_TRAILING_NEWLINE +from .defaults import LINE_COMMENT_PREFIX +from .defaults import LINE_STATEMENT_PREFIX +from .defaults import LSTRIP_BLOCKS +from .defaults import NEWLINE_SEQUENCE +from .defaults import TRIM_BLOCKS +from .defaults import VARIABLE_END_STRING +from .defaults import VARIABLE_START_STRING +from .exceptions import TemplateNotFound +from .exceptions import TemplateRuntimeError +from .exceptions import TemplatesNotFound +from .exceptions import TemplateSyntaxError +from .exceptions import UndefinedError +from .lexer import get_lexer +from .lexer import Lexer +from .lexer import TokenStream +from .nodes import EvalContext +from .parser import Parser +from .runtime import Context +from .runtime import new_context +from .runtime import Undefined +from .utils import _PassArg +from .utils import concat +from .utils import consume +from .utils import import_string +from .utils import internalcode +from .utils import LRUCache +from .utils import missing + +if t.TYPE_CHECKING: + import typing_extensions as te + + from .bccache import BytecodeCache + from .ext import Extension + from .loaders import BaseLoader + +_env_bound = t.TypeVar("_env_bound", bound="Environment") + + +# for direct template usage we have up to ten living environments +@lru_cache(maxsize=10) +def get_spontaneous_environment(cls: t.Type[_env_bound], *args: t.Any) -> _env_bound: + """Return a new spontaneous environment. A spontaneous environment + is used for templates created directly rather than through an + existing environment. + + :param cls: Environment class to create. + :param args: Positional arguments passed to environment. + """ + env = cls(*args) + env.shared = True + return env + + +def create_cache( + size: int, +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Return the cache class for the given size.""" + if size == 0: + return None + + if size < 0: + return {} + + return LRUCache(size) # type: ignore + + +def copy_cache( + cache: t.Optional[t.MutableMapping[t.Any, t.Any]], +) -> t.Optional[t.MutableMapping[t.Tuple["weakref.ref[t.Any]", str], "Template"]]: + """Create an empty copy of the given cache.""" + if cache is None: + return None + + if type(cache) is dict: # noqa E721 + return {} + + return LRUCache(cache.capacity) # type: ignore + + +def load_extensions( + environment: "Environment", + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]], +) -> t.Dict[str, "Extension"]: + """Load the extensions from the list and bind it to the environment. + Returns a dict of instantiated extensions. + """ + result = {} + + for extension in extensions: + if isinstance(extension, str): + extension = t.cast(t.Type["Extension"], import_string(extension)) + + result[extension.identifier] = extension(environment) + + return result + + +def _environment_config_check(environment: _env_bound) -> _env_bound: + """Perform a sanity check on the environment.""" + assert issubclass( + environment.undefined, Undefined + ), "'undefined' must be a subclass of 'jinja2.Undefined'." + assert ( + environment.block_start_string + != environment.variable_start_string + != environment.comment_start_string + ), "block, variable and comment start strings must be different." + assert environment.newline_sequence in { + "\r", + "\r\n", + "\n", + }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'." + return environment + + +class Environment: + r"""The core component of Jinja is the `Environment`. It contains + important shared variables like configuration, filters, tests, + globals and others. Instances of this class may be modified if + they are not shared and if no template was loaded so far. + Modifications on environments after the first template was loaded + will lead to surprising effects and undefined behavior. + + Here are the possible initialization parameters: + + `block_start_string` + The string marking the beginning of a block. Defaults to ``'{%'``. + + `block_end_string` + The string marking the end of a block. Defaults to ``'%}'``. + + `variable_start_string` + The string marking the beginning of a print statement. + Defaults to ``'{{'``. + + `variable_end_string` + The string marking the end of a print statement. Defaults to + ``'}}'``. + + `comment_start_string` + The string marking the beginning of a comment. Defaults to ``'{#'``. + + `comment_end_string` + The string marking the end of a comment. Defaults to ``'#}'``. + + `line_statement_prefix` + If given and a string, this will be used as prefix for line based + statements. See also :ref:`line-statements`. + + `line_comment_prefix` + If given and a string, this will be used as prefix for line based + comments. See also :ref:`line-statements`. + + .. versionadded:: 2.2 + + `trim_blocks` + If this is set to ``True`` the first newline after a block is + removed (block, not variable tag!). Defaults to `False`. + + `lstrip_blocks` + If this is set to ``True`` leading spaces and tabs are stripped + from the start of a line to a block. Defaults to `False`. + + `newline_sequence` + The sequence that starts a newline. Must be one of ``'\r'``, + ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a + useful default for Linux and OS X systems as well as web + applications. + + `keep_trailing_newline` + Preserve the trailing newline when rendering templates. + The default is ``False``, which causes a single newline, + if present, to be stripped from the end of the template. + + .. versionadded:: 2.7 + + `extensions` + List of Jinja extensions to use. This can either be import paths + as strings or extension classes. For more information have a + look at :ref:`the extensions documentation `. + + `optimized` + should the optimizer be enabled? Default is ``True``. + + `undefined` + :class:`Undefined` or a subclass of it that is used to represent + undefined values in the template. + + `finalize` + A callable that can be used to process the result of a variable + expression before it is output. For example one can convert + ``None`` implicitly into an empty string here. + + `autoescape` + If set to ``True`` the XML/HTML autoescaping feature is enabled by + default. For more details about autoescaping see + :class:`~markupsafe.Markup`. As of Jinja 2.4 this can also + be a callable that is passed the template name and has to + return ``True`` or ``False`` depending on autoescape should be + enabled by default. + + .. versionchanged:: 2.4 + `autoescape` can now be a function + + `loader` + The template loader for this environment. + + `cache_size` + The size of the cache. Per default this is ``400`` which means + that if more than 400 templates are loaded the loader will clean + out the least recently used template. If the cache size is set to + ``0`` templates are recompiled all the time, if the cache size is + ``-1`` the cache will not be cleaned. + + .. versionchanged:: 2.8 + The cache size was increased to 400 from a low 50. + + `auto_reload` + Some loaders load templates from locations where the template + sources may change (ie: file system or database). If + ``auto_reload`` is set to ``True`` (default) every time a template is + requested the loader checks if the source changed and if yes, it + will reload the template. For higher performance it's possible to + disable that. + + `bytecode_cache` + If set to a bytecode cache object, this object will provide a + cache for the internal Jinja bytecode so that templates don't + have to be parsed if they were not changed. + + See :ref:`bytecode-cache` for more information. + + `enable_async` + If set to true this enables async template execution which + allows using async functions and generators. + """ + + #: if this environment is sandboxed. Modifying this variable won't make + #: the environment sandboxed though. For a real sandboxed environment + #: have a look at jinja2.sandbox. This flag alone controls the code + #: generation by the compiler. + sandboxed = False + + #: True if the environment is just an overlay + overlayed = False + + #: the environment this environment is linked to if it is an overlay + linked_to: t.Optional["Environment"] = None + + #: shared environments have this set to `True`. A shared environment + #: must not be modified + shared = False + + #: the class that is used for code generation. See + #: :class:`~jinja2.compiler.CodeGenerator` for more information. + code_generator_class: t.Type["CodeGenerator"] = CodeGenerator + + concat = "".join + + #: the context class that is used for templates. See + #: :class:`~jinja2.runtime.Context` for more information. + context_class: t.Type[Context] = Context + + template_class: t.Type["Template"] + + def __init__( + self, + block_start_string: str = BLOCK_START_STRING, + block_end_string: str = BLOCK_END_STRING, + variable_start_string: str = VARIABLE_START_STRING, + variable_end_string: str = VARIABLE_END_STRING, + comment_start_string: str = COMMENT_START_STRING, + comment_end_string: str = COMMENT_END_STRING, + line_statement_prefix: t.Optional[str] = LINE_STATEMENT_PREFIX, + line_comment_prefix: t.Optional[str] = LINE_COMMENT_PREFIX, + trim_blocks: bool = TRIM_BLOCKS, + lstrip_blocks: bool = LSTRIP_BLOCKS, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = NEWLINE_SEQUENCE, + keep_trailing_newline: bool = KEEP_TRAILING_NEWLINE, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = (), + optimized: bool = True, + undefined: t.Type[Undefined] = Undefined, + finalize: t.Optional[t.Callable[..., t.Any]] = None, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = False, + loader: t.Optional["BaseLoader"] = None, + cache_size: int = 400, + auto_reload: bool = True, + bytecode_cache: t.Optional["BytecodeCache"] = None, + enable_async: bool = False, + ): + # !!Important notice!! + # The constructor accepts quite a few arguments that should be + # passed by keyword rather than position. However it's important to + # not change the order of arguments because it's used at least + # internally in those cases: + # - spontaneous environments (i18n extension and Template) + # - unittests + # If parameter changes are required only add parameters at the end + # and don't change the arguments (or the defaults!) of the arguments + # existing already. + + # lexer / parser information + self.block_start_string = block_start_string + self.block_end_string = block_end_string + self.variable_start_string = variable_start_string + self.variable_end_string = variable_end_string + self.comment_start_string = comment_start_string + self.comment_end_string = comment_end_string + self.line_statement_prefix = line_statement_prefix + self.line_comment_prefix = line_comment_prefix + self.trim_blocks = trim_blocks + self.lstrip_blocks = lstrip_blocks + self.newline_sequence = newline_sequence + self.keep_trailing_newline = keep_trailing_newline + + # runtime information + self.undefined: t.Type[Undefined] = undefined + self.optimized = optimized + self.finalize = finalize + self.autoescape = autoescape + + # defaults + self.filters = DEFAULT_FILTERS.copy() + self.tests = DEFAULT_TESTS.copy() + self.globals = DEFAULT_NAMESPACE.copy() + + # set the loader provided + self.loader = loader + self.cache = create_cache(cache_size) + self.bytecode_cache = bytecode_cache + self.auto_reload = auto_reload + + # configurable policies + self.policies = DEFAULT_POLICIES.copy() + + # load extensions + self.extensions = load_extensions(self, extensions) + + self.is_async = enable_async + _environment_config_check(self) + + def add_extension(self, extension: t.Union[str, t.Type["Extension"]]) -> None: + """Adds an extension after the environment was created. + + .. versionadded:: 2.5 + """ + self.extensions.update(load_extensions(self, [extension])) + + def extend(self, **attributes: t.Any) -> None: + """Add the items to the instance of the environment if they do not exist + yet. This is used by :ref:`extensions ` to register + callbacks and configuration values without breaking inheritance. + """ + for key, value in attributes.items(): + if not hasattr(self, key): + setattr(self, key, value) + + def overlay( + self, + block_start_string: str = missing, + block_end_string: str = missing, + variable_start_string: str = missing, + variable_end_string: str = missing, + comment_start_string: str = missing, + comment_end_string: str = missing, + line_statement_prefix: t.Optional[str] = missing, + line_comment_prefix: t.Optional[str] = missing, + trim_blocks: bool = missing, + lstrip_blocks: bool = missing, + newline_sequence: "te.Literal['\\n', '\\r\\n', '\\r']" = missing, + keep_trailing_newline: bool = missing, + extensions: t.Sequence[t.Union[str, t.Type["Extension"]]] = missing, + optimized: bool = missing, + undefined: t.Type[Undefined] = missing, + finalize: t.Optional[t.Callable[..., t.Any]] = missing, + autoescape: t.Union[bool, t.Callable[[t.Optional[str]], bool]] = missing, + loader: t.Optional["BaseLoader"] = missing, + cache_size: int = missing, + auto_reload: bool = missing, + bytecode_cache: t.Optional["BytecodeCache"] = missing, + enable_async: bool = missing, + ) -> "te.Self": + """Create a new overlay environment that shares all the data with the + current environment except for cache and the overridden attributes. + Extensions cannot be removed for an overlayed environment. An overlayed + environment automatically gets all the extensions of the environment it + is linked to plus optional extra extensions. + + Creating overlays should happen after the initial environment was set + up completely. Not all attributes are truly linked, some are just + copied over so modifications on the original environment may not shine + through. + + .. versionchanged:: 3.1.5 + ``enable_async`` is applied correctly. + + .. versionchanged:: 3.1.2 + Added the ``newline_sequence``, ``keep_trailing_newline``, + and ``enable_async`` parameters to match ``__init__``. + """ + args = dict(locals()) + del args["self"], args["cache_size"], args["extensions"], args["enable_async"] + + rv = object.__new__(self.__class__) + rv.__dict__.update(self.__dict__) + rv.overlayed = True + rv.linked_to = self + + for key, value in args.items(): + if value is not missing: + setattr(rv, key, value) + + if cache_size is not missing: + rv.cache = create_cache(cache_size) + else: + rv.cache = copy_cache(self.cache) + + rv.extensions = {} + for key, value in self.extensions.items(): + rv.extensions[key] = value.bind(rv) + if extensions is not missing: + rv.extensions.update(load_extensions(rv, extensions)) + + if enable_async is not missing: + rv.is_async = enable_async + + return _environment_config_check(rv) + + @property + def lexer(self) -> Lexer: + """The lexer for this environment.""" + return get_lexer(self) + + def iter_extensions(self) -> t.Iterator["Extension"]: + """Iterates over the extensions by priority.""" + return iter(sorted(self.extensions.values(), key=lambda x: x.priority)) + + def getitem( + self, obj: t.Any, argument: t.Union[str, t.Any] + ) -> t.Union[t.Any, Undefined]: + """Get an item or attribute of an object but prefer the item.""" + try: + return obj[argument] + except (AttributeError, TypeError, LookupError): + if isinstance(argument, str): + try: + attr = str(argument) + except Exception: + pass + else: + try: + return getattr(obj, attr) + except AttributeError: + pass + return self.undefined(obj=obj, name=argument) + + def getattr(self, obj: t.Any, attribute: str) -> t.Any: + """Get an item or attribute of an object but prefer the attribute. + Unlike :meth:`getitem` the attribute *must* be a string. + """ + try: + return getattr(obj, attribute) + except AttributeError: + pass + try: + return obj[attribute] + except (TypeError, LookupError, AttributeError): + return self.undefined(obj=obj, name=attribute) + + def _filter_test_common( + self, + name: t.Union[str, Undefined], + value: t.Any, + args: t.Optional[t.Sequence[t.Any]], + kwargs: t.Optional[t.Mapping[str, t.Any]], + context: t.Optional[Context], + eval_ctx: t.Optional[EvalContext], + is_filter: bool, + ) -> t.Any: + if is_filter: + env_map = self.filters + type_name = "filter" + else: + env_map = self.tests + type_name = "test" + + func = env_map.get(name) # type: ignore + + if func is None: + msg = f"No {type_name} named {name!r}." + + if isinstance(name, Undefined): + try: + name._fail_with_undefined_error() + except Exception as e: + msg = f"{msg} ({e}; did you forget to quote the callable name?)" + + raise TemplateRuntimeError(msg) + + args = [value, *(args if args is not None else ())] + kwargs = kwargs if kwargs is not None else {} + pass_arg = _PassArg.from_obj(func) + + if pass_arg is _PassArg.context: + if context is None: + raise TemplateRuntimeError( + f"Attempted to invoke a context {type_name} without context." + ) + + args.insert(0, context) + elif pass_arg is _PassArg.eval_context: + if eval_ctx is None: + if context is not None: + eval_ctx = context.eval_ctx + else: + eval_ctx = EvalContext(self) + + args.insert(0, eval_ctx) + elif pass_arg is _PassArg.environment: + args.insert(0, self) + + return func(*args, **kwargs) + + def call_filter( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a filter on a value the same way the compiler does. + + This might return a coroutine if the filter is running from an + environment in async mode and the filter supports async + execution. It's your responsibility to await this if needed. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, True + ) + + def call_test( + self, + name: str, + value: t.Any, + args: t.Optional[t.Sequence[t.Any]] = None, + kwargs: t.Optional[t.Mapping[str, t.Any]] = None, + context: t.Optional[Context] = None, + eval_ctx: t.Optional[EvalContext] = None, + ) -> t.Any: + """Invoke a test on a value the same way the compiler does. + + This might return a coroutine if the test is running from an + environment in async mode and the test supports async execution. + It's your responsibility to await this if needed. + + .. versionchanged:: 3.0 + Tests support ``@pass_context``, etc. decorators. Added + the ``context`` and ``eval_ctx`` parameters. + + .. versionadded:: 2.7 + """ + return self._filter_test_common( + name, value, args, kwargs, context, eval_ctx, False + ) + + @internalcode + def parse( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> nodes.Template: + """Parse the sourcecode and return the abstract syntax tree. This + tree of nodes is used by the compiler to convert the template into + executable source- or bytecode. This is useful for debugging or to + extract information from templates. + + If you are :ref:`developing Jinja extensions ` + this gives you a good overview of the node tree generated. + """ + try: + return self._parse(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def _parse( + self, source: str, name: t.Optional[str], filename: t.Optional[str] + ) -> nodes.Template: + """Internal parsing function used by `parse` and `compile`.""" + return Parser(self, source, name, filename).parse() + + def lex( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> t.Iterator[t.Tuple[int, str, str]]: + """Lex the given sourcecode and return a generator that yields + tokens as tuples in the form ``(lineno, token_type, value)``. + This can be useful for :ref:`extension development ` + and debugging templates. + + This does not perform preprocessing. If you want the preprocessing + of the extensions to be applied you have to filter source through + the :meth:`preprocess` method. + """ + source = str(source) + try: + return self.lexer.tokeniter(source, name, filename) + except TemplateSyntaxError: + self.handle_exception(source=source) + + def preprocess( + self, + source: str, + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + ) -> str: + """Preprocesses the source with all extensions. This is automatically + called for all parsing and compiling methods but *not* for :meth:`lex` + because there you usually only want the actual source tokenized. + """ + return reduce( + lambda s, e: e.preprocess(s, name, filename), + self.iter_extensions(), + str(source), + ) + + def _tokenize( + self, + source: str, + name: t.Optional[str], + filename: t.Optional[str] = None, + state: t.Optional[str] = None, + ) -> TokenStream: + """Called by the parser to do the preprocessing and filtering + for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. + """ + source = self.preprocess(source, name, filename) + stream = self.lexer.tokenize(source, name, filename, state) + + for ext in self.iter_extensions(): + stream = ext.filter_stream(stream) # type: ignore + + if not isinstance(stream, TokenStream): + stream = TokenStream(stream, name, filename) + + return stream + + def _generate( + self, + source: nodes.Template, + name: t.Optional[str], + filename: t.Optional[str], + defer_init: bool = False, + ) -> str: + """Internal hook that can be overridden to hook a different generate + method in. + + .. versionadded:: 2.5 + """ + return generate( # type: ignore + source, + self, + name, + filename, + defer_init=defer_init, + optimized=self.optimized, + ) + + def _compile(self, source: str, filename: str) -> CodeType: + """Internal hook that can be overridden to hook a different compile + method in. + + .. versionadded:: 2.5 + """ + return compile(source, filename, "exec") + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[False]" = False, + defer_init: bool = False, + ) -> CodeType: ... + + @typing.overload + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: "te.Literal[True]" = ..., + defer_init: bool = False, + ) -> str: ... + + @internalcode + def compile( + self, + source: t.Union[str, nodes.Template], + name: t.Optional[str] = None, + filename: t.Optional[str] = None, + raw: bool = False, + defer_init: bool = False, + ) -> t.Union[str, CodeType]: + """Compile a node or template source code. The `name` parameter is + the load name of the template after it was joined using + :meth:`join_path` if necessary, not the filename on the file system. + the `filename` parameter is the estimated filename of the template on + the file system. If the template came from a database or memory this + can be omitted. + + The return value of this method is a python code object. If the `raw` + parameter is `True` the return value will be a string with python + code equivalent to the bytecode returned otherwise. This method is + mainly used internally. + + `defer_init` is use internally to aid the module code generator. This + causes the generated code to be able to import without the global + environment variable to be set. + + .. versionadded:: 2.4 + `defer_init` parameter added. + """ + source_hint = None + try: + if isinstance(source, str): + source_hint = source + source = self._parse(source, name, filename) + source = self._generate(source, name, filename, defer_init=defer_init) + if raw: + return source + if filename is None: + filename = "