Pantrix UI

Uygulamanızda detekt kuralları

Projede detekt'in neyi denetlediği, nerede çalıştığı, projenin kendi kuralları, bir bulgunun nasıl ele alındığı ve Pantrix UI'ı kullanan bir uygulamanın bu kuralları nasıl açacağı.

1. Detekt nedir?

Detekt, Kotlin için bir statik kod analizi aracıdır. Kotlinter kodun nasıl göründüğüne bakar; detekt kodun ne yaptığına ve nasıl kurulduğuna bakar: fazla karmaşık bir fonksiyon, gereksiz bir kod, bir kuralın çiğnendiği bir yer. Bu projede iki tür kural çalışır:

2. Nerede çalışır?

YerAyarNe çalışır
Kütüphane modülleri (ui/foundation, ui/components, ui/annotations, ui/testing, ui/material3)config/detekt/detekt.ymldetekt'in kuralları ve projenin kütüphane kuralları. Her bulgu derlemeyi durdurur.
Demo (app/*)config/detekt/demo.ymlYalnızca projenin bir uygulamanın da uyduğu dört kuralı: NoMaterialImport, FixedSideLayout, ImageWithoutDescription, UntaggedControl. Son ikisi bildirir ama derlemeyi durdurmaz.

detekt'in kendi kurallarından UndocumentedPublicClass, UndocumentedPublicFunction ve UndocumentedPublicProperty kütüphanede açıktır: bir sınıf, bir fonksiyon ve bir özellik KDoc'suz kalmaz. Bir enum'un girdisi de özellik sayılır. Parametreleri projenin UndocumentedParameter'ı tutar (3. bölüm).

Kurulum build-logic'teki iki eklentidedir: kütüphane için pantrix.codequality'nin uyguladığı DetektSetupPlugin, demo için pantrix.demo.detekt. Testler projenin kurallarının dışındadır.

Çalıştırmak:

Raporlar her modülün build/reports/detekt/ klasöründedir: HTML (okumak için) ve SARIF (araçlar için).

3. Projenin kuralları

KuralNeyi tutarNerede açık
NoMaterialImportKütüphanede Material yok: bir Material import'u ya da tam adıyla yazılmış bir Material adıKütüphane (Material 3 köprüsü ui/material3 hariç), demo
NoFoundationPrimitiveMetin Pantrix'in sarmalayıcılarından geçer: BasicText, BasicTextField, BasicSecureTextField yalnızca sarmalayıcıların kendi dosyalarındaKütüphane
UnmarkedComponentHer public Pantrix… composable'ı ya bir bileşendir (@PantrixComponent ve iki @PantrixExample) ya da bir bileşenin parçasıdır (@PantrixComponentPart)ui/components
SettingInStringsPantrixStrings yalnızca sözcük taşır: bir ayar, bileşenin ya da yerel ayarın parametresidirKütüphane
TagFromVisibleTextOtomasyon etiketi ve anahtarı görünen metinden kurulmazKütüphane
RawTestTagBir bileşen etiketini Modifier.testTag ile değil, etiket politikasına ve test kapsamına uyan Modifier.pantrixTestTag ile koyarKütüphane
EmptyComposableDefaultComposable bir lambda'nın varsayılanı boş bir lambda değil null'dır; boş lambda ABI'ye public bir ComposableSingletons sınıfı eklerKütüphane
KDocNotASentenceKDoc'un özeti bir cümledir: büyük harfle başlar, noktayla biter (iOS gibi küçük harfle yazılan adlar olabilir)Kütüphane
UndocumentedParameterGenel bir fonksiyonun ya da yapıcının her parametresi açıklanır: KDoc'un metninde bir [ad] bağlantısıyla, bir @param ya da @property etiketiyle, ya da parametrenin kendi KDoc'uyla. Hiç KDoc'u olmayan bir bildirim detekt'in UndocumentedPublicFunction'ına ve UndocumentedPublicClass'ına kalır. Bir override'ın (yapıcının override val'ı da) ve bir actual'ın açıklaması override ettiğinde ve expect'indedirKütüphane
LiteralTextInLibraryBir bileşenin söylediği PantrixStrings'ten gelir; ekrana ya da ekran okuyucuya giden sabit metin olmaz. Animasyon etiketi ve inspector adı gibi araçlara verilen adlar sayılmazKütüphane (metin paketleri hariç)
FixedSideLayoutYerleşim okuma yönünü izler: absolutePadding, absoluteOffset, AbsoluteAlignment, Arrangement.Absolute yerine başlangıç ve sonKütüphane, demo
SizeOutsideStyleBir bileşenin ölçüsü stilinde ya da adı konmuş bir sabittedir; kodun içinde 12.dp yazılmaz. 0 ve 1 serbesttirui/components (stil dosyaları hariç)
ColorOutsideTokensBir bileşenin rengi temadan ya da kendi renklerinden gelir; Color(0xFF…) yazılmazui/components (stil dosyaları hariç)
ImageWithoutDescriptionBir görsel ne gösterdiğini söyler ya da contentDescription = null ile süs olduğunu söyler; boş bir açıklama verilmezDemo (bildirir)
UntaggedControlBir kontrol tagKey taşır (ya da form alanına bağlıdır ya da etiketini modifier'ında kendisi koyar). onClick = null verilmiş, yalnızca bir sözcük gösteren bir chip ve hiç onClick verilmemiş, yalnızca okunan bir liste satırı kontrol sayılmazDemo (bildirir)

Kuralların ayarlanabilen yerleri (allowedPathPattern, includes, excludes, ad listeleri) her kuralın KDoc'unda yazılıdır.

4. Bir bulguyu ele almak

Bir bulgu iki yoldan biriyle kapanır:

@Suppress("FixedSideLayout") // A JSON document is laid out from the left in every language.
private val COPY_CORNER: Alignment = AbsoluteAlignment.TopRight

Baseline kullanılmaz. Bir baseline dosyası bulguyu kimsenin bakmadığı bir yere koyar; bulgu oradayken kural tutuluyor gibi görünür.

5. Kendi uygulamanda Pantrix kuralları

Kurallar com.pantrixui:detekt-rules olarak yayınlanır. Bir uygulama onları detekt'e eklenti olarak verir:

dependencies {
    detektPlugins("com.pantrixui:detekt-rules:0.1.0-alpha03")
}

detekt kendi varsayılan ayarının üstüne kuruluyorsa (buildUponDefaultConfig = true), kural setinin kendi ayarı üç kuralı açar: FixedSideLayout, ImageWithoutDescription, UntaggedControl. Kütüphaneye özgü kurallar kapalı başlar; bir uygulama isterse kendi ayarında açar. Önerilen ayar, son ikisini bildirip derlemeyi durdurmayan haliyle:

build:
  weights:
    UntaggedControl: 0
    ImageWithoutDescription: 0

PantrixUIRule:
  # Uygulama Material kullanmıyorsa:
  NoMaterialImport:
    active: true

Kural sınıfları JVM 17'ye derlenir: detekt'i çalıştıran JDK 17 ya da daha yeni olmalıdır.

6. Detekt ve Kotlinter

DetektKotlinter
Neye bakarKodun kalitesi ve kurallarıKodun biçimi
Örnek bulgu"Bu boyut bileşenin stilinde olmalı""Burada bir boşluk eksik"
CevabıKodu düzeltmek ya da gerekçeli bir istisna./gradlew formatKotlin