A Python DSL to create Pollination recipes and plugins.
Project description
pollination-dsl
A Python Domain Specific Language (DSL) to create Pollination Plugins and Recipes.
Pollination uses Queenbee as its workflow language. Pollination-dsl makes it easy to create Queenbee object without the need to learn Queenbee.
API docs
Requirements
Python >=3.7
Installation
Using pip:
pip install pollination-dsl
For local development:
- Clone this repository.
- Change directory to root folder of the repository.
pip install -e .
Function
from dataclasses import dataclass
from pollination_dsl.function import Function, command, Inputs, Outputs
@dataclass
class CreateOctreeWithSky(Function):
"""Generate an octree from a Radiance folder and sky!"""
# inputs
include_aperture = Inputs.str(
default='include',
description='A value to indicate if the static aperture should be included in '
'octree. Valid values are include and exclude. Default is include.',
spec={'type': 'string', 'enum': ['include', 'exclude']}
)
black_out = Inputs.str(
default='default',
description='A value to indicate if the black material should be used. Valid '
'values are default and black. Default value is default.',
spec={'type': 'string', 'enum': ['black', 'default']}
)
model = Inputs.folder(description='Path to Radiance model folder.', path='model')
sky = Inputs.file(description='Path to sky file.', path='sky.sky')
@command
def create_octree(self):
return 'honeybee-radiance octree from-folder model --output scene.oct ' \
'--{{self.include_aperture}}-aperture --{{self.black_out}} ' \
'--add-before sky.sky'
# outputs
scene_file = Outputs.file(description='Output octree file.', path='scene.oct')
If you want to access the Queenbee
objects you can use queenbee
property. For example
try print(CreateOctreeWithSky().queenbee.yaml())
and you should see the full Queenbee
definition:
type: Function
annotations: {}
inputs:
- type: FunctionStringInput
annotations: {}
name: black-out
description: A value to indicate if the black material should be used. Valid values
are default and black. Default value is default.
default: default
alias: []
required: false
spec:
type: string
enum:
- black
- default
- type: FunctionStringInput
annotations: {}
name: include-aperture
description: A value to indicate if the static aperture should be included in octree.
Valid values are include and exclude. Default is include.
default: include
alias: []
required: false
spec:
type: string
enum:
- include
- exclude
- type: FunctionFolderInput
annotations: {}
name: model
description: Path to Radiance model folder.
default: null
alias: []
required: true
spec: null
path: model
- type: FunctionFileInput
annotations: {}
name: sky
description: Path to sky file.
default: null
alias: []
required: true
spec: null
path: sky.sky
extensions: null
outputs:
- type: FunctionFileOutput
annotations: {}
name: scene-file
description: Output octree file.
path: scene.oct
name: create-octree-with-sky
description: Generate an octree from a Radiance folder and sky!
command: honeybee-radiance octree from-folder model --output scene.oct --{{inputs.include-aperture}}-aperture
--{{inputs.black-out}} --add-before sky.sky
Since the functions are standard Python classes you can also subclass them from one
another as long as you use the same name for the @command
method. Otherwise it will
create an invalid function with two commands.
Plugin
To create a Pollination plugin use the functions to create a standard Python module.
The only change is that you need to provide the information for Pollination plugin in
the __init__.py
file as dictionary assigned to __pollination__
variable.
Follow the standard way to install a Python package. Once the package is installed you
can use pollination-dsl
to load the package or write it to a folder.
from pollination_dsl.package import load, write
# name of the pollination package
python_package = 'pollination_honeybee_radiance'
# load this package as Pollination Plugin
plugin = load(python_package)
# or write the package as a Pollination plugin to a folder directly
write(python_package, './pollination-honeybee-radiance')
See pollination-honeybee-radiance
plugin for a full project example.
Recipe
Recipe
is a collection of DAG
s. Each DAG
is a collection of interrelated task
s.
You can use pollination-dsl to create complex recipes with minimum code by reusing the
functions
as templates for each task.
Packaging a plugin is exactly the same as packaging a plugin.
from pollination_dsl.package import load, translate
# name of the pollination package
python_package = 'daylight-factor'
# load this package as Pollination Recipe
recipe = load(python_package, baked=True)
# or translate and write the package as a Pollination plugin to a folder directly
translate(python_package, './daylight-factor')
See daylight factor
recipe for a full project example.
How to create a pollination-dsl package
Pollination-dsl uses Python's standard packaging to package pollination plugins and recipes.
It parses most of the data from inputs in setup.py
file and some Pollination specific
information from __init__.py
file. Below is an example of how these file should look
like.
By taking advantage of Python's native namespace packaging
we keep all the packages under the pollination
namespace.
setup.py
#!/usr/bin/env python
import setuptools
# These two class extends setup.py to install the packages as pollination packages
try:
from pollination_dsl.package import PostInstall, PostDevelop
cmd_class = {'develop': PostDevelop, 'install': PostInstall}
except ModuleNotFoundError:
# this will happen the very first time when pollination_dsl is not installed
# to avoid this issue use pip install pollination_dsl first before installing
# pollination packages
cmd_class = {}
# Read me will be mapped to readme strings
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
cmdclass=cmd_class, # required - include this for pollination packaging
name='pollination-honeybee-radiance', # required - will be used for package name
packages=setuptools.find_namespace_packages(include=['pollination.*']), # required - that's how pollination find the package
author='ladybug-tools', # required - author must match the owner account name on Pollination
version='0.1.0', # required - will be used as package tag. you can also use semantic versioning
zip_safe=False, # required - set to False to ensure the packaging will always work
project_urls={
'icon': 'https://ladybug.tools/assets/icon.png', # optional but strongly encouraged - link to package icon
},
url='https://github.com/pollination/pollination-honeybee-radiance', # optional - will be translated to home
description='Honeybee Radiance plugin for Pollination.', # optional - will be used as package description
long_description=long_description, # optional - will be translated to ReadMe content on Pollination
long_description_content_type="text/markdown",
maintainer='maintainer_1, maintainer_2', # optional - will be translated to maintainers. For multiple maintainers
maintainer_email='maintainer_1@example.come, maintainer_2@example.com', # use comma inside the string.
keywords='honeybee, radiance, ladybug-tools, daylight', # optional - will be used as keywords
license='PolyForm Shield License 1.0.0, https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt', # optional - the license link should be separated by a comma
)
init.py
Here is an example __init__.py
for a plugin.
__pollination__ = {
'config': { # required for Pollination - docker information for this specific plugin
'docker': {
'image': 'ladybugtools/honeybee-radiance:1.28.12',
'workdir': '/home/ladybugbot/run'
}
}
}
Here is an example __init__.py
for a recipe.
from .entry import AnnualDaylightEntryPoint
__pollination__ = {
'entry_point': AnnualDaylightEntryPoint, # required - this will point pollination to the class that should be used to start the run
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for pollination_dsl-0.9.3-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d97455793ab65224c8d9ae3cc7ed6e44878968d1671b22599a266d9bfd6bc280 |
|
MD5 | 67241a9025ed932149b0954c6695f560 |
|
BLAKE2b-256 | 1f75e8a629ddc0958c9d615e93eeaa90c5bc402ef68fb572525c8bc5546f906c |