Thank you for your interest in contributing to Ark! This guide will help you get started.
- Java 17+
- Maven 3.9+
- Git
git clone https://github.com/juandiii/ark.git
cd ark
mvn clean installmvn test # All modules
mvn test -pl ark-core # Single module
mvn verify # Tests + coverage check- Create a branch from
main - Make your changes
- Push and open a PR to
main - CI runs tests (Java 17, 21, 25) + commit lint
- Add the appropriate label to the PR
- PR is reviewed and merged
All commits must follow Conventional Commits:
<type>(<scope>): <description>
| Type | Description |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
chore |
Maintenance (deps, config) |
refactor |
Code change that neither fixes a bug nor adds a feature |
test |
Adding or updating tests |
ci |
CI/CD changes |
perf |
Performance improvement |
style |
Code style (formatting, whitespace) |
build |
Build system changes |
Use ! after the type or add BREAKING CHANGE in the commit body:
feat!: redesign transport API
feat: add Mutiny execution model
feat(transport): add Apache HttpClient 5 support
fix: resolve null pointer in header validation
fix(proxy): handle unresolved path variables
docs: update README with Quarkus integration
chore: bump Jackson to 3.0
refactor: extract AbstractArkBuilder to top-level
test: add coverage for ArkJdkHttpTransport
ci: add commitlint workflow
perf: optimize URI building
A CI check validates all commits in your PR. If any commit does not follow the convention, the PR cannot be merged. Fix with:
git commit --amend -m "fix: correct commit message"
git push --force-with-leaseLabels are auto-detected from your commit messages. You can also set them manually.
These determine the version bump when a release is triggered:
| Label | Version Bump |
|---|---|
fix |
PATCH (1.0.0 → 1.0.1) |
perf |
PATCH (1.0.0 → 1.0.1) |
feat |
MINOR (1.0.0 → 1.1.0) |
breaking change |
MAJOR (1.0.0 → 2.0.0) |
These are informational and do not trigger a release:
docs, chore, refactor, test, ci, style, build
ark-core Core interfaces + fluent API
ark-async CompletableFuture execution model
ark-reactor Mono/Flux execution model
ark-mutiny Uni execution model
ark-vertx Vert.x Future execution model
ark-jackson Jackson serializer
ark-transport-jdk Java HttpClient transport
ark-transport-reactor Reactor Netty transport
ark-transport-vertx Vert.x WebClient transport
ark-transport-vertx-mutiny Vert.x Mutiny transport
ark-transport-apache Apache HttpClient 5 transport
ark-proxy-spring Declarative client from @HttpExchange
ark-spring-boot-starter Spring MVC auto-config
ark-spring-boot-starter-webflux Spring WebFlux auto-config
ark-bom Bill of Materials
- Interfaces over concrete types -
ClientRequest/ClientResponseare interfaces,Default*are implementations - CRTP for fluent chaining -
AbstractClientRequest<T>uses self-referencing generics - Template Method -
AbstractArkClient.createRequest()defined once, subclasses implement - Bridge pattern - transports wrap pre-configured HTTP clients, don't configure them
- No duplication - shared logic in
AbstractClientRequest,AbstractArkClient,AbstractArkBuilder - Error handling -
ApiExceptionfor HTTP errors,ArkExceptionfor transport/config errors, validation invalidateResponse() - Null safety - validate null keys in
header(), null types inTypeRef.of()
- Create module
ark-<model>with:<Model>Arkinterface<Model>ArkClient extends AbstractArkClient<Model>HttpTransportinterface<Model>ClientRequestinterface +Default<Model>ClientRequest extends AbstractClientRequest<Model>ClientResponseinterface +Default<Model>ClientResponse
- Add to parent
pom.xmlmodules - Add to
ark-bom - Add tests (minimum 70% coverage)
- Create module
ark-transport-<name>with:Ark<Name>Transport implements HttpTransport(and/orAsyncHttpTransport, etc.)- Constructor receives pre-configured client (bridge pattern)
- Add to parent
pom.xmlmodules - Add to
ark-bom - Add tests with real HTTP server (
com.sun.net.httpserver.HttpServer)
- JUnit 5 + Mockito
given_when_thennaming convention@Nestedclasses for grouping- JaCoCo coverage check: 70% instructions, 68% branches minimum
- Transport tests use real HTTP server, not mocks
- Mock tests demonstrate interface mockability (
ArkMockTest,AsyncArkMockTest)
Releases are triggered manually via GitHub Actions:
- PRs accumulate on
mainwith labels - Maintainer clicks Actions → Release → Run workflow
- Workflow reads PR labels → calculates version → deploys → tags → creates GitHub Release
Open an issue or start a discussion. We're happy to help!