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
28 changes: 23 additions & 5 deletions .github/workflows/auto-dependabot.yaml
Original file line number Diff line number Diff line change
@@ -1,21 +1,39 @@
name: Auto-merge Dependabot PR

on:
pull_request:
# XXX: !!! SECURITY WARNING !!!
# pull_request_target has write access to the repo, and can read secrets. We
# need to audit any external actions executed in this workflow and make sure no
# checked out code is run (not even installing dependencies, as installing
# dependencies usually can execute pre/post-install scripts). We should also
# only use hashes to pick the action to execute (instead of tags or branches).
# For more details read:
# https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
pull_request_target:

permissions:
contents: write
contents: read
pull-requests: write

jobs:
auto-merge:
if: github.actor == 'dependabot[bot]'
name: Auto-merge Dependabot PR
if: >
github.actor == 'dependabot[bot]' &&
!contains(github.event.pull_request.title, 'the repo-config group')
runs-on: ubuntu-slim
steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ secrets.FREQUENZ_AUTO_DEPENDABOT_APP_ID }}
private-key: ${{ secrets.FREQUENZ_AUTO_DEPENDABOT_APP_PRIVATE_KEY }}

- name: Auto-merge Dependabot PR
uses: frequenz-floss/dependabot-auto-approve@e943399cc9d76fbb6d7faae446cd57301d110165 # v1.5.0
uses: frequenz-floss/dependabot-auto-approve@e943399cc9d76fbb6d7faae446cd57301d110165 # v1.5.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
github-token: ${{ steps.app-token.outputs.token }}
dependency-type: 'all'
auto-merge: 'true'
merge-method: 'merge'
Expand Down
22 changes: 9 additions & 13 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,9 @@ jobs:
strategy:
fail-fast: false
matrix:
arch:
- amd64
- arm
os:
platform:
- ubuntu-24.04
- ubuntu-24.04-arm
python:
- "3.11"
- "3.12"
Expand All @@ -42,7 +40,7 @@ jobs:
# that uses the same venv to run multiple linting sessions
- "ci_checks_max"
- "pytest_min"
runs-on: ${{ matrix.os }}${{ matrix.arch != 'amd64' && format('-{0}', matrix.arch) || '' }}
runs-on: ${{ matrix.platform }}

steps:
- name: Run nox
Expand All @@ -61,7 +59,7 @@ jobs:
needs: ["nox"]
# We skip this job only if nox was also skipped
if: always() && needs.nox.result != 'skipped'
runs-on: ubuntu-24.04
runs-on: ubuntu-slim
env:
DEPS_RESULT: ${{ needs.nox.result }}
steps:
Expand Down Expand Up @@ -106,16 +104,14 @@ jobs:
strategy:
fail-fast: false
matrix:
arch:
- amd64
- arm
os:
platform:
- ubuntu-24.04
- ubuntu-24.04-arm
python:
- "3.11"
- "3.12"
- "3.13"
runs-on: ${{ matrix.os }}${{ matrix.arch != 'amd64' && format('-{0}', matrix.arch) || '' }}
runs-on: ${{ matrix.platform }}

steps:
- name: Setup Git
Expand Down Expand Up @@ -163,7 +159,7 @@ jobs:
needs: ["test-installation"]
# We skip this job only if test-installation was also skipped
if: always() && needs.test-installation.result != 'skipped'
runs-on: ubuntu-24.04
runs-on: ubuntu-slim
env:
DEPS_RESULT: ${{ needs.test-installation.result }}
steps:
Expand Down Expand Up @@ -278,7 +274,7 @@ jobs:
# discussions to create the release announcement in the discussion forums
contents: write
discussions: write
runs-on: ubuntu-24.04
runs-on: ubuntu-slim
steps:
- name: Download distribution files
uses: actions/download-artifact@v8
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dco-merge-queue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

jobs:
DCO:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
if: ${{ github.actor != 'dependabot[bot]' }}
steps:
- run: echo "This DCO job runs on merge_queue event and doesn't check PR contents"

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
2 changes: 1 addition & 1 deletion .github/workflows/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ jobs:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- name: Labeler
# XXX: !!! SECURITY WARNING !!!
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-notes-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ on:
jobs:
check-release-notes:
name: Check release notes are updated
runs-on: ubuntu-latest
runs-on: ubuntu-slim
permissions:
pull-requests: read
steps:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/repo-config-migration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
app-id: ${{ secrets.FREQUENZ_AUTO_DEPENDABOT_APP_ID }}
private-key: ${{ secrets.FREQUENZ_AUTO_DEPENDABOT_APP_PRIVATE_KEY }}
- name: Migrate
uses: frequenz-floss/gh-action-dependabot-migrate@45994e185a9040449304a470e8f02d0e197873b4 # v1.1.1
uses: frequenz-floss/gh-action-dependabot-migrate@07dc7e74726498c50726a80cc2167a04d896508f # v1.0.0
with:
script-url-template: >-
https://raw.githubusercontent.com/frequenz-floss/frequenz-repo-config-python/{version}/cookiecutter/migrate.py
Expand Down
13 changes: 7 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@
requires = [
"setuptools == 80.10.2",
"setuptools_scm[toml] == 9.2.2",
"frequenz-repo-config[lib] == 0.14.0",
"frequenz-repo-config[lib] == 0.17.0",
]
build-backend = "setuptools.build_meta"

