def read_pyproject_toml(
- ctx: click.Context, param: click.Parameter, value: Union[str, int, bool, None]
+ ctx: click.Context, param: click.Parameter, value: Optional[str]
) -> Optional[str]:
"""Inject Black configuration from "pyproject.toml" into defaults in `ctx`.
Returns the path to a successfully found and read configuration file, None
otherwise.
"""
- assert not isinstance(value, (int, bool)), "Invalid parameter type passed"
if not value:
value = find_pyproject_toml(ctx.params.get("src", ()))
if value is None:
if not config:
return None
- if ctx.default_map is None:
- ctx.default_map = {}
- ctx.default_map.update(config) # type: ignore # bad types in .pyi
+ default_map: Dict[str, Any] = {}
+ if ctx.default_map:
+ default_map.update(ctx.default_map)
+ default_map.update(config)
+
+ ctx.default_map = default_map
return value
@click.option(
"--config",
type=click.Path(
- exists=False, file_okay=True, dir_okay=False, readable=True, allow_dash=False
+ exists=True,
+ file_okay=True,
+ dir_okay=False,
+ readable=True,
+ allow_dash=False,
+ path_type=str,
),
is_eager=True,
callback=read_pyproject_toml,
"""
container: Optional[LN] = container_of(leaf)
while container is not None and container.type != token.ENDMARKER:
- is_fmt_on = False
- for comment in list_comments(container.prefix, is_endmarker=False):
- if comment.value in FMT_ON:
- is_fmt_on = True
- elif comment.value in FMT_OFF:
- is_fmt_on = False
- if is_fmt_on:
+ if fmt_on(container):
return
- yield container
+ # fix for fmt: on in children
+ if contains_fmt_on_at_column(container, leaf.column):
+ for child in container.children:
+ if contains_fmt_on_at_column(child, leaf.column):
+ return
+ yield child
+ else:
+ yield container
+ container = container.next_sibling
+
+
+def fmt_on(container: LN) -> bool:
+ is_fmt_on = False
+ for comment in list_comments(container.prefix, is_endmarker=False):
+ if comment.value in FMT_ON:
+ is_fmt_on = True
+ elif comment.value in FMT_OFF:
+ is_fmt_on = False
+ return is_fmt_on
+
+
+def contains_fmt_on_at_column(container: LN, column: int) -> bool:
+ for child in container.children:
+ if (
+ isinstance(child, Node)
+ and first_leaf_column(child) == column
+ or isinstance(child, Leaf)
+ and child.column == column
+ ):
+ if fmt_on(child):
+ return True
+
+ return False
+
- container = container.next_sibling
+def first_leaf_column(node: Node) -> Optional[int]:
+ for child in node.children:
+ if isinstance(child, Leaf):
+ return child.column
+ return None
def maybe_make_parens_invisible_in_atom(node: LN, parent: LN) -> bool: