Skip to main content

queenbee-python-dsl

A Python Domain Specific Language (DSL) to create Queenbee Plugins and Recipes as Python objects.

image

API docs

Queenbee-DSL API docs

Requirements

Python >=3.7

Installation

  1. Clone this repository.
  2. Change directory to root folder of the repository.
  3. pip install .

Quick Start

If you are interested to start writing your own plugins and recipe see the introduction post.

Function

from dataclasses import dataclass
from queenbee_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')

The Queenbee class is accessible from queenbee property. 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.

Plugin

To 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__.py file 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 use queenbee-dsl to load the package or write it to a folder.

from queenbee_dsl.package import load, write

# name of the queenbee package
python_package = 'pollination_honeybee_radiance'

# load this package as Queenbee Plugin
plugin = load(python_package)

# or write the package as a Queenbee 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 DAGs. Each DAG is a collection of interrelated tasks. You can use queenbee-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 queenbee_dsl.package import load, translate

# name of the queenbee package
python_package = 'daylight-factor'

# load this package as Queenbee Recipe
recipe = load(python_package, baked=True)

# or translate and write the package as a Queenbee plugin to a folder directly
translate(python_package, './daylight-factor')

See daylight factor recipe for a full project example.

How to create a queenbee-dsl package

Queenbee-dsl uses Python's standard packaging to package queenbee plugins and recipes. It parses most of the data from inputs in setup.py file and some Queenbee specific information from __init__.py file. Below is an example of how these file should look like.

setup.py

#!/usr/bin/env python
import setuptools

# These two class extends setup.py to install the packages as queenbee packages
from queenbee_dsl.package import PackageQBInstall, PackageQBDevelop

# Read me will be mapped to readme strings
with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    cmdclass={'develop': PackageQBDevelop, 'install': PackageQBInstall},    # required - include this for queenbee packaging
    name='pollination-honeybee-radiance',                                   # required - will be used for package name unless it is overwritten using __queenbee__ key in __init__.py
    version='0.1.0',                                                        # required - will be used as package tag. you can also use semantic versioning
    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",
    author='author_1',                                                      # optional - all the information for author and maintainers will be
    author_email='author_1@example.com',                                    # translated to maintainers. For multiple authors use comma
    maintainer='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 queenbee
    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.

__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__.py for a recipe.

from .entry import AnnualDaylightEntryPoint

__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
}

Download files

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

Source Distribution

queenbee-dsl-0.7.2.tar.gz (32.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

queenbee_dsl-0.7.2-py2.py3-none-any.whl (32.7 kB view details)

Uploaded Python 2Python 3

File details

Details for the file queenbee-dsl-0.7.2.tar.gz.

File metadata

  • Download URL: queenbee-dsl-0.7.2.tar.gz
  • Upload date:
  • Size: 32.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.9

File hashes

Hashes for queenbee-dsl-0.7.2.tar.gz
Algorithm Hash digest
SHA256 218d1269d5f26243dc1a7671ecab5f6670e5178377f0e263cc93377b05379169
MD5 fb2c8aebb573e7b8b339e6f82302a32a
BLAKE2b-256 14b4f7730294df8481e62d4e51ab9cafd00ad42f6851859daa9c3d5f2a618f4d

See more details on using hashes here.

File details

Details for the file queenbee_dsl-0.7.2-py2.py3-none-any.whl.

File metadata

  • Download URL: queenbee_dsl-0.7.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 32.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.9

File hashes

Hashes for queenbee_dsl-0.7.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 035408d9ef313750ea15094abf8a50fe2d9faeb8a070f76ce38d4cae6678527f
MD5 4325f051202f3dd799d50ecb9f8d3a95
BLAKE2b-256 4fd158c25eed1f70af413f201f96fe86f217ff0dc369fe6b4bac0c622d8441c0

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.7.2 This release

2 files

0.7.1

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.5

2 files

0.5.4

2 files

0.5.3

2 files

0.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page