Files
biblioteka-standartnyh-izdeliy/docs/prompt-bolt-7805.md
T

9.9 KiB
Raw Blame History

Промт: болт ГОСТ 7805-70 в каталоге standard_products

Адаптация исходного промта «C++/Qt/OCCT desktop-приложение» под текущий проект: Python 3.10+, SQLite, пакет standard_products, CLI stdparts. 3D/STEP вынесены в опциональную фазу (см. приложение).

РОЛЬ И КОНТЕКСТ

Ты — senior Python-разработчик. Работаешь в репозитории библиотека-стандартных-изделий: каталог стандартных изделий на SQLite. Уже есть пакет src/standard_products/ (db.py, cli.py), тесты tests/, примеры examples/, документация docs/. Зависимостей в рантайме нет — только стандартная библиотека.

Задача — добавить в каталог болты с шестигранной головкой по ГОСТ 7805-70 (класс точности А) как параметрическое семейство: таблица размеров, валидация, генерация изделий и загрузка в базу.

ЗАДАЧА (MVP)

  1. Новый модуль src/standard_products/gost_7805.py:
    • BoltSize (frozen dataclass), таблица размеров, допустимые длины;
    • функции получения размера, проверки длины, формирования Product;
    • идемпотентная загрузка всего семейства в БД.
  2. Команды CLI в src/standard_products/cli.py:
    • stdparts bolts — таблица размеров;
    • stdparts bolts --size M10 --length 40 — параметры одного болта в JSON;
    • stdparts seed-bolts — загрузить все комбинации M×L в каталог.
  3. Тесты tests/test_gost_7805.py.
  4. Документация docs/gost-7805.md.
  5. Экспорт examples/gost_7805.json (сгенерировать из таблицы, не руками).

СТЕК (строго соблюдать)

  • Python 3.10+, только стандартная библиотека в рантайме.
  • SQLite через существующий db.py (Product, upsert_product, connect).
  • pytest / ruff / mypy — dev-зависимости, уже настроены в pyproject.toml.
  • Никаких новых обязательных зависимостей.

ТАБЛИЦА ПАРАМЕТРОВ (ГОСТ 7805-70, класс точности А)

Захардкодь в gost_7805.py:

@dataclass(frozen=True, slots=True)
class BoltSize:
    d: float            # номинальный диаметр резьбы, мм
    P: float            # шаг резьбы, мм
    S: float            # размер под ключ (между гранями), мм
    k: float            # высота головки, мм
    e: float            # размер по углам (справочно), мм
    b: float | None = None  # длина резьбы, мм (в источнике не задана)

Данные (только эти строки, не выдумывай свои):

Размер d P S k e
M6 6 1.0 10 4.0 11.05
M8 8 1.25 13 5.3 14.38
M10 10 1.5 16 6.4 17.77
M12 12 1.75 18 7.5 19.85
M16 16 2.0 24 10.0 26.75

Доступные длины стержня L (мм): 20, 25, 30, 35, 40, 50, 60, 70, 80.

Значение b в источнике не приведено — оставь None, не подставляй расчётные или справочные значения из головы.

ТРЕБОВАНИЯ К МОДУЛЮ

Публичный API (имена можно уточнить, но смысл сохранить):

BOLT_SIZES: dict[str, BoltSize]          # ключи: "M6", "M8", "M10", "M12", "M16"
ALLOWED_LENGTHS_MM: tuple[int, ...]      # (20, 25, ..., 80)

def get_size(label: str) -> BoltSize: ...
def validate_length(length: int) -> None: ...
def bolt_designation(size: BoltSize, length: int) -> str: ...
def build_product(size: BoltSize, length: int) -> Product: ...
def iter_products() -> Iterator[Product]: ...
def seed_bolts(connection: sqlite3.Connection) -> int: ...

