Contributing

We appreciate your interest in contributing. This guide will help you get started, ensuring an effective collaboration.

๐Ÿ‘‹ Introduction

If you would like to contribute, please open an issue or a pull request. We are always looking for ways to improve the project and would love to hear your ideas.

The latest changes are always in master branch, so please make your Pull Request against that branch.

๐Ÿšฉ Development Requirements

Before you begin, you will need to set up your local development environment. Here is what you'll need:

โ†’ Optional Tools

๐Ÿš€ Quick Project Setup

We use a dockerized environment. Follow these steps to start working with the project:

  1. Clone this repository:

  2. Create .env file:

  3. Install phive and composer dependencies:

๐Ÿ”ง Using the Makefile

This project uses a Makefile to streamline common development tasks. The Makefile includes utilities for managing Docker environments, installing project dependencies, running tests, and linting code.

visual view of make help command

โ†’ Key Commands

  • make env: Creates a .env file from the .env.example template.

  • make install: Installs project composer dependencies

  • make update: Updates project composer dependencies

  • make up: Starts all services using Docker Compose.

  • make down: Stops and removes all services.

  • make logs: Displays logs for all services.

  • make ssh: Logs into the running application container for command line operations.

  • make lint: Executes all linting procedures for YAML, PHP, and Composer files.

  • make commit: Runs cz-git, a commitizen adapter for commit message formatting in a native environment.

For a full list of commands, run make help.

๐Ÿ’ป Workflow

circle-exclamation
  • Fork the Repository: Start by forking the repository to your GitHub account.

  • Create a Branch: In your fork, create a new branch for your work. Name it appropriately based on the feature, fix, or update you're working on.

  • Make Your Changes: Implement your changes

  • Run Tests: Ensure all tests pass by running make test.

  • Update Documentation: If you've made changes that affect the project's documentation, ensure it is updated.

  • Run Linters: Ensure your code passes all linting checks using make lint.

  • Commit Your Changes: Use the Conventional Commits standard for your commit messages. You can use make commit to assist in creating commit messages.

  • Push Your Changes: Push your branch to your fork on GitHub.

  • Open a Pull Request: Submit a pull request to the master branch of the original repository. Ensure your PR is focused, addressing a single feature, fix, or improvement.

๐Ÿณ Docker Support

This package leverages Docker to provide a consistent and isolated development environment. The included Makefile utilizes docker-compose.yaml along with the wayofdev/docker-php-devarrow-up-right PHP image to streamline setup and usage. This setup facilitates easy configuration of tools like XDebug for debugging and profiling, enhancing the development experience.

To run docker container:

Other commands:

By default, phpunit and phpstan commands will be ran against docker environment.

๐Ÿ”จ Continuous Integration with GitHub Actions

Our project employs GitHub Actionsarrow-up-right for continuous integration, ensuring code quality and reliability. We encourage contributors to review our workflow configurations to understand the CI processes:

Workflow
Description

apply-labels.yml

Auto labels PRs based on rules.

coding-standards.yml

Checks yaml, md, composer, php and commit coding standards.

create-release.yml

Creates a release on GitHub.

dependency-analysis.yml

Checks for dependency issues.

refactoring.yml

Runs rector/rector code check.

security-analysis.yml

Checks for security issues.

shellcheck.yml

Checks shell scripts.

static-analysis.yml

Runs psalm and phpstan tools.

testing.yml

Runs coverage, mutation and functional tests against SQLite

testing-mysql.yml

Runs functional tests against MySQL

testing-pgsql.yml

Runs functional tests against PostgreSQL

testing-sqlserver.yml

Runs functional tests against SQLServer (MSSQL)

๐Ÿ“ Before You Contribute

  • Tests: Include tests that cover any new features or bug fixes.

  • Code Quality: Utilize make lint for code style checks and make lint-stan lint-psalm for static analysis with PHPStanarrow-up-right and Psalmarrow-up-right.

  • Documentation: Update relevant documentation to reflect your changes, ensuring other developers can understand and use your contributions effectively.

  • Commits: use Conventional Commits standard to create a commit

๐Ÿ“ฉ Commit Message Guidelines

We follow the Conventional Commitsarrow-up-right standard. Please structure your commit messages as follows, using the appropriate prefix:

Examples:

