Skip to content

Commit

Permalink
Switch from attrs to dataclasses (#1116)
Browse files Browse the repository at this point in the history
The main motivation here is that mypyc is going to have custom support
for dataclasses but probably not attrs.
  • Loading branch information
msullivan authored and JelleZijlstra committed Oct 30, 2019
1 parent 6bedb5c commit 31f4105
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ name = "pypi"

[packages]
aiohttp = ">=3.3.2"
attrs = ">=18.1.0"
click = ">=6.5"
appdirs = "*"
toml = ">=0.9.4"
Expand All @@ -14,6 +13,7 @@ aiohttp-cors = "*"
typed-ast = "==1.4.0"
regex = ">=2019.8"
pathspec = ">=0.6"
dataclasses = {version = ">=0.6", python_version = "< 3.7"}

[dev-packages]
pre-commit = "*"
Expand Down
10 changes: 9 additions & 1 deletion Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 15 additions & 14 deletions black.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
)

from appdirs import user_cache_dir
from attr import dataclass, evolve, Factory
from dataclasses import dataclass, field, replace
import click
import toml
from typed_ast import ast3, ast27
Expand Down Expand Up @@ -185,7 +185,7 @@ class Feature(Enum):

@dataclass
class FileMode:
target_versions: Set[TargetVersion] = Factory(set)
target_versions: Set[TargetVersion] = field(default_factory=set)
line_length: int = DEFAULT_LINE_LENGTH
string_normalization: bool = True
is_pyi: bool = False
Expand Down Expand Up @@ -629,7 +629,7 @@ def format_file_in_place(
`mode` and `fast` options are passed to :func:`format_file_contents`.
"""
if src.suffix == ".pyi":
mode = evolve(mode, is_pyi=True)
mode = replace(mode, is_pyi=True)

then = datetime.utcfromtimestamp(src.stat().st_mtime)
with open(src, "rb") as buf:
Expand Down Expand Up @@ -1028,11 +1028,11 @@ class BracketTracker:
"""Keeps track of brackets on a line."""

depth: int = 0
bracket_match: Dict[Tuple[Depth, NodeType], Leaf] = Factory(dict)
delimiters: Dict[LeafID, Priority] = Factory(dict)
bracket_match: Dict[Tuple[Depth, NodeType], Leaf] = field(default_factory=dict)
delimiters: Dict[LeafID, Priority] = field(default_factory=dict)
previous: Optional[Leaf] = None
_for_loop_depths: List[int] = Factory(list)
_lambda_argument_depths: List[int] = Factory(list)
_for_loop_depths: List[int] = field(default_factory=list)
_lambda_argument_depths: List[int] = field(default_factory=list)

def mark(self, leaf: Leaf) -> None:
"""Mark `leaf` with bracket-related metadata. Keep track of delimiters.
Expand Down Expand Up @@ -1160,9 +1160,10 @@ class Line:
"""Holds leaves and comments. Can be printed with `str(line)`."""

depth: int = 0
leaves: List[Leaf] = Factory(list)
comments: Dict[LeafID, List[Leaf]] = Factory(dict) # keys ordered like `leaves`
bracket_tracker: BracketTracker = Factory(BracketTracker)
leaves: List[Leaf] = field(default_factory=list)
# keys ordered like `leaves`
comments: Dict[LeafID, List[Leaf]] = field(default_factory=dict)
bracket_tracker: BracketTracker = field(default_factory=BracketTracker)
inside_brackets: bool = False
should_explode: bool = False

Expand Down Expand Up @@ -1565,7 +1566,7 @@ class EmptyLineTracker:
is_pyi: bool = False
previous_line: Optional[Line] = None
previous_after: int = 0
previous_defs: List[int] = Factory(list)
previous_defs: List[int] = field(default_factory=list)

def maybe_empty_lines(self, current_line: Line) -> Tuple[int, int]:
"""Return the number of extra empty lines before and after the `current_line`.
Expand Down Expand Up @@ -1679,7 +1680,7 @@ class LineGenerator(Visitor[Line]):

is_pyi: bool = False
normalize_strings: bool = True
current_line: Line = Factory(Line)
current_line: Line = field(default_factory=Line)
remove_u_prefix: bool = False

def line(self, indent: int = 0) -> Iterator[Line]:
Expand Down Expand Up @@ -1844,7 +1845,7 @@ def visit_factor(self, node: Node) -> Iterator[Line]:
node.insert_child(index, Node(syms.atom, [lpar, operand, rpar]))
yield from self.visit_default(node)

def __attrs_post_init__(self) -> None:
def __post_init__(self) -> None:
"""You are in a twisty little maze of passages."""
v = self.visit_stmt
Ø: Set[str] = set()
Expand Down Expand Up @@ -3712,7 +3713,7 @@ def _v(node: Union[ast.AST, ast3.AST, ast27.AST], depth: int = 0) -> Iterator[st

yield f"{' ' * depth}{node.__class__.__name__}("

for field in sorted(node._fields):
for field in sorted(node._fields): # noqa: F402
# TypeIgnore has only one field 'lineno' which breaks this comparison
type_ignore_classes = (ast3.TypeIgnore, ast27.TypeIgnore)
if sys.version_info >= (3, 8):
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ def get_long_description() -> str:
"typed-ast>=1.4.0",
"regex",
"pathspec>=0.6, <1",
"dataclasses>=0.6; python_version < '3.7'",
],
extras_require={"d": ["aiohttp>=3.3.2", "aiohttp-cors"]},
test_suite="tests.test_black",
Expand Down

0 comments on commit 31f4105

Please sign in to comment.