Files
libnovel/justfile
Admin f51113a2f8
Some checks failed
Deploy / Deploy Production (push) Has been skipped
Deploy / Cleanup Preview (push) Has been skipped
Deploy / Deploy Preview (push) Failing after 0s
CI / Scraper / Test (pull_request) Successful in 11s
CI / UI / Build (pull_request) Failing after 14s
CI / Scraper / Lint (pull_request) Successful in 23s
CI / Scraper / Build (pull_request) Successful in 24s
iOS CI / Build (push) Has been cancelled
iOS CI / Test (push) Has been cancelled
iOS CI / Build (pull_request) Failing after 2s
iOS CI / Test (pull_request) Has been skipped
Add iOS app, SvelteKit JSON API endpoints, and Gitea CI workflow
- iOS SwiftUI app (ios/LibNovel/) targeting iOS 17+, generated via xcodegen
  - Full feature set: auth, home, library, book detail, chapter reader, browse, audio player, profile
  - Kingfisher for image loading, swift-markdown-ui for chapter rendering
  - Base URL: https://v2.libnovel.kalekber.cc
- SvelteKit JSON API routes (ui/src/routes/api/) for iOS consumption:
  auth/login, auth/register, auth/me, auth/logout, auth/change-password,
  home, library, book/[slug], chapter/[slug]/[n], search, ranking,
  progress/[slug], presign/audio (updated)
- Gitea Actions CI: .gitea/workflows/ios.yaml (build + test on macos-latest)
- justfile: ios-gen, ios-build, ios-test recipes
2026-03-07 18:17:51 +05:00

169 lines
6.0 KiB
Makefile

# justfile — libnovel-v2 task runner
# Install just: https://just.systems
scraper_dir := "scraper"
ui_dir := "ui"
ios_dir := "ios/LibNovel"
# ─── Build ────────────────────────────────────────────────────────────────────
# Build the scraper binary
build:
cd {{scraper_dir}} && go build -o bin/scraper ./cmd/scraper
# Build and verify all Go packages compile cleanly
build-all:
cd {{scraper_dir}} && go build ./...
# ─── Tests ────────────────────────────────────────────────────────────────────
# Run unit tests only (no integration services required)
test:
cd {{scraper_dir}} && go test ./...
# Run integration tests (requires MinIO, PocketBase, optional Browserless)
# Override env vars as needed, e.g.:
# just test-integration MINIO_ENDPOINT=localhost:9000
test-integration:
cd {{scraper_dir}} && go test -v -tags integration -timeout 600s ./...
# Run unit + integration tests
test-all: test test-integration
# Run a specific package's integration tests, e.g.:
# just test-pkg internal/storage
test-pkg pkg:
cd {{scraper_dir}} && go test -v -tags integration -timeout 600s ./{{pkg}}/...
# Run end-to-end tests against live services.
# All services must be running first (docker compose up -d or just e2e-up).
# Override env vars as needed, e.g.:
# just test-e2e SCRAPER_URL=http://localhost:8080 KOKORO_VOICE=af_bella
test-e2e \
browserless_url="http://localhost:3030" \
minio_endpoint="localhost:9000" \
pocketbase_url="http://localhost:8090" \
scraper_url="http://localhost:8080":
cd {{scraper_dir}} && \
BROWSERLESS_URL={{browserless_url}} \
MINIO_ENDPOINT={{minio_endpoint}} \
POCKETBASE_URL={{pocketbase_url}} \
SCRAPER_URL={{scraper_url}} \
go test -v -tags integration -timeout 900s ./internal/e2e/...
# Start all services required for e2e tests, then run them
e2e: up test-e2e
# ─── Code quality ─────────────────────────────────────────────────────────────
# Run go vet on all packages (including integration build tag)
lint:
cd {{scraper_dir}} && go vet ./...
cd {{scraper_dir}} && go vet -tags integration ./...
# ─── UI ───────────────────────────────────────────────────────────────────────
# Type-check the SvelteKit UI
ui-check:
cd {{ui_dir}} && npx svelte-check
# Start the SvelteKit dev server
ui-dev:
cd {{ui_dir}} && npm run dev
# Install UI dependencies
ui-install:
cd {{ui_dir}} && npm install
# Build the UI for production
ui-build:
cd {{ui_dir}} && npm run build
# ─── iOS ──────────────────────────────────────────────────────────────────────
# Regenerate LibNovel.xcodeproj from project.yml (run after structural changes)
ios-gen:
cd {{ios_dir}} && xcodegen generate --spec project.yml --project .
# Build the iOS app for the simulator (no signing required)
ios-build: ios-gen
cd {{ios_dir}} && xcodebuild \
-project LibNovel.xcodeproj \
-scheme LibNovel \
-configuration Debug \
-destination 'generic/platform=iOS Simulator' \
CODE_SIGNING_ALLOWED=NO
# Run unit tests on the simulator
ios-test: ios-gen
cd {{ios_dir}} && xcodebuild test \
-project LibNovel.xcodeproj \
-scheme LibNovel \
-configuration Debug \
-destination 'platform=iOS Simulator,name=iPhone 17' \
CODE_SIGNING_ALLOWED=NO
# ─── Docker Compose ───────────────────────────────────────────────────────────
# Start all services (browserless, kokoro, scraper, minio, pocketbase)
up:
docker compose up -d
# Stop all services
down:
docker compose down
# Tail logs for all services
logs:
docker compose logs -f
# Tail logs for a specific service, e.g.: just logs-service scraper
logs-service service:
docker compose logs -f {{service}}
# Rebuild and restart a specific service
restart service:
docker compose up -d --build {{service}}
# ─── Local dev: individual services ──────────────────────────────────────────
# Start only PocketBase (for local storage testing)
pb-up:
docker compose up -d pocketbase
# Start only MinIO (for local storage testing)
minio-up:
docker compose up -d minio
# Start only Browserless (for local scraping tests)
browserless-up:
docker compose up -d browserless
# Start storage backends only (MinIO + PocketBase)
storage-up:
docker compose up -d minio pocketbase
# ─── Convenience ─────────────────────────────────────────────────────────────
# Show status of all docker compose services
status:
docker compose ps
# Remove all stopped containers and unused images
prune:
docker compose down --remove-orphans
docker image prune -f
# One-shot scrape of the full catalogue (requires services to be running)
scrape-run: build
cd {{scraper_dir}} && ./bin/scraper run
# One-shot scrape of a single book URL, e.g.:
# just scrape-book https://novelfire.net/book/my-novel
scrape-book url: build
cd {{scraper_dir}} && ./bin/scraper run --url {{url}}
# Start the HTTP server
serve: build
cd {{scraper_dir}} && ./bin/scraper serve