🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Flaky `test_empty_validate_responses` (#1588)
Link: https://github.com/wemake-services/django-modern-rest/actions/runs/36040317321/job/107770717079
The fix is very welcome!
#bug #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
📝 Flaky `test_empty_validate_responses` (#1588)
________________________ test_empty_validate_responses _________________________
settings = <pytest_django.fixtures.Settings object at 0x7f00e6dbba90>
def test_empty_validate_responses(settings: LazySettings) -> None:
"""Ensure that `EMPTY` on `validate_responses` raises."""
settings.DMR_SETTINGS = {
Settings.validate_responses: EMPTY,
}
> with pytest.raises(EndpointMetadataError, match='validate_responses'):
E AssertionError: Regex pattern did not match.
E Expected regex: 'validate_responses'
E Actual message: 'Settings validation failed'
Link: https://github.com/wemake-services/django-modern-rest/actions/runs/36040317321/job/107770717079
The fix is very welcome!
#bug #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 `_validate_throttling` check is a bad design :( (#1600)
This code
django-modern-rest/dmr/validation/endpoint_metadata.py
Lines 934 to 971 in 6649d05
knows a lot about specific backends for throttling. But, why do we do this in metadata validation? Why don't we create
Like we do for
django-modern-rest/dmr/parsers.py
Lines 47 to 58 in 6649d05
This way we can validate objects directly where they know how to self-validate.
#feature #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
📝 `_validate_throttling` check is a bad design :( (#1600)
This code
django-modern-rest/dmr/validation/endpoint_metadata.py
Lines 934 to 971 in 6649d05
knows a lot about specific backends for throttling. But, why do we do this in metadata validation? Why don't we create
.validate method in throttling (and auth just in case) objects instead?Like we do for
parser and renderer objects:django-modern-rest/dmr/parsers.py
Lines 47 to 58 in 6649d05
This way we can validate objects directly where they know how to self-validate.
#feature #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Incorrect Jones complexity for formatted strings (#3820)
These two lines:
•
•
have different Jones complexity.
They must not. It should be counted as:
• 1 per every
• As regular for all python expressions inside
• All string parts of fstring are counted as total of 1
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Incorrect Jones complexity for formatted strings (#3820)
These two lines:
•
tuple(f'/{pref.strip("/")}/' for pref in (prefix, *prefixes))•
tuple(f'/{pref.strip("/")}' for pref in (prefix, *prefixes)) (notice the missing / at the end)have different Jones complexity.
They must not. It should be counted as:
• 1 per every
{}• As regular for all python expressions inside
{}• All string parts of fstring are counted as total of 1
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 `Settings.throttling_allow_unsafe_cache` is a bad design (#1611)
After #1600 we moved the throttling validation to throttling classes.
So, there's no need for a global setting now. It must be removed and we must add
#feature #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
📝 `Settings.throttling_allow_unsafe_cache` is a bad design (#1611)
After #1600 we moved the throttling validation to throttling classes.
So, there's no need for a global setting now. It must be removed and we must add
allow_unsafe_cache parameter to _DjangoCache instead.#feature #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @vyhuholl
📝 Seeded OpenAPI examples of `datetime` and `time` change with the current time (#1632)
What's wrong?
Found while working on #1629. With
Two runs 3 seconds apart, both with
polyfactory generates these with Faker, and Faker's defaults end at the current time:
So a schema with such fields is never the same on two runs, even though the
How it should be?
The same
Used versions
Reproduced on c35128a.
OS information
macOS 27.0
#bug #good_first_issue #help_wanted #openapi #opensource_september #django_modern_rest
sent via relator
📝 Seeded OpenAPI examples of `datetime` and `time` change with the current time (#1632)
What's wrong?
Found while working on #1629. With
DMR_SETTINGS = {'openapi_examples_seed': 1} and the same PYTHONHASHSEED, examples of datetime and time fields are different on every run:class _Event(msgspec.Struct):
created_at: dt.datetime
day: dt.date
at: dt.time
duration: dt.timedelta
class _EventController(Controller[MsgspecSerializer]):
def get(self) -> _Event:
raise NotImplementedError
Two runs 3 seconds apart, both with
PYTHONHASHSEED=0:02:18:43 {"created_at": "2000-10-08T03:39:12.378838", "day": "2025-09-16", "at": "18:36:00.366279", "duration": "P0D"}
02:18:46 {"created_at": "2000-10-08T03:39:16.378838", "day": "2025-09-16", "at": "18:36:03.421377", "duration": "P0D"}
polyfactory generates these with Faker, and Faker's defaults end at the current time:
datetime uses date_time_between, which ends at "now", and time uses time_object, which picks a time between 1970 and now. The seed fixes the random part, but the range moves with the clock, so the value moves too. date uses date_this_decade, which ends at today, so it changes once a day.So a schema with such fields is never the same on two runs, even though the
seed_example_factory docstring says that seeding per build "keeps a schema reproducible on its own".How it should be?
The same
openapi_examples_seed should give the same examples at any time. _ExampleFactory in dmr/openapi/mappers/example.py can override get_provider_map() and give datetime, date and time fixed bounds instead of "now".timedelta could get a range there too: its examples are always P0D now, because time_delta() without end_datetime starts and ends at "now".Used versions
django-modern-rest 0.15.0, polyfactory 3.3.0, faker 40.39.0Reproduced on c35128a.
OS information
macOS 27.0
#bug #good_first_issue #help_wanted #openapi #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 `WPS235`: ignore imports from `typing` (#3824)
I can't limit the number of types I import from
We need to just ignore this module. And
#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 `WPS235`: ignore imports from `typing` (#3824)
I can't limit the number of types I import from
typing, I can't refactor types to use typing. prefix and import import typingWe need to just ignore this module. And
typing_extensions as well.#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @Izcarmt95
📝 OpenAPI: duplicated tags when both Router(tags=...) and @modify(tags=...) set the same tag (#1656)
When an operation has a tag in
Expected:
This looks related to the change for #1299, which now propagates router metadata to included routes.
• django-modern-rest 0.15.0
• Django 5.2, Python 3.13
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
AI disclaimer: an AI assistant was used only to help write this issue.
#bug #good_first_issue #help_wanted #openapi #opensource_september #django_modern_rest
sent via relator
📝 OpenAPI: duplicated tags when both Router(tags=...) and @modify(tags=...) set the same tag (#1656)
When an operation has a tag in
@modify(tags=...) and its Router has the same tag in Router(tags=...), the generated OpenAPI operation lists the tag twice. UIs like Scalar then show every operation twice, once per tag entry.from dmr import Controller, modify
from dmr.openapi import build_schema
from dmr.plugins.pydantic import PydanticSerializer
from dmr.routing import Router, path
class UserController(Controller[PydanticSerializer]):
@modify(tags=['Users'])
def get(self) -> str:
return 'ok'
users = Router('/users', [path('/all', UserController.as_view(), name='users')], tags=['Users'])
api = Router('api')
api.include(users, namespace='users')
schema = build_schema(api)
print(schema.paths['/api/users/all'].get.tags) # ['Users', 'Users']
Expected:
['Users']. The router tags and the endpoint tags should be merged without duplicates.This looks related to the change for #1299, which now propagates router metadata to included routes.
• django-modern-rest 0.15.0
• Django 5.2, Python 3.13
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
AI disclaimer: an AI assistant was used only to help write this issue.
#bug #good_first_issue #help_wanted #openapi #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @Izcarmt95
📝 Router.include() raises KeyError for a route with an empty pattern ('') (#1657)
Workaround: use an empty router prefix and write the full segment in each route (
• django-modern-rest 0.15.0 (it worked in 0.13.0, before
• Django 5.2, Python 3.13
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
AI disclaimer: an AI assistant was used only to help write this issue.
#bug #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
📝 Router.include() raises KeyError for a route with an empty pattern ('') (#1657)
Router.include() raises KeyError when the included router has a route with an empty pattern (path('', ...)), which is the usual way to mount a list endpoint at the router's prefix.from dmr import Controller
from dmr.plugins.pydantic import PydanticSerializer
from dmr.routing import Router, path
class UserListController(Controller[PydanticSerializer]):
def get(self) -> str:
return 'ok'
users = Router('/users', [path('', UserListController.as_view(), name='users')])
api = Router('api')
api.include(users, namespace='users') # KeyError: '/users'
File ".../dmr/routing.py", line 173, in include
router.metadata_for(original_path),
File ".../dmr/routing.py", line 217, in metadata_for
return self._path_metadata[pattern]
KeyError: '/users'
Router.__init__ stores the metadata of the empty route under '/users/' (normalized with original_prefix=''), but include() looks it up as '/users' (normalized with original_prefix=router.prefix). Routes with a non-empty pattern (path('/<id>', ...)) are fine.Workaround: use an empty router prefix and write the full segment in each route (
Router('', [path('/users', ...)])).• django-modern-rest 0.15.0 (it worked in 0.13.0, before
include() looked up the metadata)• Django 5.2, Python 3.13
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
AI disclaimer: an AI assistant was used only to help write this issue.
#bug #good_first_issue #help_wanted #opensource_september #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Improve `dmr` skill with `concrete_views` example (#1670)
We should state that using
Add this to the
#feature #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Improve `dmr` skill with `concrete_views` example (#1670)
We should state that using
concrete_views is better than implementing your own views that do not change anything.Add this to the
dmr skill.#feature #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Improve `dmr` skill with CSRF example (#1671)
Currently this example shows how to protect a view with CSRF:
django-modern-rest/dmr/.agents/skills/dmr/references/security.md
Lines 117 to 176 in 1cb33fb
However, there are better ways for CSRF protection, see
This example must show something else :)
#feature #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Improve `dmr` skill with CSRF example (#1671)
Currently this example shows how to protect a view with CSRF:
django-modern-rest/dmr/.agents/skills/dmr/references/security.md
Lines 117 to 176 in 1cb33fb
However, there are better ways for CSRF protection, see
csrf_exempt=False.This example must show something else :)
#feature #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Move skills into the `wemake_python_styleguide` folder (#3842)
https://library-skills.io requires skills to be in the source folder, see https://github.com/wemake-services/django-modern-rest/tree/master/dmr/.agents/skills
Let's move them there :)
#help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Move skills into the `wemake_python_styleguide` folder (#3842)
https://library-skills.io requires skills to be in the source folder, see https://github.com/wemake-services/django-modern-rest/tree/master/dmr/.agents/skills
Let's move them there :)
#help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Set `security=None` for concrete login views (#1719)
We already set
#bug #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
📝 Set `security=None` for concrete login views (#1719)
We already set
auth=None for them, but security= must also be disabled for the consistency.#bug #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
❤1
🚀 New issue to wemake-services/django-modern-rest by @joefefs
📝 None endpoints still document a JSON null response body. (#1733)
What's wrong?
For endpoints that returns nothing, the server correctly sends an empty body, but the schema describes that response as
Anything that trusts that schema (like an SDK generator) might try to read this null body as JSON and crash.
How it should be?
The response should NOT have a content key, only a
Used versions
• django-modern-rest 0.16.0
• Django 5.2.17
• Python 3.13.12
• pydantic 2.13.5
• msgspec 0.22.0
OS information
macOS 26.3.2
#bug #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
📝 None endpoints still document a JSON null response body. (#1733)
What's wrong?
For endpoints that returns nothing, the server correctly sends an empty body, but the schema describes that response as
application/json with a null schema.Anything that trusts that schema (like an SDK generator) might try to read this null body as JSON and crash.
How it should be?
The response should NOT have a content key, only a
{ "description": "No Content" } should suffice so that clients relying on the spec won't try to read a body that does not exist.Used versions
• django-modern-rest 0.16.0
• Django 5.2.17
• Python 3.13.12
• pydantic 2.13.5
• msgspec 0.22.0
OS information
macOS 26.3.2
#bug #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
🚀 New issue to fast-collections/fast-collections by @Khabib73
📝 Fix README fast-python button link to fast-collections (#185)
In the README, the fast-python button currently points to the wrong link. It should point to https://github.com/fast-collections instead.
#help_wanted #fast_collections
sent via relator
📝 Fix README fast-python button link to fast-collections (#185)
In the README, the fast-python button currently points to the wrong link. It should point to https://github.com/fast-collections instead.
#help_wanted #fast_collections
sent via relator
😁7