[project]
name = "frequenz-sdk"
description = "A development kit to interact with the Frequenz development platform"
readme = "README.md"
license = { text = "MIT" }
license = "MIT"
license-files = ["LICENSE"]
keywords = ["frequenz", "python", "lib", "library", "sdk", "microgrid"]
classifiers = [
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Topic :: Software Development :: Libraries",
Expand Down Expand Up @@ -49,6 +49,7 @@ email = "floss@frequenz.com"
[project.optional-dependencies]
dev-flake8 = [
"flake8 == 7.3.0",
"flake8-datetimez == 20.10.0",
"flake8-docstrings == 1.7.0",
"flake8-pyproject == 1.2.4", # For reading the flake8 config from pyproject.toml
"pydoclint == 0.8.3",
Expand All @@ -65,7 +66,7 @@ dev-mkdocs = [
"mkdocs-material == 9.7.6",
"mkdocstrings[python] == 1.0.4",
"mkdocstrings-python == 2.0.3",
"frequenz-repo-config[lib] == 0.14.0",
"frequenz-repo-config[lib] == 0.17.0",
]
dev-mypy = [
"mypy == 1.19.1",
Expand All @@ -75,15 +76,15 @@ dev-mypy = [
# For checking the noxfile, docs/ script, and tests
"frequenz-sdk[dev-mkdocs,dev-noxfile,dev-pytest]",
]
dev-noxfile = ["nox == 2026.2.9", "frequenz-repo-config[lib] == 0.14.0"]
dev-noxfile = ["nox == 2026.2.9", "frequenz-repo-config[lib] == 0.17.0"]
dev-pylint = [
"pylint == 4.0.5",
# For checking the noxfile, docs/ script, and tests
"frequenz-sdk[dev-mkdocs,dev-noxfile,dev-pytest]",
]
dev-pytest = [
"pytest == 9.0.3",
"frequenz-repo-config[extra-lint-examples] == 0.14.0",
"frequenz-repo-config[extra-lint-examples] == 0.17.0",
"pytest-mock == 3.15.1",
"pytest-asyncio == 1.3.0",
"time-machine == 2.16.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ async def test_setting_power(
mocker: MockerFixture,
) -> None:
"""Test setting power."""
traveller = time_machine.travel(datetime(2012, 12, 12))
traveller = time_machine.travel(datetime(2012, 12, 12, tzinfo=timezone.utc))
mock_time = traveller.start()

set_power = cast(
Expand Down
4 changes: 2 additions & 2 deletions tests/timeseries/_formulas/test_3_phases.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import asyncio
from collections import OrderedDict
from collections.abc import Callable
from datetime import datetime
from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock

import async_solipsism
Expand Down Expand Up @@ -87,7 +87,7 @@ def stream_recv(comp_id: int) -> Receiver[Sample[Quantity]]:

await asyncio.sleep(0.1)

now = datetime.now()
now = datetime.now(timezone.utc)
for inputs, expected_output in io_pairs:
_ = await asyncio.gather(
*[
Expand Down
8 changes: 4 additions & 4 deletions tests/timeseries/_formulas/test_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import logging
from collections import OrderedDict
from collections.abc import Callable
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from typing import NamedTuple
from unittest.mock import AsyncMock, MagicMock

Expand Down Expand Up @@ -67,7 +67,7 @@ def stream_recv(comp_id: ComponentId) -> Receiver[Sample[Quantity]]:
async with formula as formula:
results_rx = formula.new_receiver()
await asyncio.sleep(0.1) # Allow time for setup
now = datetime.now()
now = datetime.now(timezone.utc)
tests_passed = 0

for io_pair in io_pairs:
Expand Down Expand Up @@ -400,7 +400,7 @@ def stream_recv(comp_id: int) -> Receiver[Sample[Quantity]]:

result_chan = formula.new_receiver()
await asyncio.sleep(0.1)
now = datetime.now()
now = datetime.now(timezone.utc)
tests_passed = 0
for io_pair in io_pairs:
io_input, io_output = io_pair
Expand Down Expand Up @@ -779,7 +779,7 @@ def new_receiver(component_id: ComponentId) -> Receiver[Sample[Quantity]]:

result_chan = formula.new_receiver()
await asyncio.sleep(0.1)
now = datetime.now()
now = datetime.now(timezone.utc)

async def send_sample(values: list[float | None]) -> None:
nonlocal now
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,10 @@ def test_align_to_timezone_unaware() -> None:
with pytest.raises(
ValueError, match=r"^align_to (.*) should be a timezone aware datetime$"
):
_ = WallClockTimerConfig(align_to=datetime(2020, 1, 1, tzinfo=None))
# Ignore the timezone-aware flake8 check because we want to validate it at runtime
_ = WallClockTimerConfig(
align_to=datetime(2020, 1, 1, tzinfo=None) # noqa: DTZ001
)


_VALID_NUMBERS = [
Expand Down
6 changes: 3 additions & 3 deletions tests/timeseries/mock_resampler.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import asyncio
import math
from datetime import datetime
from datetime import datetime, timezone

from frequenz.channels import Broadcast, Receiver, Sender
from frequenz.client.common.microgrid.components import ComponentId
Expand Down Expand Up @@ -191,7 +191,7 @@ def power_3_phase_senders(
self._meter_voltage_senders = voltage_senders(meter_ids)
self._meter_power_3_phase_senders = power_3_phase_senders(meter_ids)

self._next_ts = datetime.now()
self._next_ts = datetime.now(timezone.utc)

mocker.patch(
"frequenz.sdk.microgrid._data_pipeline._DataPipeline"
Expand All @@ -209,7 +209,7 @@ def power_3_phase_senders(

def next_ts(self) -> None:
"""Increment the timestamp."""
self._next_ts = datetime.now()
self._next_ts = datetime.now(timezone.utc)

def _handle_task_done(self, task: asyncio.Task[None]) -> None:
if task.cancelled():
Expand Down
10 changes: 5 additions & 5 deletions tests/timeseries/test_base_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""Tests for timeseries base types."""


from datetime import datetime
from datetime import datetime, timezone

from frequenz.quantities import Power

Expand Down Expand Up @@ -50,7 +50,7 @@ def test_bounds_contains_no_bounds() -> None:
def test_system_bounds_contains() -> None:
"""Tests with complete system bounds."""
system_bounds = SystemBounds(
timestamp=datetime.now(),
timestamp=datetime.now(timezone.utc),
inclusion_bounds=INCLUSION_BOUND,
exclusion_bounds=EXCLUSION_BOUND,
)
Expand All @@ -63,7 +63,7 @@ def test_system_bounds_contains() -> None:
def test_system_bounds_contains_no_exclusion() -> None:
"""Tests with no exclusion bounds."""
system_bounds_no_exclusion = SystemBounds(
timestamp=datetime.now(),
timestamp=datetime.now(timezone.utc),
inclusion_bounds=INCLUSION_BOUND,
exclusion_bounds=None,
)
Expand All @@ -74,7 +74,7 @@ def test_system_bounds_contains_no_exclusion() -> None:
def test_system_bounds_contains_no_inclusion() -> None:
"""Tests with no inclusion bounds."""
system_bounds_no_inclusion = SystemBounds(
timestamp=datetime.now(),
timestamp=datetime.now(timezone.utc),
inclusion_bounds=None,
exclusion_bounds=EXCLUSION_BOUND,
)
Expand All @@ -85,7 +85,7 @@ def test_system_bounds_contains_no_inclusion() -> None:
def test_system_bounds_contains_no_bounds() -> None:
"""Tests with no bounds."""
system_bounds_no_bounds = SystemBounds(
timestamp=datetime.now(),
timestamp=datetime.now(timezone.utc),
inclusion_bounds=None,
exclusion_bounds=None,
)
Expand Down
4 changes: 2 additions & 2 deletions tests/timeseries/test_ringbuffer.py
Original file line number Diff line number Diff line change
Expand Up @@ -433,12 +433,12 @@ def test_ringbuffer_empty_buffer() -> None:
OrderedRingBuffer(
empty_np_buffer,
sampling_period=timedelta(seconds=1),
align_to=datetime(1, 1, 1),
align_to=datetime(1, 1, 1, tzinfo=timezone.utc),
)
OrderedRingBuffer(
empty_list_buffer,
sampling_period=timedelta(seconds=1),
align_to=datetime(1, 1, 1),
align_to=datetime(1, 1, 1, tzinfo=timezone.utc),
)


Expand Down
Loading