Factor out code for dynamic routes (#109)
This commit is contained in:
parent
933c3678d4
commit
e127149bc1
@ -209,25 +209,13 @@ class App(Base):
|
|||||||
), "Path must be set if component is not a callable."
|
), "Path must be set if component is not a callable."
|
||||||
path = component.__name__
|
path = component.__name__
|
||||||
|
|
||||||
from pynecone.var import BaseVar
|
# Get args from the path for dynamic routes.
|
||||||
|
args = utils.get_path_args(path)
|
||||||
parts = os.path.split(path)
|
|
||||||
check = re.compile(r"^\[(.+)\]$")
|
|
||||||
args = []
|
|
||||||
for part in parts:
|
|
||||||
match = check.match(part)
|
|
||||||
if match:
|
|
||||||
v = BaseVar(
|
|
||||||
name=match.groups()[0],
|
|
||||||
type_=str,
|
|
||||||
state=f"{constants.ROUTER}.query",
|
|
||||||
)
|
|
||||||
args.append(v)
|
|
||||||
|
|
||||||
# Generate the component if it is a callable.
|
# Generate the component if it is a callable.
|
||||||
component = component if isinstance(component, Component) else component(*args)
|
component = component if isinstance(component, Component) else component(*args)
|
||||||
|
|
||||||
# Add the title to the component.
|
# Add meta information to the component.
|
||||||
compiler_utils.add_meta(
|
compiler_utils.add_meta(
|
||||||
component, title=title, image=image, description=description
|
component, title=title, image=image, description=description
|
||||||
)
|
)
|
||||||
|
@ -303,11 +303,21 @@ def get_bun_path() -> str:
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The path to the bun executable.
|
The path to the bun executable.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
FileNotFoundError: If bun or npm is not installed.
|
||||||
"""
|
"""
|
||||||
# On windows, we use npm instead of bun.
|
# On Windows, we use npm instead of bun.
|
||||||
if platform.system() == "Windows":
|
if platform.system() == "Windows":
|
||||||
return str(which("npm"))
|
if which("npm") is None:
|
||||||
return os.path.expandvars(get_config().bun_path)
|
raise FileNotFoundError("Pynecone requires npm to be installed on Windows.")
|
||||||
|
return "npm"
|
||||||
|
|
||||||
|
# On other platforms, we use bun.
|
||||||
|
bun_path = os.path.expandvars(get_config().bun_path)
|
||||||
|
if which(bun_path) is None:
|
||||||
|
raise FileNotFoundError("Pynecone requires bun to be installed.")
|
||||||
|
return bun_path
|
||||||
|
|
||||||
|
|
||||||
def get_app() -> ModuleType:
|
def get_app() -> ModuleType:
|
||||||
@ -681,6 +691,36 @@ def get_theme_path() -> str:
|
|||||||
return os.path.join(constants.WEB_UTILS_DIR, constants.THEME + constants.JS_EXT)
|
return os.path.join(constants.WEB_UTILS_DIR, constants.THEME + constants.JS_EXT)
|
||||||
|
|
||||||
|
|
||||||
|
def get_path_args(path: str) -> List[str]:
|
||||||
|
"""Get the path arguments for the given path.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The path to get the arguments for.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The path arguments.
|
||||||
|
"""
|
||||||
|
# Import here to avoid circular imports.
|
||||||
|
from pynecone.var import BaseVar
|
||||||
|
|
||||||
|
# Regex to check for path args.
|
||||||
|
check = re.compile(r"^\[(.+)\]$")
|
||||||
|
|
||||||
|
# Iterate over the path parts and check for path args.
|
||||||
|
args = []
|
||||||
|
for part in os.path.split(path):
|
||||||
|
match = check.match(part)
|
||||||
|
if match:
|
||||||
|
# Add the path arg to the list.
|
||||||
|
v = BaseVar(
|
||||||
|
name=match.groups()[0],
|
||||||
|
type_=str,
|
||||||
|
state=f"{constants.ROUTER}.query",
|
||||||
|
)
|
||||||
|
args.append(v)
|
||||||
|
return args
|
||||||
|
|
||||||
|
|
||||||
def write_page(path: str, code: str):
|
def write_page(path: str, code: str):
|
||||||
"""Write the given code to the given path.
|
"""Write the given code to the given path.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user