Skip to content

Conversation

alexeev-prog
Copy link
Contributor

@alexeev-prog alexeev-prog commented Jun 16, 2025

Create Untrivial Logic in Finally Block Rule

Checklist

  • I have double checked that there are no unrelated changes in this pull request (old patches, accidental config files, etc)
  • I have created at least one test case for the changes I have made
  • I have updated the documentation for the changes I have made
  • I have added my changes to the CHANGELOG.md

Related issues

Closes #3458

@alexeev-prog
Copy link
Contributor Author

Closes #3458 #3458

flake.nix Outdated
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, remove this file.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, revert this change.

.gitignore Outdated
@@ -1,4 +1,7 @@
#### joe made this: http://goel.io/joe
#### NIX ####
flake.lock
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this :)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, add a test case with a custom setting.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Forbids "fat" finally block.
Forbids complex finally block.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class UntrivialLogicInFinallyViolation(ASTViolation):
class ComplexFinallyViolation(ASTViolation):

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
error_template = 'Found untrivial logic in `finally` block: {0}'
error_template = 'Found complex `finally` block: {0}'

@alexeev-prog alexeev-prog requested a review from sobolevn June 16, 2025 21:08
Copy link
Member

@sobolevn sobolevn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't forget to add this check to test_checker.py

Default:
:int:`wemake_python_styleguide.options.defaults.MAX_LINES_IN_FINALLY.
..versionadded:: 1.1.0
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
..versionadded:: 1.1.0
..versionadded:: 1.2.0

@efimov-mikhail
Copy link

For now some test checks doesn't work correctly.
I would recommend to make all tests "green" with the local setup, if possible.

@alexeev-prog
Copy link
Contributor Author

For now some test checks doesn't work correctly. I would recommend to make all tests "green" with the local setup, if possible.

i cant install dependencies error log. I use poetry install

@sobolevn
Copy link
Member

Please, attach error log as a text, not a file. I don't want to download any files.

alexeev-prog and others added 2 commits June 17, 2025 05:39
Co-authored-by: sobolevn <mail@sobolevn.me>
@alexeev-prog
Copy link
Contributor Author

Please, attach error log as a text, not a file. I don't want to download any files.

Installing dependencies from lock file

Package operations: 17 installs, 0 updates, 0 removals

  - Installing grimp (3.7.1)
  - Installing libcst (1.7.0)

PEP517 build of a dependency failed

Backend subprocess exited when trying to invoke build_wheel

    | Command '['/tmp/tmph2m_71ay/.venv/bin/python', '/home/alexeev/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/pyproject_hooks/_in_process/_in_process.py', 'build_wheel', '/tmp/tmpfzaooz3d']' returned non-zero exit status 1.
    | 
    | Running `maturin pep517 build-wheel -i /tmp/tmph2m_71ay/.venv/bin/python --compatibility off`
    | 🍹 Building a mixed python/rust project
    | 🔗 Found pyo3 bindings
    | 🐍 Found CPython 3.14t at /tmp/tmph2m_71ay/.venv/bin/python
    | 📡 Using build options features from pyproject.toml
    |    Compiling target-lexicon v0.12.16
    |    Compiling proc-macro2 v1.0.93
    |    Compiling unicode-ident v1.0.14
    |    Compiling once_cell v1.20.2
    |    Compiling crossbeam-utils v0.8.21
    |    Compiling libc v0.2.169
    |    Compiling autocfg v1.4.0
    |    Compiling heck v0.5.0
    |    Compiling foldhash v0.1.4
    |    Compiling version_check v0.9.5
    |    Compiling serde v1.0.217
    |    Compiling memchr v2.7.4
    |    Compiling rayon-core v1.12.1
    |    Compiling regex-syntax v0.8.5
    |    Compiling unicode-xid v0.2.6
    |    Compiling thiserror v2.0.11
    | error: linker `cc` not found
    |   |
    |   = note: No such file or directory (os error 2)
    | 
    | error: could not compile `rayon-core` (build script) due to 1 previous error
    | warning: build failed, waiting for other jobs to finish...
    | error: could not compile `crossbeam-utils` (build script) due to 1 previous error
    | error: could not compile `proc-macro2` (build script) due to 1 previous error
    | error: could not compile `serde` (build script) due to 1 previous error
    | error: could not compile `thiserror` (build script) due to 1 previous error
    | error: could not compile `libc` (build script) due to 1 previous error
    | error: could not compile `target-lexicon` (build script) due to 1 previous error
    | 💥 maturin failed
    |   Caused by: Failed to build a native library through cargo
    |   Caused by: Cargo build finished with "exit status: 101": `env -u CARGO PYO3_ENVIRONMENT_SIGNATURE="cpython-3.14-64bit" PYO3_PYTHON="/tmp/tmph2m_71ay/.venv/bin/python" PYTHON_SYS_EXECUTABLE="/tmp/tmph2m_71ay/.venv/bin/python" "cargo" "rustc" "--features" "pyo3/extension-module" "--message-format" "json-render-diagnostics" "--manifest-path" "/tmp/tmp0ey2mwyx/grimp-3.7.1/rust/Cargo.toml" "--release" "--lib" "--crate-type" "cdylib"`
    | Error: command ['maturin', 'pep517', 'build-wheel', '-i', '/tmp/tmph2m_71ay/.venv/bin/python', '--compatibility', 'off'] returned non-zero exit status 1

Note: This error originates from the build backend, and is likely not a problem with poetry but one of the following issues with grimp (3.7.1)

  - not supporting PEP 517 builds
  - not specifying PEP 517 build requirements correctly
  - the build requirements are incompatible with your operating system or Python version
  - the build requirements are missing system dependencies (eg: compilers, libraries, headers).

You can verify this by running pip wheel --no-cache-dir --use-pep517 "grimp (==3.7.1)".


PEP517 build of a dependency failed

Backend subprocess exited when trying to invoke build_wheel

    | Command '['/tmp/tmp481k11hd/.venv/bin/python', '/home/alexeev/.local/share/pipx/venvs/poetry/lib/python3.12/site-packages/pyproject_hooks/_in_process/_in_process.py', 'build_wheel', '/tmp/tmpacwnzg7o']' returned non-zero exit status 1.
    | 
    | /tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools/_distutils/dist.py:289: UserWarning: Unknown distribution option: 'test_suite'
    |   warnings.warn(msg)
    | WARNING setuptools_scm.pyproject_reading toml section missing 'pyproject.toml does not contain a tool.setuptools_scm section'
    | Traceback (most recent call last):
    |   File "/tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools_scm/_integration/pyproject_reading.py", line 36, in read_pyproject
    |     section = defn.get("tool", {})[tool_name]
    |               ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
    | KeyError: 'setuptools_scm'
    | /tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated
    | !!
    | 
    |         ********************************************************************************
    |         Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).
    | 
    |         By 2026-Feb-18, you need to update your project and remove deprecated calls
    |         or your builds will no longer be supported.
    | 
    |         See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
    |         ********************************************************************************
    | 
    | !!
    |   corresp(dist, value, root_dir)
    | /tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.
    | !!
    | 
    |         ********************************************************************************
    |         Please consider removing the following classifiers in favor of a SPDX license expression:
    | 
    |         License :: OSI Approved :: MIT License
    | 
    |         See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
    |         ********************************************************************************
    | 
    | !!
    |   dist._finalize_license_expression()
    | /tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools/dist.py:759: SetuptoolsDeprecationWarning: License classifiers are deprecated.
    | !!
    | 
    |         ********************************************************************************
    |         Please consider removing the following classifiers in favor of a SPDX license expression:
    | 
    |         License :: OSI Approved :: MIT License
    | 
    |         See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.
    |         ********************************************************************************
    | 
    | !!
    |   self._finalize_license_expression()
    | running bdist_wheel
    | running build
    | running build_py
    | creating build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_add_slots.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_typed_visitor_base.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_metadata_dependent.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_type_enforce.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_tabs.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/tool.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_typed_visitor.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_maybe_sentinel.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_removal_sentinel.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_version.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_types.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_flatten_sentinel.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_position.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_batched_visitor.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_exceptions.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | copying libcst/_visitors.py -> build/lib.linux-x86_64-cpython-314t/libcst
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/expression.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/deep_equals.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/module.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/statement.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/whitespace.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/internal.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/base.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | copying libcst/_nodes/op.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/gen_visitor_functions.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/gen_matcher_classes.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/gen_type_mapping.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/generate.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/gather.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/transforms.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | copying libcst/codegen/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen
    | creating build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/expression.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/common.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/_template.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/module.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/paths.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/node_fields.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | copying libcst/helpers/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers
    | creating build/lib.linux-x86_64-cpython-314t/libcst/testing
    | copying libcst/testing/utils.py -> build/lib.linux-x86_64-cpython-314t/libcst/testing
    | copying libcst/testing/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/testing
    | creating build/lib.linux-x86_64-cpython-314t/libcst/display
    | copying libcst/display/text.py -> build/lib.linux-x86_64-cpython-314t/libcst/display
    | copying libcst/display/graphviz.py -> build/lib.linux-x86_64-cpython-314t/libcst/display
    | copying libcst/display/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/display
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_visitor.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_testing.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_command.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_codemod.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_context.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_runner.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_cli.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | copying libcst/codemod/_dummy_pool.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod
    | creating build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_deep_replace.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_fuzz.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_visitor.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_e2e.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_exceptions.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_add_slots.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_batched_visitor.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_type_enforce.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_roundtrip.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_deep_clone.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/__main__.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_pyre_integration.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/test_tabs.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | copying libcst/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/grammar.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/detect_config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/python_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/production_decorator.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/whitespace_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/py_whitespace_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/wrapped_tokenize.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/custom_itertools.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/entrypoints.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/base_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | copying libcst/_parser/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser
    | creating build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | copying libcst/matchers/_decorators.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | copying libcst/matchers/_return_types.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | copying libcst/matchers/_matcher_base.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | copying libcst/matchers/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | copying libcst/matchers/_visitors.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers
    | creating build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/scope_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/expression_context_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/parent_node_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/base_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/file_path_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/type_inference_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/position_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/name_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/accessor_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/full_repo_manager.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/wrapper.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/span_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | copying libcst/metadata/reentrant_codegen.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_trailing_whitespace.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_lambda.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_boolean_op.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_simple_comp.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_nonlocal.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_list.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_ifexp.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_await.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_indented_block.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_classdef.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_dict_comp.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_removal_behavior.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_atom.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_raise.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_for.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_global.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_dict.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_assign.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_namedexpr.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_comparison.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_import.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_docstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_simple_statement.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_set.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_unary_op.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_del.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_type_alias.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_flatten_behavior.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_module.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_while.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_try.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_attribute.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_assert.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_if.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_cst_node.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_comment.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_subscript.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_binary_op.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/base.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_matrix_multiply.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_newline.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_leaf_small_statements.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_simple_whitespace.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_number.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_with.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_tuple.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_yield.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_small_statement.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_funcdef.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_else.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_simple_string.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_call.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_return.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_match.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | copying libcst/_nodes/tests/test_empty_line.py -> build/lib.linux-x86_64-cpython-314t/libcst/_nodes/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codegen/tests
    | copying libcst/codegen/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen/tests
    | copying libcst/codegen/tests/test_codegen_clean.py -> build/lib.linux-x86_64-cpython-314t/libcst/codegen/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/test_paths.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/test_template.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/test_module.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/test_expression.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/test_node_fields.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | copying libcst/helpers/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/helpers/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/display/tests
    | copying libcst/display/tests/test_dump_text.py -> build/lib.linux-x86_64-cpython-314t/libcst/display/tests
    | copying libcst/display/tests/test_dump_graphviz.py -> build/lib.linux-x86_64-cpython-314t/libcst/display/tests
    | copying libcst/display/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/display/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/unnecessary_format_string.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/convert_format_to_fstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/convert_percent_format_to_fstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/add_trailing_commas.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/strip_strings_from_types.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/convert_namedtuple_to_dataclass.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/fix_pyre_directives.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/noop.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/fix_variadic_callable.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/convert_type_comments.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/add_pyre_directive.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/rename.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/rename_typing_generic_aliases.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/remove_unused_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/remove_pyre_directive.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/convert_union_to_or.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | copying libcst/codemod/commands/ensure_import_present.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/codemod/tests/test_runner.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/codemod/tests/test_metadata.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/codemod/tests/test_codemod_cli.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/codemod/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/codemod/tests/test_codemod.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_remove_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_exports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_comments.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_global_names.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_apply_type_annotations.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_add_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_unused_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_string_annotation_names.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | copying libcst/codemod/visitors/_gather_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_convert_percent_format_to_fstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_convert_namedtuple_to_dataclass.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_convert_union_to_or.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_rename_typing_generic_aliases.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_remove_pyre_directive.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_noop.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_remove_unused_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_strip_strings_from_types.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_fix_variadic_callable.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_unnecessary_format_string.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_fix_pyre_directives.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_add_pyre_directive.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_rename.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_ensure_import_present.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_convert_format_to_fstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_convert_type_comments.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | copying libcst/codemod/commands/tests/test_add_trailing_commas.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/commands/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_remove_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_exports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_apply_type_annotations.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_comments.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_add_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_string_annotation_names.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_global_names.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | copying libcst/codemod/visitors/tests/test_gather_unused_imports.py -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/visitors/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/expression.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/params.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/module.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/statement.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | copying libcst/_parser/conversions/terminals.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_wrapped_tokenize.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_detect_config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_node_identity.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_version_compare.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_whitespace_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_parse_errors.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/test_footer_behavior.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | copying libcst/_parser/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/conversions.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/py_token.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/production.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/whitespace_state.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/py_config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/token.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/partials.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | copying libcst/_parser/types/py_whitespace_state.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso
    | copying libcst/_parser/parso/utils.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso
    | copying libcst/_parser/parso/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/types/tests
    | copying libcst/_parser/types/tests/test_config.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types/tests
    | copying libcst/_parser/types/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/types/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/python
    | copying libcst/_parser/parso/python/py_token.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/python
    | copying libcst/_parser/parso/python/token.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/python
    | copying libcst/_parser/parso/python/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/python
    | copying libcst/_parser/parso/python/tokenize.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/python
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/tests
    | copying libcst/_parser/parso/tests/test_tokenize.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/tests
    | copying libcst/_parser/parso/tests/test_utils.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/tests
    | copying libcst/_parser/parso/tests/test_fstring.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/tests
    | copying libcst/_parser/parso/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/pgen2
    | copying libcst/_parser/parso/pgen2/grammar_parser.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/pgen2
    | copying libcst/_parser/parso/pgen2/generator.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/pgen2
    | copying libcst/_parser/parso/pgen2/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/parso/pgen2
    | creating build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_matchers_with_metadata.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_extract.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_decorators.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_findall.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_replace.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_matchers.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/test_visitors.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | copying libcst/matchers/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/matchers/tests
    | creating build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_scope_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_position_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_file_path_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_metadata_wrapper.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_full_repo_manager.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_base_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_parent_node_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_span_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_expression_context_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_accessor_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_name_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/__init__.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_metadata_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_reentrant_codegen.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | copying libcst/metadata/tests/test_type_inference_provider.py -> build/lib.linux-x86_64-cpython-314t/libcst/metadata/tests
    | running egg_info
    | writing libcst.egg-info/PKG-INFO
    | writing dependency_links to libcst.egg-info/dependency_links.txt
    | writing requirements to libcst.egg-info/requires.txt
    | writing top-level names to libcst.egg-info/top_level.txt
    | ERROR setuptools_scm._file_finders.git listing git files failed - pretending there aren't any
    | reading manifest file 'libcst.egg-info/SOURCES.txt'
    | reading manifest template 'MANIFEST.in'
    | warning: no previously-included files matching '*' found under directory 'native/target'
    | adding license file 'LICENSE'
    | writing manifest file 'libcst.egg-info/SOURCES.txt'
    | /tmp/tmp481k11hd/.venv/lib/python3.14t/site-packages/setuptools/command/build_py.py:212: _Warning: Package 'libcst.tests.pyre' is absent from the `packages` configuration.
    | !!
    | 
    |         ********************************************************************************
    |         ############################
    |         # Package would be ignored #
    |         ############################
    |         Python recognizes 'libcst.tests.pyre' as an importable package[^1],
    |         but it is absent from setuptools' `packages` configuration.
    | 
    |         This leads to an ambiguous overall configuration. If you want to distribute this
    |         package, please make sure that 'libcst.tests.pyre' is explicitly added
    |         to the `packages` configuration field.
    | 
    |         Alternatively, you can also rely on setuptools' discovery methods
    |         (for example by using `find_namespace_packages(...)`/`find_namespace:`
    |         instead of `find_packages(...)`/`find:`).
    | 
    |         You can read more about "package discovery" on setuptools documentation page:
    | 
    |         - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html
    | 
    |         If you don't want 'libcst.tests.pyre' to be distributed and are
    |         already explicitly excluding 'libcst.tests.pyre' via
    |         `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`,
    |         you can try to use `exclude_package_data`, or `include-package-data=False` in
    |         combination with a more fine grained `package-data` configuration.
    | 
    |         You can read more about "package data files" on setuptools documentation page:
    | 
    |         - https://setuptools.pypa.io/en/latest/userguide/datafiles.html
    | 
    | 
    |         [^1]: For Python, any directory (with suitable naming) can be imported,
    |               even if it does not contain any `.py` files.
    |               On the other hand, currently there is no concept of package data
    |               directory, all directories are treated like packages.
    |         ********************************************************************************
    | 
    | !!
    |   check.warn(importable)
    | copying libcst/py.typed -> build/lib.linux-x86_64-cpython-314t/libcst
    | creating build/lib.linux-x86_64-cpython-314t/libcst/tests/pyre
    | copying libcst/tests/pyre/.pyre_configuration -> build/lib.linux-x86_64-cpython-314t/libcst/tests/pyre
    | copying libcst/tests/pyre/simple_class.json -> build/lib.linux-x86_64-cpython-314t/libcst/tests/pyre
    | copying libcst/tests/pyre/simple_class.py -> build/lib.linux-x86_64-cpython-314t/libcst/tests/pyre
    | copying libcst/codemod/tests/codemod_formatter_error_input.py.txt -> build/lib.linux-x86_64-cpython-314t/libcst/codemod/tests
    | copying libcst/_parser/conversions/README.md -> build/lib.linux-x86_64-cpython-314t/libcst/_parser/conversions
    | warning: build_py: byte-compiling is disabled, skipping.
    | 
    | running build_ext
    | running build_rust
    | cargo rustc --lib --message-format=json-render-diagnostics --manifest-path native/libcst/Cargo.toml --release -v --features pyo3/extension-module --crate-type cdylib --
    |    Compiling target-lexicon v0.12.15
    |    Compiling proc-macro2 v1.0.86
    |      Running `rustc --crate-name build_script_build --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/target-lexicon-0.12.15/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("arch_zkasm", "default", "serde", "serde_support", "std"))' -C metadata=bdbe70d6ddad1284 -C extra-filename=-23de1ee14ce2c9db --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/target-lexicon-23de1ee14ce2c9db -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |    Compiling unicode-ident v1.0.1
    |    Compiling once_cell v1.16.0
    |    Compiling autocfg v1.1.0
    |    Compiling libc v0.2.149
    |    Compiling heck v0.5.0
    |    Compiling memchr v2.7.4
    |    Compiling peg-runtime v0.8.3
    |    Compiling thiserror v1.0.63
    |    Compiling paste v1.0.15
    |    Compiling regex-syntax v0.8.4
    |    Compiling cfg-if v1.0.0
    |    Compiling unicode-width v0.2.0
    |      Running `rustc --crate-name build_script_build --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.86/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --cfg 'feature="proc-macro"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "nightly", "proc-macro", "span-locations"))' -C metadata=3687f644591d6274 -C extra-filename=-d68f207e98848b84 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/proc-macro2-d68f207e98848b84 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name unicode_ident --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.1/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=0633619e2782715e -C extra-filename=-a740d722001b4edf --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name once_cell --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.16.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="alloc"' --cfg 'feature="default"' --cfg 'feature="race"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("alloc", "atomic-polyfill", "atomic_polyfill", "critical-section", "critical_section", "default", "parking_lot", "parking_lot_core", "race", "std", "unstable"))' -C metadata=f724ddbb0de1c7de -C extra-filename=-16fad1fd396a43f0 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name autocfg --edition=2015 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/autocfg-1.1.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=69a5444b1fd463ab -C extra-filename=-61809600ee8cade7 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name build_script_build --edition=2015 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.149/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --cfg 'feature="extra_traits"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("align", "const-extern-fn", "default", "extra_traits", "rustc-dep-of-std", "rustc-std-workspace-core", "std", "use_std"))' -C metadata=91e1219159563d12 -C extra-filename=-9b67c36e2ab5942a --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/libc-9b67c36e2ab5942a -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name heck --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/heck-0.5.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=9281ab7030f38e32 -C extra-filename=-06debb0d4d4774b1 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name memchr --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/memchr-2.7.4/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="alloc"' --cfg 'feature="default"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("alloc", "compiler_builtins", "core", "default", "libc", "logging", "rustc-dep-of-std", "std", "use_std"))' -C metadata=91c48576b2d8c4c8 -C extra-filename=-4f46038df9d5dc59 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name peg_runtime --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/peg-runtime-0.8.3/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("std", "unstable"))' -C metadata=e747854c5a6ce059 -C extra-filename=-858db5f88efd646b --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name build_script_build --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/thiserror-1.0.63/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=f6755dc08b6fac6c -C extra-filename=-d7fea0b3b2523326 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/thiserror-d7fea0b3b2523326 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name build_script_build --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/paste-1.0.15/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=506eafd0d305eb20 -C extra-filename=-87ff89a262ac1e66 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/paste-87ff89a262ac1e66 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name regex_syntax --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/regex-syntax-0.8.4/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="default"' --cfg 'feature="std"' --cfg 'feature="unicode"' --cfg 'feature="unicode-age"' --cfg 'feature="unicode-bool"' --cfg 'feature="unicode-case"' --cfg 'feature="unicode-gencat"' --cfg 'feature="unicode-perl"' --cfg 'feature="unicode-script"' --cfg 'feature="unicode-segment"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("arbitrary", "default", "std", "unicode", "unicode-age", "unicode-bool", "unicode-case", "unicode-gencat", "unicode-perl", "unicode-script", "unicode-segment"))' -C metadata=0cc1cc6369dffe03 -C extra-filename=-5bda9bebb3e7c01b --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name cfg_if --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("compiler_builtins", "core", "rustc-dep-of-std"))' -C metadata=f774a8b1a0b6ae97 -C extra-filename=-da34da6838abd7f1 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name unicode_width --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-width-0.2.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="cjk"' --cfg 'feature="default"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("cjk", "compiler_builtins", "core", "default", "no_std", "rustc-dep-of-std", "std"))' -C metadata=5eece23ae6c0f194 -C extra-filename=-79ded1c56a63ad71 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name once_cell --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.16.0/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="alloc"' --cfg 'feature="default"' --cfg 'feature="race"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("alloc", "atomic-polyfill", "atomic_polyfill", "critical-section", "critical_section", "default", "parking_lot", "parking_lot_core", "race", "std", "unstable"))' -C metadata=40741070a4ef2b96 -C extra-filename=-1843f1523b66b8c7 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |      Running `rustc --crate-name peg_runtime --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/peg-runtime-0.8.3/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("std", "unstable"))' -C metadata=37efba92acac36b9 -C extra-filename=-6fbfe71b8e6db2b1 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    |    Compiling indoc v2.0.4
    |      Running `rustc --crate-name indoc --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/indoc-2.0.4/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type proc-macro --emit=dep-info,link -C prefer-dynamic -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=b63953f98d160209 -C extra-filename=-462bff1ce884cb48 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --extern proc_macro --cap-lints allow`
    |    Compiling anstyle v1.0.10
    |      Running `rustc --crate-name anstyle --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/anstyle-1.0.10/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no --warn=rust_2018_idioms '--warn=clippy::zero_sized_map_values' '--warn=clippy::wildcard_imports' '--warn=clippy::verbose_file_reads' --warn=unused_qualifications --warn=unused_macro_rules --warn=unused_lifetimes --warn=unsafe_op_in_unsafe_fn --warn=unreachable_pub '--warn=clippy::uninlined_format_args' '--warn=clippy::trait_duplication_in_bounds' '--warn=clippy::todo' '--warn=clippy::string_to_string' '--warn=clippy::string_lit_as_bytes' '--warn=clippy::string_add_assign' '--warn=clippy::string_add' '--warn=clippy::str_to_string' '--warn=clippy::semicolon_if_nothing_returned' '--warn=clippy::self_named_module_files' '--warn=clippy::same_functions_in_if_condition' '--warn=clippy::rest_pat_in_fully_bound_structs' '--warn=clippy::ref_option_ref' '--warn=clippy::redundant_feature_names' '--warn=clippy::rc_mutex' '--warn=clippy::ptr_as_ptr' '--warn=clippy::path_buf_push_overwrite' '--warn=clippy::negative_feature_names' '--warn=clippy::needless_for_each' '--warn=clippy::needless_continue' '--warn=clippy::mutex_integer' '--warn=clippy::mem_forget' '--warn=clippy::macro_use_imports' '--warn=clippy::lossy_float_literal' '--warn=clippy::linkedlist' '--allow=clippy::let_and_return' '--warn=clippy::large_types_passed_by_value' '--warn=clippy::large_stack_arrays' '--warn=clippy::large_digit_groups' '--warn=clippy::invalid_upcast_comparisons' '--warn=clippy::infinite_loop' '--warn=clippy::inefficient_to_string' '--warn=clippy::inconsistent_struct_constructor' '--warn=clippy::imprecise_flops' '--warn=clippy::implicit_clone' '--allow=clippy::if_same_then_else' '--warn=clippy::from_iter_instead_of_collect' '--warn=clippy::fn_params_excessive_bools' '--warn=clippy::float_cmp_const' '--warn=clippy::flat_map_option' '--warn=clippy::filter_map_next' '--warn=clippy::fallible_impl_from' '--warn=clippy::explicit_into_iter_loop' '--warn=clippy::explicit_deref_methods' '--warn=clippy::expl_impl_clone_on_copy' '--warn=clippy::enum_glob_use' '--warn=clippy::empty_enum' '--warn=clippy::doc_markdown' '--warn=clippy::debug_assert_with_mut_call' '--warn=clippy::dbg_macro' '--warn=clippy::create_dir' '--allow=clippy::collapsible_else_if' '--warn=clippy::checked_conversions' '--allow=clippy::branches_sharing_code' '--allow=clippy::bool_assert_comparison' --cfg 'feature="default"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "std"))' -C metadata=bda98b3183b244e1 -C extra-filename=-9f5be866ba61e118 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow`
    | error: linker `cc` not found
    |   |
    |   = note: No such file or directory (os error 2)
    | 
    | error: could not compile `paste` (build script) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name build_script_build --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/paste-1.0.15/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=506eafd0d305eb20 -C extra-filename=-87ff89a262ac1e66 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/paste-87ff89a262ac1e66 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow` (exit status: 1)
    | warning: build failed, waiting for other jobs to finish...
    | error: could not compile `thiserror` (build script) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name build_script_build --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/thiserror-1.0.63/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=f6755dc08b6fac6c -C extra-filename=-d7fea0b3b2523326 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/thiserror-d7fea0b3b2523326 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow` (exit status: 1)
    | error: could not compile `proc-macro2` (build script) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name build_script_build --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.86/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --cfg 'feature="proc-macro"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "nightly", "proc-macro", "span-locations"))' -C metadata=3687f644591d6274 -C extra-filename=-d68f207e98848b84 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/proc-macro2-d68f207e98848b84 -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow` (exit status: 1)
    | error: could not compile `libc` (build script) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name build_script_build --edition=2015 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.149/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --cfg 'feature="extra_traits"' --cfg 'feature="std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("align", "const-extern-fn", "default", "extra_traits", "rustc-dep-of-std", "rustc-std-workspace-core", "std", "use_std"))' -C metadata=91e1219159563d12 -C extra-filename=-9b67c36e2ab5942a --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/libc-9b67c36e2ab5942a -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow` (exit status: 1)
    | error: could not compile `target-lexicon` (build script) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name build_script_build --edition=2018 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/target-lexicon-0.12.15/build.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debug-assertions=off --cfg 'feature="default"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("arch_zkasm", "default", "serde", "serde_support", "std"))' -C metadata=bdbe70d6ddad1284 -C extra-filename=-23de1ee14ce2c9db --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/build/target-lexicon-23de1ee14ce2c9db -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --cap-lints allow` (exit status: 1)
    | error: could not compile `indoc` (lib) due to 1 previous error
    | 
    | Caused by:
    |   process didn't exit successfully: `rustc --crate-name indoc --edition=2021 /home/alexeev/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/indoc-2.0.4/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type proc-macro --emit=dep-info,link -C prefer-dynamic -C embed-bitcode=no -C debug-assertions=off --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values())' -C metadata=b63953f98d160209 -C extra-filename=-462bff1ce884cb48 --out-dir /tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps -C strip=debuginfo -L dependency=/tmp/tmpq24_88gx/libcst-1.7.0/native/target/release/deps --extern proc_macro --cap-lints allow` (exit status: 1)
    | error: `cargo rustc --lib --message-format=json-render-diagnostics --manifest-path native/libcst/Cargo.toml --release -v --features pyo3/extension-module --crate-type cdylib --` failed with code 101

