detekt ayarları
Pantrix'in detekt'inin iki ayar dosyası: kütüphanenin kendisininki ve demonunki, demoyu Pantrix'le yazılmış bir uygulama gibi denetleyen.
Pantrix kodunu detekt'le ve kendi kural setiyle, PantrixUIRule ile denetler (detekt rehberi). Hangi kuralın nerede çalıştığını iki ayar dosyası tutar: kütüphanenin modülleri ilkiyle, demo ikincisiyle denetlenir. Kuralları benimseyen bir uygulama demonunkinden başlar.
Dosyalar kütüphanenin config/detekt/demo.yml ve config/detekt/detekt.yml dosyalarının kopyalarıdır.
Demonun ayarı, bir uygulamanınki gibi
Demo, kütüphaneyi kullanan bir uygulama gibi denetlenir: yalnızca Pantrix'in bir uygulamanın da uyduğu kuralları çalışır, detekt'in kendi kuralları kapalıdır. UntaggedControl ve ImageWithoutDescription bulgularını bildirir ama derlemeyi durdurmaz.
demo.yml
# Demo'nun detekt ayarı. Demo, kütüphaneyi kullanan bir uygulama gibi denetlenir: yalnızca Pantrix'in bir uygulamanın
# da uyduğu kuralları çalışır, detekt'in kendi kuralları kapalı. NoMaterialImport, demo'nun Material'ı bağımlılık
# olarak tutup hiçbir şeyini kullanmaması kuralını tutar (CONTRIBUTING.md).
build:
# Bu ikisi bildirir ama derlemeyi durdurmaz: ağırlığı sıfır olan bulgu maxIssues'a sayılmaz.
weights:
UntaggedControl: 0
ImageWithoutDescription: 0
comments:
active: false
complexity:
active: false
coroutines:
active: false
empty-blocks:
active: false
exceptions:
active: false
naming:
active: false
performance:
active: false
potential-bugs:
active: false
style:
active: false
PantrixUIRule:
active: true
NoMaterialImport:
active: true
# Material 3 örneği (samples/pantrix-material3) bir Material uygulamasıdır: Material'ı doğrudan kullanır.
excludes: [ '**/samples/pantrix-material3/**' ]
FixedSideLayout:
active: true
ImageWithoutDescription:
active: true
excludes: &tests
- '**/commonTest/**'
- '**/jvmTest/**'
- '**/iosTest/**'
- '**/jsTest/**'
- '**/wasmJsTest/**'
- '**/webTest/**'
- '**/androidHostTest/**'
- '**/androidDeviceTest/**'
UntaggedControl:
active: true
excludes: *tests
Kütüphanenin ayarı
Kütüphanenin modülleri detekt'in kurallarıyla ve projenin kendi kurallarıyla denetlenir; her bulgu derlemeyi durdurur, bulgu ya düzeltilir ya da gerekçesi aynı satırda yazılı bir @Suppress olur. Bir uygulamanın tuttuğu iki kural, ImageWithoutDescription ve UntaggedControl, burada kapalıdır.
detekt.yml
# PantrixUI detekt konfigürasyonu
comments:
active: true
UndocumentedPublicClass:
active: true
excludes: ¬Published
- '**/app/**'
- '**/test/**'
- '**/androidTest/**'
- '**/commonTest/**'
- '**/jsTest/**'
- '**/jvmTest/**'
- '**/iosTest/**'
- '**/wasmJsTest/**'
- '**/androidUnitTest/**'
- '**/androidInstrumentedTest/**'
# KMP Android kütüphane eklentisinin test kaynak kümeleri (yukarıdaki iki adın bugünkü karşılığı).
- '**/androidHostTest/**'
- '**/androidDeviceTest/**'
# Bileşenlerin ekran görüntüsü sahneleri: testlerin çizdiği, yayımlanmayan kod.
- '**/screenshotScenes/**'
UndocumentedPublicFunction:
active: true
excludes: *notPublished
UndocumentedPublicProperty:
active: true
excludes: *notPublished
naming:
FunctionNaming:
active: true
# @Composable fonksiyonlar PascalCase — resmî Compose API kılavuzu.
# Muafiyet değil; aracın kod tabanının konvansiyonunu tanıması.
ignoreAnnotated: [ 'Composable', 'Preview' ]
# Test adları snake_case (`a_theme_told_it_is_dark_is_dark`). detekt'in varsayılan dışlama listesi
# androidHostTest'i tanımıyor; yayımlanmayan kodun listesi onun yerine geçiyor.
excludes: *notPublished
# Kapalı. Bir dosya, bileşenini onun tipleriyle birlikte taşır: Text.kt'de PantrixText ile TextRole.
# Kural ya dosyanın adını değiştirmeyi ister, ki bu JVM'de dosya sınıfının (PlatformKt) adını ve
# ABI'yi değiştirir, ya da birlikte okunan kodu ayrı dosyalara böler. KMP actual dosyalarında da
# (`Platform.jvm.kt`) yanlış pozitif veriyordu.
MatchingDeclarationName:
active: false
style:
# @Preview fonksiyonları GİRİŞ NOKTASI: IDE onları yansımayla çağırıyor,
# kod içinden kimse çağırmıyor. "Kullanılmıyor" teknik olarak doğru,
# anlamlı olarak yanlış.
#
# Bu muafiyet olmadan preview'lar `private` olamıyor ve `internal`
# yazılıyordu — yani görünürlük, tasarım kararı değil kuraldan kaçış
# olarak seçiliyordu. Muafiyet doğru yerde durunca preview'lar hak
# ettikleri görünürlüğe (private) dönebiliyor.
UnusedPrivateMember:
active: true
ignoreAnnotated: [ 'Preview' ]
MagicNumber:
active: true
excludes:
- '**/ui/foundation/**'
# Testte sayı, saklanacak bir ayrıntı değil İDDİANIN KENDİSİ.
# `assertEquals(37.sp, style.fontSize)` satırında 37'yi
# EXPECTED_FONT_SIZE'a çevirmek, testin ne iddia ettiğini okuyucudan
# gizler — kuralın korumaya çalıştığı şeyin tersi.
#
# DAR TUTULDU: yalnızca *Test.kt. Test kaynak kümesinin tamamını
# dışlamak, test YARDIMCILARINDAKİ (fixture, builder) gerçek sihirli
# sayıları da kaçırırdı.
- '**/*Test.kt'
complexity:
# Bir katalog/ekran dosyasında @Composable fonksiyonlar AYRI SORUMLULUK
# değil, TEK SAYFANIN BÖLÜMLERİ. Kural tanrı-nesneye karşı; bölümlerine
# ayrılmış bir sayfa tam tersi. Uzun tek gövde (LongMethod) ile çok sayıda
# küçük bölüm arasında kural bizi ikincisinden cezalandırmamalı — ki
# ikincisi doğru olan.
TooManyFunctions:
active: true
ignoreAnnotatedFunctions: [ 'Composable', 'Preview' ]
# Bir test sınıfında her test bir fonksiyon: ekran görüntüsü testinde bileşen başına bir tane. detekt'in varsayılan
# dışlama listesi test kaynak kümelerini muaf tutuyor ama androidHostTest'i tanımıyor; FunctionNaming'deki gibi
# yayımlanmayan kodun listesi onun yerine geçiyor.
excludes: *notPublished
LongParameterList:
active: true
# Stil sınıfları (ButtonStyle…) boyut ya da rol başına bir değer taşır: beş boyutu olan bir
# bileşenin stili beş parametreyle başlar. Parametre sayısı tasarımın kendisi, dağınıklık değil.
excludes: [ '**/ui/foundation/**', '**/*Style.kt' ]
# Compose bileşenleri doğası gereği çok parametreli: içerik + stil +
# modifier + davranış slotları. Eşik 6, bir Composable için yanlış
# ölçü — PantrixText'in parametreleri (text, style, modifier, color,
# maxLines, overflow, textAlign, …) fazlalık değil, API'nin kendisi.
ignoreAnnotated: [ 'Composable' ]
# Composable olmayan API'ler de çoğu zaman varsayılanlı parametrelerle büyür: snackbar'ın show()'u
# (mesaj, eylem, süre, kapat düğmesi, ton, tagKey) gibi. Varsayılan eşikler (fonksiyonda 6,
# constructor'da 7) bunları hemen yakalıyordu; biraz esnetildi. Eşik, kuralın tetiklendiği sayı:
# fonksiyonda 7, constructor'da 8 parametreye kadar serbest.
functionThreshold: 8
constructorThreshold: 9
PantrixUIRule:
# Projenin kendi kuralları (tooling/detekt-rules): CONTRIBUTING.md'deki kütüphane kuralları ve erişilebilirlik, dil
# ve token kuralları. Kütüphanede her bulgu derlemeyi durdurur; bulgu ya düzeltilir ya gerekçesi yazılı bir
# @Suppress olur. Baseline yok. Testler ve demo bu kuralların dışında: demo'nun kendi ayarı demo.yml'de.
NoMaterialImport:
active: true
# Material 3 köprüsü (ui/material3) kütüphanede Material kullanan tek modüldür: işi iki temayı birbirine
# çevirmek. Hiçbir kütüphane modülü ona bağlanmaz.
excludes: [ '**/ui/material3/src/**' ]
NoFoundationPrimitive:
active: true
# Sarmalayıcıların kendi yaşadığı yer muaf — oradan primitife
# dokunmak işin tanımı: ui/foundation, BasicText'i saran PantrixText'in dosyası,
# BasicTextField'ı saran PantrixTextField'ın dosyası ve BasicSecureTextField'ı saran
# PantrixSecureTextField'ın dosyası.
allowedPathPattern: '/ui/foundation/|/components/elements/text/Text\.kt$|/components/inputs/textfield/TextField\.kt$|/components/inputs/securetextfield/SecureTextField\.kt$'
UnmarkedComponent:
active: true
includes: [ '**/ui/components/src/**' ]
excludes: *notPublished
SettingInStrings:
active: true
excludes: *notPublished
TagFromVisibleText:
active: true
excludes: *notPublished
RawTestTag:
active: true
excludes: *notPublished
# Etiket fonksiyonları burada: pantrixTestTag, Compose'un testTag'ini çağıran tek yer.
allowedPathPattern: '/foundation/testing/'
EmptyComposableDefault:
active: true
excludes: *notPublished
KDocNotASentence:
active: true
excludes: *notPublished
UndocumentedParameter:
active: true
excludes: *notPublished
LiteralTextInLibrary:
active: true
# Yayımlanmayan kod ve metin paketlerinin kendisi (l10n): bir paketin sözleri orada yazılır.
excludes:
- '**/app/**'
- '**/test/**'
- '**/androidTest/**'
- '**/commonTest/**'
- '**/jsTest/**'
- '**/jvmTest/**'
- '**/iosTest/**'
- '**/wasmJsTest/**'
- '**/androidUnitTest/**'
- '**/androidInstrumentedTest/**'
- '**/androidHostTest/**'
- '**/androidDeviceTest/**'
- '**/screenshotScenes/**'
- '**/foundation/l10n/**'
FixedSideLayout:
active: true
excludes: *notPublished
SizeOutsideStyle:
active: true
# Bileşenler: foundation'ın kendisi token katmanı. Stil dosyalarında ölçü yazılır.
includes: [ '**/ui/components/src/**' ]
excludes: *notPublished
allowedPathPattern: 'Style[^/]*\.kt$'
ColorOutsideTokens:
active: true
includes: [ '**/ui/components/src/**' ]
excludes: *notPublished
allowedPathPattern: 'Style[^/]*\.kt$'
# Bu ikisi kütüphaneyi kullanan uygulama içindir: demo.yml'de ve tüketicinin ayarında açılır.
ImageWithoutDescription:
active: false
UntaggedControl:
active: false