Skip to content

Commit 69f85ec

Browse files
committed
fixes #1621
1 parent 16326e6 commit 69f85ec

4 files changed

Lines changed: 36 additions & 32 deletions

File tree

‎nbdev/config.py‎

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,16 @@
1111
'update_llms_txt', 'import_obj', 'write_cells']
1212

1313
# %% ../nbs/api/01_config.ipynb #6fd14ecd
14-
from datetime import datetime
1514
from fastcore.docments import *
1615
from fastcore.utils import *
1716
from fastcore.meta import *
1817
from fastcore.script import *
1918
from fastcore.style import *
2019
from fastcore.xdg import *
2120

22-
import ast,importlib,re,warnings
21+
import ast,importlib,re
2322
from IPython.display import Markdown
2423
from fastcore.nbio import read_nb,NbCell
25-
from urllib.error import HTTPError
2624

2725
try: import tomllib
2826
except ImportError: import tomli as tomllib
@@ -42,6 +40,7 @@ def _get_info(owner, repo, default_branch='main', default_kw='nbdev'):
4240
from ghapi.all import call_gh, APIError
4341
try: r = call_gh('repos.get', owner=owner, repo=repo)
4442
except APIError:
43+
# chkstyle: ignore-node
4544
msg= [f"""Could not access repo: {owner}/{repo} to find your default branch - `{default_branch}` assumed.
4645
Edit `pyproject.toml` if this is incorrect.
4746
In the future, you can allow nbdev to see private repos by setting the environment variable GITHUB_TOKEN as described here:
@@ -205,8 +204,7 @@ def __init__(self, d, proj, cfg_file):
205204
if 'lib_path' not in self: self['lib_path'] = self.lib_name.replace('-', '_')
206205

207206
@property
208-
def version(self):
209-
return read_version(self.config_path / self['lib_path']) or '0.0.1'
207+
def version(self): return read_version(self.config_path / self['lib_path']) or '0.0.1'
210208

211209
@property
212210
def d(self): return {k:v for k,v in super().items()}
@@ -253,7 +251,7 @@ def is_nbdev(path=None): return _find_nbdev_pyproject(path) is not None
253251
def create_output(txt, mime):
254252
"Add a cell output containing `txt` of the `mime` text MIME sub-type"
255253
return [dict(data={f"text/{mime}": str(txt).splitlines(True)},
256-
execution_count=1, metadata={}, output_type="execute_result")]
254+
execution_count=1, metadata={}, output_type="execute_result")]
257255

258256
# %% ../nbs/api/01_config.ipynb #5a4d8e52
259257
def show_src(src, lang='python'): return Markdown(f'```{lang}\n{src}\n```')
@@ -318,12 +316,13 @@ def set_version(path, version):
318316

319317
# %% ../nbs/api/01_config.ipynb #d00889e5
320318
def bump_version(v, part=2, unbump=False):
321-
"Bump semver string `v` at index `part` (0=major, 1=minor, 2=patch)"
319+
"Bump semver part `part` (0=major, 1=minor, 2=patch), counted from the right"
322320
parts = (v or '0.0.0').split('.')
323321
parts += ['0'] * (3 - len(parts))
324-
parts[part] = str(int(parts[part]) + (-1 if unbump else 1))
325-
for i in range(part+1, 3): parts[i] = '0'
326-
return '.'.join(parts[:3])
322+
idx = len(parts) - 3 + part
323+
parts[idx] = str(int(parts[idx]) + (-1 if unbump else 1))
324+
for i in range(idx+1, len(parts)): parts[i] = '0'
325+
return '.'.join(parts)
327326

328327
# %% ../nbs/api/01_config.ipynb #e32583e6
329328
def update_version(path=None):

‎nbdev/test.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ def nbdev_test(
108108
if len(files)==0: return print('No files were eligible for testing')
109109

110110
if n_workers is None: n_workers = 0 if len(files)==1 else min(num_cpus(), 8)
111-
if IN_NOTEBOOK: kw = {'method':'spawn'} if os.name=='nt' else {'method':'forkserver'}
112-
else: kw = {'method':'forkserver'} if sys.platform=='darwin' else {}
111+
if IN_NOTEBOOK: kw = {'method':'spawn'} if os.name=='nt' or sys.platform=='darwin' else {'method':'forkserver'}
112+
else: kw = {'method':'spawn'} if sys.platform=='darwin' else {}
113113
wd_pth = cfg.nbs_path
114114
with working_directory(wd_pth if (wd_pth and wd_pth.exists()) else os.getcwd()):
115115
results = parallel(test_nb, files, skip_flags=skip_flags, force_flags=force_flags, n_workers=n_workers,

‎nbs/api/01_config.ipynb‎

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,16 @@
3030
"outputs": [],
3131
"source": [
3232
"#| export\n",
33-
"from datetime import datetime\n",
3433
"from fastcore.docments import *\n",
3534
"from fastcore.utils import *\n",
3635
"from fastcore.meta import *\n",
3736
"from fastcore.script import *\n",
3837
"from fastcore.style import *\n",
3938
"from fastcore.xdg import *\n",
4039
"\n",
41-
"import ast,importlib,re,warnings\n",
40+
"import ast,importlib,re\n",
4241
"from IPython.display import Markdown\n",
4342
"from fastcore.nbio import read_nb,NbCell\n",
44-
"from urllib.error import HTTPError\n",
4543
"\n",
4644
"try: import tomllib\n",
4745
"except ImportError: import tomli as tomllib"
@@ -138,6 +136,7 @@
138136
" from ghapi.all import call_gh, APIError\n",
139137
" try: r = call_gh('repos.get', owner=owner, repo=repo)\n",
140138
" except APIError:\n",
139+
" # chkstyle: ignore-node\n",
141140
" msg= [f\"\"\"Could not access repo: {owner}/{repo} to find your default branch - `{default_branch}` assumed.\n",
142141
"Edit `pyproject.toml` if this is incorrect.\n",
143142
"In the future, you can allow nbdev to see private repos by setting the environment variable GITHUB_TOKEN as described here:\n",
@@ -398,8 +397,7 @@
398397
" if 'lib_path' not in self: self['lib_path'] = self.lib_name.replace('-', '_')\n",
399398
"\n",
400399
" @property\n",
401-
" def version(self):\n",
402-
" return read_version(self.config_path / self['lib_path']) or '0.0.1'\n",
400+
" def version(self): return read_version(self.config_path / self['lib_path']) or '0.0.1'\n",
403401
"\n",
404402
" @property\n",
405403
" def d(self): return {k:v for k,v in super().items()}\n",
@@ -604,7 +602,7 @@
604602
"def create_output(txt, mime):\n",
605603
" \"Add a cell output containing `txt` of the `mime` text MIME sub-type\"\n",
606604
" return [dict(data={f\"text/{mime}\": str(txt).splitlines(True)},\n",
607-
" execution_count=1, metadata={}, output_type=\"execute_result\")]"
605+
" execution_count=1, metadata={}, output_type=\"execute_result\")]"
608606
]
609607
},
610608
{
@@ -810,12 +808,13 @@
810808
"source": [
811809
"#| export\n",
812810
"def bump_version(v, part=2, unbump=False):\n",
813-
" \"Bump semver string `v` at index `part` (0=major, 1=minor, 2=patch)\"\n",
811+
" \"Bump semver part `part` (0=major, 1=minor, 2=patch), counted from the right\"\n",
814812
" parts = (v or '0.0.0').split('.')\n",
815813
" parts += ['0'] * (3 - len(parts))\n",
816-
" parts[part] = str(int(parts[part]) + (-1 if unbump else 1))\n",
817-
" for i in range(part+1, 3): parts[i] = '0'\n",
818-
" return '.'.join(parts[:3])"
814+
" idx = len(parts) - 3 + part\n",
815+
" parts[idx] = str(int(parts[idx]) + (-1 if unbump else 1))\n",
816+
" for i in range(idx+1, len(parts)): parts[i] = '0'\n",
817+
" return '.'.join(parts)"
819818
]
820819
},
821820
{
@@ -842,7 +841,10 @@
842841
"test_eq(bump_version('1.2.3'), '1.2.4')\n",
843842
"test_eq(bump_version('1.2.3', part=1), '1.3.0')\n",
844843
"test_eq(bump_version('1.2.3', part=0), '2.0.0')\n",
845-
"test_eq(bump_version('1.2.3', part=2, unbump=True), '1.2.2')"
844+
"test_eq(bump_version('1.2.3', part=2, unbump=True), '1.2.2')\n",
845+
"test_eq(bump_version('2026.05.27.2'), '2026.05.27.3')\n",
846+
"test_eq(bump_version('2026.05.27.2', part=1), '2026.05.28.0')\n",
847+
"test_eq(bump_version('2026.05.27.2', part=0), '2026.6.0.0')"
846848
]
847849
},
848850
{
@@ -1038,7 +1040,8 @@
10381040
"from fastcore.nbio import new_nb, mk_cell, write_nb\n",
10391041
"with tempfile.TemporaryDirectory() as d:\n",
10401042
" d = Path(d)\n",
1041-
" p = d/'pkg'; p.mkdir()\n",
1043+
" p = d/'pkg'\n",
1044+
" p.mkdir()\n",
10421045
" (p/'a.py').write_text('\"\"\"A module\\nspanning lines\\n\\nMore about a.\\n\\nDocs: http://x\"\"\"\\n')\n",
10431046
" (p/'b.py').write_text('\"\"\"B summary\\n\\nDocs: http://y\"\"\"\\n')\n",
10441047
" (p/'_c.py').write_text('\"\"\"Private\\n\\nwith\\nmany\\nlines\"\"\"\\n')\n",
@@ -1054,14 +1057,15 @@
10541057
" update_init_mdoc(p, desc='Test pkg')\n",
10551058
" assert '- `pkg.b`: B summary' in (p/'__init__.py').read_text()\n",
10561059
" idx = new_nb([mk_cell('# Pkg\\n> tagline', 'markdown'), mk_cell('#| export\\nIntro para.', 'markdown'),\n",
1057-
" mk_cell('#| exportd\\nprint(1)'), mk_cell('Untagged prose.', 'markdown')])\n",
1060+
" mk_cell('#| exportd\\nprint(1)'), mk_cell('Untagged prose.', 'markdown')])\n",
10581061
" write_nb(idx, d/'index.ipynb')\n",
10591062
" m = pkg_mdoc(p, desc='Test pkg', index_nb=d/'index.ipynb')\n",
10601063
" assert m.startswith('Test pkg\\n\\nIntro para.\\n\\n```python\\nprint(1)\\n```\\n\\nModules:\\n\\n- `pkg.a`')\n",
10611064
" assert 'Untagged' not in m and 'tagline' not in m\n",
1062-
" q = d/'empty_pkg'; q.mkdir()\n",
1065+
" q = d/'empty_pkg'\n",
1066+
" q.mkdir()\n",
10631067
" test_eq(pkg_mdoc(q, desc='D', index_nb=d/'index.ipynb'),\n",
1064-
" 'D\\n\\nIntro para.\\n\\n```python\\nprint(1)\\n```') # intro alone still makes a docstring"
1068+
" 'D\\n\\nIntro para.\\n\\n```python\\nprint(1)\\n```') # intro alone still makes a docstring"
10651069
]
10661070
},
10671071
{
@@ -1074,13 +1078,15 @@
10741078
"#| hide\n",
10751079
"with tempfile.TemporaryDirectory() as d:\n",
10761080
" d = Path(d)\n",
1077-
" p = d/'pkg'; p.mkdir()\n",
1081+
" p = d/'pkg'\n",
1082+
" p.mkdir()\n",
10781083
" (p/'a.py').write_text('\"\"\"A module\\n\\nMore about a.\\n\\nDocs: http://x/a.html.md\"\"\"\\n')\n",
10791084
" (p/'b.py').write_text('\"\"\"B, no url\\n\\nSubstantive tho.\\n\\nno docs line\"\"\"\\n')\n",
10801085
" (p/'d.py').write_text('\"\"\"D two urls\\n\\nBody.\\n\\nDocs: http://x/1.md and http://x/2.md\"\"\"\\n')\n",
10811086
" idx = new_nb([mk_cell('# Pkg\\n> tagline', 'markdown'), mk_cell('#| export\\nIntro para.', 'markdown')])\n",
10821087
" write_nb(idx, d/'index.ipynb')\n",
10831088
" s = pkg_llms(p, desc='Test pkg', index_nb=d/'index.ipynb')\n",
1089+
" # chkstyle: ignore-node\n",
10841090
" test_eq(s, '''# pkg\n",
10851091
"\n",
10861092
"> Test pkg\n",
@@ -1120,8 +1126,7 @@
11201126
" (d/_pyproj).write_text(cfg_text)\n",
11211127
" (d/'testpkg').mkdir()\n",
11221128
"\n",
1123-
" with working_directory(d):\n",
1124-
" update_proj(d)\n",
1129+
" with working_directory(d): update_proj(d)\n",
11251130
"\n",
11261131
" result = (d/_pyproj).read_text()\n",
11271132
" assert 'name = \"testpkg\"' in result"

‎nbs/api/12_test.ipynb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@
236236
" if len(files)==0: return print('No files were eligible for testing')\n",
237237
"\n",
238238
" if n_workers is None: n_workers = 0 if len(files)==1 else min(num_cpus(), 8)\n",
239-
" if IN_NOTEBOOK: kw = {'method':'spawn'} if os.name=='nt' else {'method':'forkserver'}\n",
240-
" else: kw = {'method':'forkserver'} if sys.platform=='darwin' else {}\n",
239+
" if IN_NOTEBOOK: kw = {'method':'spawn'} if os.name=='nt' or sys.platform=='darwin' else {'method':'forkserver'}\n",
240+
" else: kw = {'method':'spawn'} if sys.platform=='darwin' else {}\n",
241241
" wd_pth = cfg.nbs_path\n",
242242
" with working_directory(wd_pth if (wd_pth and wd_pth.exists()) else os.getcwd()):\n",
243243
" results = parallel(test_nb, files, skip_flags=skip_flags, force_flags=force_flags, n_workers=n_workers,\n",

0 commit comments

Comments
 (0)