Skip to content

Conversation

@tisnik
Copy link
Contributor

@tisnik tisnik commented Dec 15, 2025

Description

  • Use specified table namespace in quota handlers
  • Updated and enhanced unit tests

Type of change

  • Refactor
  • New feature
  • Bug fix
  • CVE fix
  • Optimization
  • Documentation Update
  • Configuration Update
  • Bump-up service version
  • Bump-up dependent library
  • Bump-up library or tool used for development (does not change the final image)
  • CI configuration change
  • Konflux configuration change
  • Unit tests improvement
  • Integration tests improvement
  • End to end tests improvement

Tools used to create PR

Identify any AI code assistants used in this PR (for transparency and review context)

  • Assisted-by: CodeRabbitAI
  • Generated by: N/A

Related Tickets & Documents

  • Related Issue #LCORE-1061
  • Closes #LCORE-1061

Summary by CodeRabbit

  • New Features

    • PostgreSQL search_path/namespace is configurable; default namespace changed to "public" and applied to DB connections.
  • Refactor

    • Database initialization now runs backend-specific table creation for PostgreSQL and SQLite.
    • Quota scheduler startup updated to support backend-specific setup and a simpler public startup entry point.
  • Documentation

    • Configuration docs updated to set PostgreSQL namespace default to "public".
  • Tests

    • Unit tests updated to reflect namespace defaults and new namespace handling.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 15, 2025

Walkthrough

Adds configurable PostgreSQL namespace injection into connections (default "public") and splits quota table SQL into PostgreSQL and SQLite variants, updating initialization code and tests to choose and apply the dialect-specific CREATE TABLE statement.

Changes

