ruff/crates/ty_python_semantic/resources/mdtest
Aria Desires 2bc6c78e26
[ty] introduce local variables for from imports of submodules in __init__.py(i) (#21173)
This rips out the previous implementation in favour of a new
implementation with 3 rules:

- **froms are locals**: a `from..import` can only define locals, it does
not have global
side-effects. Specifically any submodule attribute `a` that's implicitly
introduced by either
`from .a import b` or `from . import a as b` (in an `__init__.py(i)`) is
a local and not a
global. If you do such an import at the top of a file you won't notice
this. However if you do
such an import in a function, that means it will only be function-scoped
(so you'll need to do
it in every function that wants to access it, making your code less
sensitive to execution
    order).

- **first from first serve**: only the *first* `from..import` in an
`__init__.py(i)` that imports a
particular direct submodule of the current package introduces that
submodule as a local.
Subsequent imports of the submodule will not introduce that local. This
reflects the fact that
in actual python only the first import of a submodule (in the entire
execution of the program)
introduces it as an attribute of the package. By "first" we mean "the
first time in this scope
(or any parent scope)". This pairs well with the fact that we are
specifically introducing a
local (as long as you don't accidentally shadow or overwrite the local).

- **dot re-exports**: `from . import a` in an `__init__.pyi` is
considered a re-export of `a`
(equivalent to `from . import a as a`). This is required to properly
handle many stubs in the
    wild. Currently it must be *exactly* `from . import ...`.
    
This implementation is intentionally limited/conservative (notably,
often requiring a from import to be relative). I'm going to file a ton
of followups for improvements so that their impact can be evaluated
separately.


Fixes https://github.com/astral-sh/ty/issues/133
2025-11-10 23:04:56 +00:00
..
annotations [ty] implement typing.NewType by adding Type::NewTypeInstance 2025-11-10 14:55:47 -08:00
assignment [ty] Use type context for inference of generic constructors (#20933) 2025-11-10 21:49:48 +00:00
binary [ty] Rename UnionType to types.UnionType (#21262) 2025-11-03 22:06:56 +01:00
boolean
boundness_declaredness [ty] Reformulation of public symbol inference test suite (#20667) 2025-10-01 14:26:17 +02:00
call [ty] dict is not assignable to TypedDict (#21238) 2025-11-03 16:57:49 -05:00
class [ty] implement typing.NewType by adding Type::NewTypeInstance 2025-11-10 14:55:47 -08:00
comparison [ty] detect cycles in binary comparison inference (#20446) 2025-09-17 09:45:25 +02:00
comprehensions [ty] dict is not assignable to TypedDict (#21238) 2025-11-03 16:57:49 -05:00
conditional
dataclasses [ty] Improve generic call expression inference (#21210) 2025-11-10 21:29:05 +00:00
declaration
diagnostics [ty] continue and break statements outside loops are syntax errors (#20944) 2025-10-17 17:13:40 +00:00
directives [ty] Use annotated parameters as type context (#20635) 2025-10-03 17:14:51 -04:00
doc
exception [ty] Filter out revealed-type and undefined-reveal diagnostics from mdtest snapshots (#20820) 2025-10-12 18:39:32 +00:00
expression [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
function [ty] don't union in default type for annotated parameters (#21208) 2025-11-02 18:21:54 -05:00
generics [ty] Understand legacy and PEP 695 ParamSpec (#21139) 2025-11-06 11:14:40 -05:00
ide_support [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
import [ty] introduce local variables for from imports of submodules in __init__.py(i) (#21173) 2025-11-10 23:04:56 +00:00
literal [ty] Type inference for comprehensions (#20962) 2025-11-02 14:35:33 +01:00
loops [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
narrow [ty] Use type context for inference of generic constructors (#20933) 2025-11-10 21:49:48 +00:00
regression [ty] Fix panic due to simplifying Divergent types out of intersections types (#21253) 2025-11-03 15:41:11 +00:00
scopes [ty] Improve error messages for unresolved attribute diagnostics (#20963) 2025-10-19 10:58:25 +01:00
shadowing
snapshots [ty] implement typing.NewType by adding Type::NewTypeInstance 2025-11-10 14:55:47 -08:00
stubs [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
subscript [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
suppressions [ty] Add suggestion to unknown rule diagnostics, rename unknown-rule lint to ignore-comment-unknown-rule (#20948) 2025-10-18 12:44:21 +02:00
type_compendium [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
type_of [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
type_properties [ty] introduce local variables for from imports of submodules in __init__.py(i) (#21173) 2025-11-10 23:04:56 +00:00
type_qualifiers [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
unary
with [ty] Use typing.Self for the first parameter of instance methods (#20517) 2025-09-29 21:08:08 +02:00
.mdformat.toml
async.md
attributes.md [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
bidirectional.md [ty] Improve generic call expression inference (#21210) 2025-11-10 21:29:05 +00:00
classes.md [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
cycle.md [ty] Avoid ever-growing default types (#20991) 2025-10-21 19:13:36 +02:00
decorators.md
del.md [ty] No union with Unknown for module-global symbols (#20664) 2025-10-01 16:40:30 +02:00
deprecated.md
descriptor_protocol.md [ty] Infer type for implicit self parameters in method bodies (#20922) 2025-10-23 09:34:39 +02:00
enums.md [ty] Fix incorrect inference of enum.auto() for enums with non-int mixins, and imprecise inference of enum.auto() for single-member enums (#20541) 2025-11-10 17:53:08 +00:00
exhaustiveness_checking.md [ty] Improve exhaustiveness analysis for type variables with bounds or constraints (#21172) 2025-10-31 16:51:11 -04:00
final.md
implicit_type_aliases.md [ty] Add support for Optional and Annotated in implicit type aliases (#21321) 2025-11-10 10:24:38 +01:00
instance_layout_conflict.md
intersection_types.md [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
invalid_syntax.md
known_constants.md
literal_promotion.md [ty] Do not promote literals in contravariant positions of generic specializations (#21171) 2025-10-31 17:48:34 +01:00
mdtest_config.md
mdtest_custom_typeshed.md
metaclass.md
mro.md [ty] Rename UnionType to types.UnionType (#21262) 2025-11-03 22:06:56 +01:00
named_tuple.md [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
overloads.md [ty] Infer type of self for decorated methods and properties (#21123) 2025-10-29 21:22:38 +00:00
paramspec.md [ty] Understand legacy and PEP 695 ParamSpec (#21139) 2025-11-06 11:14:40 -05:00
pep613_type_aliases.md [ty] Fall back to Divergent for deeply nested specializations (#20988) 2025-10-22 14:29:10 +02:00
pep695_type_aliases.md [ty] Add cycle handling to lazy_default (#20967) 2025-10-23 10:05:08 +02:00
properties.md [ty] Add support for properties that return Self (#21335) 2025-11-10 11:13:36 +01:00
protocols.md [ty] Fix bug where ty would think all types had an __mro__ attribute (#20995) 2025-10-27 11:19:12 +00:00
public_types.md [ty] Disambiguate classes that live in different modules but have the same fully qualified names (#20756) 2025-10-08 18:27:40 +01:00
statically_known_branches.md [ty] Rename "possibly unbound" diagnostics to "possibly missing" (#20492) 2025-09-23 14:26:55 +00:00
sys_platform.md
sys_version_info.md
t_strings.md
terminal_statements.md
ty_extensions.md [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00
typed_dict.md [ty] dict is not assignable to TypedDict (#21238) 2025-11-03 16:57:49 -05:00
union_types.md [ty] Introduce TypeRelation::Redundancy (#20602) 2025-10-03 18:35:30 +01:00
unpacking.md [ty] Infer more precise types for collection literals (#20360) 2025-09-17 18:51:50 -04:00
unreachable.md [ty] Use "cannot" consistently over "can not" (#21255) 2025-11-03 10:38:20 -05:00