Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ if [[ -f .env ]]; then
dotenv .env
fi

PATH_add "$PWD/.venv/bin"
export VIRTUAL_ENV="$PWD/.venv"

if [ ! -d .venv ]; then
echo "warning: creating virtualenv for the first time"
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip install -r requirements-dev.txt
else
source .venv/bin/activate
unset PS1
uv sync
fi

if [[ ! -f .git/hooks/pre-commit ]] || ! grep -q pre-commit .git/hooks/pre-commit 2>/dev/null; then
pre-commit install --install-hooks
fi
37 changes: 14 additions & 23 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,15 @@ on:
jobs:
dist:
name: Create Distribution
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: 3.12

- name: Install dev requirements
run: pip install -r requirements-dev.txt
- uses: astral-sh/setup-uv@e06108dd0aef18192324c70427afc47652e63a82 # v7.5.0

- name: "Prepare Artifacts"
run: python -m build
run: uv build

- name: Cache dist
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
Expand All @@ -35,31 +30,27 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, macos-14]
os: [ubuntu-24.04, macos-15]
include:
- os: ubuntu-22.04
- os: ubuntu-24.04
asset_name: devservices-linux
- os: macos-14
- os: macos-15
asset_name: devservices-darwin

steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: 3.12

- name: Install pyoxidizer
run: pip install pyoxidizer==0.24.0

- name: Install dev requirements
run: pip install -r requirements-dev.txt
- uses: astral-sh/setup-uv@e06108dd0aef18192324c70427afc47652e63a82 # v7.5.0

- name: Generate metadata
run: python -m build --sdist --no-isolation
run: |
uv sync
uv pip install pyoxidizer==0.24.0
uv export --no-dev --no-hashes --no-emit-project -o requirements.txt
uv run python -m build --sdist --no-isolation

- name: Build binary
run: pyoxidizer build --release
run: uv run pyoxidizer build --release

- name: Locate binary
id: locate_binary
Expand All @@ -78,7 +69,7 @@ jobs:

