Skip to content

Commit 71b52a0

Browse files
authored
Move remaining utility functions (#61)
1 parent 74302d6 commit 71b52a0

File tree

11 files changed

+118
-123
lines changed

11 files changed

+118
-123
lines changed

src/blurb/_add.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@
88
import sys
99
import tempfile
1010

11-
from blurb._blurb_file import Blurbs
11+
from blurb._blurb_file import BlurbError, Blurbs
1212
from blurb._cli import subcommand,error,prompt
1313
from blurb._git import flush_git_add_files, git_add_files
1414
from blurb._template import sections, template
15-
from blurb.blurb import BlurbError
1615

1716
TYPE_CHECKING = False
1817
if TYPE_CHECKING:

src/blurb/_blurb_file.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,19 @@
8181

8282
import os
8383
import re
84+
import time
8485

8586
from blurb._template import sanitize_section, sections, unsanitize_section
86-
from blurb._utils.text import textwrap_body
87-
from blurb.blurb import BlurbError, sortable_datetime, nonceify
87+
from blurb._utils.text import generate_nonce, textwrap_body
8888

8989
root = None # Set by chdir_to_repo_root()
9090
lowest_possible_gh_issue_number = 32426
9191

9292

93+
class BlurbError(RuntimeError):
94+
pass
95+
96+
9397
class Blurbs(list):
9498
def parse(self, text: str, *, metadata: dict[str, str] | None = None,
9599
filename: str = 'input') -> None:
@@ -258,7 +262,7 @@ def ensure_metadata(self) -> None:
258262
('gh-issue', '0'),
259263
('bpo', '0'),
260264
('date', sortable_datetime()),
261-
('nonce', nonceify(body)),
265+
('nonce', generate_nonce(body)),
262266
):
263267
if name not in metadata:
264268
metadata[name] = default
@@ -287,3 +291,7 @@ def save_next(self) -> str:
287291
filename = blurb._extract_next_filename()
288292
blurb.save(filename)
289293
return filename
294+
295+
296+
def sortable_datetime() -> str:
297+
return time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())

src/blurb/_merge.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
from blurb._blurb_file import Blurbs
66
from blurb._cli import require_ok, subcommand
7+
from blurb._utils.globs import glob_blurbs
78
from blurb._utils.text import textwrap_body
89
from blurb._versions import glob_versions, printable_version
9-
from blurb.blurb import glob_blurbs
1010

1111
original_dir: str = os.getcwd()
1212

src/blurb/_release.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import os
44
import time
55

6-
import blurb.blurb
6+
import blurb._blurb_file
77
from blurb._blurb_file import Blurbs
88
from blurb._cli import error, subcommand
99
from blurb._git import (flush_git_add_files, flush_git_rm_files,
1010
git_rm_files, git_add_files)
11-
from blurb.blurb import glob_blurbs, nonceify
11+
from blurb._utils.globs import glob_blurbs
12+
from blurb._utils.text import generate_nonce
1213

1314

1415
@subcommand
@@ -20,7 +21,7 @@ def release(version: str) -> None:
2021
if version == '.':
2122
# harvest version number from dirname of repo
2223
# I remind you, we're in the Misc subdir right now
23-
version = os.path.basename(blurb.blurb.root)
24+
version = os.path.basename(blurb._blurb_file.root)
2425

2526
existing_filenames = glob_blurbs(version)
2627
if existing_filenames:
@@ -34,7 +35,7 @@ def release(version: str) -> None:
3435
if not filenames:
3536
print(f'No blurbs found. Setting {version} as having no changes.')
3637
body = f'There were no new changes in version {version}.\n'
37-
metadata = {'no changes': 'True', 'gh-issue': '0', 'section': 'Library', 'date': date, 'nonce': nonceify(body)}
38+
metadata = {'no changes': 'True', 'gh-issue': '0', 'section': 'Library', 'date': date, 'nonce': generate_nonce(body)}
3839
blurbs.append((metadata, body))
3940
else:
4041
count = len(filenames)

