Skip to content

Commit 245a0c0

Browse files
committed
fixes #1599
1 parent 4e4b05a commit 245a0c0

4 files changed

Lines changed: 83 additions & 66 deletions

File tree

nbdev/doclinks.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,16 @@ def nbdev_export(
146146
**kwargs):
147147
"Export notebooks in `path` to Python modules"
148148
if os.environ.get('IN_TEST',0): return
149-
if not is_nbdev(): raise Exception('`nbdev-export` must be called from a directory within a nbdev project.')
150-
cfg = get_config()
151-
procs = procs.split() if procs else cfg.get('export_procs', [])
152-
procs = [import_obj(p) for p in procs] if procs else None
153-
files = nbglob(path=path, as_path=True, **kwargs).sorted('name')
154-
for f in files: nb_export(f, procs=procs)
155-
add_init(cfg.lib_path)
156-
_build_modidx()
149+
if path: path = Path(path).resolve()
150+
if not is_nbdev(path): raise Exception('`nbdev-export` must be called from a directory within a nbdev project.')
151+
with working_directory(get_config(path).config_path if path else '.'):
152+
cfg = get_config()
153+
procs = procs.split() if procs else cfg.get('export_procs', [])
154+
procs = [import_obj(p) for p in procs] if procs else None
155+
files = nbglob(path=path, as_path=True, **kwargs).sorted('name')
156+
for f in files: nb_export(f, procs=procs)
157+
add_init(cfg.lib_path)
158+
_build_modidx()
157159

158160
# %% ../nbs/api/05_doclinks.ipynb #3134c22b
159161
typs = 'module','class','method','function'

nbdev/test.py

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,40 @@ def test_nb(fn, # file name of notebook to test
3535
save=False): # write outputs back to notebook on success?
3636
"Execute tests in notebook in `fn` except those with `skip_flags`"
3737
faulthandler.register(signal.SIGINT, file=sys.__stderr__, all_threads=True, chain=True)
38+
fn = Path(fn)
3839
if basepath: sys.path.insert(0, str(basepath))
39-
if not IN_NOTEBOOK: os.environ["IN_TEST"] = '1'
40-
flags=set(L(skip_flags)) - set(L(force_flags))
41-
nb = NBProcessor(fn, rm_directives=False, process=True).nb
42-
fm = nb_frontmatter(nb)
43-
if str2bool(fm.get('skip_exec', False)) or nb_lang(nb) != 'python': return True, 0
44-
45-
def _no_eval(cell):
46-
if cell.cell_type != 'code': return True
47-
if 'nbdev_export'+'(' in cell.source: return True
48-
direc = getattr(cell, 'directives_', {}) or {}
49-
if direc.get('eval:', [''])[0].lower() == 'false': return True
50-
return flags & direc.keys()
51-
52-
start = time.time()
53-
k = CaptureShell(fn)
54-
if do_print: print(f'Starting {fn}')
40+
prev_test = os.environ.get('IN_TEST')
41+
if not IN_NOTEBOOK: os.environ['IN_TEST'] = '1'
5542
try:
56-
with working_directory(fn.parent):
57-
k.run_all(nb, exc_stop=True, preproc=_no_eval, verbose=verbose)
58-
if save: write_nb(nb, fn)
59-
res = True
60-
except:
61-
if showerr: sys.stderr.write(k.prettytb(fname=fn)+'\n')
62-
res=False
63-
if do_print: print(f'- Completed {fn}')
64-
return res,time.time()-start
43+
flags=set(L(skip_flags)) - set(L(force_flags))
44+
nb = NBProcessor(fn, rm_directives=False, process=True).nb
45+
fm = nb_frontmatter(nb)
46+
if str2bool(fm.get('skip_exec', False)) or nb_lang(nb) != 'python': return True, 0
47+
48+
def _no_eval(cell):
49+
if cell.cell_type != 'code': return True
50+
if 'nbdev_export'+'(' in cell.source: return True
51+
direc = getattr(cell, 'directives_', {}) or {}
52+
if direc.get('eval:', [''])[0].lower() == 'false': return True
53+
return flags & direc.keys()
54+
55+
start = time.time()
56+
k = CaptureShell(fn)
57+
if do_print: print(f'Starting {fn}')
58+
try:
59+
with working_directory(fn.parent):
60+
k.run_all(nb, exc_stop=True, preproc=_no_eval, verbose=verbose)
61+
if save: write_nb(nb, fn)
62+
res = True
63+
except:
64+
if showerr: sys.stderr.write(k.prettytb(fname=fn)+'\n')
65+
res=False
66+
if do_print: print(f'- Completed {fn}')
67+
return res,time.time()-start
68+
finally:
69+
if prev_test is None: os.environ.pop('IN_TEST', None)
70+
else: os.environ['IN_TEST'] = prev_test
71+
6572

