How to Mock Poetry pyproject.toml Dependencies Sections in Python

Parse and extract dependency lists from Poetry-style pyproject.toml text using Python's standard library.

Easy Python 3.9+ Aug 9, 2026 Modern tooling 15 views 0 copies

Python code

59 lines
Python 3.9+
from pathlib import Path
import re


def parse_pyproject_dependencies(text):
    """Extract dependencies from a pyproject.toml style text."""
    lines = text.splitlines()
    sections = {
        "dependencies": [],
        "dev": [],
        "optional": [],
    }
    current_section = None

    patterns = {
        "dependencies": r"^dependencies\s*=\s*\[",
        "dev": r"^dev\s*=\s*\[",
        "optional": r"^optional-dependencies\s*=",
    }

    for idx, line in enumerate(lines):
        stripped = line.strip()
        for section, pattern in patterns.items():
            if re.match(pattern, line.strip()):
                current_section = section
                break

        if current_section and stripped.startswith('"') and stripped.endswith('",'):
            dependency = stripped.strip('",')
            sections[current_section].append(dependency)

        if current_section and stripped == "]":
            current_section = None

    return sections


if __name__ == "__main__":
    sample_pyproject = '''
[tool.poetry]
name = "demo"
version = "0.1.0"

[tool.poetry.dependencies]
python = "^3.9"
requests = "^2.31.0"
flask = "^3.0.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"
black = "^23.9.0"

[tool.poetry.extras]
speed = ["uvloop"]
'''

    result = parse_pyproject_dependencies(sample_pyproject)
    for section, deps in result.items():
        print(f"{section}: {deps}")

Output

stdout
dependencies: ['python', 'requests', 'flask']
dev: ['pytest', 'black']
optional: ['uvloop']

How it works

This parser reads a pyproject.toml string line-by-line, tracking the current TOML section with regex patterns for dependencies, dev, and optional-dependencies. It extracts lines that look like quoted strings inside dependency arrays, stripping quotes and commas. The parser resets the current section when it sees a closing bracket. This approach works for mocking or inspecting dependency structures without needing a TOML library, handy for quick checks, scripts, or test doubles.

Common mistakes

  • Not handling the closing bracket `]` correctly, which causes dependencies from later sections to leak into the previous section.
  • Assuming all dependency lines start with quotes — Poetry can use multiline arrays or unquoted package specs.
  • Forgetting to reset `current_section` when encountering a new `[tool.poetry...]` header, mixing groups incorrectly.

Variations

  1. Use `tomllib` (Python 3.11+) to parse the file properly and access nested TOML tables.
  2. Extend patterns to capture dependencies from `tool.poetry.group.*.dependencies` with multiple group names.

Real-world use cases

  • Emulating dependency extraction when testing a package manager CLI without installing Poetry.
  • Scanning a monorepo for Python dependency declarations during license or security audits.
  • Generating a quick inventory of required vs optional packages from a config file inside a CI script.

Sponsored

Run this sample

Open the browser IDE to tweak the example and see results without installing anything.

Open editor

More from Modern tooling

Related tutorials and quizzes for this topic.