Note: This error originates from the build backend, and is likely not a problem with poetry but one of the following issues with libcst (1.7.0)

  - not supporting PEP 517 builds
  - not specifying PEP 517 build requirements correctly
  - the build requirements are incompatible with your operating system or Python version
  - the build requirements are missing system dependencies (eg: compilers, libraries, headers).

You can verify this by running pip wheel --no-cache-dir --use-pep517 "libcst (==1.7.0)".

@sobolevn
Copy link
Member

@alexeev-prog you are using 3.14 which is not supported, please use 3.13 :)

@alexeev-prog alexeev-prog requested a review from sobolevn June 17, 2025 22:44
@alexeev-prog
Copy link
Contributor Author

My local testing logs: https://pastebin.com/qJp9nkLp

@alexeev-prog
Copy link
Contributor Author

Please help, i am not understand test errors...

@sobolevn
Copy link
Member

Please, fix WPS errors first. Tests are not even executed :)

Copy link
Member

@sobolevn sobolevn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, add ComplexFinallyBlocksVisitor to a preset

my_print(first_argpm, second_argpm)


Я
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Я

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is it named complex_continue? When it checks complex try finally blocks?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So sorry! I renamed it.

@alexeev-prog
Copy link
Contributor Author

In my local environment, i got tests error:

