Skip to content

Commit ce18c82

Browse files
committed
Make code generator handle members where name cannot be converted back
Certain member names like `GetURL` will be converted to Python name `get_url` but when converted back it will become `GetUrl`. This will cause methods and properties with those names be unaccessible. However, method, properties and signals allow setting the D-Bus name instead of relying on auto conversion. Make code generator use those arguments where auto conversion does not produce equal names between D-Bus and Python. Reported by @nicomuns.
1 parent c6b3705 commit ce18c82

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

src/sdbus/dbus_common_elements.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
from .dbus_common_funcs import (
2626
_is_property_flags_correct,
27-
_method_name_converter,
2827
get_default_bus,
28+
snake_case_to_camel_case,
2929
)
3030
from .sd_bus_internals import is_interface_name_valid, is_member_name_valid
3131

@@ -122,8 +122,7 @@ def __init__(
122122
" it in to a tuple ('string', ) ?")
123123

124124
if method_name is None:
125-
method_name = ''.join(
126-
_method_name_converter(original_method.__name__))
125+
method_name = snake_case_to_camel_case(original_method.__name__)
127126

128127
try:
129128
assert is_member_name_valid(method_name), (
@@ -230,8 +229,7 @@ def __init__(self,
230229
flags: int,
231230
original_method: FunctionType):
232231
if property_name is None:
233-
property_name = ''.join(
234-
_method_name_converter(original_method.__name__))
232+
property_name = snake_case_to_camel_case(original_method.__name__)
235233

236234
try:
237235
assert is_member_name_valid(property_name), (
@@ -262,8 +260,7 @@ def __init__(self,
262260
flags: int,
263261
original_method: FunctionType):
264262
if signal_name is None:
265-
signal_name = ''.join(
266-
_method_name_converter(original_method.__name__))
263+
signal_name = snake_case_to_camel_case(original_method.__name__)
267264

268265
try:
269266
assert is_member_name_valid(signal_name), (

src/sdbus/dbus_common_funcs.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ def request_default_bus_name(
135135
return _DeprecationAwaitable()
136136

137137

138-
def _method_name_converter(python_name: str) -> Iterator[str]:
139-
char_iter = iter(python_name)
138+
def _snake_case_to_camel_case_gen(snake: str) -> Iterator[str]:
139+
char_iter = iter(snake)
140140
# Name starting with upper case letter
141141
try:
142142
first_char = next(char_iter)
@@ -158,6 +158,10 @@ def _method_name_converter(python_name: str) -> Iterator[str]:
158158
upper_next_one = True
159159

160160

161+
def snake_case_to_camel_case(snake: str) -> str:
162+
return "".join(_snake_case_to_camel_case_gen(snake))
163+
164+
161165
def _check_sync_in_async_env() -> bool:
162166
try:
163167
get_running_loop()

src/sdbus/interface_generator.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
from xml.etree.ElementTree import fromstring as etree_from_str
2525
from xml.etree.ElementTree import parse as etree_from_file
2626

27+
from .dbus_common_funcs import snake_case_to_camel_case
28+
2729
if TYPE_CHECKING:
2830
from collections.abc import Iterable, Iterator
2931
from typing import Literal, Optional, Union
@@ -317,6 +319,10 @@ def iter_sub_elements(self, element: Element) -> None:
317319
raise ValueError(
318320
'Uknown member annotation tag: ', tag)
319321

322+
@property
323+
def wants_rename(self) -> bool:
324+
return self.method_name != snake_case_to_camel_case(self.python_name)
325+
320326

321327
class DbusArgsIntrospection:
322328
def __init__(self, element: Element):
@@ -591,6 +597,9 @@ def has_members(self) -> bool:
591597
{% if method.flags_str %}
592598
flags={{ method.flags_str }},
593599
{% endif %}
600+
{% if method.wants_rename %}
601+
method_name="{{method.method_name}}",
602+
{% endif %}
594603
"""
595604
),
596605
"generic_property_flags": (
@@ -601,6 +610,9 @@ def has_members(self) -> bool:
601610
{% if a_property.flags_str %}
602611
flags={{ a_property.flags_str }},
603612
{% endif %}
613+
{% if a_property.wants_rename %}
614+
property_name="{{a_property.method_name}}",
615+
{% endif %}
604616
"""
605617
),
606618
"generic_header": """\
@@ -709,6 +721,9 @@ def {{ a_property.python_name }}(self) -> {{ a_property.typing }}:
709721
{% if signal.flags_str %}
710722
flags={{ signal.flags_str }},
711723
{% endif %}
724+
{% if signal.wants_rename %}
725+
signal_name=signal.method_name,
726+
{% endif %}
712727
)
713728
def {{ signal.python_name }}(self) -> {{ signal.typing }}:
714729
raise NotImplementedError

0 commit comments

Comments
 (0)