Add error message for invalid var ops (#664)

This commit is contained in:
Nikhil Rao 2023-03-11 21:11:59 -08:00 committed by GitHub
parent 38ecc66893
commit 2ee8c73d5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 45 additions and 61 deletions

View File

@ -1,3 +1,3 @@
{ {
"version": "0.1.19" "version": "0.1.20"
} }

View File

@ -204,7 +204,6 @@ class App(Base):
description: str = constants.DEFAULT_DESCRIPTION, description: str = constants.DEFAULT_DESCRIPTION,
image=constants.DEFAULT_IMAGE, image=constants.DEFAULT_IMAGE,
on_load: Optional[Union[EventHandler, List[EventHandler]]] = None, on_load: Optional[Union[EventHandler, List[EventHandler]]] = None,
path: Optional[str] = None,
meta: List[Dict] = constants.DEFAULT_META_LIST, meta: List[Dict] = constants.DEFAULT_META_LIST,
script_tags: Optional[List[Component]] = None, script_tags: Optional[List[Component]] = None,
): ):
@ -215,7 +214,6 @@ class App(Base):
Args: Args:
component: The component to display at the page. component: The component to display at the page.
path: (deprecated) The path to the component.
route: The route to display the component at. route: The route to display the component at.
title: The title of the page. title: The title of the page.
description: The description of the page. description: The description of the page.
@ -223,13 +221,10 @@ class App(Base):
on_load: The event handler(s) that will be called each time the page load. on_load: The event handler(s) that will be called each time the page load.
meta: The metadata of the page. meta: The metadata of the page.
script_tags: List of script tags to be added to component script_tags: List of script tags to be added to component
"""
if path is not None:
utils.deprecate(
"The `path` argument is deprecated for `add_page`. Use `route` instead."
)
route = path
Raises:
TypeError: If an invalid var operation is used.
"""
# If the route is not set, get it from the callable. # If the route is not set, get it from the callable.
if route is None: if route is None:
assert isinstance( assert isinstance(
@ -244,7 +239,17 @@ class App(Base):
self.state.setup_dynamic_args(utils.get_route_args(route)) self.state.setup_dynamic_args(utils.get_route_args(route))
# Generate the component if it is a callable. # Generate the component if it is a callable.
component = component if isinstance(component, Component) else component() try:
component = component if isinstance(component, Component) else component()
except TypeError as e:
message = str(e)
if "BaseVar" in message or "ComputedVar" in message:
raise TypeError(
"You may be trying to use an invalid Python function on a state var. "
"When referencing a var inside your render code, only limited var operations are supported. "
"See the var operation docs here: https://pynecone.io/docs/state/vars "
) from e
raise e
# Add meta information to the component. # Add meta information to the component.
compiler_utils.add_meta( compiler_utils.add_meta(

View File

@ -1,11 +1,9 @@
"""Display the page body.""" """Display the page body."""
from pynecone.components.component import Component from pynecone.components.component import Component
from pynecone.components.tags import Tag
class Body(Component): class Body(Component):
"""A body component.""" """A body component."""
def _render(self) -> Tag: tag = "body"
return Tag(name="body")

View File

@ -1,76 +1,44 @@
"""Display the title of the current page.""" """Display the title of the current page."""
from typing import Optional
from pynecone.components.component import Component from pynecone.components.component import Component
from pynecone.components.tags import Tag
from pynecone.var import Var from pynecone.var import Var
class Link(Component): class Link(Component):
"""A component that displays the title of the current page.""" """A component that displays the title of the current page."""
tag = "link"
# The href. # The href.
href: Var[str] href: Var[str]
# The type of link. # The type of link.
rel: Var[str] rel: Var[str]
def _render(self) -> Tag:
return Tag(name="link").add_props(
href=self.href,
rel=self.rel,
)
class ScriptTag(Component): class ScriptTag(Component):
"""A component that creates a script tag with the speacified type and source. """A script tag with the specified type and source."""
Args:
type: This attribute indicates the type of script represented.
The value of this attribute will be one of the following:
- module: This value causes the code to be treated as a JavaScript module.
- importmap: This value indicates that the body of the element
contains an import map.
- Any value: The embedded content is treated as a data block, and won't be
processed by the browser.
- blocking: This attribute explicitly indicates that certain operations
should be blocked on the fetching of the script.
source: This attribute specifies the URI of an external script; this can be
used as an alternative to embedding a script directly within a document.
integrity: This attribute contains inline metadata that a user agent can use
to verify that a fetched resource has been delivered free of unexpected manipulation
crossorigin: To allow error logging for sites which use a separate domain for static media,
use this attribute.
referrer_policy: Indicates which referrer to send when fetching the script, or resources fetched by the script
refrence: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#:~:text=Indicates%20which%20referrer%20to%20send%20when%20fetching%20the%20script%2C%20or%20resources%20fetched%20by%20the%20script%3A
is_async: This attribute allows the elimination of parser-blocking JavaScript where the browser would have to
load and evaluate scripts before continuing to parse. defer has a similar effect in this case.
defer: This Boolean attribute is set to indicate to a browser that the script is
meant to be executed after the document has been parsed, but before firing DOMContentLoaded.
"""
tag = "script" tag = "script"
type: Var[str] # The type of script represented.
type_: Var[str]
# The URI of an external script.
source: Var[str] source: Var[str]
integrity: Optional[Var[str]] # Metadata to verify the content of the script.
integrity: Var[str]
crossorigin: Optional[Var[str]] # Whether to allow cross-origin requests.
crossorigin: Var[str]
referrer_policy: Optional[Var[str]] # Indicates which referrer to send when fetching the script.
referrer_policy: Var[str]
is_async: Optional[Var[bool]] # Whether to asynchronously load the script.
is_async: Var[bool]
defer: Optional[Var[bool]] # Whether to defer loading the script.
defer: Var[bool]

View File

@ -44,6 +44,7 @@ class AssetFolderHandler(FileSystemEventHandler):
def on_modified(self, event: FileSystemEvent): def on_modified(self, event: FileSystemEvent):
"""Event handler when a file or folder was modified. """Event handler when a file or folder was modified.
This is called every time after a file is created, modified and deleted. This is called every time after a file is created, modified and deleted.
Args: Args:

View File

@ -0,0 +1 @@
"""Datadisplay component tests."""

View File

@ -1,3 +1,5 @@
"""Data display component tests fixtures."""
import pytest import pytest
import pynecone as pc import pynecone as pc
@ -5,6 +7,15 @@ import pynecone as pc
@pytest.fixture @pytest.fixture
def data_table_state(request): def data_table_state(request):
"""Get a data table state.
Args:
request: The request.
Returns:
The data table state class.
"""
class DataTableState(pc.State): class DataTableState(pc.State):
data = request.param["data"] data = request.param["data"]
columns = ["column1", "column2"] columns = ["column1", "column2"]