feat: initial commit
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
# Maszynowo wykonywalna wersja notatki migracyjnej acme-sdk-2.x-migration.md.
|
||||
#
|
||||
# Zasada architektoniczna: co da się zmigrować deterministycznie, migrujemy regułą,
|
||||
# a nie modelem. LLM jest od reszty - od przypadków, których reguła nie obejmuje,
|
||||
# i od oceny, czy wynik ma sens. Reguły są częścią pakietu APM, więc podlegają
|
||||
# temu samemu wersjonowaniu i przeglądowi co skill.
|
||||
package: acme-sdk
|
||||
applies_to: ">=2.0.0,<3.0.0"
|
||||
file_glob: "*.py"
|
||||
rules:
|
||||
- id: import-client
|
||||
description: "Client -> AcmeClient w imporcie"
|
||||
pattern: '\bfrom acme import Client\b'
|
||||
replacement: 'from acme import AcmeClient'
|
||||
- id: constructor
|
||||
description: "Konstruktor: nowa nazwa klasy, endpoint -> base_url"
|
||||
pattern: '\bClient\(\s*api_key=(?P<key>[^,]+),\s*endpoint=(?P<endpoint>[^)]+)\)'
|
||||
replacement: 'AcmeClient(api_key=\g<key>, base_url=\g<endpoint>)'
|
||||
- id: send-message
|
||||
description: "send() -> messages.create() z nowymi nazwami parametrów"
|
||||
pattern: '\.send\(\s*to=(?P<to>[^,]+),\s*body=(?P<body>[^)]+)\)'
|
||||
replacement: '.messages.create(recipient=\g<to>, content=\g<body>)'
|
||||
- id: drop-close
|
||||
description: "Klient 2.x zwalnia zasoby automatycznie - close() usunięte z API"
|
||||
pattern: '^[ \t]*[A-Za-z_][A-Za-z0-9_]*\.close\(\)[ \t]*\n'
|
||||
replacement: ''
|
||||
multiline: true
|
||||
- id: response-attribute
|
||||
description: "Odpowiedź jest obiektem Message, nie słownikiem"
|
||||
pattern: '(?P<var>\b[a-z_][a-z0-9_]*)\[[''"]id[''"]\]'
|
||||
replacement: '\g<var>.id'
|
||||
@@ -0,0 +1,27 @@
|
||||
# acme-sdk: migracja 1.x -> 2.x
|
||||
|
||||
> Przykładowa notatka migracyjna. W realnym wdrożeniu ten katalog zasila pakiet APM
|
||||
> utrzymywany przez zespół właściciela SDK (np. `pubi/apm-packages/acme-sdk-migrations`),
|
||||
> a `apm install` dostarcza go do joba CI z pinem po tagu.
|
||||
|
||||
## Zmiany łamiące kompatybilność
|
||||
|
||||
| 1.x | 2.x | Uwagi |
|
||||
|---|---|---|
|
||||
| `from acme import Client` | `from acme import AcmeClient` | zmiana wyłącznie nazwy |
|
||||
| `Client(api_key=..., endpoint=...)` | `AcmeClient(api_key=..., base_url=...)` | `endpoint` -> `base_url` |
|
||||
| `client.send(to=..., body=...)` | `client.messages.create(recipient=..., content=...)` | wysyłka przez sub-resource |
|
||||
| `client.close()` | `with AcmeClient(...) as client:` | klient jest context managerem |
|
||||
| zwracany `dict` z kluczem `id` | obiekt `Message` z atrybutem `.id` | dostęp `msg["id"]` -> `msg.id` |
|
||||
|
||||
## Bez zmian
|
||||
|
||||
- `AcmeError` pozostaje w `acme.errors`.
|
||||
- Format kluczy API i semantyka retry są niezmienione.
|
||||
|
||||
## Kolejność migracji
|
||||
|
||||
1. Import i konstrukcja klienta.
|
||||
2. Wywołania wysyłki.
|
||||
3. Zarządzanie cyklem życia (`close()` -> `with`).
|
||||
4. Odczyt pól odpowiedzi.
|
||||
Reference in New Issue
Block a user