reflex 0.3.7a1__py3-none-any.whl → 0.3.8__py3-none-any.whl
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.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- reflex/.templates/apps/blank/code/blank.py +0 -1
- reflex/.templates/apps/demo/code/demo.py +0 -1
- reflex/.templates/apps/sidebar/code/sidebar.py +6 -2
- reflex/.templates/jinja/web/pages/_app.js.jinja2 +4 -1
- reflex/.templates/jinja/web/pages/base_page.js.jinja2 +4 -1
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +24 -0
- reflex/.templates/jinja/web/tailwind.config.js.jinja2 +4 -1
- reflex/.templates/web/utils/helpers/dataeditor.js +56 -54
- reflex/__init__.py +4 -2
- reflex/__init__.pyi +6 -2
- reflex/app.py +43 -9
- reflex/app.pyi +2 -1
- reflex/app_module_for_backend.py +13 -0
- reflex/compiler/compiler.py +19 -0
- reflex/components/__init__.py +9 -232
- reflex/components/base/__init__.py +5 -1
- reflex/components/base/app_wrap.py +1 -1
- reflex/components/base/app_wrap.pyi +1 -1
- reflex/components/base/document.py +0 -8
- reflex/components/base/document.pyi +0 -80
- reflex/components/{layout → base}/fragment.pyi +1 -1
- reflex/components/chakra/__init__.py +202 -19
- reflex/components/{libs/chakra.pyi → chakra/base.pyi} +1 -1
- reflex/components/chakra/datadisplay/__init__.py +12 -0
- reflex/components/{datadisplay → chakra/datadisplay}/badge.py +1 -1
- reflex/components/{datadisplay → chakra/datadisplay}/badge.pyi +2 -2
- reflex/components/{datadisplay → chakra/datadisplay}/code.py +5 -5
- reflex/components/{datadisplay → chakra/datadisplay}/code.pyi +5 -5
- reflex/components/{datadisplay → chakra/datadisplay}/divider.py +4 -2
- reflex/components/{datadisplay → chakra/datadisplay}/divider.pyi +5 -3
- reflex/components/{datadisplay → chakra/datadisplay}/keyboard_key.py +1 -1
- reflex/components/{datadisplay → chakra/datadisplay}/keyboard_key.pyi +2 -2
- reflex/components/{datadisplay → chakra/datadisplay}/list.py +3 -3
- reflex/components/{datadisplay → chakra/datadisplay}/list.pyi +4 -4
- reflex/components/{datadisplay → chakra/datadisplay}/stat.py +1 -1
- reflex/components/{datadisplay → chakra/datadisplay}/stat.pyi +2 -2
- reflex/components/{datadisplay → chakra/datadisplay}/table.py +2 -2
- reflex/components/{datadisplay → chakra/datadisplay}/table.pyi +3 -3
- reflex/components/{datadisplay → chakra/datadisplay}/tag.py +2 -2
- reflex/components/{datadisplay → chakra/datadisplay}/tag.pyi +3 -3
- reflex/components/{disclosure → chakra/disclosure}/accordion.py +1 -1
- reflex/components/{disclosure → chakra/disclosure}/accordion.pyi +2 -2
- reflex/components/{disclosure → chakra/disclosure}/tabs.py +2 -2
- reflex/components/{disclosure → chakra/disclosure}/tabs.pyi +3 -3
- reflex/components/{disclosure → chakra/disclosure}/transition.py +1 -1
- reflex/components/{disclosure → chakra/disclosure}/transition.pyi +2 -2
- reflex/components/{disclosure → chakra/disclosure}/visuallyhidden.py +1 -1
- reflex/components/{disclosure → chakra/disclosure}/visuallyhidden.pyi +2 -2
- reflex/components/{feedback → chakra/feedback}/alert.py +2 -2
- reflex/components/{feedback → chakra/feedback}/alert.pyi +2 -6
- reflex/components/{feedback → chakra/feedback}/circularprogress.py +1 -1
- reflex/components/{feedback → chakra/feedback}/circularprogress.pyi +2 -2
- reflex/components/{feedback → chakra/feedback}/progress.py +1 -1
- reflex/components/{feedback → chakra/feedback}/progress.pyi +2 -2
- reflex/components/{feedback → chakra/feedback}/skeleton.py +1 -1
- reflex/components/{feedback → chakra/feedback}/skeleton.pyi +2 -2
- reflex/components/{feedback → chakra/feedback}/spinner.py +1 -1
- reflex/components/{feedback → chakra/feedback}/spinner.pyi +2 -2
- reflex/components/{forms → chakra/forms}/__init__.py +2 -11
- reflex/components/{forms → chakra/forms}/button.py +3 -1
- reflex/components/{forms → chakra/forms}/button.pyi +2 -2
- reflex/components/{forms → chakra/forms}/checkbox.py +1 -1
- reflex/components/{forms → chakra/forms}/checkbox.pyi +2 -6
- reflex/components/{forms → chakra/forms}/colormodeswitch.py +10 -2
- reflex/components/{forms → chakra/forms}/colormodeswitch.pyi +83 -3
- reflex/components/{forms → chakra/forms}/date_picker.py +1 -1
- reflex/components/{forms → chakra/forms}/date_picker.pyi +2 -2
- reflex/components/{forms → chakra/forms}/date_time_picker.py +1 -1
- reflex/components/{forms → chakra/forms}/date_time_picker.pyi +2 -2
- reflex/components/{forms → chakra/forms}/editable.py +1 -1
- reflex/components/{forms → chakra/forms}/editable.pyi +2 -2
- reflex/components/{forms → chakra/forms}/email.py +1 -1
- reflex/components/{forms → chakra/forms}/email.pyi +2 -2
- reflex/components/{forms → chakra/forms}/form.py +1 -1
- reflex/components/{forms → chakra/forms}/form.pyi +2 -2
- reflex/components/{forms → chakra/forms}/iconbutton.py +1 -1
- reflex/components/{forms → chakra/forms}/iconbutton.pyi +2 -2
- reflex/components/{forms → chakra/forms}/input.py +5 -4
- reflex/components/{forms → chakra/forms}/input.pyi +59 -5
- reflex/components/{forms → chakra/forms}/numberinput.py +6 -2
- reflex/components/{forms → chakra/forms}/numberinput.pyi +10 -2
- reflex/components/{forms → chakra/forms}/password.py +1 -1
- reflex/components/{forms → chakra/forms}/password.pyi +2 -2
- reflex/components/{forms → chakra/forms}/pininput.py +1 -1
- reflex/components/{forms → chakra/forms}/pininput.pyi +2 -2
- reflex/components/{forms → chakra/forms}/radio.py +3 -3
- reflex/components/{forms → chakra/forms}/radio.pyi +4 -4
- reflex/components/{forms → chakra/forms}/rangeslider.py +1 -1
- reflex/components/{forms → chakra/forms}/rangeslider.pyi +2 -2
- reflex/components/{forms → chakra/forms}/select.py +3 -3
- reflex/components/{forms → chakra/forms}/select.pyi +4 -4
- reflex/components/{forms → chakra/forms}/slider.py +4 -3
- reflex/components/{forms → chakra/forms}/slider.pyi +5 -4
- reflex/components/{forms → chakra/forms}/switch.py +1 -1
- reflex/components/{forms → chakra/forms}/switch.pyi +2 -2
- reflex/components/{forms → chakra/forms}/textarea.py +2 -2
- reflex/components/{forms → chakra/forms}/textarea.pyi +3 -3
- reflex/components/chakra/forms/time_picker.py +11 -0
- reflex/components/chakra/forms/time_picker.pyi +129 -0
- reflex/components/{layout → chakra/layout}/__init__.py +1 -20
- reflex/components/{layout → chakra/layout}/aspect_ratio.py +1 -1
- reflex/components/{layout → chakra/layout}/aspect_ratio.pyi +2 -2
- reflex/components/{layout → chakra/layout}/box.py +1 -1
- reflex/components/{layout → chakra/layout}/box.pyi +2 -2
- reflex/components/{layout → chakra/layout}/card.py +2 -2
- reflex/components/{layout → chakra/layout}/card.pyi +3 -3
- reflex/components/{layout → chakra/layout}/center.py +1 -1
- reflex/components/{layout → chakra/layout}/center.pyi +2 -2
- reflex/components/{layout → chakra/layout}/container.py +1 -1
- reflex/components/{layout → chakra/layout}/container.pyi +2 -2
- reflex/components/{layout → chakra/layout}/flex.py +1 -1
- reflex/components/{layout → chakra/layout}/flex.pyi +2 -2
- reflex/components/{layout → chakra/layout}/grid.py +1 -1
- reflex/components/{layout → chakra/layout}/grid.pyi +2 -2
- reflex/components/{layout → chakra/layout}/html.py +1 -1
- reflex/components/{layout → chakra/layout}/html.pyi +2 -2
- reflex/components/{layout → chakra/layout}/spacer.py +1 -1
- reflex/components/{layout → chakra/layout}/spacer.pyi +2 -2
- reflex/components/{layout → chakra/layout}/stack.py +1 -1
- reflex/components/{layout → chakra/layout}/stack.pyi +2 -2
- reflex/components/{layout → chakra/layout}/wrap.py +1 -1
- reflex/components/{layout → chakra/layout}/wrap.pyi +2 -2
- reflex/components/chakra/media/__init__.py +7 -0
- reflex/components/{media → chakra/media}/avatar.py +1 -1
- reflex/components/{media → chakra/media}/avatar.pyi +2 -2
- reflex/components/chakra/media/icon.py +110 -0
- reflex/components/{media → chakra/media}/icon.pyi +2 -2
- reflex/components/chakra/media/image.py +1 -1
- reflex/components/chakra/media/image.pyi +1 -1
- reflex/components/{navigation → chakra/navigation}/__init__.py +0 -1
- reflex/components/{navigation → chakra/navigation}/breadcrumb.py +3 -3
- reflex/components/{navigation → chakra/navigation}/breadcrumb.pyi +4 -4
- reflex/components/{navigation → chakra/navigation}/link.py +2 -2
- reflex/components/{navigation → chakra/navigation}/link.pyi +3 -3
- reflex/components/{navigation → chakra/navigation}/linkoverlay.py +1 -1
- reflex/components/{navigation → chakra/navigation}/linkoverlay.pyi +2 -2
- reflex/components/{navigation → chakra/navigation}/stepper.py +1 -1
- reflex/components/{navigation → chakra/navigation}/stepper.pyi +2 -2
- reflex/components/{overlay → chakra/overlay}/__init__.py +0 -1
- reflex/components/{overlay → chakra/overlay}/alertdialog.py +2 -2
- reflex/components/{overlay → chakra/overlay}/alertdialog.pyi +3 -3
- reflex/components/{overlay → chakra/overlay}/drawer.py +3 -3
- reflex/components/{overlay → chakra/overlay}/drawer.pyi +4 -4
- reflex/components/{overlay → chakra/overlay}/menu.py +4 -6
- reflex/components/{overlay → chakra/overlay}/menu.pyi +4 -4
- reflex/components/{overlay → chakra/overlay}/modal.py +2 -2
- reflex/components/{overlay → chakra/overlay}/modal.pyi +3 -3
- reflex/components/{overlay → chakra/overlay}/popover.py +2 -2
- reflex/components/{overlay → chakra/overlay}/popover.pyi +3 -3
- reflex/components/{overlay → chakra/overlay}/tooltip.py +1 -1
- reflex/components/{overlay → chakra/overlay}/tooltip.pyi +2 -2
- reflex/components/{typography → chakra/typography}/__init__.py +0 -1
- reflex/components/{typography → chakra/typography}/heading.py +1 -1
- reflex/components/{typography → chakra/typography}/heading.pyi +2 -2
- reflex/components/{typography → chakra/typography}/highlight.py +1 -1
- reflex/components/{typography → chakra/typography}/highlight.pyi +2 -2
- reflex/components/{typography → chakra/typography}/span.py +1 -1
- reflex/components/{typography → chakra/typography}/span.pyi +2 -2
- reflex/components/{typography → chakra/typography}/text.py +1 -1
- reflex/components/{typography → chakra/typography}/text.pyi +2 -2
- reflex/components/component.py +7 -8
- reflex/components/core/__init__.py +22 -0
- reflex/components/{overlay → core}/banner.py +4 -3
- reflex/components/{overlay → core}/banner.pyi +5 -4
- reflex/components/{navigation → core}/client_side_routing.py +1 -1
- reflex/components/{navigation → core}/client_side_routing.pyi +2 -2
- reflex/components/{layout → core}/cond.py +1 -1
- reflex/components/{forms → core}/debounce.py +1 -1
- reflex/components/{forms → core}/debounce.pyi +2 -2
- reflex/components/{layout → core}/foreach.py +18 -2
- reflex/components/core/match.py +257 -0
- reflex/components/{layout → core}/responsive.py +1 -1
- reflex/components/{forms → core}/upload.py +2 -2
- reflex/components/{forms → core}/upload.pyi +3 -3
- reflex/components/datadisplay/__init__.py +4 -13
- reflex/components/el/elements/inline.py +4 -0
- reflex/components/el/elements/inline.pyi +3 -0
- reflex/components/gridjs/__init__.py +5 -0
- reflex/components/{datadisplay → gridjs}/datatable.pyi +1 -1
- reflex/components/literals.py +27 -0
- reflex/components/markdown/__init__.py +5 -0
- reflex/components/{typography → markdown}/markdown.py +16 -6
- reflex/components/{typography → markdown}/markdown.pyi +10 -5
- reflex/components/media/__init__.py +1 -8
- reflex/components/media/icon.py +2 -110
- reflex/components/moment/__init__.py +5 -0
- reflex/components/{datadisplay → moment}/moment.pyi +1 -1
- reflex/components/next/__init__.py +2 -0
- reflex/components/{navigation/nextlink.pyi → next/link.pyi} +1 -1
- reflex/components/plotly/__init__.py +5 -0
- reflex/components/{graphing → plotly}/plotly.pyi +1 -1
- reflex/components/radix/primitives/__init__.py +12 -1
- reflex/components/radix/primitives/accordion.py +33 -68
- reflex/components/radix/primitives/accordion.pyi +6 -89
- reflex/components/radix/primitives/base.py +27 -0
- reflex/components/radix/primitives/base.pyi +95 -0
- reflex/components/radix/primitives/form.py +267 -0
- reflex/components/radix/primitives/form.pyi +740 -0
- reflex/components/radix/primitives/progress.py +84 -0
- reflex/components/radix/primitives/progress.pyi +268 -0
- reflex/components/radix/primitives/slider.py +179 -0
- reflex/components/radix/primitives/slider.pyi +452 -0
- reflex/components/radix/themes/base.py +43 -31
- reflex/components/radix/themes/base.pyi +223 -29
- reflex/components/radix/themes/components/__init__.py +18 -3
- reflex/components/radix/themes/components/alertdialog.py +27 -6
- reflex/components/radix/themes/components/alertdialog.pyi +713 -2
- reflex/components/radix/themes/components/aspectratio.py +1 -1
- reflex/components/radix/themes/components/aspectratio.pyi +67 -2
- reflex/components/radix/themes/components/avatar.py +0 -3
- reflex/components/radix/themes/components/avatar.pyi +13 -13
- reflex/components/radix/themes/components/badge.py +1 -4
- reflex/components/radix/themes/components/badge.pyi +11 -11
- reflex/components/radix/themes/components/button.py +1 -1
- reflex/components/radix/themes/components/button.pyi +15 -11
- reflex/components/radix/themes/components/callout.pyi +144 -12
- reflex/components/radix/themes/components/card.py +1 -1
- reflex/components/radix/themes/components/card.pyi +68 -1
- reflex/components/radix/themes/components/checkbox.pyi +14 -12
- reflex/components/radix/themes/components/contextmenu.pyi +402 -8
- reflex/components/radix/themes/components/dialog.py +6 -0
- reflex/components/radix/themes/components/dialog.pyi +518 -0
- reflex/components/radix/themes/components/dropdownmenu.pyi +337 -8
- reflex/components/radix/themes/components/hovercard.pyi +195 -0
- reflex/components/radix/themes/components/iconbutton.pyi +14 -12
- reflex/components/radix/themes/components/icons.py +2 -2
- reflex/components/radix/themes/components/inset.pyi +65 -0
- reflex/components/radix/themes/components/popover.pyi +260 -0
- reflex/components/radix/themes/components/radiogroup.py +1 -1
- reflex/components/radix/themes/components/radiogroup.pyi +78 -9
- reflex/components/radix/themes/components/scrollarea.pyi +65 -0
- reflex/components/radix/themes/components/select.pyi +342 -13
- reflex/components/radix/themes/components/separator.pyi +7 -5
- reflex/components/radix/themes/components/slider.py +4 -4
- reflex/components/radix/themes/components/slider.pyi +17 -13
- reflex/components/radix/themes/components/switch.pyi +20 -18
- reflex/components/radix/themes/components/table.py +1 -1
- reflex/components/radix/themes/components/table.pyi +458 -1
- reflex/components/radix/themes/components/tabs.py +4 -4
- reflex/components/radix/themes/components/tabs.pyi +263 -3
- reflex/components/radix/themes/components/textarea.py +1 -1
- reflex/components/radix/themes/components/textarea.pyi +1 -1
- reflex/components/radix/themes/components/textfield.py +1 -1
- reflex/components/radix/themes/components/textfield.pyi +18 -14
- reflex/components/radix/themes/components/tooltip.py +15 -0
- reflex/components/radix/themes/components/tooltip.pyi +205 -0
- reflex/components/radix/themes/layout/base.pyi +65 -0
- reflex/components/radix/themes/layout/box.pyi +65 -0
- reflex/components/radix/themes/layout/container.pyi +65 -0
- reflex/components/radix/themes/layout/flex.pyi +65 -0
- reflex/components/radix/themes/layout/grid.pyi +65 -0
- reflex/components/radix/themes/layout/section.pyi +65 -0
- reflex/components/radix/themes/typography/blockquote.pyi +16 -14
- reflex/components/radix/themes/typography/code.pyi +22 -20
- reflex/components/radix/themes/typography/em.pyi +65 -0
- reflex/components/radix/themes/typography/heading.pyi +30 -28
- reflex/components/radix/themes/typography/kbd.pyi +65 -0
- reflex/components/radix/themes/typography/link.py +2 -1
- reflex/components/radix/themes/typography/link.pyi +121 -28
- reflex/components/radix/themes/typography/quote.pyi +66 -0
- reflex/components/radix/themes/typography/strong.pyi +65 -0
- reflex/components/radix/themes/typography/text.pyi +30 -28
- reflex/components/react_player/__init__.py +7 -0
- reflex/components/react_player/audio.py +8 -0
- reflex/components/{media → react_player}/audio.pyi +3 -3
- reflex/components/{libs → react_player}/react_player.py +1 -1
- reflex/components/{libs → react_player}/react_player.pyi +3 -3
- reflex/components/react_player/video.py +8 -0
- reflex/components/{media → react_player}/video.pyi +3 -3
- reflex/components/{graphing/recharts → recharts}/cartesian.pyi +1 -1
- reflex/components/{graphing/recharts → recharts}/charts.py +1 -1
- reflex/components/{graphing/recharts → recharts}/charts.pyi +2 -2
- reflex/components/{graphing/recharts → recharts}/general.pyi +1 -1
- reflex/components/{graphing/recharts → recharts}/polar.pyi +1 -1
- reflex/components/{graphing/recharts → recharts}/recharts.pyi +1 -1
- reflex/components/suneditor/__init__.py +5 -0
- reflex/components/{forms → suneditor}/editor.pyi +1 -1
- reflex/components/tags/__init__.py +1 -0
- reflex/components/tags/iter_tag.py +3 -3
- reflex/components/tags/match_tag.py +19 -0
- reflex/constants/base.py +2 -0
- reflex/constants/config.py +1 -1
- reflex/constants/installer.py +1 -0
- reflex/constants/style.py +1 -1
- reflex/event.py +1 -1
- reflex/reflex.py +14 -12
- reflex/state.py +14 -0
- reflex/style.py +1 -1
- reflex/testing.py +59 -9
- reflex/utils/build.py +7 -1
- reflex/utils/exceptions.py +6 -0
- reflex/utils/exec.py +2 -2
- reflex/utils/export.py +1 -1
- reflex/utils/format.py +41 -4
- reflex/utils/prerequisites.py +56 -11
- reflex/utils/processes.py +8 -1
- reflex/utils/types.py +2 -2
- reflex/vars.py +25 -1
- {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/METADATA +8 -2
- reflex-0.3.8.dist-info/RECORD +492 -0
- reflex/components/graphing/__init__.py +0 -5
- reflex/components/libs/__init__.py +0 -31
- reflex/components/media/audio.py +0 -8
- reflex/components/media/image.pyi +0 -123
- reflex/components/media/video.py +0 -8
- reflex-0.3.7a1.dist-info/RECORD +0 -470
- /reflex/components/{layout → base}/fragment.py +0 -0
- /reflex/components/{libs/chakra.py → chakra/base.py} +0 -0
- /reflex/components/{disclosure → chakra/disclosure}/__init__.py +0 -0
- /reflex/components/{feedback → chakra/feedback}/__init__.py +0 -0
- /reflex/components/{forms → chakra/forms}/multiselect.py +0 -0
- /reflex/components/{datadisplay → gridjs}/datatable.py +0 -0
- /reflex/components/{datadisplay → moment}/moment.py +0 -0
- /reflex/components/{navigation/nextlink.py → next/link.py} +0 -0
- /reflex/components/{graphing → plotly}/plotly.py +0 -0
- /reflex/components/{graphing/recharts → recharts}/__init__.py +0 -0
- /reflex/components/{graphing/recharts → recharts}/cartesian.py +0 -0
- /reflex/components/{graphing/recharts → recharts}/general.py +0 -0
- /reflex/components/{graphing/recharts → recharts}/polar.py +0 -0
- /reflex/components/{graphing/recharts → recharts}/recharts.py +0 -0
- /reflex/components/{forms → suneditor}/editor.py +0 -0
- {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/LICENSE +0 -0
- {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/WHEEL +0 -0
- {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/entry_points.txt +0 -0
reflex/utils/prerequisites.py
CHANGED
|
@@ -159,11 +159,30 @@ def get_app(reload: bool = False) -> ModuleType:
|
|
|
159
159
|
sys.path.insert(0, os.getcwd())
|
|
160
160
|
app = __import__(module, fromlist=(constants.CompileVars.APP,))
|
|
161
161
|
if reload:
|
|
162
|
+
from reflex.state import State
|
|
162
163
|
|
|
164
|
+
# Reset rx.State subclasses to avoid conflict when reloading.
|
|
165
|
+
State.class_subclasses.clear()
|
|
166
|
+
# Reload the app module.
|
|
163
167
|
importlib.reload(app)
|
|
168
|
+
|
|
164
169
|
return app
|
|
165
170
|
|
|
166
171
|
|
|
172
|
+
def get_compiled_app(reload: bool = False) -> ModuleType:
|
|
173
|
+
"""Get the app module based on the default config after first compiling it.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
reload: Re-import the app module from disk
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
The compiled app based on the default config.
|
|
180
|
+
"""
|
|
181
|
+
app_module = get_app(reload=reload)
|
|
182
|
+
getattr(app_module, constants.CompileVars.APP).compile_()
|
|
183
|
+
return app_module
|
|
184
|
+
|
|
185
|
+
|
|
167
186
|
def get_redis() -> Redis | None:
|
|
168
187
|
"""Get the redis client.
|
|
169
188
|
|
|
@@ -201,19 +220,23 @@ def get_production_backend_url() -> str:
|
|
|
201
220
|
)
|
|
202
221
|
|
|
203
222
|
|
|
204
|
-
def
|
|
205
|
-
"""
|
|
223
|
+
def validate_app_name(app_name: str | None = None) -> str:
|
|
224
|
+
"""Validate the app name.
|
|
206
225
|
|
|
207
226
|
The default app name is the name of the current directory.
|
|
208
227
|
|
|
228
|
+
Args:
|
|
229
|
+
app_name: the name passed by user during reflex init
|
|
230
|
+
|
|
209
231
|
Returns:
|
|
210
|
-
The
|
|
232
|
+
The app name after validation.
|
|
211
233
|
|
|
212
234
|
Raises:
|
|
213
|
-
Exit: if the app directory name is reflex.
|
|
235
|
+
Exit: if the app directory name is reflex or if the name is not standard for a python package name.
|
|
214
236
|
"""
|
|
215
|
-
app_name =
|
|
216
|
-
|
|
237
|
+
app_name = (
|
|
238
|
+
app_name if app_name else os.getcwd().split(os.path.sep)[-1].replace("-", "_")
|
|
239
|
+
)
|
|
217
240
|
# Make sure the app is not named "reflex".
|
|
218
241
|
if app_name == constants.Reflex.MODULE_NAME:
|
|
219
242
|
console.error(
|
|
@@ -221,6 +244,13 @@ def get_default_app_name() -> str:
|
|
|
221
244
|
)
|
|
222
245
|
raise typer.Exit(1)
|
|
223
246
|
|
|
247
|
+
# Make sure the app name is standard for a python package name.
|
|
248
|
+
if not re.match(r"^[a-zA-Z][a-zA-Z0-9_]*$", app_name):
|
|
249
|
+
console.error(
|
|
250
|
+
"The app directory name must start with a letter and can contain letters, numbers, and underscores."
|
|
251
|
+
)
|
|
252
|
+
raise typer.Exit(1)
|
|
253
|
+
|
|
224
254
|
return app_name
|
|
225
255
|
|
|
226
256
|
|
|
@@ -263,18 +293,33 @@ def initialize_requirements_txt():
|
|
|
263
293
|
the requirements.txt file.
|
|
264
294
|
"""
|
|
265
295
|
fp = Path(constants.RequirementsTxt.FILE)
|
|
266
|
-
|
|
267
|
-
|
|
296
|
+
encoding = "utf-8"
|
|
297
|
+
if not fp.exists():
|
|
298
|
+
fp.touch()
|
|
299
|
+
else:
|
|
300
|
+
# Detect the encoding of the original file
|
|
301
|
+
import charset_normalizer
|
|
302
|
+
|
|
303
|
+
charset_matches = charset_normalizer.from_path(fp)
|
|
304
|
+
maybe_charset_match = charset_matches.best()
|
|
305
|
+
if maybe_charset_match is None:
|
|
306
|
+
console.debug(f"Unable to detect encoding for {fp}, exiting.")
|
|
307
|
+
return
|
|
308
|
+
encoding = maybe_charset_match.encoding
|
|
309
|
+
console.debug(f"Detected encoding for {fp} as {encoding}.")
|
|
268
310
|
try:
|
|
269
|
-
|
|
311
|
+
other_requirements_exist = False
|
|
312
|
+
with open(fp, "r", encoding=encoding) as f:
|
|
270
313
|
for req in f.readlines():
|
|
271
314
|
# Check if we have a package name that is reflex
|
|
272
315
|
if re.match(r"^reflex[^a-zA-Z0-9]", req):
|
|
273
316
|
console.debug(f"{fp} already has reflex as dependency.")
|
|
274
317
|
return
|
|
275
|
-
|
|
318
|
+
other_requirements_exist = True
|
|
319
|
+
with open(fp, "a", encoding=encoding) as f:
|
|
320
|
+
preceding_newline = "\n" if other_requirements_exist else ""
|
|
276
321
|
f.write(
|
|
277
|
-
f"
|
|
322
|
+
f"{preceding_newline}{constants.RequirementsTxt.DEFAULTS_STUB}{constants.Reflex.VERSION}\n"
|
|
278
323
|
)
|
|
279
324
|
except Exception:
|
|
280
325
|
console.info(f"Unable to check {fp} for reflex dependency.")
|
reflex/utils/processes.py
CHANGED
|
@@ -171,7 +171,9 @@ def run_concurrently_context(
|
|
|
171
171
|
fns = [fn if isinstance(fn, tuple) else (fn,) for fn in fns] # type: ignore
|
|
172
172
|
|
|
173
173
|
# Run the functions concurrently.
|
|
174
|
-
|
|
174
|
+
executor = None
|
|
175
|
+
try:
|
|
176
|
+
executor = futures.ThreadPoolExecutor(max_workers=len(fns))
|
|
175
177
|
# Submit the tasks.
|
|
176
178
|
tasks = [executor.submit(*fn) for fn in fns] # type: ignore
|
|
177
179
|
|
|
@@ -180,7 +182,12 @@ def run_concurrently_context(
|
|
|
180
182
|
|
|
181
183
|
# Get the results in the order completed to check any exceptions.
|
|
182
184
|
for task in futures.as_completed(tasks):
|
|
185
|
+
# if task throws something, we let it bubble up immediately
|
|
183
186
|
task.result()
|
|
187
|
+
finally:
|
|
188
|
+
# Shutdown the executor
|
|
189
|
+
if executor:
|
|
190
|
+
executor.shutdown(wait=False)
|
|
184
191
|
|
|
185
192
|
|
|
186
193
|
def run_concurrently(*fns: Union[Callable, Tuple]) -> None:
|
reflex/utils/types.py
CHANGED
|
@@ -19,7 +19,7 @@ from typing import (
|
|
|
19
19
|
)
|
|
20
20
|
|
|
21
21
|
from pydantic.fields import ModelField
|
|
22
|
-
from sqlalchemy.orm import Mapped
|
|
22
|
+
from sqlalchemy.orm import DeclarativeBase, Mapped
|
|
23
23
|
|
|
24
24
|
from reflex.base import Base
|
|
25
25
|
from reflex.utils import serializers
|
|
@@ -128,7 +128,7 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
|
|
|
128
128
|
# Ensure frontend uses null coalescing when accessing.
|
|
129
129
|
type_ = Optional[type_]
|
|
130
130
|
return type_
|
|
131
|
-
elif isinstance(cls, type) and issubclass(cls, Model):
|
|
131
|
+
elif isinstance(cls, type) and issubclass(cls, (Model, DeclarativeBase)):
|
|
132
132
|
# Check in the annotations directly (for sqlmodel.Relationship)
|
|
133
133
|
hints = get_type_hints(cls)
|
|
134
134
|
if name in hints:
|
reflex/vars.py
CHANGED
|
@@ -209,7 +209,11 @@ def _decode_var(value: str) -> tuple[VarData | None, str]:
|
|
|
209
209
|
var_datas = []
|
|
210
210
|
if isinstance(value, str):
|
|
211
211
|
# Extract the state name from a formatted var
|
|
212
|
-
while m := re.match(
|
|
212
|
+
while m := re.match(
|
|
213
|
+
pattern=r"(.*)<reflex.Var>(.*)</reflex.Var>(.*)",
|
|
214
|
+
string=value,
|
|
215
|
+
flags=re.DOTALL, # Ensure . matches newline characters.
|
|
216
|
+
):
|
|
213
217
|
value = m.group(1) + m.group(3)
|
|
214
218
|
try:
|
|
215
219
|
var_datas.append(VarData.parse_raw(m.group(2)))
|
|
@@ -1530,6 +1534,26 @@ class Var:
|
|
|
1530
1534
|
"""
|
|
1531
1535
|
return self._var_data.state if self._var_data else ""
|
|
1532
1536
|
|
|
1537
|
+
@property
|
|
1538
|
+
def _var_name_unwrapped(self) -> str:
|
|
1539
|
+
"""Get the var str without wrapping in curly braces.
|
|
1540
|
+
|
|
1541
|
+
Returns:
|
|
1542
|
+
The str var without the wrapped curly braces
|
|
1543
|
+
"""
|
|
1544
|
+
type_ = (
|
|
1545
|
+
get_origin(self._var_type)
|
|
1546
|
+
if types.is_generic_alias(self._var_type)
|
|
1547
|
+
else self._var_type
|
|
1548
|
+
)
|
|
1549
|
+
|
|
1550
|
+
wrapped_var = str(self)
|
|
1551
|
+
return (
|
|
1552
|
+
wrapped_var
|
|
1553
|
+
if not self._var_state and issubclass(type_, dict)
|
|
1554
|
+
else wrapped_var.strip("{}")
|
|
1555
|
+
)
|
|
1556
|
+
|
|
1533
1557
|
|
|
1534
1558
|
# Allow automatic serialization of Var within JSON structures
|
|
1535
1559
|
serializers.serializer(_encode_var)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: reflex
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.8
|
|
4
4
|
Summary: Web apps in pure Python.
|
|
5
5
|
Home-page: https://reflex.dev
|
|
6
6
|
License: Apache-2.0
|
|
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
18
|
Requires-Dist: alembic (>=1.11.1,<2.0.0)
|
|
19
|
+
Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
|
|
19
20
|
Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
|
|
20
21
|
Requires-Dist: distro (>=1.8.0,<2.0.0) ; sys_platform == "linux"
|
|
21
22
|
Requires-Dist: fastapi (>=0.96.0,<0.97.0)
|
|
@@ -171,7 +172,6 @@ def index():
|
|
|
171
172
|
# Add state and page to the app.
|
|
172
173
|
app = rx.App()
|
|
173
174
|
app.add_page(index, title="reflex:DALL·E")
|
|
174
|
-
app.compile()
|
|
175
175
|
```
|
|
176
176
|
|
|
177
177
|
## Let's break this down.
|
|
@@ -282,6 +282,12 @@ We welcome contributions of any size! Below are some good ways to get started in
|
|
|
282
282
|
|
|
283
283
|
We are actively looking for contributors, no matter your skill level or experience. To contribute check out [CONTIBUTING.md](https://github.com/reflex-dev/reflex/blob/main/CONTRIBUTING.md)
|
|
284
284
|
|
|
285
|
+
|
|
286
|
+
## All Thanks To Our Contributors:
|
|
287
|
+
<a href="https://github.com/reflex-dev/reflex/graphs/contributors">
|
|
288
|
+
<img src="https://contrib.rocks/image?repo=reflex-dev/reflex" />
|
|
289
|
+
</a>
|
|
290
|
+
|
|
285
291
|
## License
|
|
286
292
|
|
|
287
293
|
Reflex is open-source and licensed under the [Apache License 2.0](LICENSE).
|