biucingcli 0.9.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- biucingcli/__init__.py +5 -0
- biucingcli/cli.py +849 -0
- biucingcli/template_data/android/template/.editorconfig +9 -0
- biucingcli/template_data/android/template/.gitignore +26 -0
- biucingcli/template_data/android/template/.mise.toml +3 -0
- biucingcli/template_data/android/template/Brewfile +6 -0
- biucingcli/template_data/android/template/Makefile +103 -0
- biucingcli/template_data/android/template/README.md +163 -0
- biucingcli/template_data/android/template/app/build.gradle.kts +178 -0
- biucingcli/template_data/android/template/app/proguard-rules.pro +1 -0
- biucingcli/template_data/android/template/app/src/androidTest/java/app/HomeRouteUiTest.kt +21 -0
- biucingcli/template_data/android/template/app/src/main/AndroidManifest.xml +18 -0
- biucingcli/template_data/android/template/app/src/main/java/app/MainActivity.kt +36 -0
- biucingcli/template_data/android/template/app/src/main/res/values/strings.xml +4 -0
- biucingcli/template_data/android/template/app/src/main/res/values/themes.xml +8 -0
- biucingcli/template_data/android/template/app/src/test/java/app/AppSmokeTest.kt +19 -0
- biucingcli/template_data/android/template/build.gradle.kts +27 -0
- biucingcli/template_data/android/template/core/designsystem/build.gradle.kts +33 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Components.kt +75 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/DesignTokens.kt +23 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Theme.kt +110 -0
- biucingcli/template_data/android/template/core/model/build.gradle.kts +26 -0
- biucingcli/template_data/android/template/core/model/src/main/java/model/Greeting.kt +6 -0
- biucingcli/template_data/android/template/core/model/src/test/java/model/GreetingTest.kt +16 -0
- biucingcli/template_data/android/template/core/network/build.gradle.kts +26 -0
- biucingcli/template_data/android/template/core/network/src/main/java/network/AppEnvironment.kt +17 -0
- biucingcli/template_data/android/template/core/testing/build.gradle.kts +27 -0
- biucingcli/template_data/android/template/core/testing/src/main/java/testing/FakeAppEnvironmentProvider.kt +13 -0
- biucingcli/template_data/android/template/docs/release-delivery.md +68 -0
- biucingcli/template_data/android/template/docs/release-signing.properties.example +20 -0
- biucingcli/template_data/android/template/fastlane/.env.example +22 -0
- biucingcli/template_data/android/template/fastlane/Appfile +1 -0
- biucingcli/template_data/android/template/fastlane/Fastfile +121 -0
- biucingcli/template_data/android/template/feature/home/build.gradle.kts +35 -0
- biucingcli/template_data/android/template/feature/home/src/main/java/home/HomeRoute.kt +38 -0
- biucingcli/template_data/android/template/feature/settings/build.gradle.kts +34 -0
- biucingcli/template_data/android/template/feature/settings/src/main/java/settings/SettingsRoute.kt +35 -0
- biucingcli/template_data/android/template/gradle/libs.versions.toml +35 -0
- biucingcli/template_data/android/template/gradle/verification-metadata.xml +3462 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar +0 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar.sha256 +1 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.properties +10 -0
- biucingcli/template_data/android/template/gradle.properties +4 -0
- biucingcli/template_data/android/template/gradlew +252 -0
- biucingcli/template_data/android/template/gradlew.bat +94 -0
- biucingcli/template_data/android/template/scripts/artifact-info +11 -0
- biucingcli/template_data/android/template/scripts/bootstrap +17 -0
- biucingcli/template_data/android/template/scripts/doctor +133 -0
- biucingcli/template_data/android/template/scripts/setup-android-sdk +23 -0
- biucingcli/template_data/android/template/scripts/sync-gradle-wrapper +19 -0
- biucingcli/template_data/android/template/scripts/verify-gradle-supply-chain +61 -0
- biucingcli/template_data/android/template/scripts/verify-release-artifact +104 -0
- biucingcli/template_data/android/template/settings.gradle.kts +25 -0
- biucingcli/template_data/android/template.json +146 -0
- biucingcli/template_data/apple/template/.gitignore +28 -0
- biucingcli/template_data/apple/template/.mise.toml +4 -0
- biucingcli/template_data/apple/template/.swiftformat +10 -0
- biucingcli/template_data/apple/template/.swiftlint.yml +33 -0
- biucingcli/template_data/apple/template/App/Config/ProjectDescriptionHelpers/Module.swift +6 -0
- biucingcli/template_data/apple/template/App/Config/XCConfig/Base.xcconfig +4 -0
- biucingcli/template_data/apple/template/App/Project.swift +66 -0
- biucingcli/template_data/apple/template/App/Targets/App/Resources/.gitkeep +1 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/AppEntry.swift +9 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeView.swift +18 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeViewModel.swift +38 -0
- biucingcli/template_data/apple/template/App/Targets/AppTests/Sources/AppTests.swift +59 -0
- biucingcli/template_data/apple/template/Brewfile +8 -0
- biucingcli/template_data/apple/template/Makefile +128 -0
- biucingcli/template_data/apple/template/Packages/AppServices/Package.swift +20 -0
- biucingcli/template_data/apple/template/Packages/AppServices/Sources/AppServices/StarterMetadata.swift +52 -0
- biucingcli/template_data/apple/template/Packages/DesignSystem/Package.swift +20 -0
- biucingcli/template_data/apple/template/Packages/DesignSystem/Sources/DesignSystem/Theme.swift +8 -0
- biucingcli/template_data/apple/template/README.md +133 -0
- biucingcli/template_data/apple/template/Tuist.swift +8 -0
- biucingcli/template_data/apple/template/Workspace.swift +11 -0
- biucingcli/template_data/apple/template/docs/release-delivery.md +55 -0
- biucingcli/template_data/apple/template/fastlane/.env.example +20 -0
- biucingcli/template_data/apple/template/fastlane/Appfile +3 -0
- biucingcli/template_data/apple/template/fastlane/Fastfile +126 -0
- biucingcli/template_data/apple/template/fastlane/Matchfile +7 -0
- biucingcli/template_data/apple/template/scripts/bootstrap +9 -0
- biucingcli/template_data/apple/template/scripts/doctor +163 -0
- biucingcli/template_data/apple/template/scripts/setup-xcode +6 -0
- biucingcli/template_data/apple/template/scripts/test-destination +42 -0
- biucingcli/template_data/apple/template/scripts/verify-release-identity +88 -0
- biucingcli/template_data/apple/template.json +110 -0
- biucingcli/template_data/frontend/template/.dockerignore +8 -0
- biucingcli/template_data/frontend/template/.env.example +1 -0
- biucingcli/template_data/frontend/template/.gitignore +7 -0
- biucingcli/template_data/frontend/template/.npmrc +1 -0
- biucingcli/template_data/frontend/template/.prettierignore +2 -0
- biucingcli/template_data/frontend/template/.prettierrc.json +4 -0
- biucingcli/template_data/frontend/template/Dockerfile +25 -0
- biucingcli/template_data/frontend/template/Dockerfile.dev +35 -0
- biucingcli/template_data/frontend/template/Dockerfile.dev.full +40 -0
- biucingcli/template_data/frontend/template/Makefile +137 -0
- biucingcli/template_data/frontend/template/README.md +146 -0
- biucingcli/template_data/frontend/template/compose.dev.yaml +29 -0
- biucingcli/template_data/frontend/template/eslint.config.js +27 -0
- biucingcli/template_data/frontend/template/index.html +12 -0
- biucingcli/template_data/frontend/template/nginx.conf +11 -0
- biucingcli/template_data/frontend/template/package.json +50 -0
- biucingcli/template_data/frontend/template/playwright.production.config.ts +21 -0
- biucingcli/template_data/frontend/template/playwright.smoke.config.ts +19 -0
- biucingcli/template_data/frontend/template/pnpm-lock.yaml +4054 -0
- biucingcli/template_data/frontend/template/public/.gitkeep +1 -0
- biucingcli/template_data/frontend/template/scripts/browser-smoke-production +55 -0
- biucingcli/template_data/frontend/template/scripts/doctor +46 -0
- biucingcli/template_data/frontend/template/src/App.test.tsx +18 -0
- biucingcli/template_data/frontend/template/src/App.tsx +5 -0
- biucingcli/template_data/frontend/template/src/components/MetricCard.tsx +14 -0
- biucingcli/template_data/frontend/template/src/components/TaskPanel.tsx +32 -0
- biucingcli/template_data/frontend/template/src/config/env.ts +3 -0
- biucingcli/template_data/frontend/template/src/hooks/useProjectOverview.ts +24 -0
- biucingcli/template_data/frontend/template/src/index.css +208 -0
- biucingcli/template_data/frontend/template/src/main.tsx +11 -0
- biucingcli/template_data/frontend/template/src/pages/HomePage.tsx +60 -0
- biucingcli/template_data/frontend/template/src/router/AppRouter.tsx +14 -0
- biucingcli/template_data/frontend/template/src/services/api/client.ts +33 -0
- biucingcli/template_data/frontend/template/src/services/projectOverview.ts +39 -0
- biucingcli/template_data/frontend/template/src/test/setup.ts +1 -0
- biucingcli/template_data/frontend/template/src/types/projectOverview.ts +22 -0
- biucingcli/template_data/frontend/template/src/vite-env.d.ts +9 -0
- biucingcli/template_data/frontend/template/tests/browser-smoke.spec.ts +16 -0
- biucingcli/template_data/frontend/template/tests/production-browser-smoke.spec.ts +22 -0
- biucingcli/template_data/frontend/template/tsconfig.json +21 -0
- biucingcli/template_data/frontend/template/vite.config.ts +12 -0
- biucingcli/template_data/frontend/template.json +81 -0
- biucingcli/template_data/harmonyos/template/.gitignore +21 -0
- biucingcli/template_data/harmonyos/template/.mise.toml +2 -0
- biucingcli/template_data/harmonyos/template/AppScope/app.json5 +10 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/element/string.json +8 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/background.svg +3 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/foreground.svg +4 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/layered_image.json +6 -0
- biucingcli/template_data/harmonyos/template/Makefile +106 -0
- biucingcli/template_data/harmonyos/template/README.md +152 -0
- biucingcli/template_data/harmonyos/template/build-profile.json5 +36 -0
- biucingcli/template_data/harmonyos/template/code-linter.json5 +12 -0
- biucingcli/template_data/harmonyos/template/docs/release-signing.local.properties.example +14 -0
- biucingcli/template_data/harmonyos/template/entry/build-profile.json5 +9 -0
- biucingcli/template_data/harmonyos/template/entry/hvigorfile.ts +6 -0
- biucingcli/template_data/harmonyos/template/entry/oh-package.json5 +9 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/config/AppConfig.ets +10 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/designsystem/Tokens.ets +28 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/entryability/EntryAbility.ets +29 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Index.ets +47 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Settings.ets +96 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/module.json5 +34 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/color.json +24 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/string.json +12 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/media/app_icon.svg +5 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/profile/main_pages.json +6 -0
- biucingcli/template_data/harmonyos/template/entry/src/test/List.test.ets +11 -0
- biucingcli/template_data/harmonyos/template/hvigor/hvigor-config.json5 +8 -0
- biucingcli/template_data/harmonyos/template/hvigorfile.ts +6 -0
- biucingcli/template_data/harmonyos/template/oh-package-lock.json5 +19 -0
- biucingcli/template_data/harmonyos/template/oh-package.json5 +13 -0
- biucingcli/template_data/harmonyos/template/scripts/artifact-info +31 -0
- biucingcli/template_data/harmonyos/template/scripts/bootstrap +38 -0
- biucingcli/template_data/harmonyos/template/scripts/doctor +147 -0
- biucingcli/template_data/harmonyos/template/scripts/lint +105 -0
- biucingcli/template_data/harmonyos/template/scripts/release-build +199 -0
- biucingcli/template_data/harmonyos/template/scripts/release-preflight +109 -0
- biucingcli/template_data/harmonyos/template/scripts/test +28 -0
- biucingcli/template_data/harmonyos/template/scripts/verify-release-artifact +173 -0
- biucingcli/template_data/harmonyos/template/scripts/verify-supply-chain +70 -0
- biucingcli/template_data/harmonyos/template.json +134 -0
- biucingcli/template_data/microservice/template/.air.toml +11 -0
- biucingcli/template_data/microservice/template/.dockerignore +5 -0
- biucingcli/template_data/microservice/template/.gitignore +4 -0
- biucingcli/template_data/microservice/template/.mise.toml +3 -0
- biucingcli/template_data/microservice/template/Brewfile +7 -0
- biucingcli/template_data/microservice/template/Dockerfile +44 -0
- biucingcli/template_data/microservice/template/Dockerfile.dev +50 -0
- biucingcli/template_data/microservice/template/Makefile +145 -0
- biucingcli/template_data/microservice/template/README.md +191 -0
- biucingcli/template_data/microservice/template/api/buf.gen.yaml +11 -0
- biucingcli/template_data/microservice/template/api/buf.yaml +11 -0
- biucingcli/template_data/microservice/template/api/proto/service/v1/service.proto +18 -0
- biucingcli/template_data/microservice/template/cmd/server/main.go +81 -0
- biucingcli/template_data/microservice/template/compose.dev.yaml +49 -0
- biucingcli/template_data/microservice/template/configs/config.yaml +18 -0
- biucingcli/template_data/microservice/template/deploy/compose.yaml +35 -0
- biucingcli/template_data/microservice/template/deploy/otel-collector.yaml +15 -0
- biucingcli/template_data/microservice/template/go.mod +53 -0
- biucingcli/template_data/microservice/template/go.sum +138 -0
- biucingcli/template_data/microservice/template/internal/config/config.go +112 -0
- biucingcli/template_data/microservice/template/internal/config/config_test.go +92 -0
- biucingcli/template_data/microservice/template/internal/handler/health.go +25 -0
- biucingcli/template_data/microservice/template/internal/handler/ping.go +25 -0
- biucingcli/template_data/microservice/template/internal/model/health.go +8 -0
- biucingcli/template_data/microservice/template/internal/model/ping.go +7 -0
- biucingcli/template_data/microservice/template/internal/repository/.gitkeep +1 -0
- biucingcli/template_data/microservice/template/internal/router/router.go +26 -0
- biucingcli/template_data/microservice/template/internal/runtime/server.go +116 -0
- biucingcli/template_data/microservice/template/internal/runtime/server_test.go +161 -0
- biucingcli/template_data/microservice/template/internal/service/health.go +26 -0
- biucingcli/template_data/microservice/template/internal/service/ping.go +23 -0
- biucingcli/template_data/microservice/template/internal/telemetry/telemetry.go +56 -0
- biucingcli/template_data/microservice/template/internal/transport/grpc.go +51 -0
- biucingcli/template_data/microservice/template/internal/transport/ping.go +28 -0
- biucingcli/template_data/microservice/template/scripts/bootstrap +29 -0
- biucingcli/template_data/microservice/template/scripts/doctor +115 -0
- biucingcli/template_data/microservice/template/tests/server_test.go +153 -0
- biucingcli/template_data/microservice/template.json +114 -0
- biucingcli/template_data/web-service/template/.air.toml +11 -0
- biucingcli/template_data/web-service/template/.dockerignore +5 -0
- biucingcli/template_data/web-service/template/.gitignore +5 -0
- biucingcli/template_data/web-service/template/.mise.toml +2 -0
- biucingcli/template_data/web-service/template/Brewfile +5 -0
- biucingcli/template_data/web-service/template/Dockerfile +41 -0
- biucingcli/template_data/web-service/template/Dockerfile.dev +45 -0
- biucingcli/template_data/web-service/template/Makefile +113 -0
- biucingcli/template_data/web-service/template/README.md +164 -0
- biucingcli/template_data/web-service/template/cmd/server/main.go +50 -0
- biucingcli/template_data/web-service/template/compose.dev.yaml +28 -0
- biucingcli/template_data/web-service/template/compose.yaml +14 -0
- biucingcli/template_data/web-service/template/configs/config.yaml +10 -0
- biucingcli/template_data/web-service/template/go.mod +36 -0
- biucingcli/template_data/web-service/template/go.sum +89 -0
- biucingcli/template_data/web-service/template/internal/config/config.go +84 -0
- biucingcli/template_data/web-service/template/internal/config/config_test.go +88 -0
- biucingcli/template_data/web-service/template/internal/handler/health.go +25 -0
- biucingcli/template_data/web-service/template/internal/handler/ping.go +25 -0
- biucingcli/template_data/web-service/template/internal/handler/user.go +40 -0
- biucingcli/template_data/web-service/template/internal/model/health.go +6 -0
- biucingcli/template_data/web-service/template/internal/model/ping.go +7 -0
- biucingcli/template_data/web-service/template/internal/model/user.go +7 -0
- biucingcli/template_data/web-service/template/internal/repository/.gitkeep +1 -0
- biucingcli/template_data/web-service/template/internal/repository/user.go +37 -0
- biucingcli/template_data/web-service/template/internal/router/router.go +28 -0
- biucingcli/template_data/web-service/template/internal/runtime/server.go +76 -0
- biucingcli/template_data/web-service/template/internal/runtime/server_test.go +139 -0
- biucingcli/template_data/web-service/template/internal/service/health.go +22 -0
- biucingcli/template_data/web-service/template/internal/service/ping.go +23 -0
- biucingcli/template_data/web-service/template/internal/service/user.go +27 -0
- biucingcli/template_data/web-service/template/scripts/bootstrap +23 -0
- biucingcli/template_data/web-service/template/scripts/doctor +83 -0
- biucingcli/template_data/web-service/template/tests/server_test.go +160 -0
- biucingcli/template_data/web-service/template.json +88 -0
- biucingcli/template_data/worker/template/.dockerignore +3 -0
- biucingcli/template_data/worker/template/.gitignore +2 -0
- biucingcli/template_data/worker/template/.mise.toml +2 -0
- biucingcli/template_data/worker/template/Brewfile +1 -0
- biucingcli/template_data/worker/template/Dockerfile +19 -0
- biucingcli/template_data/worker/template/Dockerfile.dev +9 -0
- biucingcli/template_data/worker/template/Makefile +105 -0
- biucingcli/template_data/worker/template/README.md +164 -0
- biucingcli/template_data/worker/template/cmd/worker/main.go +41 -0
- biucingcli/template_data/worker/template/compose.dev.yaml +29 -0
- biucingcli/template_data/worker/template/configs/config.json +11 -0
- biucingcli/template_data/worker/template/go.mod +3 -0
- biucingcli/template_data/worker/template/go.sum +1 -0
- biucingcli/template_data/worker/template/internal/config/config.go +108 -0
- biucingcli/template_data/worker/template/internal/config/config_test.go +86 -0
- biucingcli/template_data/worker/template/internal/runtime/runner.go +199 -0
- biucingcli/template_data/worker/template/internal/runtime/runner_test.go +215 -0
- biucingcli/template_data/worker/template/internal/task/heartbeat.go +19 -0
- biucingcli/template_data/worker/template/scripts/bootstrap +6 -0
- biucingcli/template_data/worker/template/scripts/doctor +41 -0
- biucingcli/template_data/worker/template/tests/worker_test.go +44 -0
- biucingcli/template_data/worker/template.json +100 -0
- biucingcli/templates.py +902 -0
- biucingcli-0.9.1.dist-info/METADATA +204 -0
- biucingcli-0.9.1.dist-info/RECORD +269 -0
- biucingcli-0.9.1.dist-info/WHEEL +5 -0
- biucingcli-0.9.1.dist-info/entry_points.txt +2 -0
- biucingcli-0.9.1.dist-info/top_level.txt +1 -0
biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Components.kt
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.designsystem
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
+
import androidx.compose.foundation.layout.Column
|
|
5
|
+
import androidx.compose.foundation.layout.Row
|
|
6
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
7
|
+
import androidx.compose.foundation.layout.padding
|
|
8
|
+
import androidx.compose.material3.Card
|
|
9
|
+
import androidx.compose.material3.CardDefaults
|
|
10
|
+
import androidx.compose.material3.MaterialTheme
|
|
11
|
+
import androidx.compose.material3.Surface
|
|
12
|
+
import androidx.compose.material3.Text
|
|
13
|
+
import androidx.compose.runtime.Composable
|
|
14
|
+
import androidx.compose.ui.Modifier
|
|
15
|
+
import androidx.compose.ui.graphics.Color
|
|
16
|
+
|
|
17
|
+
@Composable
|
|
18
|
+
@Suppress("ktlint:standard:function-naming")
|
|
19
|
+
fun AppSectionCard(
|
|
20
|
+
title: String,
|
|
21
|
+
eyebrow: String? = null,
|
|
22
|
+
modifier: Modifier = Modifier,
|
|
23
|
+
content: @Composable () -> Unit,
|
|
24
|
+
) {
|
|
25
|
+
Card(
|
|
26
|
+
modifier = modifier.fillMaxWidth(),
|
|
27
|
+
colors = CardDefaults.cardColors(
|
|
28
|
+
containerColor = MaterialTheme.colorScheme.surface,
|
|
29
|
+
),
|
|
30
|
+
) {
|
|
31
|
+
Column(
|
|
32
|
+
modifier = Modifier.padding(BiucingSpacing.large),
|
|
33
|
+
verticalArrangement = Arrangement.spacedBy(BiucingSpacing.medium),
|
|
34
|
+
) {
|
|
35
|
+
Column(verticalArrangement = Arrangement.spacedBy(BiucingSpacing.xSmall)) {
|
|
36
|
+
eyebrow?.let {
|
|
37
|
+
Text(
|
|
38
|
+
text = it,
|
|
39
|
+
style = MaterialTheme.typography.labelMedium,
|
|
40
|
+
color = MaterialTheme.colorScheme.primary,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
Text(
|
|
44
|
+
text = title,
|
|
45
|
+
style = MaterialTheme.typography.titleLarge,
|
|
46
|
+
color = MaterialTheme.colorScheme.onSurface,
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
content()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Composable
|
|
55
|
+
@Suppress("ktlint:standard:function-naming")
|
|
56
|
+
fun StatusBadge(
|
|
57
|
+
text: String,
|
|
58
|
+
containerColor: Color = MaterialTheme.colorScheme.secondaryContainer,
|
|
59
|
+
contentColor: Color = MaterialTheme.colorScheme.onSecondaryContainer,
|
|
60
|
+
modifier: Modifier = Modifier,
|
|
61
|
+
) {
|
|
62
|
+
Surface(
|
|
63
|
+
modifier = modifier,
|
|
64
|
+
color = containerColor,
|
|
65
|
+
contentColor = contentColor,
|
|
66
|
+
shape = MaterialTheme.shapes.small,
|
|
67
|
+
) {
|
|
68
|
+
Row(modifier = Modifier.padding(horizontal = BiucingSpacing.small, vertical = BiucingSpacing.xSmall)) {
|
|
69
|
+
Text(
|
|
70
|
+
text = text,
|
|
71
|
+
style = MaterialTheme.typography.labelLarge,
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.designsystem
|
|
2
|
+
|
|
3
|
+
import androidx.compose.ui.graphics.Color
|
|
4
|
+
import androidx.compose.ui.unit.dp
|
|
5
|
+
|
|
6
|
+
object BiucingColors {
|
|
7
|
+
val Brand = Color(0xFF2151F5)
|
|
8
|
+
val BrandMuted = Color(0xFFDCE4FF)
|
|
9
|
+
val Accent = Color(0xFF0F9D7A)
|
|
10
|
+
val AccentMuted = Color(0xFFD7F6EC)
|
|
11
|
+
val SurfaceWarm = Color(0xFFF7F5EF)
|
|
12
|
+
val SurfaceCool = Color(0xFFF3F6FF)
|
|
13
|
+
val Ink = Color(0xFF172033)
|
|
14
|
+
val Outline = Color(0xFFD0D7E8)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
object BiucingSpacing {
|
|
18
|
+
val xSmall = 4.dp
|
|
19
|
+
val small = 8.dp
|
|
20
|
+
val medium = 16.dp
|
|
21
|
+
val large = 24.dp
|
|
22
|
+
val xLarge = 32.dp
|
|
23
|
+
}
|
biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Theme.kt
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.designsystem
|
|
2
|
+
|
|
3
|
+
import androidx.compose.material3.Typography
|
|
4
|
+
import androidx.compose.material3.MaterialTheme
|
|
5
|
+
import androidx.compose.material3.darkColorScheme
|
|
6
|
+
import androidx.compose.material3.lightColorScheme
|
|
7
|
+
import androidx.compose.runtime.Composable
|
|
8
|
+
import androidx.compose.ui.text.TextStyle
|
|
9
|
+
import androidx.compose.ui.text.font.FontWeight
|
|
10
|
+
import androidx.compose.ui.unit.sp
|
|
11
|
+
|
|
12
|
+
private val LightColors = lightColorScheme(
|
|
13
|
+
primary = BiucingColors.Brand,
|
|
14
|
+
onPrimary = androidx.compose.ui.graphics.Color.White,
|
|
15
|
+
secondary = BiucingColors.Accent,
|
|
16
|
+
onSecondary = androidx.compose.ui.graphics.Color.White,
|
|
17
|
+
primaryContainer = BiucingColors.BrandMuted,
|
|
18
|
+
secondaryContainer = BiucingColors.AccentMuted,
|
|
19
|
+
background = BiucingColors.SurfaceWarm,
|
|
20
|
+
surface = androidx.compose.ui.graphics.Color.White,
|
|
21
|
+
surfaceVariant = BiucingColors.SurfaceCool,
|
|
22
|
+
onBackground = BiucingColors.Ink,
|
|
23
|
+
onSurface = BiucingColors.Ink,
|
|
24
|
+
outline = BiucingColors.Outline,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
private val DarkColors = darkColorScheme(
|
|
28
|
+
primary = ColorPaletteDark.Brand,
|
|
29
|
+
onPrimary = ColorPaletteDark.OnBrand,
|
|
30
|
+
secondary = ColorPaletteDark.Accent,
|
|
31
|
+
onSecondary = ColorPaletteDark.OnAccent,
|
|
32
|
+
primaryContainer = ColorPaletteDark.BrandContainer,
|
|
33
|
+
secondaryContainer = ColorPaletteDark.AccentContainer,
|
|
34
|
+
background = ColorPaletteDark.Background,
|
|
35
|
+
surface = ColorPaletteDark.Surface,
|
|
36
|
+
surfaceVariant = ColorPaletteDark.SurfaceVariant,
|
|
37
|
+
onBackground = ColorPaletteDark.OnBackground,
|
|
38
|
+
onSurface = ColorPaletteDark.OnSurface,
|
|
39
|
+
outline = ColorPaletteDark.Outline,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
private val BiucingTypography = Typography(
|
|
43
|
+
headlineLarge = TextStyle(
|
|
44
|
+
fontSize = 30.sp,
|
|
45
|
+
lineHeight = 36.sp,
|
|
46
|
+
fontWeight = FontWeight.Bold,
|
|
47
|
+
),
|
|
48
|
+
headlineMedium = TextStyle(
|
|
49
|
+
fontSize = 24.sp,
|
|
50
|
+
lineHeight = 30.sp,
|
|
51
|
+
fontWeight = FontWeight.SemiBold,
|
|
52
|
+
),
|
|
53
|
+
titleLarge = TextStyle(
|
|
54
|
+
fontSize = 20.sp,
|
|
55
|
+
lineHeight = 26.sp,
|
|
56
|
+
fontWeight = FontWeight.SemiBold,
|
|
57
|
+
),
|
|
58
|
+
titleMedium = TextStyle(
|
|
59
|
+
fontSize = 16.sp,
|
|
60
|
+
lineHeight = 22.sp,
|
|
61
|
+
fontWeight = FontWeight.Medium,
|
|
62
|
+
),
|
|
63
|
+
bodyLarge = TextStyle(
|
|
64
|
+
fontSize = 16.sp,
|
|
65
|
+
lineHeight = 24.sp,
|
|
66
|
+
),
|
|
67
|
+
bodyMedium = TextStyle(
|
|
68
|
+
fontSize = 14.sp,
|
|
69
|
+
lineHeight = 20.sp,
|
|
70
|
+
),
|
|
71
|
+
labelLarge = TextStyle(
|
|
72
|
+
fontSize = 13.sp,
|
|
73
|
+
lineHeight = 18.sp,
|
|
74
|
+
fontWeight = FontWeight.SemiBold,
|
|
75
|
+
),
|
|
76
|
+
labelMedium = TextStyle(
|
|
77
|
+
fontSize = 12.sp,
|
|
78
|
+
lineHeight = 16.sp,
|
|
79
|
+
fontWeight = FontWeight.Medium,
|
|
80
|
+
letterSpacing = 0.4.sp,
|
|
81
|
+
),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
private object ColorPaletteDark {
|
|
85
|
+
val Brand = androidx.compose.ui.graphics.Color(0xFFB8C6FF)
|
|
86
|
+
val OnBrand = androidx.compose.ui.graphics.Color(0xFF0F1B4D)
|
|
87
|
+
val Accent = androidx.compose.ui.graphics.Color(0xFF7EE2C3)
|
|
88
|
+
val OnAccent = androidx.compose.ui.graphics.Color(0xFF00382C)
|
|
89
|
+
val BrandContainer = androidx.compose.ui.graphics.Color(0xFF1A2D77)
|
|
90
|
+
val AccentContainer = androidx.compose.ui.graphics.Color(0xFF0F4F40)
|
|
91
|
+
val Background = androidx.compose.ui.graphics.Color(0xFF11131A)
|
|
92
|
+
val Surface = androidx.compose.ui.graphics.Color(0xFF171A22)
|
|
93
|
+
val SurfaceVariant = androidx.compose.ui.graphics.Color(0xFF1F2533)
|
|
94
|
+
val OnBackground = androidx.compose.ui.graphics.Color(0xFFE7EAF4)
|
|
95
|
+
val OnSurface = androidx.compose.ui.graphics.Color(0xFFE7EAF4)
|
|
96
|
+
val Outline = androidx.compose.ui.graphics.Color(0xFF56607A)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@Composable
|
|
100
|
+
@Suppress("ktlint:standard:function-naming")
|
|
101
|
+
fun BiucingTheme(
|
|
102
|
+
darkTheme: Boolean = false,
|
|
103
|
+
content: @Composable () -> Unit,
|
|
104
|
+
) {
|
|
105
|
+
MaterialTheme(
|
|
106
|
+
colorScheme = if (darkTheme) DarkColors else LightColors,
|
|
107
|
+
typography = BiucingTypography,
|
|
108
|
+
content = content,
|
|
109
|
+
)
|
|
110
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
alias(libs.plugins.android.library)
|
|
3
|
+
alias(libs.plugins.kotlin.android)
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
android {
|
|
7
|
+
namespace = "{{PACKAGE_NAME}}.core.model"
|
|
8
|
+
compileSdk = {{COMPILE_SDK}}
|
|
9
|
+
|
|
10
|
+
defaultConfig {
|
|
11
|
+
minSdk = {{MIN_SDK}}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
compileOptions {
|
|
15
|
+
sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
16
|
+
targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
kotlinOptions {
|
|
20
|
+
jvmTarget = "{{JAVA_VERSION}}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
dependencies {
|
|
25
|
+
testImplementation(libs.junit4)
|
|
26
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.model
|
|
2
|
+
|
|
3
|
+
import org.junit.Assert.assertEquals
|
|
4
|
+
import org.junit.Test
|
|
5
|
+
|
|
6
|
+
class GreetingTest {
|
|
7
|
+
@Test
|
|
8
|
+
fun greetingHoldsData() {
|
|
9
|
+
val greeting = Greeting(
|
|
10
|
+
title = "{{DISPLAY_NAME}}",
|
|
11
|
+
subtitle = "Generated by BiucingCLI",
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
assertEquals("{{DISPLAY_NAME}}", greeting.title)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
alias(libs.plugins.android.library)
|
|
3
|
+
alias(libs.plugins.kotlin.android)
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
android {
|
|
7
|
+
namespace = "{{PACKAGE_NAME}}.core.network"
|
|
8
|
+
compileSdk = {{COMPILE_SDK}}
|
|
9
|
+
|
|
10
|
+
defaultConfig {
|
|
11
|
+
minSdk = {{MIN_SDK}}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
compileOptions {
|
|
15
|
+
sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
16
|
+
targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
kotlinOptions {
|
|
20
|
+
jvmTarget = "{{JAVA_VERSION}}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
dependencies {
|
|
25
|
+
testImplementation(libs.junit4)
|
|
26
|
+
}
|
biucingcli/template_data/android/template/core/network/src/main/java/network/AppEnvironment.kt
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.network
|
|
2
|
+
|
|
3
|
+
data class AppEnvironment(
|
|
4
|
+
val apiBaseUrl: String,
|
|
5
|
+
val releaseChannel: String,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
interface AppEnvironmentProvider {
|
|
9
|
+
fun environment(): AppEnvironment
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
class DefaultAppEnvironmentProvider : AppEnvironmentProvider {
|
|
13
|
+
override fun environment(): AppEnvironment = AppEnvironment(
|
|
14
|
+
apiBaseUrl = "https://api.example.internal",
|
|
15
|
+
releaseChannel = "beta",
|
|
16
|
+
)
|
|
17
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
alias(libs.plugins.android.library)
|
|
3
|
+
alias(libs.plugins.kotlin.android)
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
android {
|
|
7
|
+
namespace = "{{PACKAGE_NAME}}.core.testing"
|
|
8
|
+
compileSdk = {{COMPILE_SDK}}
|
|
9
|
+
|
|
10
|
+
defaultConfig {
|
|
11
|
+
minSdk = {{MIN_SDK}}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
compileOptions {
|
|
15
|
+
sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
16
|
+
targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
kotlinOptions {
|
|
20
|
+
jvmTarget = "{{JAVA_VERSION}}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
dependencies {
|
|
25
|
+
api(project(":core:network"))
|
|
26
|
+
testImplementation(libs.junit4)
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.core.testing
|
|
2
|
+
|
|
3
|
+
import {{PACKAGE_NAME}}.core.network.AppEnvironment
|
|
4
|
+
import {{PACKAGE_NAME}}.core.network.AppEnvironmentProvider
|
|
5
|
+
|
|
6
|
+
class FakeAppEnvironmentProvider(
|
|
7
|
+
private val environment: AppEnvironment = AppEnvironment(
|
|
8
|
+
apiBaseUrl = "https://staging.example.internal",
|
|
9
|
+
releaseChannel = "beta",
|
|
10
|
+
),
|
|
11
|
+
) : AppEnvironmentProvider {
|
|
12
|
+
override fun environment(): AppEnvironment = environment
|
|
13
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Google Play Release Delivery
|
|
2
|
+
|
|
3
|
+
The generated starter uses fastlane `supply` to validate release inputs, build a signed Android App Bundle (AAB), upload internal test builds, and create a draft production release in Google Play Console.
|
|
4
|
+
|
|
5
|
+
## One-Time Setup
|
|
6
|
+
|
|
7
|
+
1. Create `{{APPLICATION_ID}}` in Google Play Console and finish the required app-registration steps.
|
|
8
|
+
2. Enable the Google Play Developer API for the Google Cloud project that owns the service account.
|
|
9
|
+
3. Create a service-account JSON key, invite that account in Play Console with the least privileges needed for the intended tracks, and save it locally as `credentials/play-store-service-account.json`.
|
|
10
|
+
4. Configure an upload keystore through `local.properties` or the `BIUCING_RELEASE_*` CI variables. For Play App Signing, this is the upload key, not the app-signing key managed by Google.
|
|
11
|
+
5. Copy `fastlane/.env.example` to `fastlane/.env` and replace its placeholder values.
|
|
12
|
+
6. Verify the credential independently before the first delivery:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
fastlane run validate_play_store_json_key json_key:credentials/play-store-service-account.json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Google Play requires an app record to exist before API-driven delivery. Complete the first app-registration flow in Play Console before relying on a CI upload.
|
|
19
|
+
|
|
20
|
+
## Commands
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
make release-doctor
|
|
24
|
+
make verify-supply-chain
|
|
25
|
+
make archive
|
|
26
|
+
make artifact-info
|
|
27
|
+
make verify-release-artifact
|
|
28
|
+
make beta
|
|
29
|
+
make release
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `make release-doctor` verifies the service-account JSON, the four release-signing inputs, upload keystore, private key alias, and any enabled metadata directory.
|
|
33
|
+
- `make verify-supply-chain` validates the pinned Gradle distribution and wrapper JAR, exact dependency versions, and Gradle dependency checksum metadata.
|
|
34
|
+
- `make archive` runs lint and unit tests, validates the signing key, builds a signed `app-release.aab`, then verifies its cryptographic signature and signer certificate without uploading it.
|
|
35
|
+
- `make verify-release-artifact` checks AAB structure and compares the embedded signer SHA-256 fingerprint with the configured upload key. `make artifact-info` performs the same gate before printing the handoff checksum.
|
|
36
|
+
- `make beta` runs the archive lane and uploads the AAB to the `internal` track by default.
|
|
37
|
+
- `make release` runs the archive lane and uploads the AAB to the `production` track as a `draft` by default.
|
|
38
|
+
|
|
39
|
+
Set `PLAY_STORE_BETA_TRACK`, `PLAY_STORE_BETA_RELEASE_STATUS`, `PLAY_STORE_RELEASE_TRACK`, or `PLAY_STORE_RELEASE_STATUS` only when the target promotion and rollout have been reviewed. Valid release statuses include `draft`, `inProgress`, `halted`, and `completed`.
|
|
40
|
+
|
|
41
|
+
## Store Listing Assets
|
|
42
|
+
|
|
43
|
+
fastlane can upload metadata, changelogs, images, and screenshots from `fastlane/metadata/android`. For an existing app, initialize that tree from Play Console:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
fastlane supply init
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
After reviewing the downloaded files, set the relevant `PLAY_STORE_SKIP_*` value to `false`. Keep the defaults while the listing is managed directly in Play Console.
|
|
50
|
+
|
|
51
|
+
Data safety declarations, content rating, target audience, app access instructions, privacy policy, managed publishing choices, and Play Console review answers remain product and compliance decisions. Complete and review them in Play Console before changing a production draft to a live release.
|
|
52
|
+
|
|
53
|
+
## Local Secrets
|
|
54
|
+
|
|
55
|
+
Keep these out of version control and store them in the CI secret manager:
|
|
56
|
+
|
|
57
|
+
- `fastlane/.env`
|
|
58
|
+
- `credentials/play-store-service-account.json`
|
|
59
|
+
- the upload keystore under `signing/` and its passwords
|
|
60
|
+
- `local.properties` when it contains signing values
|
|
61
|
+
|
|
62
|
+
For direct Gradle use, keep signing values in `~/.gradle/gradle.properties`; never add them to the tracked project-level `gradle.properties`. Keep `.env.example` and signing-property examples as placeholders only.
|
|
63
|
+
|
|
64
|
+
Ignore rules only protect untracked files and do not override `git add -f`. If real credentials have already been committed, revoke or rotate them first, remove them from the index, and assess whether repository history must be rewritten.
|
|
65
|
+
|
|
66
|
+
## Dependency Verification Maintenance
|
|
67
|
+
|
|
68
|
+
The committed wrapper properties include the Gradle distribution SHA-256, while `gradle-wrapper.jar.sha256` pins the official wrapper executable. Gradle automatically enforces the artifact checksums in `gradle/verification-metadata.xml`. When intentionally upgrading a plugin or dependency, generate new SHA-256 metadata in a clean review branch, inspect the repository coordinates and checksum diff, and only then commit it. A checksum should never be copied from a failed build or an untrusted mirror.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# This example must contain placeholders only. Never put real credentials here.
|
|
2
|
+
# Copy these keys into local.properties for local-only signing setup,
|
|
3
|
+
# or export the matching BIUCING_RELEASE_* environment variables in CI.
|
|
4
|
+
#
|
|
5
|
+
# Example:
|
|
6
|
+
# biucing.release.storeFile=signing/release.keystore
|
|
7
|
+
# biucing.release.storePassword=change-me
|
|
8
|
+
# biucing.release.keyAlias=release
|
|
9
|
+
# biucing.release.keyPassword=change-me
|
|
10
|
+
#
|
|
11
|
+
# Environment variable equivalents:
|
|
12
|
+
# BIUCING_RELEASE_STORE_FILE
|
|
13
|
+
# BIUCING_RELEASE_STORE_PASSWORD
|
|
14
|
+
# BIUCING_RELEASE_KEY_ALIAS
|
|
15
|
+
# BIUCING_RELEASE_KEY_PASSWORD
|
|
16
|
+
|
|
17
|
+
biucing.release.storeFile=signing/release.keystore
|
|
18
|
+
biucing.release.storePassword=change-me
|
|
19
|
+
biucing.release.keyAlias=release
|
|
20
|
+
biucing.release.keyPassword=change-me
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Google Play Console service-account JSON. Store it in the ignored credentials directory.
|
|
2
|
+
GOOGLE_PLAY_SERVICE_ACCOUNT_JSON=credentials/play-store-service-account.json
|
|
3
|
+
|
|
4
|
+
# Release signing is read from these values or local.properties.
|
|
5
|
+
BIUCING_RELEASE_STORE_FILE=signing/release.keystore
|
|
6
|
+
BIUCING_RELEASE_STORE_PASSWORD=change-me
|
|
7
|
+
BIUCING_RELEASE_KEY_ALIAS=release
|
|
8
|
+
BIUCING_RELEASE_KEY_PASSWORD=change-me
|
|
9
|
+
|
|
10
|
+
# Internal testing is published immediately to the selected test track.
|
|
11
|
+
PLAY_STORE_BETA_TRACK=internal
|
|
12
|
+
PLAY_STORE_BETA_RELEASE_STATUS=completed
|
|
13
|
+
|
|
14
|
+
# Production delivery is intentionally a draft until Play Console review is complete.
|
|
15
|
+
PLAY_STORE_RELEASE_TRACK=production
|
|
16
|
+
PLAY_STORE_RELEASE_STATUS=draft
|
|
17
|
+
|
|
18
|
+
# Set any of these to false after fastlane/metadata/android is populated.
|
|
19
|
+
PLAY_STORE_SKIP_METADATA=true
|
|
20
|
+
PLAY_STORE_SKIP_CHANGELOGS=true
|
|
21
|
+
PLAY_STORE_SKIP_IMAGES=true
|
|
22
|
+
PLAY_STORE_SKIP_SCREENSHOTS=true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
package_name("{{APPLICATION_ID}}")
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
default_platform(:android)
|
|
2
|
+
|
|
3
|
+
APP_IDENTIFIER = "{{APPLICATION_ID}}"
|
|
4
|
+
PROJECT_ROOT = File.expand_path("..", __dir__)
|
|
5
|
+
RELEASE_AAB_PATH = File.join(PROJECT_ROOT, "app/build/outputs/bundle/release/app-release.aab")
|
|
6
|
+
METADATA_PATH = File.join(PROJECT_ROOT, "fastlane/metadata/android")
|
|
7
|
+
|
|
8
|
+
def env_true?(name, default: false)
|
|
9
|
+
value = ENV[name]
|
|
10
|
+
return default if value.nil? || value.empty?
|
|
11
|
+
|
|
12
|
+
%w[1 true yes y].include?(value.downcase)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def require_env_file(name)
|
|
16
|
+
value = ENV[name]
|
|
17
|
+
UI.user_error!("Set #{name}. See fastlane/.env.example.") if value.to_s.empty?
|
|
18
|
+
path = File.expand_path(value, PROJECT_ROOT)
|
|
19
|
+
UI.user_error!("#{name} does not exist: #{path}") unless File.file?(path)
|
|
20
|
+
path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def signing_value(property_name, environment_name)
|
|
24
|
+
ENV[environment_name] || local_properties[property_name]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def local_properties
|
|
28
|
+
return @local_properties if defined?(@local_properties)
|
|
29
|
+
|
|
30
|
+
path = File.join(PROJECT_ROOT, "local.properties")
|
|
31
|
+
@local_properties = {}
|
|
32
|
+
return @local_properties unless File.file?(path)
|
|
33
|
+
|
|
34
|
+
File.foreach(path) do |line|
|
|
35
|
+
next if line.start_with?("#") || !line.include?("=")
|
|
36
|
+
|
|
37
|
+
key, value = line.split("=", 2)
|
|
38
|
+
@local_properties[key.strip] = value.strip
|
|
39
|
+
end
|
|
40
|
+
@local_properties
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def release_signing_ready?
|
|
44
|
+
store_file = signing_value("biucing.release.storeFile", "BIUCING_RELEASE_STORE_FILE")
|
|
45
|
+
values = [
|
|
46
|
+
store_file,
|
|
47
|
+
signing_value("biucing.release.storePassword", "BIUCING_RELEASE_STORE_PASSWORD"),
|
|
48
|
+
signing_value("biucing.release.keyAlias", "BIUCING_RELEASE_KEY_ALIAS"),
|
|
49
|
+
signing_value("biucing.release.keyPassword", "BIUCING_RELEASE_KEY_PASSWORD")
|
|
50
|
+
]
|
|
51
|
+
return false unless values.all? { |value| !value.to_s.empty? }
|
|
52
|
+
|
|
53
|
+
File.file?(File.expand_path(store_file, PROJECT_ROOT))
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def play_service_account_json_path
|
|
57
|
+
require_env_file("GOOGLE_PLAY_SERVICE_ACCOUNT_JSON")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def metadata_upload_requested?
|
|
61
|
+
!env_true?("PLAY_STORE_SKIP_METADATA", default: true) ||
|
|
62
|
+
!env_true?("PLAY_STORE_SKIP_CHANGELOGS", default: true) ||
|
|
63
|
+
!env_true?("PLAY_STORE_SKIP_IMAGES", default: true) ||
|
|
64
|
+
!env_true?("PLAY_STORE_SKIP_SCREENSHOTS", default: true)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def upload_to_google_play(track:, release_status:)
|
|
68
|
+
options = {
|
|
69
|
+
package_name: APP_IDENTIFIER,
|
|
70
|
+
aab: RELEASE_AAB_PATH,
|
|
71
|
+
json_key: play_service_account_json_path,
|
|
72
|
+
track: track,
|
|
73
|
+
release_status: release_status,
|
|
74
|
+
skip_upload_metadata: env_true?("PLAY_STORE_SKIP_METADATA", default: true),
|
|
75
|
+
skip_upload_changelogs: env_true?("PLAY_STORE_SKIP_CHANGELOGS", default: true),
|
|
76
|
+
skip_upload_images: env_true?("PLAY_STORE_SKIP_IMAGES", default: true),
|
|
77
|
+
skip_upload_screenshots: env_true?("PLAY_STORE_SKIP_SCREENSHOTS", default: true)
|
|
78
|
+
}
|
|
79
|
+
options[:metadata_path] = METADATA_PATH if Dir.exist?(METADATA_PATH)
|
|
80
|
+
upload_to_play_store(**options)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
platform :android do
|
|
84
|
+
desc "Validate Google Play credentials, signing inputs, and metadata configuration"
|
|
85
|
+
lane :release_doctor do
|
|
86
|
+
play_service_account_json_path
|
|
87
|
+
UI.user_error!("Configure all BIUCING_RELEASE_* values or local.properties signing values.") unless release_signing_ready?
|
|
88
|
+
UI.user_error!("Create #{METADATA_PATH} before enabling Play Store metadata uploads.") if metadata_upload_requested? && !Dir.exist?(METADATA_PATH)
|
|
89
|
+
sh("make verify-release-signing")
|
|
90
|
+
UI.success("Google Play credentials, release signing, and metadata configuration are present.")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
desc "Build a signed Android App Bundle without uploading"
|
|
94
|
+
lane :archive do
|
|
95
|
+
release_doctor
|
|
96
|
+
sh("make lint")
|
|
97
|
+
sh("make test")
|
|
98
|
+
sh("make bundle-release")
|
|
99
|
+
UI.user_error!("No signed Android App Bundle was produced at #{RELEASE_AAB_PATH}.") unless File.file?(RELEASE_AAB_PATH)
|
|
100
|
+
sh("make verify-release-artifact")
|
|
101
|
+
sh("make artifact-info")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
desc "Build, sign, and upload an internal Google Play test build"
|
|
105
|
+
lane :beta do
|
|
106
|
+
archive
|
|
107
|
+
upload_to_google_play(
|
|
108
|
+
track: ENV.fetch("PLAY_STORE_BETA_TRACK", "internal"),
|
|
109
|
+
release_status: ENV.fetch("PLAY_STORE_BETA_RELEASE_STATUS", "completed")
|
|
110
|
+
)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
desc "Build, sign, and upload a draft Google Play production release"
|
|
114
|
+
lane :release do
|
|
115
|
+
archive
|
|
116
|
+
upload_to_google_play(
|
|
117
|
+
track: ENV.fetch("PLAY_STORE_RELEASE_TRACK", "production"),
|
|
118
|
+
release_status: ENV.fetch("PLAY_STORE_RELEASE_STATUS", "draft")
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
plugins {
|
|
2
|
+
alias(libs.plugins.android.library)
|
|
3
|
+
alias(libs.plugins.kotlin.android)
|
|
4
|
+
alias(libs.plugins.kotlin.compose)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
android {
|
|
8
|
+
namespace = "{{PACKAGE_NAME}}.feature.home"
|
|
9
|
+
compileSdk = {{COMPILE_SDK}}
|
|
10
|
+
|
|
11
|
+
defaultConfig {
|
|
12
|
+
minSdk = {{MIN_SDK}}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
compileOptions {
|
|
16
|
+
sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
17
|
+
targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
kotlinOptions {
|
|
21
|
+
jvmTarget = "{{JAVA_VERSION}}"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
buildFeatures {
|
|
25
|
+
compose = true
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
dependencies {
|
|
30
|
+
implementation(project(":core:designsystem"))
|
|
31
|
+
implementation(project(":core:model"))
|
|
32
|
+
|
|
33
|
+
implementation(platform(libs.androidx.compose.bom))
|
|
34
|
+
implementation(libs.androidx.compose.material3)
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package {{PACKAGE_NAME}}.feature.home
|
|
2
|
+
|
|
3
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
4
|
+
import androidx.compose.foundation.layout.Column
|
|
5
|
+
import androidx.compose.material3.MaterialTheme
|
|
6
|
+
import androidx.compose.material3.Text
|
|
7
|
+
import androidx.compose.runtime.Composable
|
|
8
|
+
import {{PACKAGE_NAME}}.core.designsystem.AppSectionCard
|
|
9
|
+
import {{PACKAGE_NAME}}.core.designsystem.BiucingSpacing
|
|
10
|
+
import {{PACKAGE_NAME}}.core.designsystem.StatusBadge
|
|
11
|
+
import {{PACKAGE_NAME}}.core.model.Greeting
|
|
12
|
+
|
|
13
|
+
@Composable
|
|
14
|
+
@Suppress("ktlint:standard:function-naming")
|
|
15
|
+
fun HomeRoute() {
|
|
16
|
+
val greeting = Greeting(
|
|
17
|
+
title = "{{DISPLAY_NAME}}",
|
|
18
|
+
subtitle = "Generated by BiucingCLI",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
AppSectionCard(
|
|
22
|
+
title = greeting.title,
|
|
23
|
+
eyebrow = "Starter Overview",
|
|
24
|
+
) {
|
|
25
|
+
Column(verticalArrangement = Arrangement.spacedBy(BiucingSpacing.small)) {
|
|
26
|
+
StatusBadge(text = "Compose baseline ready")
|
|
27
|
+
Text(
|
|
28
|
+
text = greeting.subtitle,
|
|
29
|
+
style = MaterialTheme.typography.bodyLarge,
|
|
30
|
+
)
|
|
31
|
+
Text(
|
|
32
|
+
text = "Use the generated design system tokens and starter components as the baseline for new features.",
|
|
33
|
+
style = MaterialTheme.typography.bodyMedium,
|
|
34
|
+
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|