Cohort / File(s) Summary
SQL constant definitions
src/quota/sql.py
Renamed CREATE_QUOTA_TABLECREATE_QUOTA_TABLE_PG and added CREATE_QUOTA_TABLE_SQLITE containing a SQLite-specific CREATE TABLE statement.
PostgreSQL connection configuration
src/quota/connect_pg.py
Introduced local namespace (default "public", overridable via config.namespace) and passed it into psycopg2.connect via options="-c search_path=<namespace>".
Quota limiter initialization
src/quota/revokable_quota_limiter.py
Imported CREATE_QUOTA_TABLE_PG and CREATE_QUOTA_TABLE_SQLITE; _initialize_tables now selects the appropriate create-table SQL based on the active backend (Postgres vs SQLite).
Quota scheduler and initialization
src/runners/quota_scheduler.py
Switched to backend-specific CREATE constants; init_tables now accepts a create_quota_table: str parameter and callers pass the chosen SQL; added start_quota_scheduler(configuration: Configuration) -> None wrapper to launch scheduler thread.
Configuration defaults & docs
src/models/config.py, docs/config.json
Changed default PostgreSQLDatabaseConfiguration.namespace from "lightspeed-stack" to "public".
Unit tests updated
tests/unit/models/config/*, tests/unit/quota/*, tests/unit/quota/test_connect_pg.py, tests/unit/quota/test_quota_limiter_factory.py
Updated fixtures and expected outputs to reflect new default namespace ("public"), added tests verifying explicit namespace values (e.g., "foo"), and adjusted assertions accordingly.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Verify all call sites updated to the new init_tables(connection, create_quota_table) usage.
  • Confirm connect_pg.py constructs the options string safely and that search_path values are properly handled/escaped.
  • Check SQL correctness for both CREATE_QUOTA_TABLE_PG and CREATE_QUOTA_TABLE_SQLITE and ensure runtime backend selection covers all paths.
  • Review updated tests for correct expectations and coverage of namespace behavior.

Possibly related PRs

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'LCORE-1061: Table namespace used in quota handlers' clearly and concisely summarizes the main change: implementing table namespace support in quota handlers across multiple files.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/quota/sql.py (1)

16-26: Use TEXT explicitly for the SQLite schema instead of timestamp with time zone.

SQLite has no built-in timestamp with time zone datatype; it will store this as TEXT. While SQLite's flexible type system allows the statement to execute, explicitly declaring TEXT in the CREATE_QUOTA_TABLE_SQLITE constant clarifies intent and aligns with SQLite best practices. This improves code clarity and makes the dialect-specific design explicit without affecting functionality.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 58ff79e and b645243.

📒 Files selected for processing (4)
  • src/quota/connect_pg.py (2 hunks)
  • src/quota/revokable_quota_limiter.py (2 hunks)
  • src/quota/sql.py (1 hunks)
  • src/runners/quota_scheduler.py (3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.py: Use absolute imports for internal modules in LCS project (e.g., from auth import get_auth_dependency)
All modules must start with descriptive docstrings explaining their purpose
Use logger = logging.getLogger(__name__) pattern for module logging
All functions must include complete type annotations for parameters and return types, using modern syntax (str | int) and Optional[Type] or Type | None
All functions must have docstrings with brief descriptions following Google Python docstring conventions
Function names must use snake_case with descriptive, action-oriented names (get_, validate_, check_)
Avoid in-place parameter modification anti-patterns; return new data structures instead of modifying input parameters
Use async def for I/O operations and external API calls
All classes must include descriptive docstrings explaining their purpose following Google Python docstring conventions
Class names must use PascalCase with descriptive names and standard suffixes: Configuration for config classes, Error/Exception for exceptions, Resolver for strategy patterns, Interface for abstract base classes
Abstract classes must use ABC with @abstractmethod decorators
Include complete type annotations for all class attributes in Python classes
Use import logging and module logger pattern with standard log levels: debug, info, warning, error

Files:

  • src/quota/sql.py
  • src/quota/connect_pg.py
  • src/quota/revokable_quota_limiter.py
  • src/runners/quota_scheduler.py
🪛 GitHub Actions: Black
src/quota/connect_pg.py

[error] 1-1: Black formatting check failed; 1 file would be reformatted. Run 'black --write' to fix.

🪛 GitHub Actions: Pyright
src/runners/quota_scheduler.py

[error] 63-63: Pyright: Type 'None' is not assignable to declared type 'str' (reportAssignmentType)

🪛 GitHub Actions: Type checks
src/runners/quota_scheduler.py

[error] 63-63: mypy: Incompatible types in assignment (expression has type "None", variable has type "str") [assignment] in src/runners/quota_scheduler.py:63. Command failed: uv run mypy --explicit-package-bases --disallow-untyped-calls --disallow-untyped-defs --disallow-incomplete-defs --ignore-missing-imports --disable-error-code attr-defined src/

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build-pr
  • GitHub Check: Konflux kflux-prd-rh02 / lightspeed-stack-on-pull-request
🔇 Additional comments (5)
src/quota/connect_pg.py (1)

42-42: Clarify the hardcoded dbo in the search_path.

The search_path includes dbo as the first schema before the configured namespace. If this is intentional (e.g., for shared objects), consider documenting why dbo is included. If not, this may cause unexpected schema resolution behavior.

Is including dbo in the search_path intentional? If so, consider adding a comment explaining its purpose. If only the configured namespace should be used:

-            options=f"-c search_path=dbo,{namespace}"
+            options=f"-c search_path={namespace}"
src/quota/revokable_quota_limiter.py (2)

11-12: LGTM!

The imports are correctly updated to include the dialect-specific CREATE TABLE constants.


185-194: LGTM with a minor observation.

The dialect selection logic correctly mirrors the pattern used elsewhere in the class. However, if neither sqlite_connection_config nor postgres_connection_config is set, the cursor is created and closed without executing anything, which is a harmless no-op but could be worth logging for debugging.

src/runners/quota_scheduler.py (2)

19-21: LGTM!

The imports are correctly updated to include the dialect-specific CREATE TABLE constants.


306-319: LGTM!

The updated init_tables function correctly accepts the dialect-specific CREATE TABLE statement and executes it. The docstring is properly updated to document the new parameter.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
src/quota/connect_pg.py (1)

28-31: Namespace defaulting logic is correct.

The defensive handling of config.namespace properly falls back to "public" when None, even though the Pydantic model now defaults to "public". This provides robustness if the field is explicitly set to None.

Note: The formatting issue flagged in the previous review (missing space around = on line 30) has been resolved.

src/runners/quota_scheduler.py (1)

63-70: Fix type annotation to resolve pipeline failures.

The type annotation create_quota_table: Optional[str] = None causes type errors when passed to init_tables (line 70), which expects str (line 308). Since the guard at line 50 ensures at least one backend is configured, the variable will always be assigned before use.

Apply this diff to fix the type error:

-    create_quota_table: Optional[str] = None
+    create_quota_table: str
     if config.postgres is not None:
         create_quota_table = CREATE_QUOTA_TABLE_PG
-    elif config.sqlite is not None:
+    else:
+        # SQLite must be configured if we reach here (guard at line 50)
         create_quota_table = CREATE_QUOTA_TABLE_SQLITE
-
-    if create_quota_table is not None:
-        init_tables(connection, create_quota_table)
+    
+    init_tables(connection, create_quota_table)

This approach ensures create_quota_table is always a str and eliminates the redundant None check.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b645243 and f2e3d6a.

📒 Files selected for processing (4)
  • docs/config.json (1 hunks)
  • src/models/config.py (1 hunks)
  • src/quota/connect_pg.py (2 hunks)
  • src/runners/quota_scheduler.py (4 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
src/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.py: Use absolute imports for internal modules in LCS project (e.g., from auth import get_auth_dependency)
All modules must start with descriptive docstrings explaining their purpose
Use logger = logging.getLogger(__name__) pattern for module logging
All functions must include complete type annotations for parameters and return types, using modern syntax (str | int) and Optional[Type] or Type | None
All functions must have docstrings with brief descriptions following Google Python docstring conventions
Function names must use snake_case with descriptive, action-oriented names (get_, validate_, check_)
Avoid in-place parameter modification anti-patterns; return new data structures instead of modifying input parameters
Use async def for I/O operations and external API calls
All classes must include descriptive docstrings explaining their purpose following Google Python docstring conventions
Class names must use PascalCase with descriptive names and standard suffixes: Configuration for config classes, Error/Exception for exceptions, Resolver for strategy patterns, Interface for abstract base classes
Abstract classes must use ABC with @abstractmethod decorators
Include complete type annotations for all class attributes in Python classes
Use import logging and module logger pattern with standard log levels: debug, info, warning, error

Files:

  • src/models/config.py
  • src/runners/quota_scheduler.py
  • src/quota/connect_pg.py
src/models/config.py

📄 CodeRabbit inference engine (CLAUDE.md)

src/models/config.py: All configuration must use Pydantic models extending ConfigurationBase with extra="forbid" to reject unknown fields
Use type hints Optional[FilePath], PositiveInt, SecretStr for Pydantic configuration models

Files:

  • src/models/config.py
src/models/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

src/models/**/*.py: Use @field_validator and @model_validator for custom validation in Pydantic models
Pydantic configuration classes must extend ConfigurationBase; data models must extend BaseModel

