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.
- {python-fasthtml-0.6.10/python_fasthtml.egg-info → python-fasthtml-0.6.12}/PKG-INFO +2 -2
- python-fasthtml-0.6.12/fasthtml/__init__.py +2 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/_modidx.py +7 -2
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/components.py +7 -2
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/core.py +71 -27
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/jupyter.py +2 -2
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/live_reload.py +1 -1
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/starlette.py +3 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12/python_fasthtml.egg-info}/PKG-INFO +2 -2
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/requires.txt +1 -1
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/settings.ini +2 -2
- python-fasthtml-0.6.10/fasthtml/__init__.py +0 -2
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/CONTRIBUTING.md +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/LICENSE +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/MANIFEST.in +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/README.md +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/authmw.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/basics.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/cli.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/common.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/components.pyi +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/core.pyi +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/fastapp.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/ft.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/js.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/katex.js +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/oauth.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/pico.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/svg.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/toaster.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/xtend.py +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/fasthtml/xtend.pyi +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/pyproject.toml +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/SOURCES.txt +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/dependency_links.txt +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/entry_points.txt +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/not-zip-safe +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/top_level.txt +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/setup.cfg +0 -0
- {python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/setup.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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=
|
|
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
|
|
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',
|
|
7
|
-
'viewport', 'charset', 'all_meths', 'parsed_date', 'snake2hyphens', 'HtmxHeaders', '
|
|
8
|
-
'
|
|
9
|
-
'
|
|
10
|
-
'
|
|
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
|
|
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
|
|
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=
|
|
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';
|
|
@@ -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.
|
|
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.
|
|
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,10 +1,10 @@
|
|
|
1
1
|
[DEFAULT]
|
|
2
2
|
repo = fasthtml
|
|
3
3
|
lib_name = fasthtml
|
|
4
|
-
version = 0.6.
|
|
4
|
+
version = 0.6.12
|
|
5
5
|
min_python = 3.10
|
|
6
6
|
license = apache2
|
|
7
|
-
requirements = fastcore>=1.7.
|
|
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
|
|
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
|
{python-fasthtml-0.6.10 → python-fasthtml-0.6.12}/python_fasthtml.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|