Skip to content

Commit fb81ed8

Browse files
dadachiclaude
andcommitted
Add Spotless + ktlint for Kotlin code formatting
Configure Spotless with ktlint to enforce consistent code style across the project, excluding libs.versions.toml. Add spotlessCheck and Android Lint to CI workflow. Add JVM crash logs to .gitignore. Disable ktlint rules incompatible with existing codebase conventions (package-name, wildcard-imports, max-line-length, property-naming, filename) and Compose-unfriendly rules (matching nowinandroid .editorconfig). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 792e5da commit fb81ed8

185 files changed

Lines changed: 1097 additions & 1037 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,24 @@ ij_formatter_off_tag = @formatter:off
88
ij_formatter_on_tag = @formatter:on
99
ij_formatter_tags_enabled = false
1010
ij_smart_tabs = false
11-
ij_wrap_on_typing = false
11+
ij_wrap_on_typing = false
12+
13+
[*.{kt,kts}]
14+
ij_kotlin_allow_trailing_comma = true
15+
ij_kotlin_allow_trailing_comma_on_call_site = true
16+
ktlint_function_naming_ignore_when_annotated_with = Composable, Test
17+
ktlint_standard_backing-property-naming = disabled
18+
ktlint_standard_binary-expression-wrapping = disabled
19+
ktlint_standard_chain-method-continuation = disabled
20+
ktlint_standard_class-signature = disabled
21+
ktlint_standard_condition-wrapping = disabled
22+
ktlint_standard_function-expression-body = disabled
23+
ktlint_standard_function-literal = disabled
24+
ktlint_standard_function-type-modifier-spacing = disabled
25+
ktlint_standard_multiline-loop = disabled
26+
ktlint_standard_function-signature = disabled
27+
ktlint_standard_package-name = disabled
28+
ktlint_standard_no-wildcard-imports = disabled
29+
ktlint_standard_property-naming = disabled
30+
ktlint_standard_max-line-length = disabled
31+
ktlint_standard_filename = disabled

.github/workflows/run_tests.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ jobs:
1515
- name: Setup Gradle
1616
uses: gradle/actions/setup-gradle@v3
1717

