python-fasthtml 0.6.10__tar.gz → 0.6.12__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 (41) hide show
  1. {python-fasthtml-0.6.10/python_fasthtml.egg-info → python-fasthtml-0.6.12}/PKG-INFO +2 -2
  2. python-fasthtml-0.6.12/fasthtml/__init__.py +2 -0
  3. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/_modidx.py +7 -2
  4. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/components.py +7 -2
  5. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/core.py +71 -27
  6. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/jupyter.py +2 -2
  7. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/live_reload.py +1 -1
  8. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/starlette.py +3 -0
  9. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12/python_fasthtml.egg-info}/PKG-INFO +2 -2
  10. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/requires.txt +1 -1
  11. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/settings.ini +2 -2
  12. python-fasthtml-0.6.10/fasthtml/__init__.py +0 -2
  13. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/CONTRIBUTING.md +0 -0
  14. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/LICENSE +0 -0
  15. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/MANIFEST.in +0 -0
  16. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/README.md +0 -0
  17. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/authmw.py +0 -0
  18. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/basics.py +0 -0
  19. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/cli.py +0 -0
  20. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/common.py +0 -0
  21. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/components.pyi +0 -0
  22. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/core.pyi +0 -0
  23. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/fastapp.py +0 -0
  24. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/ft.py +0 -0
  25. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/js.py +0 -0
  26. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/katex.js +0 -0
  27. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/oauth.py +0 -0
  28. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/pico.py +0 -0
  29. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/svg.py +0 -0
  30. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/toaster.py +0 -0
  31. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/xtend.py +0 -0
  32. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/xtend.pyi +0 -0
  33. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/pyproject.toml +0 -0
  34. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/SOURCES.txt +0 -0
  35. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/dependency_links.txt +0 -0
  36. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/entry_points.txt +0 -0
  37. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/not-zip-safe +0 -0
  38. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/top_level.txt +0 -0
  39. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/setup.cfg +0 -0
  40. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/setup.py +0 -0
  41. {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/tests/test_toaster.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-fasthtml
3
- Version: 0.6.10
3
+ Version: 0.6.12
4
4
  Summary: The fastest way to create an HTML app
5
5
  Home-page: https://github.com/AnswerDotAI/fasthtml
6
6
  Author: Jeremy Howard
@@ -15,7 +15,7 @@ Classifier: License :: OSI Approved :: Apache Software License
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: fastcore>=1.7.10
18
+ Requires-Dist: fastcore>=1.7.15
19
19
  Requires-Dist: python-dateutil
20
20
  Requires-Dist: starlette>0.33
21
21
  Requires-Dist: oauthlib
@@ -0,0 +1,2 @@
1
+ __version__ = "0.6.12"
2
+ from .core import *
@@ -46,6 +46,11 @@ d = { 'settings': { 'branch': 'main',
46
46
  'fasthtml.core.HttpHeader': ('api/core.html#httpheader', 'fasthtml/core.py'),
47
47
  'fasthtml.core.MiddlewareBase': ('api/core.html#middlewarebase', 'fasthtml/core.py'),
48
48
  'fasthtml.core.MiddlewareBase.__call__': ('api/core.html#middlewarebase.__call__', 'fasthtml/core.py'),
49
+ 'fasthtml.core.Pusher': ('api/core.html#pusher', 'fasthtml/core.py'),
50
+ 'fasthtml.core.Pusher.__call__': ('api/core.html#pusher.__call__', 'fasthtml/core.py'),
51
+ 'fasthtml.core.Pusher.__init__': ('api/core.html#pusher.__init__', 'fasthtml/core.py'),
52
+ 'fasthtml.core.Pusher.queue': ('api/core.html#pusher.queue', 'fasthtml/core.py'),
53
+ 'fasthtml.core.Pusher.set_q': ('api/core.html#pusher.set_q', 'fasthtml/core.py'),
49
54
  'fasthtml.core.Redirect': ('api/core.html#redirect', 'fasthtml/core.py'),
50
55
  'fasthtml.core.Redirect.__init__': ('api/core.html#redirect.__init__', 'fasthtml/core.py'),
51
56
  'fasthtml.core.Redirect.__response__': ('api/core.html#redirect.__response__', 'fasthtml/core.py'),
@@ -60,6 +65,7 @@ d = { 'settings': { 'branch': 'main',
60
65
  'fasthtml.core.StringConvertor.to_string': ('api/core.html#stringconvertor.to_string', 'fasthtml/core.py'),
61
66
  'fasthtml.core.WS_RouteX': ('api/core.html#ws_routex', 'fasthtml/core.py'),
62
67
  'fasthtml.core.WS_RouteX.__init__': ('api/core.html#ws_routex.__init__', 'fasthtml/core.py'),
68
+ 'fasthtml.core._add_ids': ('api/core.html#_add_ids', 'fasthtml/core.py'),
63
69
  'fasthtml.core._annotations': ('api/core.html#_annotations', 'fasthtml/core.py'),
64
70
  'fasthtml.core._apply_ft': ('api/core.html#_apply_ft', 'fasthtml/core.py'),
65
71
  'fasthtml.core._find_p': ('api/core.html#_find_p', 'fasthtml/core.py'),
@@ -102,8 +108,7 @@ d = { 'settings': { 'branch': 'main',
102
108
  'fasthtml.core.serve': ('api/core.html#serve', 'fasthtml/core.py'),
103
109
  'fasthtml.core.signal_shutdown': ('api/core.html#signal_shutdown', 'fasthtml/core.py'),
104
110
  'fasthtml.core.snake2hyphens': ('api/core.html#snake2hyphens', 'fasthtml/core.py'),
105
- 'fasthtml.core.str2date': ('api/core.html#str2date', 'fasthtml/core.py'),
106
- 'fasthtml.core.str2int': ('api/core.html#str2int', 'fasthtml/core.py'),
111
+ 'fasthtml.core.unqid': ('api/core.html#unqid', 'fasthtml/core.py'),
107
112
  'fasthtml.core.uri': ('api/core.html#uri', 'fasthtml/core.py')},
108
113
  'fasthtml.fastapp': { 'fasthtml.fastapp._app_factory': ('api/fastapp.html#_app_factory', 'fasthtml/fastapp.py'),
109
114
  'fasthtml.fastapp._get_tbl': ('api/fastapp.html#_get_tbl', 'fasthtml/fastapp.py'),
@@ -65,16 +65,21 @@ def attrmap_x(o):
65
65
  # %% ../nbs/api/01_components.ipynb
66
66
  fh_cfg['attrmap']=attrmap_x
67
67
  fh_cfg['valmap' ]=valmap
68
+ fh_cfg['ft_cls' ]=FT
69
+ fh_cfg['auto_id' ]=False
68
70
 
69
71
  # %% ../nbs/api/01_components.ipynb
70
- def ft_html(tag: str, *c, id=None, cls=None, title=None, style=None, attrmap=None, valmap=None, ft_cls=FT, **kwargs):
72
+ def ft_html(tag: str, *c, id=None, cls=None, title=None, style=None, attrmap=None, valmap=None, ft_cls=None, auto_id=None, **kwargs):
71
73
  ds,c = partition(c, risinstance(dict))
72
74
  for d in ds: kwargs = {**kwargs, **d}
75
+ if ft_cls is None: ft_cls = fh_cfg.ft_cls
73
76
  if attrmap is None: attrmap=fh_cfg.attrmap
74
77
  if valmap is None: valmap =fh_cfg.valmap
78
+ if auto_id is None: auto_id = fh_cfg.auto_id
79
+ if auto_id and not id: id = unqid()
75
80
  kwargs['id'],kwargs['cls'],kwargs['title'],kwargs['style'] = id,cls,title,style
76
81
  tag,c,kw = ft(tag, *c, attrmap=attrmap, valmap=valmap, **kwargs).list
77
- if tag in named and 'id' in kw and 'name' not in kw: kw['name'] = kw['id']
82
+ if tag in named and id and 'name' not in kw: kw['name'] = kw['id']
78
83
  return ft_cls(tag,c,kw, void_=tag in voids)
79
84
 
80
85
  # %% ../nbs/api/01_components.ipynb
@@ -3,12 +3,11 @@
3
3
  # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/api/00_core.ipynb.
4
4
 
5
5
  # %% auto 0
6
- __all__ = ['empty', 'htmx_hdrs', 'fh_cfg', 'htmx_resps', 'htmxsrc', 'htmxwssrc', 'fhjsscr', 'htmxctsrc', 'surrsrc', 'scopesrc',
7
- 'viewport', 'charset', 'all_meths', 'parsed_date', 'snake2hyphens', 'HtmxHeaders', 'str2int', 'str2date',
8
- 'HttpHeader', 'HtmxResponseHeaders', 'form2dict', 'parse_form', 'flat_xt', 'Beforeware', 'EventStream',
9
- 'signal_shutdown', 'WS_RouteX', 'uri', 'decode_uri', 'flat_tuple', 'Redirect', 'RouteX', 'RouterX',
10
- 'get_key', 'def_hdrs', 'FastHTML', 'serve', 'Client', 'cookie', 'reg_re_param', 'MiddlewareBase',
11
- 'FtResponse']
6
+ __all__ = ['empty', 'htmx_hdrs', 'fh_cfg', 'htmx_resps', 'htmx_exts', 'htmxsrc', 'htmxwssrc', 'fhjsscr', 'htmxctsrc', 'surrsrc',
7
+ 'scopesrc', 'viewport', 'charset', 'all_meths', 'parsed_date', 'snake2hyphens', 'HtmxHeaders', 'HttpHeader',
8
+ 'HtmxResponseHeaders', 'form2dict', 'parse_form', 'flat_xt', 'Beforeware', 'EventStream', 'signal_shutdown',
9
+ 'WS_RouteX', 'uri', 'decode_uri', 'flat_tuple', 'Redirect', 'RouteX', 'RouterX', 'get_key', 'def_hdrs',
10
+ 'FastHTML', 'serve', 'Client', 'cookie', 'reg_re_param', 'MiddlewareBase', 'FtResponse', 'unqid', 'Pusher']
12
11
 
13
12
  # %% ../nbs/api/00_core.ipynb
14
13
  import json,uuid,inspect,types,uvicorn,signal,asyncio,threading
@@ -31,6 +30,8 @@ from warnings import warn
31
30
  from dateutil import parser as dtparse
32
31
  from httpx import ASGITransport, AsyncClient
33
32
  from anyio import from_thread
33
+ from uuid import uuid4
34
+ from base64 import b85encode,b64encode
34
35
 
35
36
  from .starlette import *
36
37
 
@@ -71,32 +72,19 @@ def _get_htmx(h):
71
72
  res = {k:h.get(v.lower(), None) for k,v in htmx_hdrs.items()}
72
73
  return HtmxHeaders(**res)
73
74
 
74
- # %% ../nbs/api/00_core.ipynb
75
- def str2int(s)->int:
76
- "Convert `s` to an `int`"
77
- s = s.lower()
78
- if s=='on': return 1
79
- if s=='none': return 0
80
- return 0 if not s else int(s)
81
-
82
75
  # %% ../nbs/api/00_core.ipynb
83
76
  def _mk_list(t, v): return [t(o) for o in v]
84
77
 
85
78
  # %% ../nbs/api/00_core.ipynb
86
79
  fh_cfg = AttrDict(indent=True)
87
80
 
88
- # %% ../nbs/api/00_core.ipynb
89
- def str2date(s:str)->date:
90
- "`date.fromisoformat` with empty string handling"
91
- return date.fromisoformat(s) if s else None
92
-
93
81
  # %% ../nbs/api/00_core.ipynb
94
82
  def _fix_anno(t):
95
83
  "Create appropriate callable type for casting a `str` to type `t` (or first type in `t` if union)"
96
84
  origin = get_origin(t)
97
85
  if origin is Union or origin is UnionType or origin in (list,List):
98
86
  t = first(o for o in get_args(t) if o!=type(None))
99
- d = {bool: str2bool, int: str2int, date: str2date}
87
+ d = {bool: str2bool, int: str2int, date: str2date, UploadFile: noop}
100
88
  res = d.get(t, t)
101
89
  if origin in (list,List): return partial(_mk_list, res)
102
90
  return lambda o: res(o[-1]) if isinstance(o,(list,tuple)) else res(o)
@@ -382,17 +370,20 @@ def _xt_cts(req, resp):
382
370
  resp = resp + tuple(getattr(req, 'injects', ()))
383
371
  http_hdrs,resp = partition(resp, risinstance(HttpHeader))
384
372
  http_hdrs = {o.k:str(o.v) for o in http_hdrs}
373
+ tasks,resp = partition(resp, risinstance(BackgroundTask))
374
+ ts = BackgroundTasks()
375
+ for t in tasks: ts.tasks.append(t)
385
376
  hdr_tags = 'title','meta','link','style','base'
386
377
  titles,bdy = partition(resp, lambda o: getattr(o, 'tag', '') in hdr_tags)
387
378
  if resp and 'hx-request' not in req.headers and not any(getattr(o, 'tag', '')=='html' for o in resp):
388
379
  if not titles: titles = [Title('FastHTML page')]
389
380
  resp = Html(Head(*titles, *flat_xt(req.hdrs)), Body(bdy, *flat_xt(req.ftrs), **req.bodykw), **req.htmlkw)
390
- return _to_xml(req, resp, indent=fh_cfg.indent), http_hdrs
381
+ return _to_xml(req, resp, indent=fh_cfg.indent), http_hdrs, ts
391
382
 
392
383
  # %% ../nbs/api/00_core.ipynb
393
384
  def _xt_resp(req, resp):
394
- cts,http_hdrs = _xt_cts(req, resp)
395
- return HTMLResponse(cts, headers=http_hdrs)
385
+ cts,http_hdrs,tasks = _xt_cts(req, resp)
386
+ return HTMLResponse(cts, headers=http_hdrs, background=tasks)
396
387
 
397
388
  # %% ../nbs/api/00_core.ipynb
398
389
  def _is_ft_resp(resp): return isinstance(resp, (list,tuple,HttpHeader,FT)) or hasattr(resp, '__ft__')
@@ -472,6 +463,17 @@ class RouterX(Router):
472
463
  route = WS_RouteX(self._app, path, recv=recv, conn=conn, disconn=disconn, name=name)
473
464
  self._add_route(route)
474
465
 
466
+ # %% ../nbs/api/00_core.ipynb
467
+ htmx_exts = {
468
+ "head-support": "https://unpkg.com/htmx-ext-head-support@2.0.1/head-support.js",
469
+ "preload": "https://unpkg.com/htmx-ext-preload@2.0.1/preload.js",
470
+ "class-tools": "https://unpkg.com/htmx-ext-class-tools@2.0.1/class-tools.js",
471
+ "loading-states": "https://unpkg.com/htmx-ext-loading-states@2.0.0/loading-states.js",
472
+ "multi-swap": "https://unpkg.com/htmx-ext-multi-swap@2.0.0/multi-swap.js",
473
+ "path-deps": "https://unpkg.com/htmx-ext-path-deps@2.0.0/path-deps.js",
474
+ "remove-me": "https://unpkg.com/htmx-ext-remove-me@2.0.0/remove-me.js"
475
+ }
476
+
475
477
  # %% ../nbs/api/00_core.ipynb
476
478
  htmxsrc = Script(src="https://unpkg.com/htmx.org@next/dist/htmx.min.js")
477
479
  htmxwssrc = Script(src="https://unpkg.com/htmx-ext-ws/ws.js")
@@ -666,11 +668,53 @@ class MiddlewareBase:
666
668
  # %% ../nbs/api/00_core.ipynb
667
669
  class FtResponse:
668
670
  "Wrap an FT response with any Starlette `Response`"
669
- def __init__(self, content, status_code:int=200, headers=None, cls=HTMLResponse, media_type:str|None=None, background=None):
671
+ def __init__(self, content, status_code:int=200, headers=None, cls=HTMLResponse, media_type:str|None=None):
670
672
  self.content,self.status_code,self.headers = content,status_code,headers
671
- self.cls,self.media_type,self.background = cls,media_type,background
673
+ self.cls,self.media_type = cls,media_type
672
674
 
673
675
  def __response__(self, req):
674
- cts,httphdrs = _xt_cts(req, self.content)
676
+ cts,httphdrs,tasks = _xt_cts(req, self.content)
675
677
  headers = {**(self.headers or {}), **httphdrs}
676
- return self.cls(cts, status_code=self.status_code, headers=headers, media_type=self.media_type, background=self.background)
678
+ return self.cls(cts, status_code=self.status_code, headers=headers, media_type=self.media_type, background=tasks)
679
+
680
+ # %% ../nbs/api/00_core.ipynb
681
+ def unqid():
682
+ res = b64encode(uuid4().bytes)
683
+ return '_' + res.decode().rstrip('=').translate(str.maketrans('+/', '_-'))
684
+
685
+ # %% ../nbs/api/00_core.ipynb
686
+ def _add_ids(s):
687
+ if not isinstance(s, FT): return
688
+ if not getattr(s, 'id', None): s.id = unqid()
689
+ for c in s.children: _add_ids(c)
690
+
691
+ # %% ../nbs/api/00_core.ipynb
692
+ class Pusher:
693
+ def __init__(self, app, dest_id='_dest', auto_id=True):
694
+ store_attr()
695
+ self._queue = None
696
+ self('')
697
+ @app.route
698
+ def index():
699
+ return Div(id=self.dest_id, hx_trigger='load', hx_ext="ws",
700
+ ws_send=True, ws_connect="/ws")
701
+
702
+ @property
703
+ def queue(self):
704
+ self.set_q()
705
+ return self._queue
706
+
707
+ def set_q(self):
708
+ if self._queue: return
709
+ self._queue = asyncio.Queue()
710
+ @self.app.ws("/ws")
711
+ async def ws(ws, send):
712
+ try:
713
+ while True: await send(await self.queue.get())
714
+ except WebSocketDisconnect: self._queue=None
715
+
716
+ def __call__(self, *s):
717
+ id = getattr(s[0], 'id', None)
718
+ if not id: s = Div(*s, hx_swap_oob='innerHTML', id=self.dest_id)
719
+ if self.auto_id: _add_ids(s)
720
+ self.queue.put_nowait(s)
@@ -88,9 +88,9 @@ def FastJupy(hdrs=None, middleware=None, **kwargs):
88
88
  return FastHTML(hdrs=hdrs, middleware=middleware, **kwargs)
89
89
 
90
90
  # %% ../nbs/api/06_jupyter.ipynb
91
- def HTMX(host='localhost', port=8000, iframe_height="auto"):
91
+ def HTMX(path="", host='localhost', port=8000, iframe_height="auto"):
92
92
  "An iframe which displays the HTMX application in a notebook."
93
- return HTML(f'<iframe src="http://{host}:{port}" style="width: 100%; height: {iframe_height}; border: none;" ' + """onload="{
93
+ return HTML(f'<iframe src="http://{host}:{port}{str(path)}" style="width: 100%; height: {iframe_height}; border: none;" ' + """onload="{
94
94
  let frame = this;
95
95
  window.addEventListener('message', function(e) {
96
96
  if (e.data.height) frame.style.height = (e.data.height+1) + 'px';
@@ -47,7 +47,7 @@ class FastHTMLWithLiveReload(FastHTML):
47
47
  >>> app = FastHTMLWithLiveReload()
48
48
 
49
49
  Run:
50
- run_uv()
50
+ serve()
51
51
  """
52
52
  LIVE_RELOAD_ROUTE = WebSocketRoute("/live-reload", endpoint=live_reload_websocket)
53
53
 
@@ -18,3 +18,6 @@ from starlette.config import Config
18
18
  from starlette.datastructures import CommaSeparatedStrings, Secret, UploadFile, URLPath
19
19
  from starlette.types import ASGIApp, Receive, Scope, Send
20
20
  from starlette.concurrency import run_in_threadpool
21
+ from starlette.background import BackgroundTask, BackgroundTasks
22
+ from starlette.websockets import WebSocketDisconnect
23
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-fasthtml
3
- Version: 0.6.10
3
+ Version: 0.6.12
4
4
  Summary: The fastest way to create an HTML app
5
5
  Home-page: https://github.com/AnswerDotAI/fasthtml
6
6
  Author: Jeremy Howard
@@ -15,7 +15,7 @@ Classifier: License :: OSI Approved :: Apache Software License
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: fastcore>=1.7.10
18
+ Requires-Dist: fastcore>=1.7.15
19
19
  Requires-Dist: python-dateutil
20
20
  Requires-Dist: starlette>0.33
21
21
  Requires-Dist: oauthlib
@@ -1,4 +1,4 @@
1
- fastcore>=1.7.10
1
+ fastcore>=1.7.15
2
2
  python-dateutil
3
3
  starlette>0.33
4
4
  oauthlib
@@ -1,10 +1,10 @@
1
1
  [DEFAULT]
2
2
  repo = fasthtml
3
3
  lib_name = fasthtml
4
- version = 0.6.10
4
+ version = 0.6.12
5
5
  min_python = 3.10
6
6
  license = apache2
7
- requirements = fastcore>=1.7.10 python-dateutil starlette>0.33 oauthlib itsdangerous uvicorn[standard]>=0.30 httpx fastlite>=0.0.9 python-multipart beautifulsoup4
7
+ requirements = fastcore>=1.7.15 python-dateutil starlette>0.33 oauthlib itsdangerous uvicorn[standard]>=0.30 httpx fastlite>=0.0.9 python-multipart beautifulsoup4
8
8
  dev_requirements = ipython lxml pysymbol_llm
9
9
  black_formatting = False
10
10
  conda_user = fastai
@@ -1,2 +0,0 @@
1
- __version__ = "0.6.10"
2
- from .core import *