{"id":51335122,"url":"https://github.com/mathiaspaulenko/behave-model","last_synced_at":"2026-07-02T02:01:01.271Z","repository":{"id":368681636,"uuid":"1286195120","full_name":"MathiasPaulenko/behave-model","owner":"MathiasPaulenko","description":"The canonical object model for Behave projects — Gherkin v6 Rules, Tag Expression v2, full Behave 1.3.x compatibility.","archived":false,"fork":false,"pushed_at":"2026-07-01T17:33:31.000Z","size":100,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T19:16:21.341Z","etag":null,"topics":["bdd","behave","behave-model","cucumber","domain-model","gherkin","gherkin-v6","python","tag-expressions","testing"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MathiasPaulenko.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-01T14:33:45.000Z","updated_at":"2026-07-01T17:33:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MathiasPaulenko/behave-model","commit_stats":null,"previous_names":["mathiaspaulenko/behave-model"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/MathiasPaulenko/behave-model","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbehave-model","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbehave-model/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbehave-model/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbehave-model/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MathiasPaulenko","download_url":"https://codeload.github.com/MathiasPaulenko/behave-model/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MathiasPaulenko%2Fbehave-model/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35029796,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bdd","behave","behave-model","cucumber","domain-model","gherkin","gherkin-v6","python","tag-expressions","testing"],"created_at":"2026-07-02T02:00:32.804Z","updated_at":"2026-07-02T02:01:01.265Z","avatar_url":"https://github.com/MathiasPaulenko.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# behave-model\n\n**The canonical object model for [Behave](https://github.com/behave/behave) projects.**\n\n[![CI](https://github.com/MathiasPaulenko/behave-model/actions/workflows/ci.yml/badge.svg)](https://github.com/MathiasPaulenko/behave-model/actions/workflows/ci.yml)\n[![PyPI](https://img.shields.io/pypi/v/behave-model.svg)](https://pypi.org/project/behave-model/)\n[![Python](https://img.shields.io/pypi/pyversions/behave-model.svg)](https://pypi.org/project/behave-model/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Coverage](https://codecov.io/gh/MathiasPaulenko/behave-model/branch/main/graph/badge.svg)](https://codecov.io/gh/MathiasPaulenko/behave-model)\n\n[Documentation](https://mathiaspaulenko.github.io/behave-model/) · [Getting Started](https://mathiaspaulenko.github.io/behave-model/getting-started/quick_start/) · [API Reference](https://mathiaspaulenko.github.io/behave-model/api/overview/) · [Changelog](https://mathiaspaulenko.github.io/behave-model/changelog/)\n\n\u003c/div\u003e\n\n---\n\n`behave-model` provides a clean, stable, and extensible Python API that represents every element of a Behave project — features, rules, scenarios, steps, tags, tables, docstrings, and more.\n\n**Why does this exist?** Every Behave tooling project parses `.feature` files independently, duplicating effort and producing inconsistent results. `behave-model` provides a single, well-tested domain model so that tools can depend on it instead of reinventing the parser.\n\n## Installation\n\n```bash\npip install behave-model\n```\n\n## Quick Example\n\n```python\nfrom behave_model import load_project\n\nproject = load_project(\"features/\")\n\n# Query scenarios by tag\nfor scenario in project.find_scenarios(tag=\"@smoke\"):\n    print(scenario.name)\n\n# Statistics\nstats = project.statistics()\nprint(f\"{stats['features']} features, {stats['scenarios']} scenarios, {stats['steps']} steps\")\n\n# Validate\nfrom behave_model import Validator\nissues = Validator().validate(project)\nfor issue in issues:\n    print(f\"[{issue.severity}] {issue.message}\")\n```\n\n## Requirements\n\n- Python \u003e= 3.11\n- `behave \u003e= 1.2.6` (only runtime dependency)\n\n## Features\n\n- **Gherkin v6** — Full `Rule` keyword support\n- **Domain model** — Pure frozen dataclasses for every Gherkin element\n- **Visitor pattern** — DFS/BFS tree traversal with custom visitors\n- **Query API** — Filter by name, tag, keyword, or text content\n- **Serializers** — Dict, JSON, and pretty-printed Gherkin output\n- **Transformations** — Rename, sort, normalize, add/remove tags and scenarios\n- **Validation** — Pluggable rule framework with built-in checks\n- **Statistics** — Project metrics out of the box\n\n## Documentation\n\nAll guides, API reference, examples, and architecture docs are at **[mathiaspaulenko.github.io/behave-model](https://mathiaspaulenko.github.io/behave-model/)**.\n\n## Development\n\n```bash\ngit clone https://github.com/MathiasPaulenko/behave-model.git\ncd behave-model\npip install -e \".[dev]\"\nmake test        # run tests\nmake lint        # lint with ruff\nmake docs-serve  # serve docs locally\n```\n\n## Contributing\n\nContributions are welcome! See the [Contributing guide](https://mathiaspaulenko.github.io/behave-model/contributing/) for guidelines.\n\n## License\n\nMIT — see [LICENSE](https://github.com/MathiasPaulenko/behave-model/blob/main/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathiaspaulenko%2Fbehave-model","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmathiaspaulenko%2Fbehave-model","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmathiaspaulenko%2Fbehave-model/lists"}