Skip to content

Commit

Permalink
Add warnings when calling deprecated method (#596)
Browse files Browse the repository at this point in the history
* Add test

* To run the workflow

* Fix import

* Format

* Add warning

* Fix indentation

* Test deprecated method

* More test

* Format

* Add import if needed

---------

Co-authored-by: Adrien Vannson <[email protected]>
  • Loading branch information
AdrienVannson and Adrien Vannson authored Aug 14, 2024
1 parent f96f516 commit 4e9a17c
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/betterproto/plugin/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,8 +275,21 @@ def input_filenames(self) -> Iterable[str]:
@property
def python_module_imports(self) -> Set[str]:
imports = set()

has_deprecated = False
if any(m.deprecated for m in self.messages):
has_deprecated = True
if any(x for x in self.messages if any(x.deprecated_fields)):
has_deprecated = True
if any(
any(m.proto_obj.options.deprecated for m in s.methods)
for s in self.services
):
has_deprecated = True

if has_deprecated:
imports.add("warnings")

if self.builtins_import:
imports.add("builtins")
return imports
Expand Down
4 changes: 4 additions & 0 deletions src/betterproto/templates/template.py.j2
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ class {{ service.py_name }}Stub(betterproto.ServiceStub):
{% if method.comment %}
{{ method.comment }}

{% endif %}
{% if method.proto_obj.options.deprecated %}
warnings.warn("{{ service.py_name }}.{{ method.py_name }} is deprecated", DeprecationWarning)

{% endif %}
{% if method.server_streaming %}
{% if method.client_streaming %}
Expand Down
7 changes: 7 additions & 0 deletions tests/inputs/deprecated/deprecated.proto
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,10 @@ message Message {
option deprecated = true;
string value = 1;
}

message Empty {}

service TestService {
rpc func(Empty) returns (Empty);
rpc deprecated_func(Empty) returns (Empty) { option deprecated = true; };
}
19 changes: 19 additions & 0 deletions tests/test_deprecated.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import pytest

from tests.mocks import MockChannel
from tests.output_betterproto.deprecated import (
Empty,
Message,
Test,
TestServiceStub,
)


Expand Down Expand Up @@ -43,3 +46,19 @@ def test_message_with_deprecated_field_not_set_default(message):
_ = Test(value=10).message

assert not record


@pytest.mark.asyncio
async def test_service_with_deprecated_method():
stub = TestServiceStub(MockChannel([Empty(), Empty()]))

with pytest.warns(DeprecationWarning) as record:
await stub.deprecated_func(Empty())

assert len(record) == 1
assert str(record[0].message) == f"TestService.deprecated_func is deprecated"

with pytest.warns(None) as record:
await stub.func(Empty())

assert not record

0 comments on commit 4e9a17c

Please sign in to comment.