Skip to main content

behave-comments

Parse doc strings, extract metadata from comments, and declare lifecycle hooks in Behave .feature files.

Features

Text Block Parsing

Detect content types in doc strings and parse them automatically:

Given a JSON document
  """json
  {"name": "Alice", "age": 30}
  """
from behave_comments import with_parsed_text

@given("a JSON document")
@with_parsed_text()
def step_given_json(context, text_block):
    data = text_block.parsed  # {"name": "Alice", "age": 30}

Supported content types: json, yaml, xml, csv, form-urlencoded, graphql, text/plain.

The content type can be declared on the doc string opening line ("""json) or as the first line inside the doc string body — both are detected, since Behave itself discards the opening-line media type.

Metadata Annotations

Extract structured metadata from # @key value comments:

# @jira TICKET-42
# @owner team-alpha
Feature: Login

  # @id SC-001
  Scenario: Successful login
    Given the user is on the login page
from behave_comments import inject_metadata

def before_feature(context, feature):
    inject_metadata(context, feature)
    # context.metadata == {
    #   "feature": [{"key": "jira", "value": "TICKET-42"}, ...],
    #   "scenario": [{"key": "id", "value": "SC-001"}, ...],
    # }

Lifecycle Hooks

Declare setup/teardown steps directly in comments:

# @before-feature: Given a clean database
Feature: User Tests

  # @after-scenario: Then clear the cache
  Scenario: User login
    Given a registered user
from behave_comments import setup_lifecycle_hooks, run_before_feature, run_after_scenario

def before_feature(context, feature):
    setup_lifecycle_hooks(context, feature)
    run_before_feature(context, feature)

def after_scenario(context, scenario):
    run_after_scenario(context, scenario)

Installation

pip install behave-comments

YAML support is included — pyyaml is a required dependency.

Usage

Text Blocks

from behave_comments import with_parsed_text, extract_text_block

# Option 1: Decorator
@given("a JSON document")
@with_parsed_text()
def step(context, text_block):
    data = text_block.parsed

# Option 2: Manual extraction
def step(context):
    text_block = extract_text_block(context)  # context.text holds the doc string
    data = text_block.parsed

Annotations

from behave_comments import inject_metadata, extract_annotations, annotations_to_tags

def before_feature(context, feature):
    inject_metadata(context, feature)

# Or extract directly
annotations = extract_annotations("features/login.feature")
tags = annotations_to_tags(annotations)

Lifecycle Hooks Usage

from behave_comments import (
    setup_lifecycle_hooks,
    setup_lifecycle_hooks_from_path,
    run_before_all,
    run_after_all,
    run_before_feature,
    run_after_feature,
    run_before_scenario,
    run_after_scenario,
    run_before_step,
    run_after_step,
)

def before_all(context):
    # Accepts a single .feature file or a directory (hooks are collected
    # from every *.feature file inside it, recursively).
    setup_lifecycle_hooks_from_path(context, "features/")
    run_before_all(context)

def after_all(context):
    run_after_all(context)

def before_feature(context, feature):
    setup_lifecycle_hooks(context, feature)
    run_before_feature(context, feature)

def after_feature(context, feature):
    run_after_feature(context, feature)

def before_scenario(context, scenario):
    run_before_scenario(context, scenario)

def after_scenario(context, scenario):
    run_after_scenario(context, scenario)

def before_step(context, step):
    run_before_step(context, step)

def after_step(context, step):
    run_after_step(context, step)

API Reference

Errors

  • BehaveCommentsError — Base exception
  • ContentTypeError — Unsupported content type
  • ParseError — Parsing failed
  • AnnotationParseError — Invalid annotation syntax
  • LifecycleStepError — Lifecycle step execution failed

Models

  • TextBlock(content, content_type, line, parsed) — Parsed doc string
  • Annotation(key, value, line, scope, scope_name) — Extracted annotation
  • LifecycleHook(hook_type, step_text, line) — Lifecycle hook declaration

Development

pip install -e ".[dev]"
pytest
ruff check behave_comments tests
mypy behave_comments/

License

MIT

Metadata

Release files for behave-comments 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for behave-comments 1.1.0
File Size Uploaded
behave_comments-1.1.0.tar.gz 43.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for behave-comments 1.1.0
File Interpreter ABI Platform
behave_comments-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 59.1 kB

Release files / behave_comments-1.1.0.tar.gz

Download URL behave_comments-1.1.0.tar.gz
Size 43.1 kB
Tags Source
SHA-256 checksum
How to use checksums
da3939fce1dc6d0c8df0023f37fd72b9710a295b7d7308be83f0a425bab06725
BLAKE2b-256 checksum
How to use checksums
52d5ba26f0d1f4bfb5a4430083e1e69d1d5ffd7843c8d384edeffc531d9045d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / behave_comments-1.1.0-py3-none-any.whl

Download URL behave_comments-1.1.0-py3-none-any.whl
Size 15.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a4f95f794b104b126a6712fe5991af47992e5d2ff3cac83af406c20cea24f879
BLAKE2b-256 checksum
How to use checksums
ec9fab6979026f240e9d53ad2a6e0e6f2b4e1d69148060bdb5631e655b7aacdb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.0

2 release files

0.1.0

2 release 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