Находки в опенсорсе: Python
985 subscribers
4 photos
221 links
Легкие задачки в опенсорсе из мира Python

Чат: @opensource_findings_chat
Download Telegram
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Create `json_dumps` internal helper (#383)


We have to dump json in some internal places of our code:

django-modern-rest/django_modern_rest/openapi/renderers/base.py

Lines 16 to 31 in 9e6132e

But, right now we don't use msgspec there if it is available. But, we should :)
So, let's create a new internal/json file and make a helper there. Then use it in base.py


#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
Необходимо добавить метаинформацию в новые исключения, которые кидаются при построенни графа зависимостей и были добавлены в связи с реализацией новой фичи активации провайдеров.

https://github.com/reagento/dishka/issues/643

#dishka
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Test that `HttpResponseRedirect` works and provide `APIRedirect` exception (#107)


We have a TODO item for redirects:

django-modern-rest/django_modern_rest/controller.py

Line 187 in be877dc

DRF uses regular HttpResonseRedirect and it seems to work well.
We need to test that we also can return HttpResponseRedirect in @validate endpoints.

In @modify endpoints we should better provide a helper called APIRedirect which should be a subclass of APIError with location field.

See the original implementation of HttpRedirectResponse here https://github.com/django/django/blob/ca3e0484ef31d13053af6a9d50667813e22fc282/django/http/response.py#L628-L653

Make sure that preserve_request also works.

@Peopl3s are you interested? This is a nice beginner-friendly task :)


#enhancement #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Negotiate response renderer as soon as possible (#402)


I think that it would be fair not to do anything if we can't find a renderer for the response.
It is better than we do it right now, when we finish all the business logic, just to find out that we can't show a proper response.

We should move response_negotiator call before the actual endpoint execution.
Maybe here?

django-modern-rest/django_modern_rest/endpoint.py

Lines 148 to 150 in 697c348

We should also add a test case that endpoint logic is not executed if there's something wrong with the negotiation.


#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Fix `Sequence[SyncAuth | AsyncAuth]` to be `Sequence[SyncAuth] | Sequence[AsyncAuth]` (#408)


I've made a mistake in modify and validate typing:

django-modern-rest/django_modern_rest/endpoint.py

Line 411 in 65d7638

I used Sequence[SyncAuth | AsyncAuth] instead of Sequence[SyncAuth] | Sequence[AsyncAuth].
Here's the difference: https://mypy-play.net/?mypy=latest&python=3.12&flags=strict&gist=487fad8c5bdaa2e7d2b4e84a3fa25a6d

We need to fix the typings of @modify and @validate and add a typesafety/ test that providing both sync and async auth at the same time is a type error.

This issue is created for people who make their first (!) contribution :)
Please, let them feel welcome!


#bug #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 False positive for `WPS430` with whitelisted name (#3589)


def wrap_handler(
method: _MethodSyncHandler | _MethodAsyncHandler,
) -> SyncErrorHandlerT | AsyncErrorHandlerT:
if inspect.iscoroutinefunction(method):

@wraps(method)
async def decorator(
endpoint: 'Endpoint',
controller: 'Controller[BaseSerializer]',
exc: Exception,
) -> HttpResponse:
return await method( # type: ignore[no-any-return]
controller.active_blueprint,
endpoint,
controller,
exc,
)

else:

@wraps(method)
def decorator(
endpoint: 'Endpoint',
controller: 'Controller[BaseSerializer]',
exc: Exception,
) -> HttpResponse:
return method( # type: ignore[return-value]
controller.active_blueprint,
endpoint,
controller,
exc,
)

return decorator

This code falsy raises two WPS430 violations.

  69:9     WPS430 Found nested function: factory
async def factory(
^

84:9 WPS430 Found nested function: factory
def factory(
^

But, the name is correct. decorator name is in whitelist of names. This is a false positive.
We need to fix it and add a test case.


#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
Мои друзья делают ярмарку опенсорс проектов: https://forms.phdays.com/yarmarka-proektov_2026

Можно будет кратко на сцене рассказать про свой проект и показать его всем желающим.
Подавайте заявки, если интересно :)
👍3👀1
Находки в опенсорсе: Python pinned «Мои друзья делают ярмарку опенсорс проектов: https://forms.phdays.com/yarmarka-proektov_2026 Можно будет кратко на сцене рассказать про свой проект и показать его всем желающим. Подавайте заявки, если интересно :)»
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Support conditional parsing in components (#453)


Right now we support conditional return types:

django-modern-rest/django_modern_rest/negotiation.py

Lines 212 to 228 in 35051cd

But, incomming Body / Headers / Query can also be conditional, depending on the content-type.
Should we reuse the same feature for parsing?

OpenAPI fully supports this feature:

      requestBody:
description: Optional description in *Markdown*
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/Pet"
application/xml:
schema:
$ref: "#/components/schemas/Pet"

For people who want to solve this: this is not easy!
Here's how the process should look like:

1. You present the idea and prototype implementation
2. We iterate on the design (several times maybe)
3. I approve the design
4. We can then continue with the implementation :)

#enhancement #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Add `:language: python` to every single `.. literalinclude` (#458)


Sometimes without :language: python sphinx does not render code correctly. Example:

🖼️Image

This happens because .. literalinclude there does not have :language: python

django-modern-rest/docs/pages/using-controller.rst

Lines 171 to 178 in d654770

We need to add it everywhere, where it is missing.


#documentation #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 JWT token blacklist app: design conditional apps (#462)


We need to design how we can add conditional django apps that have models to the framework.
For example, right now we can add an app to blacklist some jwt tokens.

What's interesting about that?

1. We need to design this app in a way that it is not required by default, with no visible parts
2. We need to design it that it will be very easy to install and use. For example: it should provide a mixin class that can be used together with JWTSyncAuth / JWTAsyncAuth and a pre-existing common subclass

So, usage will look something like:

from django_modern_rest.some.place.for.app.models import BlacklistedJWTToken

class BlacklistMixin:
def check_auth(self, user: 'AbstractBaseUser', token: JWTToken) -> None:
super().check_user()
if BlacklistedJWTToken.objects.filter(jti=token.jti).exists():
# Token was blacklisted:
raise NotAuthenticatedError

We use jti to identify tokens, as other jwt's do.
It is now possible after #461

Sources of inspiration:

https://github.com/jazzband/djangorestframework-simplejwt/blob/master/rest_framework_simplejwt/token_blacklist/models.py
https://django-rest-framework-simplejwt.readthedocs.io/en/latest/blacklist_app.html

#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Add `cookies` support to `APIError` (#465)


Right now we support cookies in our API:

django-modern-rest/django_modern_rest/response.py

Lines 78 to 85 in ddfe907

But, APIError does not allow to set any cookies:

django-modern-rest/django_modern_rest/response.py

Lines 64 to 75 in ddfe907

This is unfortunate. We need to be able to do anything we can do with a regular response with APIError.

This is a really easy issue for first-timers, welcome :)


#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Add unit tests for pagination (#484)


Right now we only test pagination in the doctests: https://github.com/wemake-services/django-modern-rest/blob/master/docs/examples/integrations/pagination.py

Let's add the same test to test_unit as well. Create new test_pagination folder and put it there.

This is a very easy task for entry-level controbutors :)


#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 `WPS617` false positive with keyword args (#3596)


self._media_by_precedence = sorted(
(
media_type
for parser in self._parsers.values()
if (media_type := MediaType(parser.content_type)).quality != 0
),
key=lambda media: (media.specificity, media.quality), # noqa: WPS617
reverse=True,
)

It says:

django_modern_rest/negotiation.py

52:17 WPS617 Found lambda assigned as an attribute
key=lambda media: (media.specificity, media.quality),
^

Which is clearly a bug, it is a named param, not an attribute.
PRs are welcome, this is easy to fix.


#bug #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @kondratevdev
📝 Enable `positive_data_acceptance` in `schemathesis` (#496)


At the moment, this check is disabled in the configuration.

We need to enable it (delete the line, because by default we have everything enabled) and fix the error that this check catches.


#enhancement #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/django-modern-rest by @sobolevn
📝 Add an option to rename schemas (#505)


Right now schemas are registered like regular python classes, their name is just type(...).__name__ we need a way to rename schemas in the openapi.

I propose adding __dmr_schema_name__ special attribute to do that.

This will also require a test case for the openapi.


#enhancement #good_first_issue #help_wanted #django_modern_rest
sent via relator
🚀 New issue to wemake-services/wemake-python-styleguide by @sobolevn
📝 Remove `WPS354` (#3601)


This rules has more problems that it solves:

1. Two yields and yield from are two different things
2. Async iterators cannot use yield from, but WPS354 still raises even in async def

So, it is time to remove this rule. I was wrong about that :(
See other rules with disabled_since attribute on how to disable a rule.


#feature #help_wanted #levelstarter #good_first_issue #wemake_python_styleguide #wps
sent via relator
🫡1
🚀 New issue to ag2ai/faststream by @yann-combarnous
📝 Bug: AsyncAPI documentation fails when Confluent uses oauth bearer authentication (#2774)


Describe the bug
When using Confluent Kafka with oauthbearer authentication, the generated AsyncAPI schema is:

 "securitySchemes":{"oauthbearer":{"type":"oauth2","$ref":""}}

An empty $ref: "" causes the AsyncAPI React component to attempt file resolution via readFile. This is a FastStream bug in schema generation.

How to reproduce
Include source code:

from faststream.confluent import KafkaBroker

broker = KafkaBroker(
config={ ...config... },
security=SASLOAuthBearer(use_ssl=True)
)
...

Expected behavior
AsyncAPI documentation is correctly generated.

Observed behavior
It fails with a file cannot be read error.

Screenshots
If applicable, attach screenshots to help illustrate the problem.

Environment
Running FastStream 0.6.5 with CPython 3.13.11 on Darwin

Additional context


#bug #good_first_issue #faststream #ag2ai
sent via relator