initial template for app based on wuttaweb

with e.g. `poser install` command
This commit is contained in:
Lance Edgar 2024-11-26 11:16:09 -06:00
commit 46b33a622f
18 changed files with 344 additions and 0 deletions

View file

@ -0,0 +1,18 @@
# {{cookiecutter.project_name}}
This is a starter project based on `WuttaWeb
<https://wuttaproject.org>`_.
## Quick Start
Make a virtual environment and install the app:
python3 -m venv {{cookiecutter.repo_name}}
cd {{cookiecutter.repo_name}}
bin/pip install {{cookiecutter.distribution_name}}
bin/{{cookiecutter.package_name}} install
For more info see
https://rattailproject.org/docs/wuttjamaican/narr/install/index.html

View file

@ -0,0 +1,51 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "{{cookiecutter.project_name}}"
version = "0.1.0"
description = "{{cookiecutter.project_short_description}}"
readme = "README.md"
authors = [
{name = "{{cookiecutter.full_name}}", email = "{{cookiecutter.email}}"}
]
maintainers = [
{name = "{{cookiecutter.full_name}}", email = "{{cookiecutter.email}}"}
]
classifiers = [
# TODO: remove this if you intend to publish your project
# (it's here by default, to prevent accidental publishing)
"Private :: Do Not Upload",
]
license = {text = "{{cookiecutter.open_source_license}}"}
dependencies = [
"psycopg2",
"WuttaWeb",
]
[project.scripts]
"{{cookiecutter.package_name}}" = "{{cookiecutter.package_name}}.cli:{{cookiecutter.package_name}}_typer"
[project.entry-points."paste.app_factory"]
"main" = "{{cookiecutter.package_name}}.web.app:main"
[project.entry-points."wutta.config.extensions"]
"{{cookiecutter.package_name}}" = "{{cookiecutter.package_name}}.config:{{cookiecutter.__studly_prefix}}Config"
# [project.urls]
# Homepage = "https://example.com/"
# Repository = "https://github.com/example/{{cookiecutter.repo_name}}"
# Issues = "https://github.com/example/{{cookiecutter.repo_name}}/issues"
# Changelog = "https://github.com/example/{{cookiecutter.repo_name}}/blob/master/CHANGELOG.md"
# [tool.commitizen]
# version_provider = "pep621"
# tag_format = "v$version"
# update_changelog_on_bump = true
[tool.hatch.build.targets.wheel]
packages = ["{{cookiecutter.package_name}}"]

View file

@ -0,0 +1,30 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} CLI
"""
import typer
from wuttjamaican.cli import make_typer
{{cookiecutter.package_name}}_typer = make_typer(
name='{{cookiecutter.package_name}}',
help="{{cookiecutter.project_name}} -- {{cookiecutter.project_short_description}}"
)
@{{cookiecutter.package_name}}_typer.command()
def install(
ctx: typer.Context,
):
"""
Install the {{cookiecutter.project_name}} app
"""
config = ctx.parent.wutta_config
app = config.get_app()
install = app.get_install_handler(pkg_name='{{cookiecutter.package_name}}',
app_title="{{cookiecutter.project_name}}",
pypi_name='{{cookiecutter.distribution_name}}',
egg_name='{{cookiecutter.__egg_name}}')
install.run()

View file

@ -0,0 +1,29 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} config extensions
"""
from wuttjamaican.conf import WuttaConfigExtension
class {{cookiecutter.__studly_prefix}}Config(WuttaConfigExtension):
"""
Config extension for {{cookiecutter.project_name}}
"""
key = '{{cookiecutter.package_name}}'
def configure(self, config):
# app info
config.setdefault(f'{config.appname}.app_title', "{{cookiecutter.project_name.replace('"', '\\"')}}")
config.setdefault(f'{config.appname}.app_dist', "{{cookiecutter.distribution_name}}")
# app model
config.setdefault(f'{config.appname}.model_spec', '{{cookiecutter.package_name}}.db.model')
# web app menu
config.setdefault(f'{config.appname}.web.menus.handler_spec',
'{{cookiecutter.package_name}}.web.menus:{{cookiecutter.__studly_prefix}}MenuHandler')
# web app libcache
#config.setdefault('tailbone.static_libcache.module', '{{cookiecutter.package_name}}.web.static')

View file

@ -0,0 +1,9 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} data models
"""
# bring in all of wutta
from wuttjamaican.db.model import *
# TODO: import other/custom models here...

View file

@ -0,0 +1,28 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} web app
"""
from wuttaweb import app as base
def main(global_config, **settings):
"""
This function returns a Pyramid WSGI application.
"""
# prefer {{cookiecutter.project_name}} templates over wuttaweb
settings.setdefault('mako.directories', [
'{{cookiecutter.package_name}}.web:templates',
'wuttaweb:templates',
])
# make config objects
wutta_config = base.make_wutta_config(settings)
pyramid_config = base.make_pyramid_config(settings)
# bring in the rest of {{cookiecutter.project_name}}
pyramid_config.include('{{cookiecutter.package_name}}.web.static')
pyramid_config.include('{{cookiecutter.package_name}}.web.subscribers')
pyramid_config.include('{{cookiecutter.package_name}}.web.views')
return pyramid_config.make_wsgi_app()

View file

@ -0,0 +1,26 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} Menu
"""
from wuttaweb import menus as base
class {{cookiecutter.__studly_prefix}}MenuHandler(base.MenuHandler):
"""
{{cookiecutter.project_name}} menu handler
"""
def make_menus(self, request, **kwargs):
# TODO: override this if you need custom menus...
# menus = [
# self.make_products_menu(request),
# self.make_admin_menu(request),
# ]
# ...but for now this uses default menus
menus = super().make_menus(request, **kwargs)
return menus

View file

@ -0,0 +1,22 @@
# -*- coding: utf-8; -*-
"""
Static assets
"""
# from fanstatic import Library, Resource
# # libcache
# libcache = Library('{{cookiecutter.package_name}}_libcache', 'libcache')
# bb_vue_js = Resource(libcache, 'vue.esm-browser-3.3.11.prod.js')
# bb_oruga_js = Resource(libcache, 'oruga-0.8.10.js')
# bb_oruga_bulma_js = Resource(libcache, 'oruga-bulma-0.3.0.js')
# bb_oruga_bulma_css = Resource(libcache, 'oruga-bulma-0.3.0.css')
# bb_fontawesome_svg_core_js = Resource(libcache, 'fontawesome-svg-core-6.5.2.js')
# bb_free_solid_svg_icons_js = Resource(libcache, 'free-solid-svg-icons-6.5.2.js')
# bb_vue_fontawesome_js = Resource(libcache, 'vue-fontawesome-3.0.6.index.es.js')
def includeme(config):
config.include('wuttaweb.static')
config.add_static_view('{{cookiecutter.package_name}}', '{{cookiecutter.package_name}}.web:static', cache_max_age=3600)

View file

@ -0,0 +1,2 @@
Place files in this folder, which correspond to the Resource()
definitions found in `{{cookiecutter.package_name}}/web/static/__init__.py`

View file

@ -0,0 +1,16 @@
# -*- coding: utf-8; -*-
"""
Pyramid event subscribers
"""
import {{cookiecutter.package_name}}
def add_{{cookiecutter.package_name}}_to_context(event):
renderer_globals = event
renderer_globals['{{cookiecutter.package_name}}'] = {{cookiecutter.package_name}}
def includeme(config):
config.include('wuttaweb.subscribers')
config.add_subscriber(add_{{cookiecutter.package_name}}_to_context, 'pyramid.events.BeforeRender')

View file

@ -0,0 +1,16 @@
<%inherit file="wuttaweb:templates/base_meta.mako" />
## TODO: you can override parent template as needed below, or you
## can simply delete this file if no customizations are needed
<%def name="favicon()">
${parent.favicon()}
</%def>
<%def name="header_logo()">
${parent.header_logo()}
</%def>
<%def name="footer()">
${parent.footer()}
</%def>

View file

@ -0,0 +1,13 @@
# -*- coding: utf-8; -*-
"""
{{cookiecutter.project_name}} Views
"""
def includeme(config):
# core views for wuttaweb
config.include('wuttaweb.views.essential')
# TODO: include your own views here
#config.include('{{cookiecutter.package_name}}.web.views.widgets')