Contributions are always welcome!
Setup
This section contains instructions for creating a local development environment
for the EctoPGMQ application.
Environment Variables
In order to run the project we must first setup some environment variables.
These environment variables should be stored in a file named .envrc.
The necessary environment variables aren't actually secrets and can just be
copied from .envrc.example:
cp .envrc.example .envrc
Below are a few tools that be used to source environment variables:
Mise (Preferred)
If you have mise installed, environment variables can be sourced with the following command:
mise trust
direnv
If you have direnv installed, environment variables can be sourced with the following command:
direnv allow .
Updates to the .envrc file will not take effect until the above command is run
again.
External Services
As one would expect, this project requires a
PostgreSQL instance with certain extensions
installed. By default, we create a custom docker image and run a containerized
version of this service to make local development more ergonomic. The
configuration for this container can be found in the docker-compose.yml file.
Below are a few tools that can be used to run containers:
Docker
If you have Docker installed, the containers can be run with the following command:
docker compose up
Podman
If you have Podman installed, the containers can be run with the following command:
podman compose up
OrbStack
If you have OrbStack installed, the containers can be run with the following command:
docker compose up
Regardless of what tool you use to run the container, you should see a message like this when everything is up and running:
All services started and healthy!Alternatively, while the project is set up to work with the aforementioned docker image, any Postgres instance can be used so long as the following extensions are available:
The ECTO_PGMQ_POSTGRES_URL environment variable will just need to be updated
accordingly.
Erlang and Elixir
This project is written almost entirely in Elixir but, since Elixir is built on top of Erlang, we need both languages installed.
The specific language versions used by the project can be found in the
.tool-versions file.
Below are a few tools that can be used to manage language versions:
Mise (Preferred)
If you have mise installed, the language versions from
the .tool-versions file can be installed with the following commands:
mise trust
mise install
asdf
If you're using asdf, you first need to install the language plugins:
asdf plugin add erlang
asdf plugin add elixir
Once you have the plugins installed, the language versions from the
.tool-versions file can be installed with the following command:
asdf install
If the above command fails to install a language version, you may need to troubleshoot using the corresponding plugin's documentation:
Once Elixir and Erlang are installed, we can install their respective package managers if they aren't already available:
mix local.hex --if-missing --force
mix local.rebar --if-missing --force
Application
Once our environment variables are set, Postgres is running, and the necessary languages are installed, we can use the following command to install the project dependencies:
mix deps.get
From there, the application can be started in "REPL" mode with the following command:
iex -S mix
Testing
Tests can be run locally with the following command:
mix test
The CI workflow runs tests but also includes a few additional checks. This process can be run locally with the following command:
mix ci
Documentation
This project's documentation can be generated locally with the following command:
mix docs
The generated documentation can be viewed in a browser with the following command:
open doc/index.html
Debugging
You can optionally interact with the PostgreSQL container using psql. This
tool is available if you've
installed PostgreSQL.
Using psql, you can open a SQL terminal with the following command:
# Password is "ecto_pgmq"
psql -h localhost -p 5432 -U ecto_pgmq -d ecto_pgmq
Alternatively, if psql is not available, and you're running a Postgres
container, you can execute the above command inside of the container to open a
SQL terminal. The exact command is dependent on the tool you're using to run the
containers, but here is an example:
# Find the Postgres container name/ID
docker ps
# Replace "ecto_pgmq-postgres" with the container name/ID
docker exec -it ecto_pgmq-postgres psql -U ecto_pgmq -d ecto_pgmq
Tip
All tests that interact with the Postgres container remove any inserted data upon completion, so don't be surprised if the database is empty after a test run.
Pull Request Process
Before submitting a pull request, make sure that:
- The CI process is passing locally
- Any relevant documentation is updated
- The pull request description contains adequate context for a reviewer
Potential Future Enhancements
Itching to contribute but not sure where to start? Here's a list of potential enhancements that could benefit the application:
Investigate adding a notion of a worker and leveraging it to limit the number of active consumers
Investigate adding a scheduled job framework (maybe on top of pg_cron)
Update the PGMQ extension to fix SQL-based installation failures
Code of Conduct
Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project owner at gordonwoolbert3@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]