upload-artifacts:
name: Upload build artifacts
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
needs: [dist, binary]
if: github.event_name != 'pull_request'
steps:
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ jobs:
steps:
- name: Checkout repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Set up Python
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: 3.12
- name: Set up uv
uses: astral-sh/setup-uv@e06108dd0aef18192324c70427afc47652e63a82 # v7.5.0
- name: Install dependencies
run: uv sync
- name: Pre-commit
uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
run: uv run pre-commit run --all-files
16 changes: 5 additions & 11 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,20 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.12"]
python-version: ["3.11.14", "3.12.13"]
steps:
- name: Configure git
run: |
git config --global user.email "test@example.com"
git config --global user.name "test"
- name: Checkout repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Set up Python
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # v5.1.1
with:
python-version: ${{ matrix.python-version }}
- name: Set up uv
uses: astral-sh/setup-uv@e06108dd0aef18192324c70427afc47652e63a82 # v7.5.0
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
pip install -e .
run: uv sync --python ${{ matrix.python-version }}
- name: Run tests
run: pytest --cov --junitxml=junit.xml -o junit_family=legacy
run: uv run pytest --cov --junitxml=junit.xml -o junit_family=legacy
- name: Upload results to Codecov
uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0
with:
Expand Down
44 changes: 19 additions & 25 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,33 +1,27 @@
repos:
- repo: https://github.com/asottile/reorder-python-imports
rev: v3.12.0
hooks:
- id: reorder-python-imports
args: [--py311-plus, --add-import, "from __future__ import annotations"]
- repo: https://github.com/psf/black
rev: 23.10.0
hooks:
- id: black
language_version: python3.12
- repo: https://github.com/PyCQA/flake8
rev: 6.1.0
hooks:
- id: flake8
language_version: python3.12
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.6.1
- repo: local
hooks:
- id: ruff-check
name: ruff check
entry: .venv/bin/ruff check --fix
language: system
types: [python]
- id: ruff-format
name: ruff format
entry: .venv/bin/ruff format
language: system
types: [python]
- id: mypy
additional_dependencies:
- "pytest"
- "types-PyYAML"
language_version: python3.12
- repo: https://github.com/shellcheck-py/shellcheck-py
rev: v0.9.0.6
hooks:
name: mypy
entry: .venv/bin/mypy
language: system
types: [python]
- id: shellcheck
name: shellcheck
entry: .venv/bin/shellcheck
language: system
types: [shell]
args: [--norc]
language_version: python3.12
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
Expand Down
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.12.13
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,11 @@ networks:
name: devservices
external: true
```

## Dev

```sh
uv sync
direnv allow
pytest
```
1 change: 1 addition & 0 deletions devservices/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""
DevServices CLI tool for managing Docker Compose services.
"""

from __future__ import annotations
16 changes: 8 additions & 8 deletions devservices/commands/down.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
import concurrent.futures
import os
import subprocess
from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception
from sentry_sdk import logger as sentry_logger

from devservices.constants import CONFIG_FILE_NAME
from devservices.constants import DEPENDENCY_CONFIG_VERSION
from devservices.constants import DependencyType
from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR
from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY
from devservices.constants import DEVSERVICES_DIR_NAME
from devservices.constants import DependencyType
from devservices.exceptions import ConfigError
from devservices.exceptions import ConfigNotFoundError
from devservices.exceptions import DependencyError
Expand All @@ -25,17 +25,17 @@
from devservices.exceptions import SupervisorError
from devservices.utils.console import Console
from devservices.utils.console import Status
from devservices.utils.dependencies import construct_dependency_graph
from devservices.utils.dependencies import DependencyNode
from devservices.utils.dependencies import InstalledRemoteDependency
from devservices.utils.dependencies import construct_dependency_graph
from devservices.utils.dependencies import get_non_shared_remote_dependencies
from devservices.utils.dependencies import install_and_verify_dependencies
from devservices.utils.dependencies import InstalledRemoteDependency
from devservices.utils.docker_compose import DockerComposeCommand
from devservices.utils.docker_compose import get_docker_compose_commands_to_run
from devservices.utils.docker_compose import run_cmd
from devservices.utils.services import Service
from devservices.utils.services import find_matching_service
from devservices.utils.services import get_active_service_names
from devservices.utils.services import Service
from devservices.utils.state import ServiceRuntime
from devservices.utils.state import State
from devservices.utils.state import StateTables
Expand Down Expand Up @@ -231,9 +231,9 @@ def bring_down_service(

# Set the environment variable for the local dependencies directory to be used by docker compose
current_env = os.environ.copy()
current_env[
DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY
] = relative_local_dependency_directory
current_env[DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY] = (
relative_local_dependency_directory
)
state = State()

# We want to ignore any dependencies that are set to run locally if we are excluding local dependencies
Expand Down
4 changes: 2 additions & 2 deletions devservices/commands/foreground.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import os
import pty
import shlex
from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception

from devservices.constants import CONFIG_FILE_NAME
from devservices.constants import DependencyType
from devservices.constants import DEVSERVICES_DIR_NAME
from devservices.constants import DependencyType
from devservices.exceptions import ConfigError
from devservices.exceptions import ConfigNotFoundError
from devservices.exceptions import ServiceNotFoundError
Expand Down
2 changes: 1 addition & 1 deletion devservices/commands/list_dependencies.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from __future__ import annotations

from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception

Expand Down
2 changes: 1 addition & 1 deletion devservices/commands/list_services.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from __future__ import annotations

from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception

Expand Down
14 changes: 7 additions & 7 deletions devservices/commands/logs.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
import concurrent.futures
import os
import subprocess
from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception

from devservices.constants import CONFIG_FILE_NAME
from devservices.constants import DEPENDENCY_CONFIG_VERSION
from devservices.constants import DependencyType
from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR
from devservices.constants import DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY
from devservices.constants import DEVSERVICES_DIR_NAME
from devservices.constants import MAX_LOG_LINES
from devservices.constants import DependencyType
from devservices.exceptions import ConfigError
from devservices.exceptions import ConfigNotFoundError
from devservices.exceptions import DependencyError
Expand All @@ -24,13 +24,13 @@
from devservices.exceptions import SupervisorConfigError
from devservices.exceptions import SupervisorError
from devservices.utils.console import Console
from devservices.utils.dependencies import install_and_verify_dependencies
from devservices.utils.dependencies import InstalledRemoteDependency
from devservices.utils.dependencies import install_and_verify_dependencies
from devservices.utils.docker_compose import get_docker_compose_commands_to_run
from devservices.utils.docker_compose import run_cmd
from devservices.utils.services import Service
from devservices.utils.services import find_matching_service
from devservices.utils.services import get_active_service_names
from devservices.utils.services import Service
from devservices.utils.state import State
from devservices.utils.state import StateTables
from devservices.utils.supervisor import SupervisorManager
Expand Down Expand Up @@ -142,9 +142,9 @@ def _logs(
)
# Set the environment variable for the local dependencies directory to be used by docker compose
current_env = os.environ.copy()
current_env[
DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY
] = relative_local_dependency_directory
current_env[DEVSERVICES_DEPENDENCIES_CACHE_DIR_KEY] = (
relative_local_dependency_directory
)
docker_compose_commands = get_docker_compose_commands_to_run(
service=service,
remote_dependencies=list(remote_dependencies),
Expand Down
2 changes: 1 addition & 1 deletion devservices/commands/purge.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import os
import shutil
from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from devservices.configs.service_config import load_service_config_from_file
from devservices.constants import DEPENDENCY_CONFIG_VERSION
Expand Down
6 changes: 3 additions & 3 deletions devservices/commands/reset.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from __future__ import annotations

from argparse import _SubParsersAction
from argparse import ArgumentParser
from argparse import Namespace
from argparse import _SubParsersAction

from sentry_sdk import capture_exception

from devservices.commands.down import down
from devservices.constants import DependencyType
from devservices.constants import DEVSERVICES_ORCHESTRATOR_LABEL
from devservices.constants import DependencyType
from devservices.exceptions import DockerDaemonNotRunningError
from devservices.exceptions import DockerError
from devservices.utils.console import Console
from devservices.utils.console import Status
from devservices.utils.dependencies import construct_dependency_graph
from devservices.utils.dependencies import DependencyNode
from devservices.utils.dependencies import construct_dependency_graph
from devservices.utils.docker import get_matching_containers
from devservices.utils.docker import get_volumes_for_containers
from devservices.utils.docker import remove_docker_resources
Expand Down
Loading
Loading