18-
- name: Unit Tests
18+
- name: Check lint (spotless)
1919
run: |
2020
chmod +x gradlew
21-
./gradlew test --stacktrace
21+
./gradlew spotlessCheck
22+
23+
- name: Android Lint
24+
run: ./gradlew :app:lintDebug
25+
26+
- name: Unit Tests
27+
run: ./gradlew test --stacktrace

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ app/release/*
6161
# https://github.com/JetBrains/kotlin/blob/ca34e5d2fd255ed0501bae4fae3d3691dc40d375/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt#L458
6262
/.kotlin
6363

64+
# JVM crash logs
65+
hs_err_pid*.log
66+
replay_pid*.log
67+
6468
# Claude
6569
# Personal Claude Code settings
6670
.claude/settings.local.json

app/build.gradle.kts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ android {
2626
debug {
2727
extra["alwaysUpdateBuildId"] = false
2828
isDebuggable = true
29-
buildConfigField("String", "DOMAIN","\"api.nativeapptemplate.com\"")
30-
buildConfigField("String", "PORT","\"\"")
31-
buildConfigField("String", "SCHEME","\"https\"")
29+
buildConfigField("String", "DOMAIN", "\"api.nativeapptemplate.com\"")
30+
buildConfigField("String", "PORT", "\"\"")
31+
buildConfigField("String", "SCHEME", "\"https\"")
3232
// buildConfigField("String", "DOMAIN","\"192.168.1.21\"")
3333
// buildConfigField("String", "PORT","\"3000\"")
3434
// buildConfigField("String", "SCHEME","\"http\"")
@@ -37,9 +37,9 @@ android {
3737
release {
3838
isMinifyEnabled = true
3939
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
40-
buildConfigField("String", "DOMAIN","\"api.nativeapptemplate.com\"")
41-
buildConfigField("String", "PORT","\"\"")
42-
buildConfigField("String", "SCHEME","\"https\"")
40+
buildConfigField("String", "DOMAIN", "\"api.nativeapptemplate.com\"")
41+
buildConfigField("String", "PORT", "\"\"")
42+
buildConfigField("String", "SCHEME", "\"https\"")
4343
}
4444
}
4545

@@ -124,5 +124,3 @@ dependencies {
124124
testImplementation(libs.kotlinx.coroutines.test)
125125
testImplementation(libs.robolectric)
126126
}
127-
128-

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/MainActivity.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ class MainActivity : ComponentActivity() {
128128
val rawMessages = if (SDK_INT >= 33) { // TIRAMISU
129129
intent.getParcelableArrayExtra(
130130
NfcAdapter.EXTRA_NDEF_MESSAGES,
131-
NdefMessage::class.java
131+
NdefMessage::class.java,
132132
)
133-
}else{
133+
} else {
134134
@Suppress("DEPRECATION")
135135
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
136136
}
@@ -140,7 +140,7 @@ class MainActivity : ComponentActivity() {
140140

141141
val itemTagInfoFromNdefMessage = Utility.extractItemTagInfoFrom(
142142
context = this,
143-
ndefMessage = ndefMessage
143+
ndefMessage = ndefMessage,
144144
)
145145

146146
updateItemTagInfoFromNdefMessage(itemTagInfoFromNdefMessage)
@@ -162,9 +162,9 @@ class MainActivity : ComponentActivity() {
162162
val rawMessages = if (SDK_INT >= 33) { // TIRAMISU
163163
intent.getParcelableArrayExtra(
164164
NfcAdapter.EXTRA_NDEF_MESSAGES,
165-
NdefMessage::class.java
165+
NdefMessage::class.java,
166166
)
167-
}else{
167+
} else {
168168
@Suppress("DEPRECATION")
169169
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
170170
}
@@ -174,7 +174,7 @@ class MainActivity : ComponentActivity() {
174174

175175
val itemTagInfoFromNdefMessage = Utility.extractItemTagInfoFrom(
176176
context = this,
177-
ndefMessage = ndefMessage
177+
ndefMessage = ndefMessage,
178178
)
179179

180180
updateItemTagInfoFromNdefMessage(itemTagInfoFromNdefMessage)

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/NatConstants.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ object NatConstants {
2727

2828
return result
2929
}
30-
}
30+
}

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/NativeAppTemplateApplication.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ class NativeAppTemplateApplication : Application() {
1414
super.onCreate()
1515
profileVerifierLogger()
1616
}
17-
}
17+
}

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/data/item_tag/ItemTagApi.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,33 @@ interface ItemTagApi {
99
@GET("{account_id}/api/v1/shopkeeper/shops/{shop_id}/item_tags")
1010
suspend fun getItemTags(
1111
@Path("account_id") accountId: String,
12-
@Path("shop_id") shopId: String
12+
@Path("shop_id") shopId: String,
1313
): ApiResponse<ItemTags>
1414

1515
@GET("{account_id}/api/v1/shopkeeper/item_tags/{id}")
1616
suspend fun getItemTag(
1717
@Path("account_id") accountId: String,
18-
@Path("id") id: String
18+
@Path("id") id: String,
1919
): ApiResponse<ItemTag>
2020

2121
@POST("{account_id}/api/v1/shopkeeper/shops/{shop_id}/item_tags")
2222
suspend fun createItemTag(
2323
@Path("account_id") accountId: String,
2424
@Path("shop_id") shopId: String,
25-
@Body data: ItemTagBody
25+
@Body data: ItemTagBody,
2626
): ApiResponse<ItemTag>
2727

2828
@PATCH("{account_id}/api/v1/shopkeeper/item_tags/{id}")
2929
suspend fun updateItemTag(
3030
@Path("account_id") accountId: String,
3131
@Path("id") id: String,
32-
@Body data: ItemTagBody
32+
@Body data: ItemTagBody,
3333
): ApiResponse<ItemTag>
3434

3535
@DELETE("{account_id}/api/v1/shopkeeper/item_tags/{id}")
3636
suspend fun deleteItemTag(
3737
@Path("account_id") accountId: String,
38-
@Path("id") id: String
38+
@Path("id") id: String,
3939
): ApiResponse<Status>
4040

4141
@PATCH("{account_id}/api/v1/shopkeeper/item_tags/{id}/complete")
@@ -52,7 +52,7 @@ interface ItemTagApi {
5252

5353
companion object {
5454
fun create(retroFit: Retrofit): ItemTagApi = retroFit.create(
55-
ItemTagApi::class.java
55+
ItemTagApi::class.java,
5656
)
5757
}
5858
}

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/data/item_tag/ItemTagRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ interface ItemTagRepository {
1919

2020
fun updateItemTag(
2121
id: String,
22-
itemTagBody: ItemTagBody
22+
itemTagBody: ItemTagBody,
2323
): Flow<ItemTag>
2424

2525
fun deleteItemTag(

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/data/item_tag/ItemTagRepositoryImpl.kt

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ class ItemTagRepositoryImpl @Inject constructor(
3636
try {
3737
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTags, NativeAppTemplateApiError>()
3838
} catch (exception: Exception) {
39-
val message= "Not processable error(${message()})."
39+
val message = "Not processable error(${message()})."
4040
throw Exception(message)
4141
}
4242

4343
if (nativeAppTemplateApiError != null) {
44-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
44+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
4545
throw Exception(message)
4646
} else {
47-
val message= "Not processable error(${message()})."
47+
val message = "Not processable error(${message()})."
4848
throw Exception(message)
4949
}
5050
}
@@ -55,7 +55,7 @@ class ItemTagRepositoryImpl @Inject constructor(
5555
) = flow {
5656
val response = api.getItemTag(
5757
mtcPreferencesDataSource.userData.first().accountId,
58-
id
58+
id,
5959
)
6060

6161
response.suspendOnSuccess {
@@ -66,15 +66,15 @@ class ItemTagRepositoryImpl @Inject constructor(
6666
try {
6767
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTag, NativeAppTemplateApiError>()
6868
} catch (exception: Exception) {
69-
val message= "Not processable error(${message()})."
69+
val message = "Not processable error(${message()})."
7070
throw Exception(message)
7171
}
7272

7373
if (nativeAppTemplateApiError != null) {
74-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
74+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
7575
throw Exception(message)
7676
} else {
77-
val message= "Not processable error(${message()})."
77+
val message = "Not processable error(${message()})."
7878
throw Exception(message)
7979
}
8080
}
@@ -101,15 +101,15 @@ class ItemTagRepositoryImpl @Inject constructor(
101101
try {
102102
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTag, NativeAppTemplateApiError>()
103103
} catch (exception: Exception) {
104-
val message= "Not processable error(${message()})."
104+
val message = "Not processable error(${message()})."
105105
throw Exception(message)
106106
}
107107

108108
if (nativeAppTemplateApiError != null) {
109-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
109+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
110110
throw Exception(message)
111111
} else {
112-
val message= "Not processable error(${message()})."
112+
val message = "Not processable error(${message()})."
113113
throw Exception(message)
114114
}
115115
}
@@ -124,7 +124,7 @@ class ItemTagRepositoryImpl @Inject constructor(
124124
val response = api.updateItemTag(
125125
mtcPreferencesDataSource.userData.first().accountId,
126126
id,
127-
itemTagBody
127+
itemTagBody,
128128
)
129129

130130
response.suspendOnSuccess {
@@ -136,15 +136,15 @@ class ItemTagRepositoryImpl @Inject constructor(
136136
try {
137137
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTag, NativeAppTemplateApiError>()
138138
} catch (exception: Exception) {
139-
val message= "Not processable error(${message()})."
139+
val message = "Not processable error(${message()})."
140140
throw Exception(message)
141141
}
142142

143143
if (nativeAppTemplateApiError != null) {
144-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
144+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
145145
throw Exception(message)
146146
} else {
147-
val message= "Not processable error(${message()})."
147+
val message = "Not processable error(${message()})."
148148
throw Exception(message)
149149
}
150150
}
@@ -163,15 +163,15 @@ class ItemTagRepositoryImpl @Inject constructor(
163163
try {
164164
nativeAppTemplateApiError = response.deserializeErrorBody<Status, NativeAppTemplateApiError>()
165165
} catch (exception: Exception) {
166-
val message= "Not processable error(${message()})."
166+
val message = "Not processable error(${message()})."
167167
throw Exception(message)
168168
}
169169

170170
if (nativeAppTemplateApiError != null) {
171-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
171+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
172172
throw Exception(message)
173173
} else {
174-
val message= "Not processable error(${message()})."
174+
val message = "Not processable error(${message()})."
175175
throw Exception(message)
176176
}
177177
}
@@ -190,15 +190,15 @@ class ItemTagRepositoryImpl @Inject constructor(
190190
try {
191191
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTag, NativeAppTemplateApiError>()
192192
} catch (exception: Exception) {
193-
val message= "Not processable error(${message()})."
193+
val message = "Not processable error(${message()})."
194194
throw Exception(message)
195195
}
196196

197197
if (nativeAppTemplateApiError != null) {
198-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
198+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
199199
throw Exception(message)
200200
} else {
201-
val message= "Not processable error(${message()})."
201+
val message = "Not processable error(${message()})."
202202
throw Exception(message)
203203
}
204204
}
@@ -217,15 +217,15 @@ class ItemTagRepositoryImpl @Inject constructor(
217217
try {
218218
nativeAppTemplateApiError = response.deserializeErrorBody<ItemTag, NativeAppTemplateApiError>()
219219
} catch (exception: Exception) {
220-
val message= "Not processable error(${message()})."
220+
val message = "Not processable error(${message()})."
221221
throw Exception(message)
222222
}
223223

224224
if (nativeAppTemplateApiError != null) {
225-
val message= "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
225+
val message = "${nativeAppTemplateApiError.message} [Status: ${nativeAppTemplateApiError.code}]"
226226
throw Exception(message)
227227
} else {
228-
val message= "Not processable error(${message()})."
228+
val message = "Not processable error(${message()})."
229229
throw Exception(message)
230230
}
231231
}

0 commit comments

Comments
 (0)