أمثلة
تأليف محوّل إطار عمل
دليل خطوة بخطوة لتأليف محوّل إطار عمل جديد لـ Apothem.
يرشدك هذا الدليل خلال إنشاء محوّل إطار عمل لـApothem من الصِّفر،
باستخدام بروتوكول HarnessAdapter.
المتطلّبات المسبقة
- Python 3.10+
- إطار عمل مستهدَف بتنسيق إعداد معروف
- فهم تجريد محوّل إطار العمل
الخطوة 1: إنشاء حزمة المحوّل
mkdir apothem-myadapter
cd apothem-myadapter# pyproject.toml
[project]
name = "apothem-myadapter"
version = "X.Y.Z"
requires-python = ">=3.10"
dependencies = ["apothem>=X.Y.Z"] # pin the floor to the apothem release you target
[project.entry-points."apothem.harnesses"]
my-harness = "apothem_myadapter.adapter:MyHarnessAdapter"الخطوة 2: تنفيذ المحوّل
# src/apothem_myadapter/adapter.py
from pathlib import Path
from typing import Any
from apothem.harnesses import HarnessAdapter
class MyHarnessAdapter(HarnessAdapter):
"""Implements the HarnessAdapter protocol for "My Harness".
First-party adapters in the apothem tree usually delegate to the
``make_user_scope_adapter`` / ``make_project_scope_adapter`` factories in
``apothem.harnesses._shared.wrapper_factories`` and declare their install
rules in ``src/apothem/lib/propagation-manifest.yaml``. Implementing the
protocol directly, as shown here, is the clearest way to read its surface.
"""
@property
def name(self) -> str:
return "my-harness"
@property
def output_path(self) -> Path:
# The single native config file this adapter owns on disk.
return Path.home() / ".myharness" / "config.md"
def install(self, profile: dict[str, Any]) -> object:
# ``profile`` is the loaded shared-profile dict (rules, skills, hooks...).
self.output_path.parent.mkdir(parents=True, exist_ok=True)
self.output_path.write_text(self._render(profile), encoding="utf-8")
return self.output_path
def update(self, profile: dict[str, Any]) -> object:
return self.install(profile) # idempotent re-materialization
def uninstall(self) -> None:
self.output_path.unlink(missing_ok=True)
def is_installed(self) -> bool:
return self.output_path.is_file()
def verify(self) -> bool:
return self.output_path.is_file() and self.output_path.stat().st_size > 0
def _render(self, profile: dict[str, Any]) -> str:
# Translate the profile into the harness's native format.
rules = profile.get("rules", [])
return "\n\n".join(str(rule) for rule in rules)الخطوة 3: التثبيت والاختبار
pip install -e .
apothem install --harness my-harness
apothem verify --harness my-harnessالخطوة 4: الإضافة إلى توثيق pyproject.toml
وثّق إطار العمل في site/content/docs/harnesses/my-harness.mdx باتّباع
قالب صفحة إطار العمل.
الخطوة 5: التقديم للإدراج
افتح طلب سحب في مستودع Apothem يحوي:
- حزمة المحوّل (أو رابطًا إليها)
- صفحة التوثيق
- اختبار تحقّق في
tests/packaging/test_myadapter_install.py