Thank you for investing your time and effort in contributing to my project, I appreciate it a lot! 🤗 # General Guidelines - **Open an Issue**: If you want to contribute a bug fix or a new feature that isn't listed in the [issues](https://github.com/kpavlov/awesome-kotlin-maven-template/issues) yet, please open a new issue for it. We will prioritize it shortly. - **Follow Best Practices**: Adhere to [Google's Best Practices for Java Libraries](https://jlbp.dev/) and [Google Engineering Practices](https://google.github.io/eng-practices/). - **Java Compatibility**: Ensure the code is compatible with Java 17. - **Dependency Management**: Avoid adding new dependencies wherever possible (new dependencies with test scope are OK). - Adhere to [S.O.L.I.D. Principles](https://en.wikipedia.org/wiki/SOLID) principles in your code. - **Testing**: Write unit and/or integration tests for your code. This is critical: no tests, no review! Tests should be designed in a way to run in parallel. - **Run All Tests**: Make sure you run all tests on all modules with `make build`. - **Maintain Backward Compatibility**: Avoid making breaking changes. Always keep backward compatibility in mind. For example, instead of removing fields/methods/etc, mark them `@Deprecated` and make sure they still work as before. - **Naming Conventions**: Follow existing naming conventions. - **Documentation**: Add KDoc where necessary, but the code should be self-documenting. - **Code Style**: Follow the official Kotlin code style. Use `make format` for automatic code formatting. - **Discuss Large Features**: Large features should be discussed with maintainers before implementation. - **Thread Safety**: Ensure that the code you write is thread-safe. ## Using the Makefile The [`Makefile`](Makefile) includes several helpful targets to make your development process more efficient: - **`build`**: - Runs all tests, verifies the project, and generates site documentation. - **`apidocs`**: - Generates API documentation using Dokka and places it in `target/docs/api`. - **`lint`**: - Prepares the environment and checks code style using `ktlint` and Maven `spotless:check`. - **`format`**: - Formats the code using `ktlint --format` and applies `spotless` and OpenRewrite best practices. - **`prepare`**: - Installs `ktlint` via Homebrew if not already installed. - **`all`**: - Executes `format`, `lint`, and `build` sequentially.