Правила:

  • designation: "Болт M10x40 ГОСТ 7805-70" (диаметр — целое без .0).
  • name: "Болт с шестигранной головкой".
  • standard: "ГОСТ 7805-70", category: "Крепёж", unit: "шт".
  • material и mass_kg не заданы в источнике — None.
  • Параметры ГОСТ кладутся в attributes (ключи на русском, как в проекте): диаметр, шаг_резьбы, размер_под_ключ, высота_головки, размер_по_углам, длина, длина_резьбы (если b is None — не добавлять).
  • seed_bolts использует upsert_product, поэтому повторный запуск не создаёт дубликатов и возвращает число обработанных записей (5 × 9 = 45).
  • Ошибки — ValueError с перечислением допустимых значений: get_size("M7"), validate_length(45).
  • Никаких изменений схемы БД и сигнатур существующих функций db.py.

ТРЕБОВАНИЯ К CLI

Добавить подкоманды, не ломая существующие:

stdparts bolts                       # таблица размеров
stdparts bolts --size M10 --length 40  # JSON одного изделия
stdparts seed-bolts                  # загрузить 45 изделий (идемпотентно)
  • --size и --length валидируются теми же функциями; при ошибке — сообщение в stderr и код возврата 1.
  • seed-bolts печатает число загруженных записей.
  • Работает с глобальным --db, как остальные команды.

ТЕСТЫ (обязательно)

tests/test_gost_7805.py:

  1. Таблица содержит ровно 5 размеров, значения совпадают с промтом.
  2. bolt_designation даёт "Болт M10x40 ГОСТ 7805-70" и не даёт M10.0.
  3. build_product заполняет standard/category/unit/attributes.
  4. get_size и validate_length кидают ValueError на недопустимых входах.
  5. seed_bolts в temp-БД создаёт 45 записей; повторный вызов — всё ещё 45.
  6. Несколько записей находятся через search_products(conn, "ГОСТ 7805-70").
  7. CLI: bolts --size M10 --length 40 возвращает 0 и валидный JSON.

ДОКУМЕНТАЦИЯ

docs/gost-7805.md: таблица размеров, допустимые длины, формат designation, соответствие полей Product ↔ attributes, примеры команд. Ссылка из README.md в разделе про данные.

ОГРАНИЧЕНИЯ (ЧТО НЕ ДЕЛАТЬ — строго)

  • ❌ Не добавлять C++, Qt, OpenCASCADE, CMake — это другой стек и его нет в проекте.
  • ❌ Не делать 3D-геометрию, резьбу, спирали, вырезы и экспорт STEP в MVP.
  • ❌ Не менять схему SQLite и не добавлять миграции.
  • ❌ Не добавлять другие типы изделий (гайки, шайбы) — только болт 7805-70.
  • ❌ Не добавлять обязательные зависимости, логирование, настройки, темы.
  • ❌ Не выдумывать размеры, длины, массу и b, которых нет в источнике.
  • ❌ Не дублировать логику db.py — использовать Product и upsert_product.

ФОРМАТ ОТВЕТА

Код каждого файла — отдельным блоком с полным путём:

# File: src/standard_products/gost_7805.py
...

Затем — короткая инструкция (3–5 команд): установка, тесты, линтеры, пример запуска. В конце — отчёт: какие файлы изменены и почему.

КРИТЕРИИ ПРИЁМКИ

  1. pytest — зелёный, включая новые тесты.
  2. ruff check . и mypy src — без ошибок.
  3. stdparts seed-bolts создаёт 45 изделий; повторный запуск — те же 45.
  4. stdparts search "ГОСТ 7805-70" находит загруженные болты.
  5. stdparts bolts --size M16 --length 80 печатает корректный JSON.
  6. Существующие команды и тесты не сломаны.
  7. Новых обязательных зависимостей нет.

ПРИЛОЖЕНИЕ (вне MVP): STEP-экспорт

Если позже понадобится STEP, это отдельная задача и отдельный модуль step_export.py с опциональной зависимостью (cadquery/OCP), не входящей в базовую установку. Геометрия строится из тех же BoltSize: шестигранная призма S × k, цилиндр d/2 × L, фаска 0.3×45° на торце. Резьба не моделируется. До появления зависимости модуль не добавлять.