🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Make an `@overload`ed function from `load_schema` (#625)
Currently
Otherwise it needs extra params:
django-modern-rest/dmr/openapi/mappers/schema_loader.py
Lines 21 to 28 in 6c06cd9
This needs to be an overload.
This is a very easy task :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Make an `@overload`ed function from `load_schema` (#625)
Currently
load_schema can accept just a single argument if should_generate_examples is False.Otherwise it needs extra params:
django-modern-rest/dmr/openapi/mappers/schema_loader.py
Lines 21 to 28 in 6c06cd9
This needs to be an overload.
This is a very easy task :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Support django's `i18n` for translation (#426)
All our user-facing texts must use django's i18n.
We will only provide en-us translation for now. Later more can be added if needed.
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Support django's `i18n` for translation (#426)
All our user-facing texts must use django's i18n.
We will only provide en-us translation for now. Later more can be added if needed.
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Formalize our CDN / static files support for OpenAPI renderers (#678)
I think that we should be able to configure: do we want to use local static files, served by django for OpenAPI renderers and interactive APIs, or should we use CDN for this.
Currently:
• Swagger uses local static files
• Scalar / Redoc use CDNs
Plan:
1. Introduce
2. Only when some lib has this explicit setting, we should use the CDN. Otherwise, they should use local static files which should be copied to
3. We need to document the EXACT versions we have bundleded in our static files
4. We need to copy their licenses as well, not just static files. Because we take their code / build result. They can go to our
#enhancement #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
📝 Formalize our CDN / static files support for OpenAPI renderers (#678)
I think that we should be able to configure: do we want to use local static files, served by django for OpenAPI renderers and interactive APIs, or should we use CDN for this.
Currently:
• Swagger uses local static files
• Scalar / Redoc use CDNs
Plan:
1. Introduce
openapi_static_cdn: {'scalar': 'https://cdn_url.com'} option, where we can specify when these libs should use CDN2. Only when some lib has this explicit setting, we should use the CDN. Otherwise, they should use local static files which should be copied to
dmr3. We need to document the EXACT versions we have bundleded in our static files
4. We need to copy their licenses as well, not just static files. Because we take their code / build result. They can go to our
LICENSE.md at the very bottom, specify why it is there#enhancement #good_first_issue #help_wanted #openapi #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Make an `@overload` from `SchemaGenerator.__call__` (#679)
This code right now is not ideal:
django-modern-rest/dmr/openapi/generators/schema.py
Lines 22 to 31 in 8917dd3
Because when
While it is
This needs to be an
This is a very easy task for first-timers only :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Make an `@overload` from `SchemaGenerator.__call__` (#679)
This code right now is not ideal:
django-modern-rest/dmr/openapi/generators/schema.py
Lines 22 to 31 in 8917dd3
Because when
skip_registration=True, we know that we return a Schema object only.While it is
skip_registration=False we can return Schema | Reference.This needs to be an
@overloaded function with correct return types.This is a very easy task for first-timers only :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Add `llms.txt` and `llms-full.txt` (#3619)
Let's add
It will generate
Plugin: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L72
Configuration: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L256-L258
#help_wanted #levelstarter #documentation #good_first_issue #wemake_python_styleguide #wps
sent via relator
📝 Add `llms.txt` and `llms-full.txt` (#3619)
Let's add
sphinx_llms_txt extension for the WPS: https://sphinx-llms-txt.readthedocs.io/en/latest/It will generate
llms.txt and llms-full.txtPlugin: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L72
Configuration: https://github.com/wemake-services/django-modern-rest/blob/048bfa4e19f897a6ca9fbae63af14df56882b991/docs/conf.py#L256-L258
#help_wanted #levelstarter #documentation #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Integrate property-based `schemathesis` tests for routes that require `jwt` auth (#687)
We use
But, right now it does not not have any information about how it can get our JWT token to test protected APIs. This is a downside of our setup.
So, what should we do?
1. We should add a dynamic auth class for the jwt auth: https://schemathesis.readthedocs.io/en/stable/guides/auth/#dynamic-token-authentication
2. Next, modify all controllers' bodies in https://github.com/wemake-services/django-modern-rest/blob/master/django_test_app/server/apps/jwt_auth/views.py to raise an error
3. Test that
4. Revert
This is going to be interesing!
Refs schemathesis/schemathesis#3620
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Integrate property-based `schemathesis` tests for routes that require `jwt` auth (#687)
We use
schemathesis to run property-based tests on our API: https://github.com/wemake-services/django-modern-rest/blob/master/tests/test_integration/test_openapi/test_schema.pyBut, right now it does not not have any information about how it can get our JWT token to test protected APIs. This is a downside of our setup.
So, what should we do?
1. We should add a dynamic auth class for the jwt auth: https://schemathesis.readthedocs.io/en/stable/guides/auth/#dynamic-token-authentication
2. Next, modify all controllers' bodies in https://github.com/wemake-services/django-modern-rest/blob/master/django_test_app/server/apps/jwt_auth/views.py to raise an error
3. Test that
schemathsis can successfully log in and find these failure4. Revert
views.py changes and ensure that now all tests passThis is going to be interesing!
Refs schemathesis/schemathesis#3620
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
❤1
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Deploy example application somewhere (#691)
We have an example Django app that we can deploy somewhere: https://github.com/wemake-services/django-modern-rest/tree/master/django_test_app
So, users would have a real life application to test and interact with.
I propose finding a service that:
• Is free for our case
• Can support deployments from GitHub Actions, so we can do that in CI as well
• Provides some kind of a permanent link, so we can share it
• Does not require complex deployment strategy
Like PythonAnywhere or Heroku or Vercel, etc.
Any help is appreciated.
#documentation #enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Deploy example application somewhere (#691)
We have an example Django app that we can deploy somewhere: https://github.com/wemake-services/django-modern-rest/tree/master/django_test_app
So, users would have a real life application to test and interact with.
I propose finding a service that:
• Is free for our case
• Can support deployments from GitHub Actions, so we can do that in CI as well
• Provides some kind of a permanent link, so we can share it
• Does not require complex deployment strategy
Like PythonAnywhere or Heroku or Vercel, etc.
Any help is appreciated.
#documentation #enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Translate `django-modenr-rest` to your native language! (#718)
Docs: https://docs.djangoproject.com/en/6.0/topics/i18n/
How to do it?
1. Run
2. Run
3. Translate the new file created in
4. Run
5. Done! You are awesome, submit the PR :)
We welcome all contributions!
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Translate `django-modenr-rest` to your native language! (#718)
Docs: https://docs.djangoproject.com/en/6.0/topics/i18n/
How to do it?
1. Run
poetry install --all-groups --all-extras2. Run
poetry run django-admin makemessages -l YOUR_LOCALE, for example: poetry run django-admin makemessages -l ru_RU, full list of locales: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes3. Translate the new file created in
dmr/locale/YOUR_LOCALE/LC_MESSAGES/django.po4. Run
poetry run django-admin compilemessages5. Done! You are awesome, submit the PR :)
We welcome all contributions!
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
Находки в опенсорсе: Python
🚀 New issue to wemake-services/django-modern-rest by @sobolevn 📝 Translate `django-modenr-rest` to your native language! (#718) Docs: https://docs.djangoproject.com/en/6.0/topics/i18n/ How to do it? 1. Run poetry install --all-groups --all-extras 2. Run…
задача очень большая, языков много! подключайтесь :)
Находки в опенсорсе: Python pinned «🚀 New issue to wemake-services/django-modern-rest by @sobolevn 📝 Translate `django-modenr-rest` to your native language! (#718) Docs: https://docs.djangoproject.com/en/6.0/topics/i18n/ How to do it? 1. Run poetry install --all-groups --all-extras 2. Run…»
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Support `openapi.yaml` (#745)
Litestar supports
It should be only available if
Everything else should be identical to
This is a rather easy task, so new contributors are very welcome!
#documentation #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Support `openapi.yaml` (#745)
Litestar supports
openapi.yaml view, so should we: https://docs.litestar.dev/latest/usage/openapi/ui_plugins.htmlIt should be only available if
msgspec is installed, it can dump yaml with msgspec.yaml.Everything else should be identical to
openapi.json view.This is a rather easy task, so new contributors are very welcome!
#documentation #good_first_issue #help_wanted #django_modern_rest
sent via relator
🔥1
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Test `Controller[BaseSerializer]` corner case (#749)
Currently we don't test that
It must accept subclasses for
We need:
• a test case here https://github.com/wemake-services/django-modern-rest/blob/master/tests/test_unit/test_controllers/test_extend_controller.py
• a possible fix to raise an error when
django-modern-rest/dmr/controller.py
Lines 157 to 164 in acb9c17
This is a very easy task, so new contributors are very welcome!
#bug #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Test `Controller[BaseSerializer]` corner case (#749)
Currently we don't test that
Controller[BaseSerializer] is not a valid way of creating a controller class.It must accept subclasses for
BaseSerializer, but not BaseSerializer itself.We need:
• a test case here https://github.com/wemake-services/django-modern-rest/blob/master/tests/test_unit/test_controllers/test_extend_controller.py
• a possible fix to raise an error when
BaseSerializer is given to a controller here:django-modern-rest/dmr/controller.py
Lines 157 to 164 in acb9c17
This is a very easy task, so new contributors are very welcome!
#bug #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Support `Path` with `*args` (#754)
Right now
However, parsing from
django-modern-rest/dmr/components.py
Lines 655 to 662 in b3f9c08
What should we do instead?
1. When
1. We would return
2. Test this with unnamed
3. Test this in
4. Document this feature in
5. Provide an example in
6. Provide a changelog entry
7. Remove
Contributions are welcome! This is an intermediate level task :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Support `Path` with `*args` (#754)
Right now
Path component only supports parsing from request.kwargs. Which is like 99% of cases.However, parsing from
request.args is not supported:django-modern-rest/dmr/components.py
Lines 655 to 662 in b3f9c08
What should we do instead?
1. When
request.args is provided we should require models like:>>> import pydantic
>>> class UserId(pydantic.BaseModel):
... user_id: int
>>> PathModel = pydantic.RootModel[tuple[tuple[int, ...], UserId]]
>>> PathModel.model_validate((('1', '2', '3'), {'user_id': 10}))
RootModel[tuple[tuple[int, ...], UserId]](root=((1, 2, 3), UserId(user_id=10)))
1. We would return
tuple[Args, Kwargs] from this component if request.args is set2. Test this with unnamed
re_path urls https://docs.djangoproject.com/en/6.0/topics/http/urls/#using-unnamed-regular-expression-groups3. Test this in
tests/test_unit/test_components/test_path.py4. Document this feature in
docs/pages/components/path.rst5. Provide an example in
docs/examples/components/path_args.py and include it to path.rst6. Provide a changelog entry
7. Remove
_UNNAMED_PATH_PARAMS_MSG and all translations of this string, recompile all translations with make translationsContributions are welcome! This is an intermediate level task :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Use the latest django version by default (#759)
Currently we use
django-modern-rest/pyproject.toml
Line 77 in bea5f2d
But, we need to use the latest one. Which is
Also, we would need to change this CI job to use
django-modern-rest/.github/workflows/test.yml
Lines 71 to 78 in bea5f2d
#good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Use the latest django version by default (#759)
Currently we use
5.2 by default:django-modern-rest/pyproject.toml
Line 77 in bea5f2d
But, we need to use the latest one. Which is
6.0.Also, we would need to change this CI job to use
5.2 instead:django-modern-rest/.github/workflows/test.yml
Lines 71 to 78 in bea5f2d
#good_first_issue #help_wanted #django_modern_rest
sent via relator
❤1
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Provide our own `settings` fixture (#760)
When using
However, we have
So, let's add a new fixture to
Also, remove all
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Provide our own `settings` fixture (#760)
When using
settings fixture from pytest-django we frequently change them.However, we have
dmr_clean_settings fixture, which should be use when we touch our own settings.So, let's add a new fixture to
dmr_pytest.py which will return unchanged settings: LazySettings, but will also use dmr_clean_settings.Also, remove all
dmr_clean_settings from our own tests, where settings is used.#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Provide `dmr.cookies.set_cookies` helper function (#773)
Currently we have two places where we duplicate this code:
django-modern-rest/dmr/streaming/controller.py
Lines 172 to 178 in a6bc356
and
django-modern-rest/dmr/response.py
Lines 256 to 259 in a6bc356
So, it can probably be useful to others as well.
Let's move this to
Also, document it in
This is a very easy task for new contributors.
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Provide `dmr.cookies.set_cookies` helper function (#773)
Currently we have two places where we duplicate this code:
django-modern-rest/dmr/streaming/controller.py
Lines 172 to 178 in a6bc356
and
django-modern-rest/dmr/response.py
Lines 256 to 259 in a6bc356
So, it can probably be useful to others as well.
Let's move this to
cookies.py as a public helper function.Also, document it in
public-api.rstThis is a very easy task for new contributors.
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Test and declare officail `NamedTuple` support (#774)
Here's the code:
As we can see,
1. Add a test case to
2. Add a doc example here https://django-modern-rest.readthedocs.io/en/latest/pages/getting-started.html#showcase
3. Add a changelog entry, that it is now officially supported
We welcome new contributors :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Test and declare officail `NamedTuple` support (#774)
Here's the code:
>>> from typing import NamedTuple
>>> class A(NamedTuple):
... x: int
... y: int
...
>>> import pydantic
>>> pydantic.TypeAdapter(A).validate_python({'x': 1, 'y': 2})
A(x=1, y=2)
>>> pydantic.TypeAdapter(A).validate_python({'x': 1, 'y': 'a'})
Traceback (most recent call last):
File "<python-input-11>", line 1, in <module>
pydantic.TypeAdapter(A).validate_python({'x': 1, 'y': 'a'})
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/Users/sobolev/Desktop/django-modern-rest/.venv/lib/python3.13/site-packages/pydantic/type_adapter.py", line 441, in validate_python
return self.validator.validate_python(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
object,
^^^^^^^
...<6 lines>...
by_name=by_name,
^^^^^^^^^^^^^^^^
)
^
pydantic_core._pydantic_core.ValidationError: 1 validation error for call[A]
y
Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='a', input_type=str]
For further information visit https://errors.pydantic.dev/2.12/v/int_parsing
As we can see,
NamedTuple models work well with pydantic. So, here's what we need to do:1. Add a test case to
test_plugins/test_pydantic that it works with NamedTuple2. Add a doc example here https://django-modern-rest.readthedocs.io/en/latest/pages/getting-started.html#showcase
3. Add a changelog entry, that it is now officially supported
We welcome new contributors :)
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🔥1
🚀 New issue to ag2ai/faststream by @hmvp
📝 Bug: topic patterns are not correctly documented (#2804)
Describe the bug
When using a pattern for a kafka topic the generated asyncapi spec (and docs) does not include that handler
How to reproduce
With something along the lines of:
Expected behavior
The subscriber is included in the asyncapi spec and docs. As far as I can see the asyncapi spec actually allows for this even when using Path variables.
Observed behavior
The asyncapi docs don't contain that subscriber.
Screenshots
Environment
Running FastStream 0.6.7 with CPython 3.14.0 on Linux
Additional context
#bug #good_first_issue #faststream #ag2ai
sent via relator
📝 Bug: topic patterns are not correctly documented (#2804)
Describe the bug
When using a pattern for a kafka topic the generated asyncapi spec (and docs) does not include that handler
How to reproduce
With something along the lines of:
broker = KafkaBroker(...)
router = KafkaRouter()
@router.subscriber(pattern="some.wildcard.topic.*")
def handle_event(event: Event): ...
broker.include_router(router)
app = AsgiFastStream(
broker,
asyncapi_path="/docs",
)
Expected behavior
The subscriber is included in the asyncapi spec and docs. As far as I can see the asyncapi spec actually allows for this even when using Path variables.
Observed behavior
The asyncapi docs don't contain that subscriber.
Screenshots
Environment
Running FastStream 0.6.7 with CPython 3.14.0 on Linux
Additional context
#bug #good_first_issue #faststream #ag2ai
sent via relator
🚀 New issue to ag2ai/faststream by @dumpler
📝 Bug: Logger not properly passed to Confluent Kafka Producer and AdminClient (#2691)
Describe the bug
There are two related issues with logger configuration in the Confluent Kafka components:
1.
Late Logger Setup in AsyncConfluentProducer
In faststream/confluent/helpers/client.py at line 46, the Producer object is created before the _setup() method is called for loger_state. This results in the Producer receiving a NoSetLoggerObject instead of the intended logger passed during initialization.
2.
Missing Logger in AdminClient
The AdminClient in AdminService does not accept a logger parameter, even though it should. Currently, only the configuration is passed, leaving the AdminClient without proper logging.
How to reproduce
Include source code:
Expected behavior
1. The Producer in AsyncConfluentProducer should use the logger passed to KafkaRouter.
2. The AdminClient should inherit the same logger as other components.
Observed behavior
1. The Producer uses NoSetLoggerObject instead of the provided logger.
2. The AdminClient lacks logger configuration, leading to potential silent failures or inadequate logging.
Environment
Running FastStream 0.6.3 with CPython 3.13.1 on Linux
#bug #good_first_issue #faststream #ag2ai
sent via relator
📝 Bug: Logger not properly passed to Confluent Kafka Producer and AdminClient (#2691)
Describe the bug
There are two related issues with logger configuration in the Confluent Kafka components:
1.
Late Logger Setup in AsyncConfluentProducer
In faststream/confluent/helpers/client.py at line 46, the Producer object is created before the _setup() method is called for loger_state. This results in the Producer receiving a NoSetLoggerObject instead of the intended logger passed during initialization.
2.
Missing Logger in AdminClient
The AdminClient in AdminService does not accept a logger parameter, even though it should. Currently, only the configuration is passed, leaving the AdminClient without proper logging.
How to reproduce
Include source code:
import logging
import uvicorn
from fastapi import FastAPI
from faststream.confluent.fastapi import KafkaRouter
logger = logging.getLogger("faststream")
router = KafkaRouter(
bootstrap_servers="kafka:9092",
enable_idempotence=True,
allow_auto_create_topics=False,
schema_url="/asyncapi",
include_in_schema=True,
logger=logger,
)
app = FastAPI()
app.include_router(router)
uvicorn.run(app, host="0.0.0.0", port=8000)
Expected behavior
1. The Producer in AsyncConfluentProducer should use the logger passed to KafkaRouter.
2. The AdminClient should inherit the same logger as other components.
Observed behavior
1. The Producer uses NoSetLoggerObject instead of the provided logger.
2. The AdminClient lacks logger configuration, leading to potential silent failures or inadequate logging.
Environment
Running FastStream 0.6.3 with CPython 3.13.1 on Linux
#bug #good_first_issue #faststream #ag2ai
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Add docs and example about `django-health-check` integration (#831)
One can use https://github.com/codingjoe/django-health-check for health checks.
No special integration from our side is required.
This information can be added here: https://github.com/wemake-services/django-modern-rest/blob/master/docs/pages/integrations.rst
#documentation #enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Add docs and example about `django-health-check` integration (#831)
One can use https://github.com/codingjoe/django-health-check for health checks.
No special integration from our side is required.
This information can be added here: https://github.com/wemake-services/django-modern-rest/blob/master/docs/pages/integrations.rst
#documentation #enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Support `orjson` as a possible backend for `JsonParser` / `JsonRenderer` (#857)
Currently we always use
django-modern-rest/dmr/parsers.py
Lines 132 to 134 in 69822ff
But, we can make this module customizable. We can pass
Something like:
And later
This would need multiple test cases: install
And we can document that with an example in the
#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
📝 Support `orjson` as a possible backend for `JsonParser` / `JsonRenderer` (#857)
Currently we always use
json as a module in JsonParser and JsonRenderer:django-modern-rest/dmr/parsers.py
Lines 132 to 134 in 69822ff
But, we can make this module customizable. We can pass
orjson module there, since it also has a similar API.Something like:
class JsonParser(Parser):
__slots__ = ('_json_module', ...)
def __init__(self, json_module: _JsonModule = json, ...) -> None:
self._json_module = json_module
And later
self._json_module.loads(...)This would need multiple test cases: install
orjson as unit-test dependency and add unit tests for this new renderer / parser.And we can document that with an example in the
integrations.rst docs.#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator