| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
|
Btw @hauntsaninja mypy_primer output looks like we aren't really checking attrs now (but it is probably important). To clear, that error is a blocker. |
Sorry, something went wrong.
There was a problem hiding this comment.
I have some questions, mostly about things that I don't fully understand. Otherwise looks good.
Sorry, something went wrong.
| try: | ||
| for id in scc.mod_ids: | ||
| state = graph[id] | ||
| # Extra step below is needed only because we are using local graph. |
There was a problem hiding this comment.
This comment wasn't clear to me. I'm not sure which extra step this refers to (parse_file or the state.tree is None check?).
Sorry, something went wrong.
There was a problem hiding this comment.
It refers to the whole if/else block. It can be avoided if we would not call load_graph() in the worker.
Sorry, something went wrong.
| # Extra step below is needed only because we are using local graph. | ||
| # TODO: clone options when switching to coordinator graph. | ||
| if state.tree is None: | ||
| state.parse_file() |
There was a problem hiding this comment.
Why are we parsing the file here? Is this related to error processing?
Sorry, something went wrong.
There was a problem hiding this comment.
Yes, we want to get the side effect of setting ignored/skipped lines.
Sorry, something went wrong.
| source_set = BuildSourceSet(sources) | ||
| cached_read = fscache.read | ||
| errors = Errors(options, read_source=lambda path: read_py_file(path, cached_read)) | ||
| # Record import errors so that they sn be replayed by the workers. |
There was a problem hiding this comment.
Typo: sn
Sorry, something went wrong.
| # We don't need parsed trees in coordinator process, we parse only to | ||
| # compute dependencies. | ||
| state.tree = None | ||
| if not temporary: |
There was a problem hiding this comment.
Should we only have the del statement behind the not temporary condition?
Sorry, something went wrong.
There was a problem hiding this comment.
No, we need the tree until it is used by the caller who created temporary state to check for is_partial_stub_package, I will delete it there to make it more clear.
Sorry, something went wrong.
There was a problem hiding this comment.
Actually, I decided to add a little cache for partial packages, otherwise it looks like a lot of potential overhead for a niche use case.
Sorry, something went wrong.
| util.hard_exit(0) | ||
|
|
||
|
|
||
| def serve(server: IPCServer, ctx: ServerContext) -> None: |
There was a problem hiding this comment.
Unrelated: Add a docstring here?
Sorry, something went wrong.
|
|
||
| for id in graph: | ||
| manager.import_map[id] = set(graph[id].dependencies + graph[id].suppressed) | ||
| manager.import_map[id] = graph[id].dependencies_set |
There was a problem hiding this comment.
Is this change related to error processing or the earlier changes to how we process suppressed modules?
Sorry, something went wrong.
There was a problem hiding this comment.
This is just a minor perf optimization (we never check for imports of suppressed deps after graph is loaded). I was scrolling past this line and decided it is not worth a separate PR.
Sorry, something went wrong.
| # Cache for transitive dependency check (expensive). | ||
| self.transitive_deps_cache: dict[tuple[int, int], bool] = {} | ||
| # Resolved paths for each module in build. | ||
| self.path_by_id: dict[str, str] = {} |
There was a problem hiding this comment.
Is this because we now delete modules in the middle of a build, or is there another reason for maintaing this here?
Sorry, something went wrong.
There was a problem hiding this comment.
This is mostly for convenience, to avoid passing graph around just for the purpose of mapping id to xpath. In most cases we identify modules by id, but in error-tracking-related code it is always xpath.
Sorry, something went wrong.
| def __init__(self, *, graph: Graph, missing_modules: set[str]) -> None: | ||
| self.graph = graph | ||
| self.missing_modules = missing_modules | ||
| self.from_cache = {mod_id for mod_id in graph if graph[mod_id].meta} |
There was a problem hiding this comment.
It looks like we might calculate this on demand using graph, and it wouldn't be much slower than a set lookup. Why are we storing this separately here?
Sorry, something went wrong.
There was a problem hiding this comment.
The receiver will not be able to do this after we stop calling load_graph() there. This is because we don't serialize State.meta (it would double the size). The worker only needs to know whether the state is from cache or was already parsed by coordinator. I will try to restructure some code in other places to make this more obvious.
Sorry, something went wrong.
hauntsaninja/mypy_primer#241 should fix this. |
Sorry, something went wrong.
|
Diff from mypy_primer, showing the effect of this PR on open source code: attrs (https://github.com/python-attrs/attrs)
- mypy: can't read file 'tests/typing_example.py': No such file or directory
+ mypy: error: cannot read file 'tests/typing_example.py': No such file or directory
|
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Ref #933
When parallel parsing is ready, we will not run load_graph() in each worker. So, we need to send early errors (mostly import errors) to the relevant workers. Couple notes here: