Skip to main content

Allows you to create a schema for templates with a tag syntax easy enough for end users.

Project description

# Smores
[![CircleCI branch](]()
[![Coverage Status](](

Smores allows you to specify a schema for user facing template features. It leverages marshmallow (hence 'smores') to
populate and transform data that is then rendered via jinja. It has a parser that presents a more friendly syntax to
users (ex. {user.addresses:1.street}). It also includes an autocomplete method that gives you intellisense style
options given a tag fragment.

Smores provides two Marshmallow field types called TemplateString and TemplateFile. Templates defined in these fields
are scoped to that schema and it's descendants. Each schema can have a _default_template that, if defined, will what
is inserted if the associated tag ends with that schema. For example: typing {user.address} will render the _default_template
for the Address schema. You can define other template attributes as well. For example, see the 'google_link' attribute
of the Address schema below. Typing {user.address.google_link} will populate and insert that link.

smores.tag_autocomplete is a method where you can provide a tag 'fragment' and it will return the possible options below that.
For example:

from smores import Smores, TemplateString
from marshmallow import Schema, fields

# instantiate a smores instance
smores = Smores()

# smores.schema registers the schema with the instance
class Coordinates(Schema):
lat = fields.Decimal()
lng = fields.Decimal()
_default_template = TemplateString("{{lat}},{{lng}}")

class Address(Schema):
street = fields.String()
suite = fields.String()
city = fields.String()
state = fields.String()
zipcode = fields.String()
coordinates = fields.Nested(Coordinates)
google_link = TemplateString('<a href="{{coordinates}}">View Map</a>')
_default_template = TemplateString("""
<div>{{<a href="{{coordinates}}">View Map</a>}}</div>
<div>{{street}} -- {{suite}}</div>
<div>{{city}}, {{state}} {{zipcode}}</div>

class User(Schema):
id = fields.Integer()
name = fields.String()
email = fields.Email()
address = fields.Nested(Address)
_default_template = TemplateString("""
<div>E: {{email}}</div>

# for the schemas above, simply invoke the autocomplete method with a tag fragment

>>> smores.autocomplete("")
AutocompleteResponse(tagStatus='INVALID', options=['address', 'coordinates', 'user'])

>>> smores.autocomplete('user')
AutocompleteResponse(tagStatus='VALID', options=['_default_template', 'address', 'email', 'id', 'name'])

>>> smores.autocomplete('us')
AutocompleteResponse(tagStatus='INVALID', options=['user'])

>>> smores.autocomplete("user.address.coordinates")
AutocompleteResponse(tagStatus='VALID', options=['_default_template', 'lat', 'lng'])

# Receiving '_default_template' or no results means that the current tag fragment is valid but _default_template
# shouldn't be appended to the tag in the ui.

# provide data to the render function
data = {
"user": {
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "",
"phone": "1-770-736-8031 x56442",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"state": "MD",
"zipcode": "92998-3874",
"coordinates": {
"lat": "36.065934",
"lng": "-79.791414"

# provide user created template
user_template = """
<h3>Hi, {}!</h3>
<p>Your Info:</p>

# render the output
print smores.render(data, user_template)

# output -->
# <h3>Hi, Leanne Graham!</h3>
# <p>Your Info:</p>
# <div>Leanne Graham</div>
# <div>E:</div>
# <div>
# <div><a href=",-79.791414">View Map</a></div>
# <div>Kulas Light -- Apt. 556</div>
# <div>Gwenborough, MD 92998-3874</div>
# </div>

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smores-0.0.7.tar.gz (13.5 kB view hashes)

Uploaded source

Built Distribution

smores-0.0.7-py2.py3-none-any.whl (14.8 kB view hashes)

Uploaded py2 py3

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page