INW000 unsupported-encoding¶
Co robi¶
Zgłasza plik w warstwie albo w kontekście, którego deklaracja PEP 263 (# coding: ... w linii 1 albo w linii 2 po linii pustej lub z komentarzem) wskazuje kodek, którego Inwards nie czyta. UTF-8 i jego warianty, ASCII, Latin-1, ISO-8859-* i cp125x są czytane normalnie, bo żaden ich bajt nie może zamienić się w koniec linii ani w cudzysłów. Każdy inny kodek, np. unicode_escape, utf-7, utf-16 czy shift_jis, daje jedno INW000 w linii 1, a importy pliku nie są sprawdzane.
Dlaczego to źle¶
W kodowaniu unicode_escape tekst #\u000aimport shop.infrastructure.db jest komentarzem dla każdego narzędzia, które czyta plik jako UTF-8, a importem dla CPythona, który najpierw zamienia \u000a na koniec linii. Agent, który szuka drogi obok sprawdzenia warstw albo kopiuje sztuczkę z danych treningowych, może tak ukryć dowolny import. Inwards czyta pliki jako UTF-8 i nie ma tabel kodeków, więc zgłasza taki plik, zamiast przepuścić go niesprawdzonego (ADR-014).
Przykład¶
Z warstwami z INW001:
shop/domain/order.py:1:1: INW000 The file declares encoding "unicode-escape", which can hide imports from Inwards, so its imports were not checked.
fix: Save the file as UTF-8 and remove the coding declaration.
1. Re-encode the file as UTF-8 without changing its code.
2. Delete the `# coding: ...` line, or change it to `# coding: utf-8`.
docs: https://sircypkowskyy.github.io/inwards/rules/INW000/
Po poprawce plik jest w UTF-8, a komentarz znowu jest komentarzem.
Jak naprawić¶
- Przekoduj plik na UTF-8, nie zmieniając kodu (
iconv -f SHIFT_JIS -t UTF-8albo „zapisz z kodowaniem” w edytorze). - Usuń linię
# coding: ...albo zmień ją na# coding: utf-8. - Uruchom sprawdzenie ponownie: importy pliku są teraz sprawdzane, więc import, który ukrywało stare kodowanie, pojawi się jako INW001 albo inna reguła.
Bezpieczeństwo poprawki¶
Brak automatycznej poprawki (autofix: false). Przekodowanie musi zachować każdy znak, co w plikach z tekstem spoza ASCII powinien sprawdzić człowiek.
Konfiguracja¶
Zawsze błąd. [tool.inwards.rules] nie może wymienić INW000 w ignore ani severity (błąd konfiguracji, kod wyjścia 2), a select jej nie wyłącza: plik, którego zadeklarowane kodowanie może ukrywać importy, w ogóle nie jest sprawdzany, więc wyłączenie INW000 przepuściłoby go bez sprawdzenia (ADR-027). Nie da się jej też wyciszyć w linii, a w pliku z INW000 wyciszenia w ogóle nie są czytane, bo w zadeklarowanym kodowaniu „komentarz” może być kodem (ADR-028).
Znane ograniczenia¶
- Poprawne pliki w kodekach takich jak Shift_JIS czy EUC-JP też są zgłaszane. To celowe: bajt wiodący Shift_JIS może połknąć ukośnik wsteczny.
- INW000 dostają tylko pliki, których importy są sprawdzane: pliki w warstwie, a gdy zadeklarowano konteksty, każdy plik. Żaden inny plik z taką deklaracją nie jest zgłaszany, choć INW007 i INW009 nadal go sprawdzają.
- Bajty przekazane do
execalbocompilez nieczytelnym zadeklarowanym kodowaniem zgłasza INW011, nie INW000.
Źródła¶
- ADR-014: Zgłaszaj pliki, których zadeklarowane kodowanie może ukryć importy
- PEP 263: Defining Python Source Code Encodings