6673
# %% ../nbs/api/12_test.ipynb #d8bf1f1b-935d-4b69-ba96-827c5d7213f0
6774
def _keep_file(p:Path, # filename for which to check for `indicator_fname`

nbs/api/05_doclinks.ipynb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -369,14 +369,16 @@
369369
" **kwargs):\n",
370370
" \"Export notebooks in `path` to Python modules\"\n",
371371
" if os.environ.get('IN_TEST',0): return\n",
372-
" if not is_nbdev(): raise Exception('`nbdev-export` must be called from a directory within a nbdev project.')\n",
373-
" cfg = get_config()\n",
374-
" procs = procs.split() if procs else cfg.get('export_procs', [])\n",
375-
" procs = [import_obj(p) for p in procs] if procs else None\n",
376-
" files = nbglob(path=path, as_path=True, **kwargs).sorted('name')\n",
377-
" for f in files: nb_export(f, procs=procs)\n",
378-
" add_init(cfg.lib_path)\n",
379-
" _build_modidx()"
372+
" if path: path = Path(path).resolve()\n",
373+
" if not is_nbdev(path): raise Exception('`nbdev-export` must be called from a directory within a nbdev project.')\n",
374+
" with working_directory(get_config(path).config_path if path else '.'):\n",
375+
" cfg = get_config()\n",
376+
" procs = procs.split() if procs else cfg.get('export_procs', [])\n",
377+
" procs = [import_obj(p) for p in procs] if procs else None\n",
378+
" files = nbglob(path=path, as_path=True, **kwargs).sorted('name')\n",
379+
" for f in files: nb_export(f, procs=procs)\n",
380+
" add_init(cfg.lib_path)\n",
381+
" _build_modidx()"
380382
]
381383
},
382384
{

nbs/api/12_test.ipynb

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,33 +63,39 @@
6363
" save=False): # write outputs back to notebook on success?\n",
6464
" \"Execute tests in notebook in `fn` except those with `skip_flags`\"\n",
6565
" faulthandler.register(signal.SIGINT, file=sys.__stderr__, all_threads=True, chain=True)\n",
66+
" fn = Path(fn)\n",
6667
" if basepath: sys.path.insert(0, str(basepath))\n",
67-
" if not IN_NOTEBOOK: os.environ[\"IN_TEST\"] = '1'\n",
68-
" flags=set(L(skip_flags)) - set(L(force_flags))\n",
69-
" nb = NBProcessor(fn, rm_directives=False, process=True).nb\n",
70-
" fm = nb_frontmatter(nb)\n",
71-
" if str2bool(fm.get('skip_exec', False)) or nb_lang(nb) != 'python': return True, 0\n",
72-
"\n",
73-
" def _no_eval(cell):\n",
74-
" if cell.cell_type != 'code': return True\n",
75-
" if 'nbdev_export'+'(' in cell.source: return True\n",
76-
" direc = getattr(cell, 'directives_', {}) or {}\n",
77-
" if direc.get('eval:', [''])[0].lower() == 'false': return True\n",
78-
" return flags & direc.keys()\n",
79-
" \n",
80-
" start = time.time()\n",
81-
" k = CaptureShell(fn)\n",
82-
" if do_print: print(f'Starting {fn}')\n",
68+
" prev_test = os.environ.get('IN_TEST')\n",
69+
" if not IN_NOTEBOOK: os.environ['IN_TEST'] = '1'\n",
8370
" try:\n",
84-
" with working_directory(fn.parent):\n",
85-
" k.run_all(nb, exc_stop=True, preproc=_no_eval, verbose=verbose)\n",
86-
" if save: write_nb(nb, fn)\n",
87-
" res = True\n",
88-
" except: \n",
89-
" if showerr: sys.stderr.write(k.prettytb(fname=fn)+'\\n')\n",
90-
" res=False\n",
91-
" if do_print: print(f'- Completed {fn}')\n",
92-
" return res,time.time()-start"
71+
" flags=set(L(skip_flags)) - set(L(force_flags))\n",
72+
" nb = NBProcessor(fn, rm_directives=False, process=True).nb\n",
73+
" fm = nb_frontmatter(nb)\n",
74+
" if str2bool(fm.get('skip_exec', False)) or nb_lang(nb) != 'python': return True, 0\n",
75+
"\n",
76+
" def _no_eval(cell):\n",
77+
" if cell.cell_type != 'code': return True\n",
78+
" if 'nbdev_export'+'(' in cell.source: return True\n",
79+
" direc = getattr(cell, 'directives_', {}) or {}\n",
80+
" if direc.get('eval:', [''])[0].lower() == 'false': return True\n",
81+
" return flags & direc.keys()\n",
82+
"\n",
83+
" start = time.time()\n",
84+
" k = CaptureShell(fn)\n",
85+
" if do_print: print(f'Starting {fn}')\n",
86+
" try:\n",
87+
" with working_directory(fn.parent):\n",
88+
" k.run_all(nb, exc_stop=True, preproc=_no_eval, verbose=verbose)\n",
89+
" if save: write_nb(nb, fn)\n",
90+
" res = True\n",
91+
" except: \n",
92+
" if showerr: sys.stderr.write(k.prettytb(fname=fn)+'\\n')\n",
93+
" res=False\n",
94+
" if do_print: print(f'- Completed {fn}')\n",
95+
" return res,time.time()-start\n",
96+
" finally:\n",
97+
" if prev_test is None: os.environ.pop('IN_TEST', None)\n",
98+
" else: os.environ['IN_TEST'] = prev_test\n"
9399
]
94100
},
95101
{

0 commit comments

Comments
 (0)