Files:

  • src/models/config.py
🧬 Code graph analysis (2)
src/runners/quota_scheduler.py (1)
src/models/config.py (1)
  • config (324-341)
src/quota/connect_pg.py (1)
src/models/config.py (1)
  • config (324-341)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build-pr
  • GitHub Check: Konflux kflux-prd-rh02 / lightspeed-stack-on-pull-request
🔇 Additional comments (5)
docs/config.json (1)

729-729: LGTM! Documentation aligns with code change.

The default namespace change to "public" matches the updated default in src/models/config.py and aligns with PostgreSQL's standard default schema.

src/models/config.py (1)

220-224: LGTM! Default namespace updated to PostgreSQL standard.

Changing the default from "lightspeed-stack" to "public" aligns with PostgreSQL's standard default schema and improves interoperability.

src/runners/quota_scheduler.py (3)

3-3: LGTM! Import addition supports optional type annotation.

The Optional import from typing is correctly added to support the type annotation on line 63.


19-26: LGTM! Backend-specific SQL constants imported.

The imports correctly bring in separate CREATE_QUOTA_TABLE_PG and CREATE_QUOTA_TABLE_SQLITE constants, enabling backend-aware table creation.


308-321: LGTM! Function signature updated to accept backend-specific SQL.

The init_tables function now accepts create_quota_table: str parameter, enabling dynamic backend-specific table creation. The parameter is properly documented and used.

@tisnik tisnik force-pushed the lcore-1061-table-namespace-used-in-quota-handler branch from bb7da0c to 35f9f15 Compare December 15, 2025 09:22
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f2e3d6a and bb7da0c.

