Skip to main content

blockapily

blockapily is a Python utility that automatically generates Google Blockly assets from decorated class methods. It inspects a Python class and converts type-annotated methods into JavaScript block definitions, Python code generators, and toolbox XML.


Core Concept

The main idea is to keep your Python code as the single source of truth. You define the logic and parameters for an action in a Python method, add type hints, and use a simple decorator. blockapily then handles the boilerplate of creating the corresponding Blockly assets, ensuring they stay in sync with your Python implementation.


Quickstart

1. Define your Actions Class

Create a Python class and decorate the methods you want to expose in Blockly with @mced_block. Use standard type hints for parameters.

# my_robot.py
from blockapily import mced_block

class Vec3:
    def __init__(self, x=0.0, y=0.0, z=0.0):
        try:
            self.x = float(x)
            self.y = float(y)
            self.z = float(z)
        except (ValueError, TypeError):
            print(f"Warning: Invalid input for Vec3({x}, {y}, {z}). Defaulting to (0,0,0).")
            self.x = 0.0
            self.y = 0.0
            self.z = 0.0

class RobotActions:
    """Defines actions a robot can perform."""

    @mced_block(label="Move Robot")
    def move(self, direction: Vec3, speed: float = 1.0, forward: bool = True):
        """A simple statement block."""
        pass

    @mced_block(label="Get Position")
    def get_position(self, target_id: int) -> Vec3:
        """A block that returns a value."""
        pass

2. Write your Generation Script

Create a script to run the generator. You only need to provide mappings for any custom types you used (like 'Vec3').

# generate_blocks.py
from pathlib import Path
from blockapily import BlocklyGenerator
from my_robot import RobotActions,Vec3

# 1. Define mappings for any custom types
CUSTOM_TYPE_MAP = {
            'str': 'String',
            'int': 'Number',
            'float': 'Number',
            'bool': 'Boolean',
            'Vec3': '3DVector'
}
CUSTOM_SHADOW_MAP = {
    'int': '<shadow type="math_number"><field name="NUM">0</field></shadow>',
    'float': '<shadow type="math_number"><field name="NUM">0.0</field></shadow>',
    'str': '<shadow type="text"><field name="TEXT"></field></shadow>',
    'bool': '<shadow type="logic_boolean"><field name="BOOL">TRUE</field></shadow>',
    'Vec3': '<shadow type="vector_3d_zero"></shadow>'}

# 2. Instantiate the generator
generator = BlocklyGenerator(
    RobotActions,
    type_map=CUSTOM_TYPE_MAP,
    shadow_map=CUSTOM_SHADOW_MAP,
    category_colour="210",
    category_name="Robot"
)

# 3. Generate the assets
block_defs_js, py_gen_js, toolbox_xml = generator.generate()

# 4. Save the generated files
output_dir = Path("./generated_assets")
output_dir.mkdir(exist_ok=True)

(output_dir / "block_definitions.js").write_text(block_defs_js)
(output_dir / "python_generators.js").write_text(py_gen_js)

# 5. Update the main toolbox XML file
toolbox_path = output_dir / "toolbox.xml"
generator.update_toolbox(toolbox_xml, toolbox_path)

print(f"✅ Blockly assets generated in '{output_dir}'")

3. Run the Script

python generate_blocks.py

This will create a generated_assets directory containing your JavaScript files and an updated toolbox.xml ready to be used in your Blockly application.


Key Features

  • Decorator-based: Simply mark methods for export with a clear @mced_block decorator.
  • Type Hint Driven: Automatically infers Blockly types, shadows, and default values from standard Python type annotations.
  • Automatic Toolbox Management: Intelligently creates and updates your toolbox.xml file, adding or replacing categories as needed.
  • Highly Configurable: Easily customize block prefixes, category names, colors, and mappings for custom types.

Download files

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

Source Distribution

blockapily-0.4.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

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

blockapily-0.4-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file blockapily-0.4.tar.gz.

File metadata

  • Download URL: blockapily-0.4.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for blockapily-0.4.tar.gz
Algorithm Hash digest
SHA256 71c9d23ed96bceb694472d1da3adf4dbdb73b40b08b2d0ac986c408adbecef3e
MD5 d79f5001678a90cb5861156514bf7023
BLAKE2b-256 bbe937a59d12823e50730df34fab277e29771269888bd09fc01e8ee7dfb36307

See more details on using hashes here.

File details

Details for the file blockapily-0.4-py3-none-any.whl.

File metadata

  • Download URL: blockapily-0.4-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for blockapily-0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 80c592a8bfb7629dad711247af243734f7ce97e6f72e8e99dafcd1e75dbc870c
MD5 b7e8eb36b5c61f01be16fd5e55f32750
BLAKE2b-256 2a74b6e441e1db2a1f3c98741e85a0530dfcd1109f0576830abe50f96c64d391

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4 This release

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page