Skip to content

Commit 2670e95

Browse files
Enable "FA" rules in ruff and apply UP rules to migrate syntax
1 parent d821b76 commit 2670e95

File tree

4 files changed

+80
-70
lines changed

4 files changed

+80
-70
lines changed

pins/boards.py

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import functools
24
import inspect
35
import logging
@@ -7,7 +9,7 @@
79
from datetime import datetime, timedelta
810
from io import IOBase
911
from pathlib import Path
10-
from typing import Mapping, Optional, Protocol, Sequence
12+
from typing import Mapping, Protocol, Sequence
1113

1214
from importlib_resources import files
1315

@@ -23,7 +25,7 @@
2325

2426

2527
class IFileSystem(Protocol):
26-
protocol: "str | list"
28+
protocol: str | list
2729

2830
def ls(self, path: str) -> Sequence[str]: ...
2931

@@ -47,11 +49,11 @@ class BaseBoard:
4749

4850
def __init__(
4951
self,
50-
board: "str | Path",
52+
board: str | Path,
5153
fs: IFileSystem,
5254
versioned=True,
5355
meta_factory=MetaFactory(),
54-
allow_pickle_read: "bool | None" = None,
56+
allow_pickle_read: bool | None = None,
5557
):
5658
self.board = str(board)
5759
self.fs = fs
@@ -81,7 +83,7 @@ def pin_versions(self, name: str, as_df: bool = True) -> Sequence[VersionRaw]:
8183
"""
8284

8385
if not self.pin_exists(name):
84-
raise PinsError("Cannot check version, since pin %s does not exist" % name)
86+
raise PinsError(f"Cannot check version, since pin {name} does not exist")
8587

8688
detail = isinstance(self, BoardRsConnect)
8789

@@ -170,7 +172,7 @@ def pin_list(self):
170172

171173
return [name for name in pin_names if name not in self.reserved_pin_names]
172174

173-
def pin_fetch(self, name: str, version: Optional[str] = None) -> Meta:
175+
def pin_fetch(self, name: str, version: str | None = None) -> Meta:
174176
meta = self.pin_meta(name, version)
175177

176178
# TODO: sanity check caching (since R pins does a cache touch here)
@@ -182,7 +184,7 @@ def pin_fetch(self, name: str, version: Optional[str] = None) -> Meta:
182184
# so they could pin_fetch and then examine the result, a la pin_download
183185
return meta
184186

185-
def pin_read(self, name, version: Optional[str] = None, hash: Optional[str] = None):
187+
def pin_read(self, name, version: str | None = None, hash: str | None = None):
186188
"""Return the data stored in a pin.
187189
188190
Parameters
@@ -216,13 +218,13 @@ def pin_read(self, name, version: Optional[str] = None, hash: Optional[str] = No
216218
def _pin_store(
217219
self,
218220
x,
219-
name: Optional[str] = None,
220-
type: Optional[str] = None,
221-
title: Optional[str] = None,
222-
description: Optional[str] = None,
223-
metadata: Optional[Mapping] = None,
224-
versioned: Optional[bool] = None,
225-
created: Optional[datetime] = None,
221+
name: str | None = None,
222+
type: str | None = None,
223+
title: str | None = None,
224+
description: str | None = None,
225+
metadata: Mapping | None = None,
226+
versioned: bool | None = None,
227+
created: datetime | None = None,
226228
) -> Meta:
227229
if type == "feather":
228230
warn_deprecated(
@@ -301,13 +303,13 @@ def _pin_store(
301303
def pin_write(
302304
self,
303305
x,
304-
name: Optional[str] = None,
305-
type: Optional[str] = None,
306-
title: Optional[str] = None,
307-
description: Optional[str] = None,
308-
metadata: Optional[Mapping] = None,
309-
versioned: Optional[bool] = None,
310-
created: Optional[datetime] = None,
306+
name: str | None = None,
307+
type: str | None = None,
308+
title: str | None = None,
309+
description: str | None = None,
310+
metadata: Mapping | None = None,
311+
versioned: bool | None = None,
312+
created: datetime | None = None,
311313
) -> Meta:
312314
"""Write a pin object to the board.
313315
@@ -386,7 +388,7 @@ def pin_download(self, name, version=None, hash=None) -> Sequence[str]:
386388

387389
def pin_upload(
388390
self,
389-
paths: "str | list[str]",
391+
paths: str | list[str],
390392
name=None,
391393
title=None,
392394
description=None,
@@ -440,7 +442,7 @@ def pin_version_delete(self, name: str, version: str):
440442
pin_version_path = self.construct_path([pin_name, version])
441443
self.fs.rm(pin_version_path, recursive=True)
442444

443-
def pin_versions_prune(self, name, n: "int | None" = None, days: "int | None" = None):
445+
def pin_versions_prune(self, name, n: int | None = None, days: int | None = None):
444446
"""Delete old versions of a pin.
445447
446448
Parameters
@@ -534,7 +536,7 @@ def pin_search(self, search=None, as_df=True):
534536
# looks with meta objects in it.
535537
return res
536538

537-
def pin_delete(self, names: "str | Sequence[str]"):
539+
def pin_delete(self, names: str | Sequence[str]):
538540
"""Delete a pin (or pins), removing it from the board.
539541
540542
Parameters
@@ -548,7 +550,7 @@ def pin_delete(self, names: "str | Sequence[str]"):
548550

549551
for name in names:
550552
if not self.pin_exists(name):
551-
raise PinsError("Cannot delete pin, since pin %s does not exist" % name)
553+
raise PinsError(f"Cannot delete pin, since pin {name} does not exist")
552554

553555
path_to_pin = self.construct_path([self.path_to_pin(name)])
554556
self.fs.rm(path_to_pin, recursive=True)
@@ -611,14 +613,14 @@ def prepare_pin_version(
611613
self,
612614
pin_dir_path,
613615
x,
614-
name: Optional[str] = None,
615-
type: Optional[str] = None,
616-
title: Optional[str] = None,
617-
description: Optional[str] = None,
618-
metadata: Optional[Mapping] = None,
619-
versioned: Optional[bool] = None,
620-
created: Optional[datetime] = None,
621-
object_name: Optional[str] = None,
616+
name: str | None = None,
617+
type: str | None = None,
618+
title: str | None = None,
619+
description: str | None = None,
620+
metadata: Mapping | None = None,
621+
versioned: bool | None = None,
622+
created: datetime | None = None,
623+
object_name: str | None = None,
622624
):
623625
meta = self._create_meta(
624626
pin_dir_path,
@@ -642,14 +644,14 @@ def _create_meta(
642644
self,
643645
pin_dir_path,
644646
x,
645-
name: Optional[str] = None,
646-
type: Optional[str] = None,
647-
title: Optional[str] = None,
648-
description: Optional[str] = None,
649-
metadata: Optional[Mapping] = None,
650-
versioned: Optional[bool] = None,
651-
created: Optional[datetime] = None,
652-
object_name: Optional[str] = None,
647+
name: str | None = None,
648+
type: str | None = None,
649+
title: str | None = None,
650+
description: str | None = None,
651+
metadata: Mapping | None = None,
652+
versioned: bool | None = None,
653+
created: datetime | None = None,
654+
object_name: str | None = None,
653655
):
654656
if name is None:
655657
raise NotImplementedError("Name must be specified.")
@@ -933,9 +935,7 @@ def pin_list(self):
933935
return names
934936

935937
@ExtendMethodDoc
936-
def pin_write(
937-
self, *args, access_type=None, versioned: Optional[bool] = None, **kwargs
938-
):
938+
def pin_write(self, *args, access_type=None, versioned: bool | None = None, **kwargs):
939939
"""Write a pin.
940940
941941
Extends parent method in the following ways:
@@ -1121,7 +1121,7 @@ def path_to_deploy_version(self, name: str, version: str):
11211121
def user_name(self):
11221122
return self.fs.api.get_user()["username"]
11231123

1124-
def prepare_pin_version(self, pin_dir_path, x, name: "str | None", *args, **kwargs):
1124+
def prepare_pin_version(self, pin_dir_path, x, name: str | None, *args, **kwargs):
11251125
# RSC pin names can have form <user_name>/<name>, but this will try to
11261126
# create the object in a directory named <user_name>. So we grab just
11271127
# the <name> part.

pins/meta.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from __future__ import annotations
2+
13
from dataclasses import InitVar, asdict, dataclass, field, fields
24
from pathlib import Path
3-
from typing import ClassVar, List, Mapping, Optional, Sequence, Union
5+
from typing import ClassVar, Mapping, Sequence
46

57
import yaml
68

@@ -24,7 +26,7 @@ class MetaRaw:
2426
The type of pin data stored. This is used to determine how to read / write it.
2527
"""
2628

27-
file: "str | Sequence[str] | None"
29+
file: str | Sequence[str] | None
2830
type: str
2931
name: str
3032

@@ -63,16 +65,16 @@ class Meta:
6365
6466
"""
6567

66-
_excluded: ClassVar["set[str]"] = {"name", "version", "local"}
68+
_excluded: ClassVar[set[str]] = {"name", "version", "local"}
6769

68-
title: Optional[str]
69-
description: Optional[str]
70+
title: str | None
71+
description: str | None
7072

7173
# TODO(defer): different from R pins, which has a local field
7274
created: str
7375
pin_hash: str
7476

75-
file: Union[str, Sequence[str]]
77+
file: str | Sequence[str]
7678
file_size: int
7779
type: str
7880

@@ -84,14 +86,14 @@ class Meta:
8486
# pin_hash, created, etc.."
8587
version: VersionRaw
8688

87-
tags: Optional[List[str]] = None
88-
name: Optional[str] = None
89+
tags: list[str] | None = None
90+
name: str | None = None
8991
user: Mapping = field(default_factory=dict)
9092
local: Mapping = field(default_factory=dict)
9193

92-
unknown_fields: InitVar["dict | None"] = None
94+
unknown_fields: InitVar[dict | None] = None
9395

94-
def __post_init__(self, unknown_fields: "dict | None"):
96+
def __post_init__(self, unknown_fields: dict | None):
9597
unknown_fields = {} if unknown_fields is None else unknown_fields
9698

9799
self._unknown_fields = unknown_fields
@@ -119,7 +121,7 @@ def to_pin_dict(self):
119121
return d
120122

121123
@classmethod
122-
def from_pin_dict(cls, data, pin_name, version, local=None) -> "Meta":
124+
def from_pin_dict(cls, data, pin_name, version, local=None) -> Meta:
123125
# TODO: re-arrange Meta argument positions to reflect what's been
124126
# learned about default arguments. e.g. title was not used at some
125127
# point in api_version 1
@@ -142,17 +144,17 @@ def from_pin_dict(cls, data, pin_name, version, local=None) -> "Meta":
142144
unknown_fields=unknown,
143145
)
144146

145-
def to_pin_yaml(self, f: Optional[IOBase] = None) -> "str | None":
147+
def to_pin_yaml(self, f: IOBase | None = None) -> str | None:
146148
data = self.to_pin_dict()
147149

148150
return yaml.dump(data, f)
149151

150152

151153
@dataclass
152154
class MetaV0:
153-
file: Union[str, Sequence[str]]
155+
file: str | Sequence[str]
154156
type: str
155-
description: "str | None"
157+
description: str | None
156158

157159
name: str
158160

@@ -173,7 +175,7 @@ def to_dict(self):
173175
return asdict(self)
174176

175177
@classmethod
176-
def from_pin_dict(cls, data, pin_name, version, local=None) -> "MetaV0":
178+
def from_pin_dict(cls, data, pin_name, version, local=None) -> MetaV0:
177179
# could infer from dataclasses.fields(), but seems excessive.
178180
req_fields = {"type", "description"}
179181

@@ -205,13 +207,13 @@ def get_meta_name(self, *args, **kwargs) -> str:
205207

206208
def get_version_for_meta(self, api_version) -> Version:
207209
if api_version != 1:
208-
raise NotImplementedError("Unsupported api_version: %s" % api_version)
210+
raise NotImplementedError(f"Unsupported api_version: {api_version}")
209211

210212
return Version
211213

212214
def create(
213215
self,
214-
base_folder: "str | Path",
216+
base_folder: str | Path,
215217
files: Sequence[StrOrFile],
216218
type,
217219
# TODO: when files is a string name should be okay as None
@@ -266,7 +268,7 @@ def read_pin_yaml(
266268
self,
267269
f: IOBase,
268270
pin_name: str,
269-
version: "str | VersionRaw",
271+
version: str | VersionRaw,
270272
local=None,
271273
) -> Meta:
272274
if isinstance(version, str):

pins/versions.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
from __future__ import annotations
2+
13
import logging
24
from dataclasses import asdict, dataclass
35
from datetime import datetime
4-
from typing import Mapping, Sequence, Union
6+
from typing import Mapping, Sequence
57

68
from xxhash import xxh64
79

@@ -64,12 +66,12 @@ def hash_file(f: IOBase, block_size: int = -1) -> str:
6466
return hasher.hexdigest()
6567

6668
@classmethod
67-
def from_string(cls, version: str) -> "Version":
69+
def from_string(cls, version: str) -> Version:
6870
parts = version.split("-")
6971

7072
if len(parts) != 2:
7173
raise PinsVersionError(
72-
"version string can only have 1 '-', but contains %s" % len(parts)
74+
f"version string can only have 1 '-', but contains {len(parts)}"
7375
)
7476

7577
dt_string, hash_ = parts
@@ -79,7 +81,7 @@ def from_string(cls, version: str) -> "Version":
7981
try:
8082
created = cls.parse_created(dt_string)
8183
except ValueError:
82-
raise PinsVersionError("Invalid date part of version: " % dt_string)
84+
raise PinsVersionError("Invalid date part of version: ".format())
8385

8486
obj = cls(created, hash_)
8587

@@ -93,8 +95,8 @@ def from_string(cls, version: str) -> "Version":
9395

9496
@classmethod
9597
def from_files(
96-
cls, files: Sequence[StrOrFile], created: Union[datetime, None] = None
97-
) -> "Version":
98+
cls, files: Sequence[StrOrFile], created: datetime | None = None
99+
) -> Version:
98100
hashes = []
99101
for f in files:
100102
hash_ = cls.hash_file(open(f, "rb") if isinstance(f, str) else f)

pyproject.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,11 @@ line-length = 90
120120
extend-exclude = ["docs"]
121121

122122
[tool.ruff.lint]
123-
select = ["E", "F", "I", "W"]
123+
select = [
124+
"E", # Style
125+
"F", # Errors
126+
"FA", # Use from __future__ import annotations for cleaner type hints
127+
"I", # Import sorting
128+
"W", # Style
129+
]
124130
ignore = ["E501"]

0 commit comments

Comments
 (0)