Package: queenbee-dsl
queenbee-python-dslA Python Domain Specific Language (DSL) to create Queenbee Plugins and Recipes as Python
objects.API docsQueenbee-DSL API docsRequirementsPython >=3.7InstallationClone this repository.Change directory to root folder of the repository.pip install .Quick StartIf you are interested to start writing your own plugins and recipe see theintroduction post.Functionfromdataclassesimportdataclassfromqueenbee_dsl.functionimportFunction,command,Inputs,Outputs@dataclassclassCreateOctreeWithSky(Function):"""Generate an octree from a Radiance folder and sky!"""# inputsinclude_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')@commanddefcreate_octree(self):return'honeybee-radiance octree from-folder model --output scene.oct '\'--{{self.include_aperture}}-aperture --{{self.black_out}} '\'--add-before sky.sky'# outputsscene_file=Outputs.file(description='Output octree file.',path='scene.oct')The Queenbee class is accessible fromqueenbeeproperty.
Tryprint(CreateOctreeWithSky().queenbee.yaml())and you should see the full Queenbee
definition:type:Functionannotations:{}inputs:-type:FunctionStringInputannotations:{}name:black-outdescription:A value to indicate if the black material should be used. Valid valuesare default and black. Default value is default.default:defaultalias:[]required:falsespec:type:stringenum:-black-default-type:FunctionStringInputannotations:{}name:include-aperturedescription:A value to indicate if the static aperture should be included in octree.Valid values are include and exclude. Default is include.default:includealias:[]required:falsespec:type:stringenum:-include-exclude-type:FunctionFolderInputannotations:{}name:modeldescription:Path to Radiance model folder.default:nullalias:[]required:truespec:nullpath:model-type:FunctionFileInputannotations:{}name:skydescription:Path to sky file.default:nullalias:[]required:truespec:nullpath:sky.skyextensions:nulloutputs:-type:FunctionFileOutputannotations:{}name:scene-filedescription:Output octree file.path:scene.octname:create-octree-with-skydescription: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.skySince the functions are standard Python classes you can also subclass them from one
another.PluginTo create a Queenbee plugin use the functions to create a standard Python module. The only
change is that you need to provide the information for Queenbee plugin in the__init__.pyfile as dictionary assigned to__queenbee__variable.In the near future we might be able to use Python package's information to collect most
of these information.Follow the standard way to install a Python package. Once the package is installed you
can usequeenbee-dslto load the package or write it to a folder.fromqueenbee_dsl.packageimportload,write# name of the queenbee packagepython_package='pollination_honeybee_radiance'# load this package as Queenbee Pluginplugin=load(python_package)# or write the package as a Queenbee plugin to a folder directlywrite(python_package,'./pollination-honeybee-radiance')Seepollination-honeybee-radiancepluginfor a full project example.RecipeRecipeis a collection ofDAGs. EachDAGis a collection of interrelatedtasks.
You can use queenbee-dsl to create complex recipes with minimum code by reusing thefunctionsas templates for each task.Packaging a plugin is exactly the same as packaging a plugin.fromqueenbee_dsl.packageimportload,translate# name of the queenbee packagepython_package='daylight-factor'# load this package as Queenbee Reciperecipe=load(python_package,baked=True)# or translate and write the package as a Queenbee plugin to a folder directlytranslate(python_package,'./daylight-factor')Seedaylight factorrecipefor a full project example.How to create a queenbee-dsl packageQueenbee-dsl uses Python's standard packaging to package queenbee plugins and recipes.
It parses most of the data from inputs insetup.pyfile and some Queenbee specific
information from__init__.pyfile. Below is an example of how these file should look
like.setup.py#!/usr/bin/env pythonimportsetuptools# These two class extends setup.py to install the packages as queenbee packagesfromqueenbee_dsl.packageimportPackageQBInstall,PackageQBDevelop# Read me will be mapped to readme stringswithopen("README.md","r")asfh:long_description=fh.read()setuptools.setup(cmdclass={'develop':PackageQBDevelop,'install':PackageQBInstall},# required - include this for queenbee packagingname='pollination-honeybee-radiance',# required - will be used for package name unless it is overwritten using __queenbee__ key in __init__.pyversion='0.1.0',# required - will be used as package tag. you can also use semantic versioningurl='https://github.com/pollination/pollination-honeybee-radiance',# optional - will be translated to homedescription='Honeybee Radiance plugin for Pollination.',# optional - will be used as package descriptionlong_description=long_description,# optional - will be translated to ReadMe content on Pollinationlong_description_content_type="text/markdown",author='author_1',# optional - all the information for author and maintainers will beauthor_email='author_1@example.com',# translated to maintainers. For multiple authors use commamaintainer='maintainer_1, maintainer_2',# inside the string.maintainer_email='maintainer_1@example.come, maintainer_2@example.com',packages=setuptools.find_packages('pollination_honeybee_radiance'),# required - standard python packaging input. not used by queenbeekeywords='honeybee, radiance, ladybug-tools, daylight',# optional - will be used as keywordslicense='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.pyHere is an example__init__.pyfor a plugin.__queenbee__={'name':'honeybee-radiance',# optional - new name for queenbee package. this will overwrite the Python package name'icon':'https://ladybug.tools/assets/icon.png',# optional - package icon'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__.pyfor a recipe.from.entryimportAnnualDaylightEntryPoint__queenbee__={'name':'annual-daylight',# optional - new name for queenbee package. this will overwrite the Python package name'icon':'https://ladybug.tools/assets/icon.png',# optional - package icon'entry_point':AnnualDaylightEntryPoint,# required - this will point queenbee to the class that should be used to start the run}