src/blurb/_utils/globs.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import glob
2+
import os
3+
4+
from blurb._template import (
5+
next_filename_unsanitize_sections, sanitize_section,
6+
sanitize_section_legacy, sections,
7+
)
8+
9+
10+
def glob_blurbs(version: str) -> list[str]:
11+
filenames = []
12+
base = os.path.join('Misc', 'NEWS.d', version)
13+
if version != 'next':
14+
wildcard = f'{base}.rst'
15+
filenames.extend(glob.glob(wildcard))
16+
else:
17+
sanitized_sections = set(map(sanitize_section, sections))
18+
sanitized_sections |= set(map(sanitize_section_legacy, sections))
19+
for section in sanitized_sections:
20+
wildcard = os.path.join(base, section, '*.rst')
21+
entries = glob.glob(wildcard)
22+
deletables = [x for x in entries if x.endswith('/README.rst')]
23+
for filename in deletables:
24+
entries.remove(filename)
25+
filenames.extend(entries)
26+
filenames.sort(reverse=True, key=next_filename_unsanitize_sections)
27+
return filenames

src/blurb/_utils/text.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
import base64
4+
import hashlib
35
import itertools
46
import textwrap
57

@@ -97,3 +99,8 @@ def textwrap_body(body: str | Iterable[str], *, subsequent_indent: str = '') ->
9799
if not text.endswith('\n'):
98100
text += '\n'
99101
return text
102+
103+
104+
def generate_nonce(body: str) -> str:
105+
digest = hashlib.md5(body.encode('utf-8')).digest()
106+
return base64.urlsafe_b64encode(digest)[0:6].decode('ascii')

src/blurb/blurb.py

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -39,51 +39,8 @@
3939
#
4040
# automatic git adds and removes
4141

42-
import base64
43-
import glob
44-
import hashlib
45-
import os
4642
import sys
47-
import time
4843

49-
from blurb._template import (
50-
next_filename_unsanitize_sections, sanitize_section,
51-
sanitize_section_legacy, sections,
52-
)
53-
54-
def sortable_datetime():
55-
return time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
56-
57-
58-
def nonceify(body):
59-
digest = hashlib.md5(body.encode("utf-8")).digest()
60-
return base64.urlsafe_b64encode(digest)[0:6].decode('ascii')
61-
62-
63-
def glob_blurbs(version):
64-
filenames = []
65-
base = os.path.join("Misc", "NEWS.d", version)
66-
if version != "next":
67-
wildcard = base + ".rst"
68-
filenames.extend(glob.glob(wildcard))
69-
else:
70-
sanitized_sections = (
71-
{sanitize_section(section) for section in sections} |
72-
{sanitize_section_legacy(section) for section in sections}
73-
)
74-
for section in sanitized_sections:
75-
wildcard = os.path.join(base, section, "*.rst")
76-
entries = glob.glob(wildcard)
77-
deletables = [x for x in entries if x.endswith("/README.rst")]
78-
for filename in deletables:
79-
entries.remove(filename)
80-
filenames.extend(entries)
81-
filenames.sort(reverse=True, key=next_filename_unsanitize_sections)
82-
return filenames
83-
84-
85-
class BlurbError(RuntimeError):
86-
pass
8744

8845
def error(*a):
8946
s = " ".join(str(x) for x in a)
File renamed without changes.

tests/test_blurb.py

Lines changed: 0 additions & 68 deletions
This file was deleted.

tests/test_blurb_file.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
import time_machine
33

44
import blurb._blurb_file
5-
from blurb._blurb_file import Blurbs
6-
from blurb.blurb import BlurbError
5+
from blurb._blurb_file import Blurbs, BlurbError, sortable_datetime
76

87

98
@pytest.mark.parametrize(
@@ -146,3 +145,8 @@ def test_parse_no_body(contents, expected_error):
146145
# Act / Assert
147146
with pytest.raises(BlurbError, match=expected_error):
148147
blurbs.parse(contents)
148+
149+
150+
@time_machine.travel("2025-01-07 16:28:41")
151+
def test_sortable_datetime():
152+
assert sortable_datetime() == "2025-01-07-16-28-41"

0 commit comments

Comments
 (0)