📒 Files selected for processing (5)
  • src/quota/connect_pg.py (2 hunks)
  • tests/unit/models/config/test_dump_configuration.py (5 hunks)
  • tests/unit/models/config/test_postgresql_database_configuration.py (1 hunks)
  • tests/unit/quota/test_connect_pg.py (2 hunks)
  • tests/unit/quota/test_quota_limiter_factory.py (6 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/quota/connect_pg.py
🧰 Additional context used
📓 Path-based instructions (2)
tests/{unit,integration}/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

tests/{unit,integration}/**/*.py: Use pytest for all unit and integration tests; do not use unittest framework
Unit tests must achieve 60% code coverage; integration tests must achieve 10% coverage

Files:

  • tests/unit/quota/test_connect_pg.py
  • tests/unit/quota/test_quota_limiter_factory.py
  • tests/unit/models/config/test_postgresql_database_configuration.py
  • tests/unit/models/config/test_dump_configuration.py
tests/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Use pytest-mock with AsyncMock objects for mocking in tests

Files:

  • tests/unit/quota/test_connect_pg.py
  • tests/unit/quota/test_quota_limiter_factory.py
  • tests/unit/models/config/test_postgresql_database_configuration.py
  • tests/unit/models/config/test_dump_configuration.py
🧬 Code graph analysis (2)
tests/unit/models/config/test_postgresql_database_configuration.py (1)
src/models/config.py (1)
  • PostgreSQLDatabaseConfiguration (176-260)
tests/unit/models/config/test_dump_configuration.py (1)
src/models/config.py (4)
  • Configuration (1367-1481)
  • DatabaseConfiguration (263-341)
  • PostgreSQLDatabaseConfiguration (176-260)
  • dump (1469-1481)
🪛 GitHub Actions: Black
tests/unit/models/config/test_dump_configuration.py

[error] 1-1: Black formatting check failed. 1 file would be reformatted by Black. Run 'black' to fix. Command: 'uv tool run black --check .'

🪛 GitHub Actions: Python linter
tests/unit/models/config/test_dump_configuration.py

[warning] 853-853: Pylint: Trailing newlines detected (C0305).


[warning] 823-823: Pylint: Duplicate key 'namespace' in dictionary (W0109).

🪛 GitHub Actions: Ruff
tests/unit/models/config/test_dump_configuration.py

[error] 833-833: ruff (F601): Dictionary key literal "namespace" repeated. Remove repeated key literal "namespace".

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build-pr
  • GitHub Check: Konflux kflux-prd-rh02 / lightspeed-stack-on-pull-request
🔇 Additional comments (6)
tests/unit/quota/test_quota_limiter_factory.py (1)

30-35: LGTM! Namespace parameter consistently added across all PostgreSQL test configurations.

The addition of namespace="foo" to all PostgreSQLDatabaseConfiguration instances ensures that the new namespace functionality is properly exercised in quota limiter tests.

Also applies to: 55-60, 82-87, 129-134, 174-179, 207-212

tests/unit/models/config/test_postgresql_database_configuration.py (2)

30-31: LGTM! Default namespace assertion updated correctly.

The test now correctly expects the default namespace to be "public" and includes an explicit assertion for ca_cert_path, improving test completeness.


34-49: LGTM! Good test coverage for custom namespace specification.

The new test function comprehensively validates that a custom namespace value (e.g., "foo") is properly stored and retrieved, ensuring the namespace field works as expected.

tests/unit/quota/test_connect_pg.py (1)

15-20: LGTM! Namespace parameter added to connection tests.

Both test cases now include namespace="foo" in the PostgreSQL configuration, ensuring the connection logic properly handles the namespace parameter.

Also applies to: 33-39

tests/unit/models/config/test_dump_configuration.py (2)

170-170: LGTM! Default namespace correctly updated to "public".

The expected namespace value in serialized configurations has been correctly updated to reflect the new default value of "public".

Also applies to: 470-470


545-545: LGTM! Custom namespace correctly set and verified.

The test properly configures a custom namespace ("foo") and validates it in the serialized output.

Also applies to: 656-656

@tisnik
Copy link
Contributor Author

tisnik commented Dec 15, 2025

@coderabbitai review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 15, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/quota/connect_pg.py (1)

28-31: Namespace-based search_path configuration looks solid; consider a small cleanup

Using a default "public" namespace and overriding from config.namespace, then wiring it into options=f"-c search_path={namespace}", is consistent with the configuration model and gives the desired per-namespace behavior.

If you want to tighten this up a bit, you could optionally:

  • Collapse the default/override into a single expression and normalize whitespace, e.g.:
-    namespace = "public"
-    if config.namespace is not None:
-        namespace = config.namespace
+    namespace = (config.namespace or "public").strip()
  • (Optionally) treat an empty string as “no override” and skip the options argument entirely if namespace ends up empty.

These are purely cosmetic/robustness tweaks; the current logic is correct.

Also applies to: 42-42

tests/unit/models/config/test_postgresql_database_configuration.py (1)

30-32: Tests correctly cover default and custom namespace; consider an extra edge-case

The updates to assert the default namespace "public" and the new test_postgresql_database_configuration_namespace_specification exercising a custom "foo" namespace look consistent with the configuration model and give good coverage of the new field.

If you care about the explicit namespace=None behavior (given the Optional[str] type), you might optionally add a small test to lock in how that should behave, for example:

+def test_postgresql_database_configuration_namespace_none() -> None:
+    """Explicit None namespace should fall back to public (or be None, per spec)."""
+    # pylint: disable=no-member
+    c = PostgreSQLDatabaseConfiguration(
+        db="db",
+        user="user",
+        password="password",
+        namespace=None,
+    )
+    # Decide and assert the intended behavior here:
+    # e.g., assert c.namespace is None  # or "public"

But as-is, the new and updated tests already validate the primary namespace use cases.

Also applies to: 34-49

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bb7da0c and 35f9f15.

📒 Files selected for processing (5)
  • src/quota/connect_pg.py (2 hunks)
  • tests/unit/models/config/test_dump_configuration.py (5 hunks)
  • tests/unit/models/config/test_postgresql_database_configuration.py (1 hunks)
  • tests/unit/quota/test_connect_pg.py (2 hunks)
  • tests/unit/quota/test_quota_limiter_factory.py (6 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • tests/unit/quota/test_quota_limiter_factory.py
  • tests/unit/quota/test_connect_pg.py
  • tests/unit/models/config/test_dump_configuration.py
🧰 Additional context used
📓 Path-based instructions (3)
src/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

src/**/*.py: Use absolute imports for internal modules in LCS project (e.g., from auth import get_auth_dependency)
All modules must start with descriptive docstrings explaining their purpose
Use logger = logging.getLogger(__name__) pattern for module logging
All functions must include complete type annotations for parameters and return types, using modern syntax (str | int) and Optional[Type] or Type | None
All functions must have docstrings with brief descriptions following Google Python docstring conventions
Function names must use snake_case with descriptive, action-oriented names (get_, validate_, check_)
Avoid in-place parameter modification anti-patterns; return new data structures instead of modifying input parameters
Use async def for I/O operations and external API calls
All classes must include descriptive docstrings explaining their purpose following Google Python docstring conventions
Class names must use PascalCase with descriptive names and standard suffixes: Configuration for config classes, Error/Exception for exceptions, Resolver for strategy patterns, Interface for abstract base classes
Abstract classes must use ABC with @abstractmethod decorators
Include complete type annotations for all class attributes in Python classes
Use import logging and module logger pattern with standard log levels: debug, info, warning, error

Files:

  • src/quota/connect_pg.py
tests/{unit,integration}/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

tests/{unit,integration}/**/*.py: Use pytest for all unit and integration tests; do not use unittest framework
Unit tests must achieve 60% code coverage; integration tests must achieve 10% coverage

Files:

  • tests/unit/models/config/test_postgresql_database_configuration.py
tests/**/*.py

📄 CodeRabbit inference engine (CLAUDE.md)

Use pytest-mock with AsyncMock objects for mocking in tests

Files:

  • tests/unit/models/config/test_postgresql_database_configuration.py
🧬 Code graph analysis (2)
src/quota/connect_pg.py (1)
src/models/config.py (1)
  • config (324-341)
tests/unit/models/config/test_postgresql_database_configuration.py (1)
src/models/config.py (1)
  • PostgreSQLDatabaseConfiguration (176-260)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Konflux kflux-prd-rh02 / lightspeed-stack-on-pull-request

@tisnik tisnik merged commit be36924 into lightspeed-core:main Dec 15, 2025
19 of 25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant