fastcore 2.2.0__tar.gz → 2.2.2__tar.gz

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. {fastcore-2.2.0/fastcore.egg-info → fastcore-2.2.2}/PKG-INFO +1 -1
  2. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/__init__.py +1 -1
  3. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/_modidx.py +4 -0
  4. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/apisurface.py +7 -5
  5. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/editskill.py +1 -1
  6. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/nbio.py +29 -9
  7. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/xtras.py +8 -6
  8. {fastcore-2.2.0 → fastcore-2.2.2/fastcore.egg-info}/PKG-INFO +1 -1
  9. {fastcore-2.2.0 → fastcore-2.2.2}/CONTRIBUTING.md +0 -0
  10. {fastcore-2.2.0 → fastcore-2.2.2}/LICENSE +0 -0
  11. {fastcore-2.2.0 → fastcore-2.2.2}/MANIFEST.in +0 -0
  12. {fastcore-2.2.0 → fastcore-2.2.2}/README.md +0 -0
  13. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/aio.py +0 -0
  14. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/all.py +0 -0
  15. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/ansi.py +0 -0
  16. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/basics.py +0 -0
  17. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/dispatch.py +0 -0
  18. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/docments.py +0 -0
  19. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/docscrape.py +0 -0
  20. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/foundation.py +0 -0
  21. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/funccall.py +0 -0
  22. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/imghdr.py +0 -0
  23. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/imports.py +0 -0
  24. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/meta.py +0 -0
  25. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/nb_imports.py +0 -0
  26. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/net.py +0 -0
  27. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/parallel.py +0 -0
  28. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/py2pyi.py +0 -0
  29. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/script.py +0 -0
  30. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/shutil.py +0 -0
  31. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/style.py +0 -0
  32. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/test.py +0 -0
  33. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/tools.py +0 -0
  34. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/transform.py +0 -0
  35. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/utils.py +0 -0
  36. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/xdg.py +0 -0
  37. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore/xml.py +0 -0
  38. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore.egg-info/SOURCES.txt +0 -0
  39. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore.egg-info/dependency_links.txt +0 -0
  40. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore.egg-info/entry_points.txt +0 -0
  41. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore.egg-info/requires.txt +0 -0
  42. {fastcore-2.2.0 → fastcore-2.2.2}/fastcore.egg-info/top_level.txt +0 -0
  43. {fastcore-2.2.0 → fastcore-2.2.2}/pyproject.toml +0 -0
  44. {fastcore-2.2.0 → fastcore-2.2.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastcore
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Python supercharged for fastai development
5
5
  Author-email: Jeremy Howard and Sylvain Gugger <infos@fast.ai>
6
6
  License: Apache-2.0
@@ -55,4 +55,4 @@ Modules:
55
55
  - `fastcore.xml`: Concise generation of XML.
56
56
  - `fastcore.xtras`: Utility functions used in the fastai library"""
57
57
 
58
- __version__ = "2.2.0"
58
+ __version__ = "2.2.2"
@@ -31,6 +31,7 @@ d = { 'settings': { 'branch': 'main',
31
31
  'fastcore.apisurface.OpGroup.__allow__': ( 'apisurface.html#opgroup.__allow__',
32
32
  'fastcore/apisurface.py'),
33
33
  'fastcore.apisurface.OpGroup.__dir__': ('apisurface.html#opgroup.__dir__', 'fastcore/apisurface.py'),
34
+ 'fastcore.apisurface.OpGroup.__doc__': ('apisurface.html#opgroup.__doc__', 'fastcore/apisurface.py'),
34
35
  'fastcore.apisurface.OpGroup.__init__': ('apisurface.html#opgroup.__init__', 'fastcore/apisurface.py'),
35
36
  'fastcore.apisurface.OpGroup._repr_markdown_': ( 'apisurface.html#opgroup._repr_markdown_',
36
37
  'fastcore/apisurface.py'),
@@ -576,6 +577,7 @@ d = { 'settings': { 'branch': 'main',
576
577
  'fastcore.nbio.Notebook.summary': ('nbio.html#notebook.summary', 'fastcore/nbio.py'),
577
578
  'fastcore.nbio.Notebook.to_dict': ('nbio.html#notebook.to_dict', 'fastcore/nbio.py'),
578
579
  'fastcore.nbio.Notebook.view_cell': ('nbio.html#notebook.view_cell', 'fastcore/nbio.py'),
580
+ 'fastcore.nbio._cap_tb': ('nbio.html#_cap_tb', 'fastcore/nbio.py'),
579
581
  'fastcore.nbio._cell_method': ('nbio.html#_cell_method', 'fastcore/nbio.py'),
580
582
  'fastcore.nbio._dict2obj': ('nbio.html#_dict2obj', 'fastcore/nbio.py'),
581
583
  'fastcore.nbio._dir_attrs': ('nbio.html#_dir_attrs', 'fastcore/nbio.py'),
@@ -599,6 +601,7 @@ d = { 'settings': { 'branch': 'main',
599
601
  'fastcore.nbio._render_text': ('nbio.html#_render_text', 'fastcore/nbio.py'),
600
602
  'fastcore.nbio._split_cell': ('nbio.html#_split_cell', 'fastcore/nbio.py'),
601
603
  'fastcore.nbio._split_mime': ('nbio.html#_split_mime', 'fastcore/nbio.py'),
604
+ 'fastcore.nbio._tb_line': ('nbio.html#_tb_line', 'fastcore/nbio.py'),
602
605
  'fastcore.nbio._unparse_dir': ('nbio.html#_unparse_dir', 'fastcore/nbio.py'),
603
606
  'fastcore.nbio.cell2xml': ('nbio.html#cell2xml', 'fastcore/nbio.py'),
604
607
  'fastcore.nbio.cell_edit': ('nbio.html#cell_edit', 'fastcore/nbio.py'),
@@ -622,6 +625,7 @@ d = { 'settings': { 'branch': 'main',
622
625
  'fastcore.nbio.msgs2outs': ('nbio.html#msgs2outs', 'fastcore/nbio.py'),
623
626
  'fastcore.nbio.nb2dict': ('nbio.html#nb2dict', 'fastcore/nbio.py'),
624
627
  'fastcore.nbio.nb2str': ('nbio.html#nb2str', 'fastcore/nbio.py'),
628
+ 'fastcore.nbio.nb_frontmatter': ('nbio.html#nb_frontmatter', 'fastcore/nbio.py'),
625
629
  'fastcore.nbio.nb_lang': ('nbio.html#nb_lang', 'fastcore/nbio.py'),
626
630
  'fastcore.nbio.new_nb': ('nbio.html#new_nb', 'fastcore/nbio.py'),
627
631
  'fastcore.nbio.preferred_msg_out': ('nbio.html#preferred_msg_out', 'fastcore/nbio.py'),
@@ -112,11 +112,13 @@ class OpGroup:
112
112
  "Namespace for grouped operations: each op is an attribute, and the repr lists them all"
113
113
  def __init__(self, name: str, ops):
114
114
  self.name,self.ops,self.subgroups = name,list(ops),{}
115
- repr_md = []
116
- for op in self.ops:
117
- setattr(self, op.name, op)
118
- if hasattr(op, '__signature__'): repr_md.append(f"- {_op_line(op, op.__signature__)}")
119
- self.__doc__ = "\n".join(repr_md)
115
+ for op in self.ops: setattr(self, op.name, op)
116
+
117
+ @property
118
+ def __doc__(self):
119
+ res = [f"- {_op_line(op, op.__signature__)}" for op in self.ops if hasattr(op, '__signature__')]
120
+ res.extend(f"- {k}/" for k in sorted(self.subgroups))
121
+ return "\n".join(res)
120
122
 
121
123
  def __dir__(self): return object.__dir__(self)
122
124
  def __allow__(self): return self.ops + list(self.subgroups.values())
@@ -43,7 +43,7 @@ When you don't yet know where to edit, locate with a summary first: `rgapi`'s `r
43
43
  - `fastcore.tools`: text primitives, file tools, and `line_hash`/`lnhash`/`lnhash_at` for creating addresses without exhash installed.
44
44
  - `fastcore.nbio`: notebook read/write/validate/repair, cell construction, cell editors, and the `Notebook`/`NbCell` session objects with their snapshot queries (`find_cells`, `summary_nb`).
45
45
  - `exhash.skill`: hash-verified editing for files and cells; prefer it for edits where installed.
46
- - `rgapi.skill`: `rg`/`fd`/`ls`/`nbrg` search with lnhash output.
46
+ - `rgapi.skill`: `rg`/`fd`/`ls`/`nbrg` search with lnhash output, and `rgstr` to search text already in hand.
47
47
  - `remold`: structural search and rewrite for Python source (declarative ast-grep rules, LibCST matcher transforms, symbol queries); the engine behind `ast_replace`.
48
48
  - `aidialog.dlgskill`, `dialoghelper`: the dialog layer, including its own theory of dialogs and projections.
49
49
 
@@ -11,16 +11,16 @@ Docs: https://fastcore.fast.ai/nbio.html.md"""
11
11
  # %% auto #0
12
12
  __all__ = ['langs', 'cell_insert_line', 'cell_str_replace', 'cell_strs_replace', 'cell_replace_lines', 'cell_del_lines',
13
13
  'cell_ast_replace', 'IMG_MIMES', 'nb_lang', 'NbCell', 'dict2nb', 'read_nb', 'mk_cell', 'new_nb',
14
- 'first_code_ln', 'dir_tag', 'nb2dict', 'nb2str', 'write_nb', 'find_id', 'cell_edit', 'view_cell',
15
- 'validate_cell', 'validate_nb', 'repair_cell', 'repair_nb', 'preferred_out', 'join_out', 'mk_stream',
16
- 'mk_result', 'mk_display', 'mk_error', 'concat_streams', 'preferred_msg_out', 'render_output',
14
+ 'nb_frontmatter', 'first_code_ln', 'dir_tag', 'nb2dict', 'nb2str', 'write_nb', 'find_id', 'cell_edit',
15
+ 'view_cell', 'validate_cell', 'validate_nb', 'repair_cell', 'repair_nb', 'preferred_out', 'join_out',
16
+ 'mk_stream', 'mk_result', 'mk_display', 'mk_error', 'concat_streams', 'preferred_msg_out', 'render_output',
17
17
  'render_outputs', 'render_text', 'item2xml', 'cell2xml', 'cells2xml', 'Notebook', 'CellRow', 'CellRows',
18
18
  'summary_nb', 'Found', 'FoundCells', 'find_cells', 'deep_merge', 'update_cell', 'select_cells', 'exec_cell',
19
19
  'show_cell', 'msg2out', 'msgs2outs']
20
20
 
21
21
  # %% ../nbs/13_nbio.ipynb #954ca1aa
22
22
  from .basics import *
23
- from .xtras import rtoken_hex,clean_cli_output,take_lines,str_diff,truncstr
23
+ from .xtras import frontmatter,rtoken_hex,clean_cli_output,take_lines,str_diff,truncstr
24
24
  from .imports import *
25
25
  from .ansi import ansi2html
26
26
  from .meta import delegates,splice_sig
@@ -140,6 +140,13 @@ def new_nb(cells=None, meta=None, nbformat=4, nbformat_minor=5):
140
140
  cells = [o if isinstance(o,dict) else mk_cell(o) for o in cells or []]
141
141
  return dict2nb(cells=cells or [],metadata=meta or {},nbformat=nbformat,nbformat_minor=nbformat_minor)
142
142
 
143
+ # %% ../nbs/13_nbio.ipynb #af62e5ef
144
+ def nb_frontmatter(nb, strvals:bool=False):
145
+ "Frontmatter mapping from `nb`'s first cell (raw or markdown opening with `---`)"
146
+ c = first(nb.cells)
147
+ if c is None or c.cell_type not in ('raw','markdown'): return {}
148
+ return frontmatter(c.source, strvals=strvals)[0]
149
+
143
150
  # %% ../nbs/13_nbio.ipynb #c2ed0d5e
144
151
  def _dir_pre(lang=None): return fr"\s*{langs[lang]}\s*\|"
145
152
  _cell_mgc = re.compile(r"^\s*%%\w+")
@@ -541,10 +548,23 @@ def render_outputs(outputs):
541
548
  return '\n'.join(render_output(o) for o in concat_streams(outputs))
542
549
 
543
550
  # %% ../nbs/13_nbio.ipynb #88b0018a
544
- def _render_text(out, html1st=False):
551
+ def _tb_line(l, maxlen):
552
+ "One traceback line, capped at `maxlen`; `None` drops it (an over-long anchor line means nothing once cut). `File `/`Cell ` locations are exempt."
553
+ if len(l) <= maxlen: return l
554
+ if l.strip() and not (set(l) - set('~^ ')): return None
555
+ if l.lstrip().startswith(('File ', 'Cell ')): return l
556
+ return l[:maxlen] + '…'
557
+
558
+ def _cap_tb(tb, maxlen):
559
+ "Cap over-long lines in `tb`'s chunks, stripping ANSI first (the cap can sever an escape sequence); the last chunk is the exception message and survives whole"
560
+ tb = [strip_ansi(c) for c in tb]
561
+ return ['\n'.join(l for l in (_tb_line(x, maxlen) for x in c.split('\n')) if l is not None) for c in tb[:-1]] + tb[-1:]
562
+
563
+ def _render_text(out, html1st=False, tb_maxlen=None):
545
564
  typ = out['output_type']
565
+ if typ=='error' and tb_maxlen: out = {**out, 'traceback': _cap_tb(out.get('traceback', []), tb_maxlen)}
546
566
  mime,d = preferred_msg_out(out, html1st=html1st, include_imgs=False)
547
- d = join_out(d)
567
+ d = strip_ansi(join_out(d))
548
568
  if not d: return None
549
569
  attrs = {}
550
570
  if typ == 'stream': typ = out.get('name')
@@ -552,10 +572,10 @@ def _render_text(out, html1st=False):
552
572
  body = f'\n{d}' if d.endswith('\n') else f'\n{d}\n'
553
573
  return d, to_xml(ft(typ, body, **attrs), do_escape=False, indent=False)
554
574
 
555
- def render_text(outputs, html1st=False):
556
- "Render notebook outputs to concise text, using XML-ish tags when multiple outputs are present."
575
+ def render_text(outputs, html1st=False, tb_maxlen=None):
576
+ "Render notebook outputs to concise ANSI-stripped text, using XML-ish tags when multiple outputs are present; `tb_maxlen` caps over-long error-traceback lines"
557
577
  if (not isinstance(outputs, (list,tuple))) or (outputs and not isinstance(outputs[0],dict)): return ''
558
- items = [o for out in concat_streams(outputs) if (o := _render_text(out, html1st=html1st))]
578
+ items = [o for out in concat_streams(outputs) if (o := _render_text(out, html1st=html1st, tb_maxlen=tb_maxlen))]
559
579
  if not items: return ''
560
580
  return items[0][0] if len(items)==1 else '\n'.join(o[1] for o in items)
561
581
 
@@ -741,15 +741,17 @@ def asave_iter(g):
741
741
  return _
742
742
 
743
743
  # %% ../nbs/03_xtras.ipynb #d2757e2a
744
- def frontmatter(txt:str)->tuple:
744
+ def frontmatter(txt:str, strvals:bool=False)->tuple:
745
745
  "Tuple of (dict, body) from frontmatter in `txt`; invalid/missing frontmatter returns ({}, txt)"
746
746
  import yaml
747
747
  if not txt.startswith('---\n'): return {},txt
748
- fm,part,body = txt[4:].partition('\n---\n')
749
- if not part: return {},txt
750
- try: res = yaml.safe_load(fm)
751
- except yaml.parser.ParserError: return {},txt
752
- return (res,body) if isinstance(res,dict) else ({},txt)
748
+ end = min((i for i in (txt.find(f'\n{c}\n', 3) for c in ('---','...')) if i >= 0), default=-1)
749
+ if end < 0:
750
+ if not txt.endswith(('\n---','\n...')): return {},txt
751
+ end = len(txt) - 4
752
+ try: res = yaml.load(txt[4:end], Loader=yaml.BaseLoader if strvals else yaml.SafeLoader)
753
+ except yaml.YAMLError: return {},txt
754
+ return (res,txt[end+5:]) if isinstance(res,dict) else ({},txt)
753
755
 
754
756
  # %% ../nbs/03_xtras.ipynb #45eb5141
755
757
  def clean_cli_output(txt:str, strip:bool=True):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastcore
3
- Version: 2.2.0
3
+ Version: 2.2.2
4
4
  Summary: Python supercharged for fastai development
5
5
  Author-email: Jeremy Howard and Sylvain Gugger <infos@fast.ai>
6
6
  License: Apache-2.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes