Skip to content

Commit

Permalink
Switch from attrs to dataclasses
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 committed Oct 29, 2019
1 parent 6bedb5c commit c4a52e1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Pipfile
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.

33 changes: 20 additions & 13 deletions black.py
Expand Up @@ -39,7 +39,7 @@
)

from appdirs import user_cache_dir
from attr import dataclass, evolve, Factory
from dataclasses import dataclass, field
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,12 @@ 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 = FileMode(
mode.target_versions,
mode.line_length,
mode.string_normalization,
is_pyi=True,
)

then = datetime.utcfromtimestamp(src.stat().st_mtime)
with open(src, "rb") as buf:
Expand Down Expand Up @@ -1028,11 +1033,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 +1165,11 @@ 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)
comments: Dict[LeafID, List[Leaf]] = field(
default_factory=dict
) # keys ordered like `leaves`
bracket_tracker: BracketTracker = field(default_factory=BracketTracker)
inside_brackets: bool = False
should_explode: bool = False

Expand Down Expand Up @@ -1565,7 +1572,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 +1686,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 +1851,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
3 changes: 2 additions & 1 deletion setup.py
Expand Up @@ -42,7 +42,8 @@ def get_long_description() -> str:
"typed-ast>=1.4.0",
"regex",
"pathspec>=0.6, <1",
],
]
+ (["dataclasses>=0.6"] if sys.version_info < (3, 7) else []),
extras_require={"d": ["aiohttp>=3.3.2", "aiohttp-cors"]},
test_suite="tests.test_black",
classifiers=[
Expand Down

0 comments on commit c4a52e1

Please sign in to comment.