Selected changesmerged Oct 30, 2026
fix: Send updates from long running sync callbacks before they returnPython · 51 + / 2 −
Introduces 3 new declarations in panel/io/document.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
panel/io/document.py ↗ · 2 files
@@ -651,6 +653,46 @@ def _suppress_property_callbacks( event.callback_invoker = None return events +async def _write_message(+ doc: Document, connections: list[ServerConnection], message: Message+) -> None:+ for conn in connections:+ lock = getattr(conn._socket, 'write_lock', None)+ with (await lock.acquire()) if lock is not None else nullcontext():+ await _await_writes(_socket_dispatcher(conn._socket)(conn, msg=message))++def _write_from_worker_thread(+ doc: Document,+ connections: Iterable[ServerConnection],+ events: list[DocumentChangedEvent]+) -> bool:+ """+ Writes events generated by a locked callback that bokeh runs on a+ worker thread right away, rather than leaving them to bokeh, which+ only writes them once the callback returns, so that a long running+ callback can still report progress.++ Only safe while bokeh has no pending writes of its own: the message+ is serialized here, while the callback holds the Document lock, and+ the write is scheduled on the event loop ahead of bokeh's, so the+ client always receives models before they are referenced.+ """+ patches = [e for e in events if isinstance(e, DocumentPatchedEvent)]+ if state._on_loop_thread or not patches or len(patches) != len(events):+ return False+ loop = state._document_loop(doc)+ asyncio_loop = t.cast(+ 'asyncio.AbstractEventLoop | None', getattr(loop, 'asyncio_loop', loop)
Refactor flags and options in `kubectl api-resources` cmdGo · 76 + / 42 −
Introduces 4 new declarations in staging/src/k8s.io/kubectl/pkg/cmd/apiresources/apiresources.go.
Adds new systems design rather than adjusting what was there. Tests changed with it, with code of their own.
staging/src/k8s.io/kubectl/pkg/cmd/apiresources/apiresources.go ↗ · 3 files
@@ -126,33 +148,44 @@ func (o *APIResourceOptions) Validate() error { return nil } -// Complete adapts from the command line args and validates them-func (o *APIResourceOptions) Complete(restClientGetter genericclioptions.RESTClientGetter, cmd *cobra.Command, args []string) error {+// ToOptions converts from CLI inputs to runtime inputs+func (flags *APIResourceFlags) ToOptions(cmd *cobra.Command, args []string) (*APIResourceOptions, error) { if len(args) != 0 {- return cmdutil.UsageErrorf(cmd, "unexpected arguments: %v", args)+ return nil, fmt.Errorf("unexpected arguments: %v", args) } - discoveryClient, err := restClientGetter.ToDiscoveryClient()+ discoveryClient, err := flags.RESTClientGetter.ToDiscoveryClient() if err != nil {- return err+ return nil, err }- o.discoveryClient = discoveryClient - o.groupChanged = cmd.Flags().Changed("api-group")- o.nsChanged = cmd.Flags().Changed("namespaced")+ o := &APIResourceOptions{+ SortBy: flags.SortBy,+ APIGroup: flags.APIGroup,+ Namespaced: flags.Namespaced,+ Verbs: flags.Verbs,+ Cached: flags.Cached,+ Categories: flags.Categories,++ groupChanged: cmd.Flags().Changed("api-group"),+ nsChanged: cmd.Flags().Changed("namespaced"),
🚨 build and expand once the tp/ep_plan/fsdp_planPython · 239 + / 188 −
Introduces 14 new declarations in src/transformers/distributed/mixin.py.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
src/transformers/distributed/mixin.py ↗ · 16 files
@@ -195,6 +187,101 @@ def prepare_distribute_model( return distributed_config, device_map, mesh_manager + def _validate_parallel_plan(+ self, plan: dict[str, str], supported_styles, plan_name: str, names: set[str] | None = None+ ) -> None:+ """Raise on a style that `supported_styles` does not know, warn on a rule that names nothing in the model."""+ unsupported_styles = {style for style in plan.values() if style not in supported_styles}+ if unsupported_styles:+ raise ValueError(+ f"Unsupported `{plan_name}` styles: {unsupported_styles}. Supported styles are {list(supported_styles)}"+ )++ if names is None:+ names = {+ replace_layer_number_by_wildcard(n) for n, _ in chain(self.named_modules(), self.named_parameters())+ }+ if unused := plan.keys() - names:+ if _get_torch_distributed_rank() == 0:+ logger.warning(+ f"`{plan_name}` rules {sorted(unused)} match nothing in {type(self).__name__} and will not be applied."+ )++ def _expand_parallel_plan(self, plan: dict[str, str]) -> dict[str, str]:+ """Replace the `*` of the plan's rules with the layer numbers of the model, one entry per module or parameter."""+ expanded_plan = {}++ for module_name, module in self.named_modules():+ module_style = _get_parameter_plan(parameter_name=module_name, plan=plan, is_weight=False)++ if module_style in ALL_FSDP_STYLES:+ # FSDP: list the module to wrap.+ expanded_plan[module_name] = module_style
turbopack: drop ASTs of tree-shaken modulesRust · 141 + / 6 −
Introduces 9 new declarations in turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs.
Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.
turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs ↗ · 15 files
@@ -374,6 +381,23 @@ pub async fn compute_binding_usage_info( span.record("visit_count", visit_count); span.record("unused_reference_count", unused_references.len()); + if drop_unused_module_data {+ // The traversal visits every module that is reachable via used references (and sets+ // its usage), so the remaining ones are unused.+ graph_ref+ .iter_nodes()+ .filter(|module| !used_exports.contains_key(module))+ .map(async |module| {+ module+ .into_trait_ref()+ .await?+ .drop_code_gen_data_hint()+ .await+ })+ .try_join()+ .await?;+ }+ #[cfg(debug_assertions)] { use std::sync::LazyLock;
BUG: Index.copy treating name as a list of names (GH#19171)Python · 55 + / 41 −
Introduces 2 new declarations in pandas/core/indexes/base.py.
Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.
pandas/core/indexes/base.py ↗ · 6 files
@@ -1880,42 +1903,6 @@ def name(self, value: Hashable) -> None: maybe_extract_name(value, None, type(self)) self._name = value - @final- def _validate_names(- self,- name: Hashable = None,- names: Sequence[Hashable] | None = None,- deep: bool = False,- ) -> list[Hashable]:- """- Handles the quirks of having a singular 'name' parameter for general- Index and plural 'names' parameter for MultiIndex.- """- from copy import deepcopy-- if names is not None and name is not None:- raise TypeError("Can only provide one of `names` and `name`")- if names is None and name is None:- new_names = deepcopy(self.names) if deep else self.names- elif names is not None:- if not is_list_like(names):- raise TypeError("Must pass list-like as `names`.")- new_names = names- elif not is_list_like(name):- new_names = [name]- else:- new_names = name-- if len(new_names) != len(self.names): # pyright: ignore[reportArgumentType]- raise ValueError(- f"Length of new names must be {len(self.names)}, got {len(new_names)}" # pyright: ignore[reportArgumentType]- )