____________________________________________________ ERROR collecting tests/conftest.py ____________________________________________________
import file mismatch:
imported module 'conftest' has this __file__ attribute:
  /home/alexeev/Desktop/Projects/wemake-python-styleguide/tests/test_visitors/conftest.py
which is not the same as the test file we want to collect:
  /home/alexeev/Desktop/Projects/wemake-python-styleguide/tests/conftest.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
_____________________________________________ ERROR collecting tests/test_visitors/conftest.py _____________________________________________
import file mismatch:
imported module 'conftest' has this __file__ attribute:
  /home/alexeev/Desktop/Projects/wemake-python-styleguide/tests/test_logic/test_complexity/test_cognitive/conftest.py
which is not the same as the test file we want to collect:
  /home/alexeev/Desktop/Projects/wemake-python-styleguide/tests/test_visitors/conftest.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules

Whats is solution of fix it?


# Wrong examples:

untrivial_logic_example1 = """
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is the same as trivial_logic_custom_example1


# Correct examples:

trivial_logic_example1 = """
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, add two test cases with try/finally without except: both correct and incorrect ones.

Copy link
Contributor Author

@alexeev-prog alexeev-prog Jun 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I add this, by i get Total coverage: 99.91% in local tests.


total_lines = 0

for stmt in node.finalbody:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You don't need any of this. Here's the code you need:

if not node.finalbody:
    return

first_line = node.finalbody[0].lineno
last_line = node.finalbody[-1].lineno
total_lines = last_line - first_line
if total_lines > self.options.max_lines_in_finally:
    self.add_violation(
        complexity.ComplexFinallyViolation(
            node, 
            text=str(total_lines),
            baseline=self.options.max_lines_in_finally,
         ),
    )

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I add this

Copy link

codecov bot commented Jun 27, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (4bdacae) to head (11796a0).
⚠️ Report is 38 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff            @@
##            master     #3461   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          362       364    +2     
  Lines        11987     12040   +53     
  Branches       821       823    +2     
=========================================
+ Hits         11987     12040   +53     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@alexeev-prog
Copy link
Contributor Author

Its ready?

@sobolevn sobolevn merged commit 5927698 into wemake-services:master Jun 27, 2025
9 checks passed
@alexeev-prog alexeev-prog deleted the fat-finally branch June 27, 2025 20:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Forbid "fat" finally

3 participants