Allowed Prefixes:

Prefix
Purpose

feat:

Introduces a new feature

fix:

Fixes a bug

perf:

Improves performance

docs:

Documentation only changes

style:

Code style changes (formatting, missing semi-colons, etc.)

deps:

Updates dependencies

refactor:

Code changes that neither fixes a bug nor adds a feature

ci:

Changes to our CI configuration files and scripts

test:

Adding missing tests or correcting existing tests

revert:

Reverts a previous commit

build:

Changes that affect the build system or external dependencies

chore:

Other changes that don't modify src or test files

security:

A code change that fixes a security issue

๐Ÿ“ฆ PHAR Dependencies

We use Phivearrow-up-right to manage PHAR dependencies. You can install all dependencies using the make phive command, which will be executed through the Docker environment.

๐Ÿ” Coding Standards

We enforce coding standards to maintain high code quality and readability. Here's a list of tools we use:

โ†’ Composer Normalization

We use ergebnis/composer-normalizearrow-up-right to normalize composer.json.

Use:

โ†’ Yaml Lint

We use yamllintarrow-up-right to enforce coding standards in YAML files.

To lint yaml files run:

by default, cytopia/yamllintarrow-up-right Docker image will be used to run linter.

โ†’ Action Lint

We use actionlintarrow-up-right to enforce coding standards in GitHub Actions workflows.

To lint GitHub Actions run:

by default, rhysd/actionlintarrow-up-right Docker image will be used to run linter.

โ†’ Markdown Lint

We use markdownlint-cli2arrow-up-right to enforce coding standards in Markdown files.

To lint markdown files run:

โ†’ PHP CS Fixer

We use friendsofphp/php-cs-fixerarrow-up-right together with wayofdev/php-cs-fixer-configarrow-up-right to enforce coding standards in PHP files.

Run

to automatically fix coding standard violations.

โ†’ Rector

We use rector/rectorarrow-up-right to refactor and modernize PHP code.

Run

to perform code refactoring.

๐Ÿ”ฌ Dependency Analysis

We use maglnet/composer-require-checkerarrow-up-right to prevent the use of unknown symbols in production code.

Run

to run a dependency analysis.

๐Ÿ”’ Security Audits

We use Composer's built-in audit feature to check for known vulnerabilities in dependencies.

Run

๐Ÿฆ  Mutation Tests

We use infection/infectionarrow-up-right together with roave/infection-static-analysis-pluginarrow-up-right to ensure a minimum quality of the tests. Roave plugin is used to publish mutation score results to the Stryker Dashboardarrow-up-right.

Xdebug support is enabled by default when running commands through the Makefile:

to run mutation tests.

๐Ÿ” Static Code Analysis

We use both phpstan/phpstanarrow-up-right and vimeo/psalmarrow-up-right to statically analyze the code.

Run

to run a static code analysis.

We also use the baseline features of phpstan/phpstanarrow-up-right and vimeo/psalmarrow-up-right to ignore existing issues.

Run

to regenerate the baselines in:

  • ../phpstan-baseline.neon.

  • ../psalm-baseline.xml.

circle-info

Ideally, the baseline files should stay empty or shrink over time.

๐Ÿงช Unit and Functional Tests

We use phpunit/phpunitarrow-up-right and pestphp/pestarrow-up-right to drive the development.

Run to run all the tests:

๐Ÿ“ฆ Pre-commit Hooks

Pre-commit hooks are an optional but highly recommended way to automate the linting and quality checks before committing changes to the repository. This project provides a predefined configuration that helps in maintaining code quality and consistency.

โ†’ Configured Hooks

Our pre-commit configuration includes several hooks:

  • Trailing Whitespace: Removes unnecessary trailing spaces.

  • End-of-File Fixer: Ensures that files end with a newline.

  • Check Added Large Files: Prevents accidentally adding large files to the git repository, with a current limit set to 600 KB.

  • Commitizen: Ensures commit messages meet the conventional commit format. This hook is triggered at the commit message stage.

  • PHP-CS-Fixer: Enforces coding standards in PHP files.

  • Markdown Lint: Enforces coding standards in Markdown files.

โ†’ Installing Pre-commit Hooks

To utilize these hooks, you first need to install them using the command provided by the Makefile:

Last updated