liblaf-cherries 0.1.6__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. liblaf/cherries/__init__.pyi +8 -87
  2. liblaf/cherries/_entrypoint.py +56 -0
  3. liblaf/cherries/_version.py +2 -2
  4. liblaf/cherries/config/_asset.py +3 -3
  5. liblaf/cherries/core/__init__.pyi +14 -6
  6. liblaf/cherries/core/_impl.py +58 -0
  7. liblaf/cherries/core/_plugin.py +96 -0
  8. liblaf/cherries/core/_run.py +42 -0
  9. liblaf/cherries/core/_spec.py +53 -159
  10. liblaf/cherries/core/typed.py +2 -0
  11. liblaf/cherries/meta/_git.py +3 -3
  12. liblaf/cherries/meta/_name.py +3 -3
  13. liblaf/cherries/{pathutils → paths}/_path.py +9 -7
  14. liblaf/cherries/plugins/__init__.pyi +3 -0
  15. liblaf/cherries/plugins/logging.py +25 -0
  16. liblaf/cherries/profiles/__init__.pyi +13 -0
  17. liblaf/cherries/profiles/_abc.py +10 -0
  18. liblaf/cherries/profiles/_default.py +12 -0
  19. liblaf/cherries/profiles/_factory.py +21 -0
  20. liblaf/cherries/profiles/_playground.py +13 -0
  21. {liblaf_cherries-0.1.6.dist-info → liblaf_cherries-0.2.0.dist-info}/METADATA +5 -3
  22. liblaf_cherries-0.2.0.dist-info/RECORD +43 -0
  23. liblaf/cherries/_run.py +0 -51
  24. liblaf/cherries/core/_exp.py +0 -119
  25. liblaf/cherries/integration/__init__.pyi +0 -72
  26. liblaf/cherries/integration/_abc.py +0 -144
  27. liblaf/cherries/integration/_exp.py +0 -109
  28. liblaf/cherries/integration/comet.py +0 -142
  29. liblaf/cherries/integration/dvc.py +0 -51
  30. liblaf/cherries/integration/git.py +0 -44
  31. liblaf/cherries/integration/logging.py +0 -45
  32. liblaf/cherries/presets/__init__.pyi +0 -5
  33. liblaf/cherries/presets/_default.py +0 -46
  34. liblaf/cherries/presets/_playground.py +0 -11
  35. liblaf/cherries/presets/typed.py +0 -5
  36. liblaf_cherries-0.1.6.dist-info/RECORD +0 -44
  37. /liblaf/cherries/{integration → paths}/__init__.py +0 -0
  38. /liblaf/cherries/{pathutils → paths}/__init__.pyi +0 -0
  39. /liblaf/cherries/{pathutils → paths}/_convert.py +0 -0
  40. /liblaf/cherries/{pathutils → paths}/_special.py +0 -0
  41. /liblaf/cherries/{pathutils → plugins}/__init__.py +0 -0
  42. /liblaf/cherries/{presets → profiles}/__init__.py +0 -0
  43. {liblaf_cherries-0.1.6.dist-info → liblaf_cherries-0.2.0.dist-info}/WHEEL +0 -0
  44. {liblaf_cherries-0.1.6.dist-info → liblaf_cherries-0.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,109 +0,0 @@
1
- import datetime
2
- import functools
3
- from os import PathLike
4
- from pathlib import Path
5
-
6
- import attrs
7
- import comet_ml as comet
8
-
9
- from liblaf.cherries import pathutils as _path
10
-
11
- from ._abc import (
12
- AddTag,
13
- AddTags,
14
- End,
15
- LogAsset,
16
- LogCode,
17
- LogMetric,
18
- LogMetrics,
19
- LogOther,
20
- LogOthers,
21
- LogParam,
22
- LogParams,
23
- Start,
24
- )
25
-
26
-
27
- @attrs.define
28
- class Experiment:
29
- add_tag: AddTag = attrs.field(factory=AddTag, init=False)
30
- add_tags: AddTags = attrs.field(factory=AddTags, init=False)
31
- end: End = attrs.field(factory=End, init=False)
32
- log_asset: LogAsset = attrs.field(factory=LogAsset, init=False)
33
- log_code: LogCode = attrs.field(factory=LogCode, init=False)
34
- log_metric: LogMetric = attrs.field(factory=LogMetric, init=False)
35
- log_metrics: LogMetrics = attrs.field(factory=LogMetrics, init=False)
36
- log_other: LogOther = attrs.field(factory=LogOther, init=False)
37
- log_others: LogOthers = attrs.field(factory=LogOthers, init=False)
38
- log_param: LogParam = attrs.field(factory=LogParam, init=False)
39
- log_params: LogParams = attrs.field(factory=LogParams, init=False)
40
- start: Start = attrs.field(factory=Start, init=False)
41
-
42
- @property
43
- def comet(self) -> comet.CometExperiment:
44
- return comet.get_running_experiment() # pyright: ignore[reportReturnType]
45
-
46
- @functools.cached_property
47
- def exp_dir(self) -> Path:
48
- return _path.exp_dir(absolute=True)
49
-
50
- @property
51
- def exp_key(self) -> str:
52
- return self.comet.get_key()
53
-
54
- @property
55
- def exp_name(self) -> str:
56
- return self.comet.get_name()
57
-
58
- @exp_name.setter
59
- def exp_name(self, value: str) -> None:
60
- self.comet.set_name(value)
61
-
62
- @property
63
- def exp_url(self) -> str:
64
- return self.comet.url # pyright: ignore[reportReturnType]
65
-
66
- @property
67
- def project_id(self) -> str:
68
- return self.comet.project_id # pyright: ignore[reportReturnType]
69
-
70
- @property
71
- def project_name(self) -> str:
72
- return self.comet.project_name
73
-
74
- @functools.cached_property
75
- def start_time(self) -> datetime.datetime:
76
- return datetime.datetime.now().astimezone()
77
-
78
- def log_input(self, path: PathLike, /, **kwargs) -> None:
79
- self.log_asset(path, prefix="inputs/", **kwargs)
80
-
81
- def log_output(self, path: PathLike, /, **kwargs) -> None:
82
- self.log_asset(path, prefix="outputs/", **kwargs)
83
-
84
-
85
- exp = Experiment()
86
- add_tag: AddTag = exp.add_tag
87
- add_tags: AddTags = exp.add_tags
88
- end: End = exp.end
89
- log_asset: LogAsset = exp.log_asset
90
- log_code: LogCode = exp.log_code
91
- log_metric: LogMetric = exp.log_metric
92
- log_metrics: LogMetrics = exp.log_metrics
93
- log_other: LogOther = exp.log_other
94
- log_others: LogOthers = exp.log_others
95
- log_param: LogParam = exp.log_param
96
- log_params: LogParams = exp.log_params
97
- start: Start = exp.start
98
-
99
-
100
- def current_exp() -> Experiment:
101
- return exp
102
-
103
-
104
- def log_input(path: PathLike, /, **kwargs) -> None:
105
- exp.log_input(path, **kwargs)
106
-
107
-
108
- def log_output(path: PathLike, /, **kwargs) -> None:
109
- exp.log_output(path, **kwargs)
@@ -1,142 +0,0 @@
1
- from collections.abc import Iterable, Mapping
2
- from pathlib import Path
3
- from typing import Any, override
4
- from unittest import mock
5
-
6
- import attrs
7
- import comet_ml as comet
8
- from loguru import logger
9
-
10
- from liblaf.cherries import meta
11
- from liblaf.cherries.typed import PathLike
12
-
13
- from . import _abc
14
-
15
-
16
- class Comet:
17
- @property
18
- def exp(self) -> comet.CometExperiment:
19
- exp: comet.CometExperiment | None = comet.get_running_experiment()
20
- if exp is None:
21
- exp = mock.MagicMock()
22
- return exp
23
-
24
-
25
- @attrs.define
26
- class AddTag(Comet, _abc.AddTag):
27
- @override
28
- def __call__(self, tag: str, **kwargs) -> None:
29
- self.exp.add_tag(tag)
30
-
31
-
32
- @attrs.define
33
- class AddTags(Comet, _abc.AddTags):
34
- @override
35
- def __call__(self, tags: Iterable[str], **kwargs) -> None:
36
- self.exp.add_tags(list(tags))
37
-
38
-
39
- @attrs.define
40
- class End(Comet, _abc.End):
41
- @override
42
- def __call__(self, **kwargs) -> None:
43
- comet.end()
44
-
45
-
46
- @attrs.define
47
- class LogAsset(Comet, _abc.LogAsset):
48
- @override
49
- def __call__(self, path: PathLike, prefix: str | None = None, **kwargs) -> None:
50
- path = Path(path)
51
- if (dvc_path := path.with_name(path.name + ".dvc")).exists():
52
- path = dvc_path
53
- if path.is_file():
54
- filename: str | None = f"{prefix}/{path.name}" if prefix else None
55
- self.exp.log_asset(path, file_name=filename, **kwargs)
56
- elif path.is_dir():
57
- self.exp.log_asset_folder(str(path), **kwargs)
58
- else:
59
- logger.warning("Neither file nor directory: {}", path)
60
-
61
-
62
- @attrs.define
63
- class LogCode(Comet, _abc.LogCode):
64
- @override
65
- def __call__(self, path: PathLike, **kwargs) -> None:
66
- path = Path(path)
67
- if path.is_file():
68
- self.exp.log_code(str(path), **kwargs)
69
- elif path.is_dir():
70
- self.exp.log_code(folder=str(path), **kwargs)
71
- else:
72
- logger.warning("Neither file nor directory: {}", path)
73
-
74
-
75
- @attrs.define
76
- class LogMetric(Comet, _abc.LogMetric):
77
- @override
78
- def __call__(
79
- self,
80
- name: str,
81
- value: float,
82
- step: int | None = None,
83
- epoch: int | None = None,
84
- **kwargs,
85
- ) -> None:
86
- self.exp.log_metric(name, value, step=step, epoch=epoch)
87
-
88
-
89
- @attrs.define
90
- class LogMetrics(Comet, _abc.LogMetrics):
91
- @override
92
- def __call__(
93
- self,
94
- metrics: Mapping[str, Any],
95
- step: int | None = None,
96
- epoch: int | None = None,
97
- **kwargs,
98
- ) -> None:
99
- self.exp.log_metrics(metrics, step=step, epoch=epoch) # pyright: ignore[reportArgumentType]
100
-
101
-
102
- @attrs.define
103
- class LogOther(Comet, _abc.LogOther):
104
- @override
105
- def __call__(self, key: str, value: Any, **kwargs) -> None:
106
- self.exp.log_other(key, value)
107
-
108
-
109
- @attrs.define
110
- class LogOthers(Comet, _abc.LogOthers):
111
- @override
112
- def __call__(self, others: Mapping[str, Any], **kwargs) -> None:
113
- self.exp.log_others(others) # pyright: ignore[reportArgumentType]
114
-
115
-
116
- @attrs.define
117
- class LogParam(Comet, _abc.LogParam):
118
- @override
119
- def __call__(self, name: str, value: Any, **kwargs) -> None:
120
- self.exp.log_parameter(name, value)
121
-
122
-
123
- @attrs.define
124
- class LogParams(Comet, _abc.LogParams):
125
- @override
126
- def __call__(self, params: Any, **kwargs: Any) -> None:
127
- self.exp.log_parameters(params)
128
-
129
-
130
- @attrs.define
131
- class Start(Comet, _abc.Start):
132
- text: bool = True
133
- jsonl: bool = False
134
-
135
- @override
136
- def __call__(self, **kwargs) -> None:
137
- comet.start(
138
- project_name=meta.project_name(),
139
- experiment_config=comet.ExperimentConfig(
140
- auto_output_logging="native", name=meta.exp_name()
141
- ),
142
- )
@@ -1,51 +0,0 @@
1
- import subprocess as sp
2
- from pathlib import Path
3
- from typing import override
4
-
5
- import attrs
6
- import git
7
- import git.exc
8
-
9
- from liblaf.cherries import pathutils as _path
10
- from liblaf.cherries.typed import PathLike
11
-
12
- from . import _abc
13
-
14
-
15
- @attrs.define
16
- class End(_abc.End):
17
- priority: int = attrs.field(default=-2, kw_only=True) # after logging
18
-
19
- @override
20
- def __call__(self, **kwargs) -> None:
21
- sp.run(["dvc", "status"], check=True)
22
- sp.run(["dvc", "push"], check=True)
23
-
24
-
25
- @attrs.define
26
- class LogAsset(_abc.LogAsset):
27
- priority: int = attrs.field(default=-1, kw_only=True) # before Comet
28
-
29
- @override
30
- def __call__(self, path: PathLike, prefix: str | None = None, **kwargs) -> None:
31
- path: Path = _path.as_path(path)
32
- if check_ignore(path) or tracked_by_git(path):
33
- return
34
- sp.run(["dvc", "add", "--quiet", path], check=True)
35
-
36
-
37
- def check_ignore(path: PathLike) -> bool:
38
- proc: sp.CompletedProcess[bytes] = sp.run(
39
- ["dvc", "check-ignore", "--quiet", path], check=False
40
- )
41
- return proc.returncode == 0
42
-
43
-
44
- def tracked_by_git(path: PathLike) -> bool:
45
- path: Path = _path.as_path(path).absolute()
46
- try:
47
- repo = git.Repo(search_parent_directories=True)
48
- repo.git.ls_files(path, error_unmatch=True)
49
- except git.exc.GitCommandError:
50
- return False
51
- return True
@@ -1,44 +0,0 @@
1
- from typing import override
2
-
3
- import attrs
4
-
5
- from liblaf.cherries import meta as _info
6
-
7
- from . import _abc
8
- from ._exp import exp
9
-
10
-
11
- @attrs.define
12
- class End(_abc.End):
13
- priority: int = attrs.field(default=-3, kw_only=True) # before dvc
14
- dry_run: bool = False
15
-
16
- @override
17
- def __call__(self, **kwargs) -> None:
18
- git_auto_commit(
19
- "chore(cherries): auto commit (on run end)", dry_run=self.dry_run
20
- )
21
-
22
-
23
- @attrs.define
24
- class Start(_abc.Start):
25
- dry_run: bool = False
26
-
27
- @override
28
- def __call__(self, **kwargs) -> None:
29
- git_auto_commit(
30
- "chore(cherries): auto commit (on run start)", dry_run=self.dry_run
31
- )
32
-
33
-
34
- def git_auto_commit(
35
- header: str = "chore(cherries): auto commit", *, dry_run: bool = False
36
- ) -> None:
37
- body: str = ""
38
- if exp.exp_name and exp.exp_url:
39
- body += f"🧪 View experiment {exp.exp_name} at: {exp.exp_url}\n"
40
- message: str = f"{header}\n\n{body}" if body else header
41
- _info.git_auto_commit(message, dry_run=dry_run)
42
- exp.log_other("cherries.git.branch", _info.git_branch())
43
- exp.log_other("cherries.git.sha", _info.git_commit_sha())
44
- exp.log_other("cherries.git.url", _info.git_commit_url())
@@ -1,45 +0,0 @@
1
- from typing import override
2
-
3
- import attrs
4
- import loguru
5
- from loguru import logger
6
-
7
- from liblaf import grapes
8
-
9
- from . import _abc
10
- from ._exp import exp
11
-
12
-
13
- @attrs.define
14
- class End(_abc.End):
15
- priority: int = attrs.field(default=-1, kw_only=True) # before Comet
16
- text: bool = True
17
- jsonl: bool = False
18
-
19
- @override
20
- def __call__(self, **kwargs) -> None:
21
- logger.complete()
22
- if self.text and (exp.exp_dir / "run.log").exists():
23
- exp.log_asset(exp.exp_dir / "run.log")
24
- if self.jsonl and (exp.exp_dir / "run.log.jsonl").exists():
25
- exp.log_asset(exp.exp_dir / "run.log.jsonl")
26
-
27
-
28
- @attrs.define
29
- class Start(_abc.Start):
30
- priority: int = attrs.field(default=-1, kw_only=True) # before Comet
31
- text: bool = True
32
- jsonl: bool = False
33
-
34
- @override
35
- def __call__(self, **kwargs) -> None:
36
- handlers: list[loguru.HandlerConfig] = [
37
- grapes.logging.rich_handler(enable_link=False)
38
- ]
39
- if self.text:
40
- handlers.append(grapes.logging.file_handler(sink=exp.exp_dir / "run.log"))
41
- if self.jsonl:
42
- handlers.append(
43
- grapes.logging.jsonl_handler(sink=exp.exp_dir / "run.log.jsonl")
44
- )
45
- grapes.init_logging(handlers=handlers)
@@ -1,5 +0,0 @@
1
- from ._default import default
2
- from ._playground import playground
3
- from .typed import Preset
4
-
5
- __all__ = ["Preset", "default", "playground"]
@@ -1,46 +0,0 @@
1
- from liblaf.cherries import integration
2
-
3
-
4
- def default(exp: integration.Experiment) -> integration.Experiment:
5
- exp.add_tag.add(
6
- integration.comet.AddTag(),
7
- )
8
- exp.add_tags.add(
9
- integration.comet.AddTags(),
10
- )
11
- exp.end.add(
12
- integration.git.End(),
13
- integration.dvc.End(),
14
- integration.logging.End(),
15
- integration.comet.End(),
16
- )
17
- exp.log_asset.add(
18
- integration.dvc.LogAsset(),
19
- integration.comet.LogAsset(),
20
- )
21
- exp.log_code.add(
22
- integration.comet.LogCode(),
23
- )
24
- exp.log_metric.add(
25
- integration.comet.LogMetric(),
26
- )
27
- exp.log_metrics.add(
28
- integration.comet.LogMetrics(),
29
- )
30
- exp.log_other.add(
31
- integration.comet.LogOther(),
32
- )
33
- exp.log_others.add(
34
- integration.comet.LogOthers(),
35
- )
36
- exp.log_param.add(
37
- integration.comet.LogParam(),
38
- )
39
- exp.log_params.add(
40
- integration.comet.LogParams(),
41
- )
42
- exp.start.add(
43
- integration.logging.Start(),
44
- integration.comet.Start(),
45
- )
46
- return integration.exp
@@ -1,11 +0,0 @@
1
- from liblaf.cherries import integration
2
-
3
-
4
- def playground(exp: integration.Experiment) -> integration.Experiment:
5
- exp.end.add(
6
- integration.logging.End(),
7
- )
8
- exp.start.add(
9
- integration.logging.Start(),
10
- )
11
- return integration.exp
@@ -1,5 +0,0 @@
1
- from collections.abc import Callable
2
-
3
- from liblaf.cherries import integration
4
-
5
- type Preset = Callable[[integration.Experiment], integration.Experiment]
@@ -1,44 +0,0 @@
1
- liblaf/cherries/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
2
- liblaf/cherries/__init__.pyi,sha256=XAiCE1ZKUkEHQ44ElWLnmxZXxyrWU4hVH1NA4SjISUo,2022
3
- liblaf/cherries/_run.py,sha256=9zbivlGOUc-S4Luu14FQeRP2fNSBDca8EkSYWaES5EQ,1479
4
- liblaf/cherries/_version.py,sha256=ESbJO0YD7TYfOUv_WDIJJgWELGepEWsoyhqVifEcXPA,511
5
- liblaf/cherries/_version.pyi,sha256=Pnv4Bxw13LHeuVkPLPsTtnp4N4jOGcAfFJw05uMMgBY,108
6
- liblaf/cherries/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- liblaf/cherries/typed.py,sha256=mim8QVtwczTSHyw5mhEdfFcXis9o32n0CZyu8BrEorE,50
8
- liblaf/cherries/config/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
9
- liblaf/cherries/config/__init__.pyi,sha256=1CMEQlPneeRXCG51KDUj6Zmqs0xzUF3gilqeuHPlsVc,359
10
- liblaf/cherries/config/_asset.py,sha256=7WEkyDxX4X389s0UqoBRbOtHOU9Dlh4NtAq9KXHXbPI,2485
11
- liblaf/cherries/config/_config.py,sha256=WPwwk-3O96FyHGb2W8__LDfHpXBHLQM44aOcrMPjDL4,171
12
- liblaf/cherries/core/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
13
- liblaf/cherries/core/__init__.pyi,sha256=E2YMg93kfxxO-g0CGyDOqkzTmVlSlHC7DRmu3AEm4_w,220
14
- liblaf/cherries/core/_exp.py,sha256=3kexCigujuHnO0NWSfa46FBwe0QGpAJtMW-WIphmAMA,2726
15
- liblaf/cherries/core/_spec.py,sha256=5rOhMgFTVhXhvOqJ4USWrYuuhOxIgyPdI5LFknpnMTs,5357
16
- liblaf/cherries/integration/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
17
- liblaf/cherries/integration/__init__.pyi,sha256=LSvxbLYdyYAsc8aR2OMYiEf0hku1L82q0ECqM6hk_UQ,1042
18
- liblaf/cherries/integration/_abc.py,sha256=0xsoAxxRAhBAOEx0qNx7THDVF8zdYuaAUHX7INe0r8U,3817
19
- liblaf/cherries/integration/_exp.py,sha256=gsCCqi551JP5EUHagpW29jHH1PSE7prfpMAuqKJn-9A,3048
20
- liblaf/cherries/integration/comet.py,sha256=BbY88hwo3rVphirYVSBSfQgs8z0UB9RNlCqK5wMUCRY,3709
21
- liblaf/cherries/integration/dvc.py,sha256=ClIyT-xj7jx_8knwdFKMzXH6Gq7lQnNWBzW8zycZB8g,1358
22
- liblaf/cherries/integration/git.py,sha256=GPRPpftlkDfb1z4oSQ6gRhnbPowKB0euOK8Ak4oAJpw,1209
23
- liblaf/cherries/integration/logging.py,sha256=lIjF_2PE6TGT-uFXAnQOnPZ4kP-e982yrGL03L4Gn3s,1267
24
- liblaf/cherries/meta/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
25
- liblaf/cherries/meta/__init__.pyi,sha256=kQFneP3IiV9rBIzpep_uX0z-5IRPrXkPmyNRt19j8fg,282
26
- liblaf/cherries/meta/_git.py,sha256=oy1xx23sXWA7RqQuLGc3HxcLCF7zHTSpZvZ9pukJGdI,1232
27
- liblaf/cherries/meta/_name.py,sha256=LskfsW0yv9WEAl8WqGFG3D82_mULulV5N9p9Ogjt7Q0,561
28
- liblaf/cherries/pathutils/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
29
- liblaf/cherries/pathutils/__init__.pyi,sha256=mr3Dk8ragpNGXmXJriMt21vc7YmqUD6X587exFe9tCI,413
30
- liblaf/cherries/pathutils/_convert.py,sha256=IrXN_9s-rfH7EKk0_ilr1giGmfN8FlvB_edm2kI-k3I,807
31
- liblaf/cherries/pathutils/_path.py,sha256=PLcVzBO6r99qspf5ZKqVtWm6mT8Ud5cUGsUkyJkTqyM,1548
32
- liblaf/cherries/pathutils/_special.py,sha256=b5D3PtW__u0Zpiv69OYoV7TTYc6Dgs4Bu-P8jwrROV4,1415
33
- liblaf/cherries/presets/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
34
- liblaf/cherries/presets/__init__.pyi,sha256=3ug6RF4DSBOEankXOEgotQw_E0fMvQ5yuhps7EHf6b0,139
35
- liblaf/cherries/presets/_default.py,sha256=-sm9IBvXP_JfWXUfZdwc9u5WcLOQXloDmBgwjiw2EPk,1095
36
- liblaf/cherries/presets/_playground.py,sha256=F0dphGgJ_6MD5mBGm0chrxWIufZtYgtt5c2l-TVPNso,260
37
- liblaf/cherries/presets/typed.py,sha256=LztTXKiiCD1NW1fb2Od6giaU0vaXdOidjsqxbTkIlJY,152
38
- liblaf/cherries/utils/__init__.py,sha256=OHb6Xou2v6u42swTgjRfzej4CIlRg4OmgOIQXUiRjKA,97
39
- liblaf/cherries/utils/__init__.pyi,sha256=F5aTcXpWVmUoctPbLfmQXKyuXYRspAIjaIzfL1_3Lrw,51
40
- liblaf/cherries/utils/_functools.py,sha256=0Puwvj1Wq4kp3S--hI-CXwUBZ56AtfkqIzFHllQtuug,181
41
- liblaf_cherries-0.1.6.dist-info/METADATA,sha256=CFvkztVl4GVLIuIgCvciRnt32SmNZcudEhRRPmGit9U,6194
42
- liblaf_cherries-0.1.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
43
- liblaf_cherries-0.1.6.dist-info/licenses/LICENSE,sha256=Ph4NzyU3lGVDeYv-mf8aRmImH8v9rVL9F362FV4G6Ow,1063
44
- liblaf_cherries-0.1.6.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes