REFACTOR END
1
data/semantic-ktlint-rules/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/build
|
||||
@@ -1,18 +0,0 @@
|
||||
// Файл: /data/semantic-ktlint-rules/build.gradle.kts
|
||||
|
||||
plugins {
|
||||
kotlin("jvm")
|
||||
}
|
||||
|
||||
|
||||
dependencies {
|
||||
// Зависимость для RuleSetProviderV3
|
||||
implementation("com.pinterest.ktlint:ktlint-cli-ruleset-core:1.2.1")
|
||||
// Зависимость для Rule, RuleId и psi-утилит
|
||||
api("com.pinterest.ktlint:ktlint-rule-engine:1.2.1")
|
||||
|
||||
// Зависимости для тестирования остаются без изменений
|
||||
testImplementation(kotlin("test"))
|
||||
testImplementation("com.pinterest.ktlint:ktlint-test:1.2.1")
|
||||
testImplementation("org.assertj:assertj-core:3.24.2")
|
||||
}
|
||||
21
data/semantic-ktlint-rules/proguard-rules.pro
vendored
@@ -1,21 +0,0 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@@ -1,28 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] ExampleInstrumentedTest.kt
|
||||
// [SEMANTICS] testing, android, ktlint, rules
|
||||
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import androidx.test.platform.app.InstrumentationRegistry
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
import org.junit.Assert.*
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
|
||||
assertEquals("com.busya.ktlint.rules", appContext.packageName)
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.HomeboxLens" />
|
||||
|
||||
</manifest>
|
||||
@@ -1,18 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] CustomRuleSetProvider.kt
|
||||
// [SEMANTICS] ktlint, rules, provider
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import com.pinterest.ktlint.rule.engine.core.api.RuleProvider
|
||||
import com.pinterest.ktlint.rule.engine.core.api.RuleSetId
|
||||
import com.pinterest.ktlint.cli.ruleset.core.api.RuleSetProviderV3
|
||||
|
||||
class CustomRuleSetProvider : RuleSetProviderV3(RuleSetId("custom")) {
|
||||
override fun getRuleProviders(): Set<RuleProvider> {
|
||||
return setOf(
|
||||
RuleProvider { FileHeaderRule() },
|
||||
RuleProvider { MandatoryEntityDeclarationRule() },
|
||||
RuleProvider { NoStrayCommentsRule() }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] FileHeaderRule.kt
|
||||
// [SEMANTICS] ktlint, rules, file_header
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import com.pinterest.ktlint.rule.engine.core.api.ElementType
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule.About
|
||||
import com.pinterest.ktlint.rule.engine.core.api.RuleId
|
||||
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
|
||||
|
||||
class FileHeaderRule : Rule(ruleId = RuleId("custom:file-header-rule"), about = About()) {
|
||||
override fun beforeVisitChildNodes(
|
||||
node: ASTNode,
|
||||
autoCorrect: Boolean,
|
||||
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
|
||||
) {
|
||||
if (node.elementType == ElementType.FILE) {
|
||||
val lines = node.text.lines()
|
||||
if (lines.size < 3) {
|
||||
emit(node.startOffset, "File must start with a 3-line semantic header.", false)
|
||||
return
|
||||
}
|
||||
if (!lines[0].startsWith("// [PACKAGE]")) {
|
||||
emit(node.startOffset, "File header missing or incorrect. Line 1 must be '// [PACKAGE] ...'.", false)
|
||||
}
|
||||
if (!lines[1].startsWith("// [FILE]")) {
|
||||
emit(node.startOffset + lines[0].length + 1, "File header missing or incorrect. Line 2 must be '// [FILE] ...'.", false)
|
||||
}
|
||||
if (!lines[2].startsWith("// [SEMANTICS]")) {
|
||||
emit(node.startOffset + lines[0].length + lines[1].length + 2, "File header missing or incorrect. Line 3 must be '// [SEMANTICS] ...'.", false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] MandatoryEntityDeclarationRule.kt
|
||||
// [SEMANTICS] ktlint, rules, entity_declaration
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import com.pinterest.ktlint.rule.engine.core.api.ElementType
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule.About
|
||||
import com.pinterest.ktlint.rule.engine.core.api.RuleId
|
||||
import com.pinterest.ktlint.rule.engine.core.api.prevLeaf
|
||||
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
|
||||
class MandatoryEntityDeclarationRule : Rule(ruleId = RuleId("custom:entity-declaration-rule"), about = About()) {
|
||||
private val entityTypes = setOf(
|
||||
ElementType.CLASS,
|
||||
ElementType.OBJECT_DECLARATION,
|
||||
ElementType.FUN
|
||||
)
|
||||
|
||||
override fun beforeVisitChildNodes(
|
||||
node: ASTNode,
|
||||
autoCorrect: Boolean,
|
||||
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
|
||||
) {
|
||||
if (node.elementType in entityTypes) {
|
||||
val ktDeclaration = node.psi as? KtDeclaration ?: return
|
||||
if (node.elementType == ElementType.FUN &&
|
||||
(ktDeclaration.hasModifier(KtTokens.PRIVATE_KEYWORD) ||
|
||||
ktDeclaration.hasModifier(KtTokens.PROTECTED_KEYWORD) ||
|
||||
ktDeclaration.hasModifier(KtTokens.INTERNAL_KEYWORD))
|
||||
) {
|
||||
return
|
||||
}
|
||||
val prevComment = node.prevLeaf { it.elementType == ElementType.EOL_COMMENT }
|
||||
if (prevComment == null || !prevComment.text.startsWith("// [ENTITY:")) {
|
||||
emit(node.startOffset, "Missing or misplaced '// [ENTITY: ...]' declaration before '${node.elementType}'.", false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] NoStrayCommentsRule.kt
|
||||
// [SEMANTICS] ktlint, rules, comments
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import com.pinterest.ktlint.rule.engine.core.api.ElementType
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule
|
||||
import com.pinterest.ktlint.rule.engine.core.api.Rule.About
|
||||
import com.pinterest.ktlint.rule.engine.core.api.RuleId
|
||||
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
|
||||
|
||||
class NoStrayCommentsRule : Rule(ruleId = RuleId("custom:no-stray-comments-rule"), about = About()) {
|
||||
private val allowedCommentPattern = Regex("""^//\s?\[([A-Z_]+|ENTITY:|RELATION:|AI_NOTE:)]""")
|
||||
override fun beforeVisitChildNodes(
|
||||
node: ASTNode,
|
||||
autoCorrect: Boolean,
|
||||
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
|
||||
) {
|
||||
if (node.elementType == ElementType.EOL_COMMENT) {
|
||||
val commentText = node.text
|
||||
if (!allowedCommentPattern.matches(commentText)) {
|
||||
emit(node.startOffset, "Stray comment found. Use semantic anchors like '// [TAG]' or '// [AI_NOTE]:' instead.", false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path
|
||||
android:fillColor="#3DDC84"
|
||||
android:pathData="M0,0h108v108h-108z" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M9,0L9,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,0L19,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M29,0L29,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M39,0L39,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M49,0L49,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M59,0L59,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M69,0L69,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M79,0L79,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M89,0L89,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M99,0L99,108"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,9L108,9"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,19L108,19"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,29L108,29"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,39L108,39"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,49L108,49"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,59L108,59"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,69L108,69"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,79L108,79"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,89L108,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M0,99L108,99"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,29L89,29"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,39L89,39"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,49L89,49"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,59L89,59"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,69L89,69"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M19,79L89,79"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M29,19L29,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M39,19L39,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M49,19L49,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M59,19L59,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M69,19L69,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M79,19L79,89"
|
||||
android:strokeWidth="0.8"
|
||||
android:strokeColor="#33FFFFFF" />
|
||||
</vector>
|
||||
@@ -1,30 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="85.84757"
|
||||
android:endY="92.4963"
|
||||
android:startX="42.9492"
|
||||
android:startY="49.59793"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#44000000"
|
||||
android:offset="0.0" />
|
||||
<item
|
||||
android:color="#00000000"
|
||||
android:offset="1.0" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 982 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
@@ -1,16 +0,0 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.HomeboxLens" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_200</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/black</item>
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="colorSecondary">@color/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="purple_200">#FFBB86FC</color>
|
||||
<color name="purple_500">#FF6200EE</color>
|
||||
<color name="purple_700">#FF3700B3</color>
|
||||
<color name="teal_200">#FF03DAC5</color>
|
||||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
</resources>
|
||||
@@ -1,3 +0,0 @@
|
||||
<resources>
|
||||
<string name="app_name">semantic-ktlint-rules</string>
|
||||
</resources>
|
||||
@@ -1,16 +0,0 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.HomeboxLens" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_500</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/white</item>
|
||||
<!-- Secondary brand color. -->
|
||||
<item name="colorSecondary">@color/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<!-- Status bar color. -->
|
||||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1 +0,0 @@
|
||||
com.busya.ktlint.rules.CustomRuleSetProvider
|
||||
@@ -1,45 +0,0 @@
|
||||
// [PACKAGE] com.busya.ktlint.rules
|
||||
// [FILE] ExampleUnitTest.kt
|
||||
// [SEMANTICS] testing, ktlint, rules
|
||||
|
||||
package com.busya.ktlint.rules
|
||||
|
||||
import com.pinterest.ktlint.test.KtLintAssertThat.Companion.assertThatRule
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
class FileHeaderRuleTest {
|
||||
|
||||
private val ruleAssertThat = assertThatRule { FileHeaderRule() }
|
||||
|
||||
@Test
|
||||
fun `should pass on correct header`() {
|
||||
val code = """
|
||||
// [PACKAGE] com.example
|
||||
// [FILE] Test.kt
|
||||
// [SEMANTICS] test, example
|
||||
package com.example
|
||||
""".trimIndent()
|
||||
ruleAssertThat(code).hasNoLintViolations()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `should fail on missing header`() {
|
||||
val code = """
|
||||
package com.example
|
||||
""".trimIndent()
|
||||
ruleAssertThat(code)
|
||||
.hasLintViolation(1, 1, "File must start with a 3-line semantic header.")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `should fail on incorrect line 1`() {
|
||||
val code = """
|
||||
// [WRONG_TAG] com.example
|
||||
// [FILE] Test.kt
|
||||
// [SEMANTICS] test, example
|
||||
package com.example
|
||||
""".trimIndent()
|
||||
ruleAssertThat(code)
|
||||
.hasLintViolation(1, 1, "File header missing or incorrect. Line 1 must be '// [PACKAGE] ...'.")
|
||||
}
|
||||
}
|
||||