Fix incorrect deprecation warnings on defaults (#348)

This change ensures that deprecation warnings are only raised when
either a deprecated field is explicitly set or a deprecated message is
initialised.

Resolves: #347
This commit is contained in:
Arun Babu Neelicattu
2022-03-12 00:36:14 +01:00
committed by GitHub
parent 9c1bf25304
commit 69f4192341
7 changed files with 65 additions and 39 deletions

View File

@@ -1,4 +1,6 @@
{
"v": 10,
"message": {
"value": "hello"
},
"value": 10
}

View File

@@ -4,8 +4,11 @@ package deprecated;
// Some documentation about the Test message.
message Test {
// Some documentation about the value.
option deprecated = true;
int32 v = 1 [deprecated=true];
Message message = 1 [deprecated=true];
int32 value = 2;
}
message Message {
option deprecated = true;
string value = 1;
}

View File

@@ -1,4 +0,0 @@
{
"v": 10,
"value": 10
}

View File

@@ -1,10 +0,0 @@
syntax = "proto3";
package deprecated_field;
// Some documentation about the Test message.
message Test {
// Some documentation about the value.
int32 v = 1 [deprecated=true];
int32 value = 2;
}

View File

@@ -1,26 +1,42 @@
import warnings
import pytest
from tests.output_betterproto.deprecated import Test as DeprecatedMessageTest
from tests.output_betterproto.deprecated_field import Test as DeprecatedFieldTest
from tests.output_betterproto.deprecated import Message, Test
@pytest.fixture
def message():
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
return Message(value="hello")
def test_deprecated_message():
with pytest.deprecated_call():
DeprecatedMessageTest(value=10)
with pytest.warns(DeprecationWarning) as record:
Message(value="hello")
assert len(record) == 1
assert str(record[0].message) == f"{Message.__name__} is deprecated"
def test_deprecated_message_with_deprecated_field():
def test_message_with_deprecated_field(message):
with pytest.warns(DeprecationWarning) as record:
Test(message=message, value=10)
assert len(record) == 1
assert str(record[0].message) == f"{Test.__name__}.message is deprecated"
def test_message_with_deprecated_field_not_set(message):
with pytest.warns(None) as record:
DeprecatedMessageTest(v=10, value=10)
assert len(record) == 2
Test(value=10)
assert not record
def test_message_with_deprecated_field_not_set_default(message):
with pytest.warns(None) as record:
_ = Test(value=10).message
def test_deprecated_field_warning():
with pytest.deprecated_call():
DeprecatedFieldTest(v=10, value=10)
def test_deprecated_field_no_warning():
with pytest.warns(None) as record:
DeprecatedFieldTest(value=10)
assert not record