mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-113317: Argument Clinic: Add libclinic.converters module (#117315)
Move the following converter classes to libclinic.converters: * PyByteArrayObject_converter * PyBytesObject_converter * Py_UNICODE_converter * Py_buffer_converter * Py_complex_converter * Py_ssize_t_converter * bool_converter * byte_converter * char_converter * defining_class_converter * double_converter * fildes_converter * float_converter * int_converter * long_converter * long_long_converter * object_converter * self_converter * short_converter * size_t_converter * slice_index_converter * str_converter * unicode_converter * unsigned_char_converter * unsigned_int_converter * unsigned_long_converter * unsigned_long_long_converter * unsigned_short_converter Move also the following classes to libclinic.converters: * buffer * robuffer * rwbuffer Move the following functions to libclinic.converters: * correct_name_for_self() * r() * str_converter_key() Move Null and NULL to libclinic.utils.
This commit is contained in:
parent
9dae05ee59
commit
5fd1897ec5
7 changed files with 1259 additions and 1215 deletions
|
@ -17,6 +17,7 @@ import unittest
|
||||||
test_tools.skip_if_missing('clinic')
|
test_tools.skip_if_missing('clinic')
|
||||||
with test_tools.imports_under_tool('clinic'):
|
with test_tools.imports_under_tool('clinic'):
|
||||||
import libclinic
|
import libclinic
|
||||||
|
from libclinic.converters import int_converter, str_converter
|
||||||
import clinic
|
import clinic
|
||||||
from clinic import DSLParser
|
from clinic import DSLParser
|
||||||
|
|
||||||
|
@ -924,7 +925,7 @@ class ClinicParserTest(TestCase):
|
||||||
self.assertEqual(2, len(function.parameters))
|
self.assertEqual(2, len(function.parameters))
|
||||||
p = function.parameters['path']
|
p = function.parameters['path']
|
||||||
self.assertEqual('path', p.name)
|
self.assertEqual('path', p.name)
|
||||||
self.assertIsInstance(p.converter, clinic.int_converter)
|
self.assertIsInstance(p.converter, int_converter)
|
||||||
|
|
||||||
def test_param_default(self):
|
def test_param_default(self):
|
||||||
function = self.parse_function("""
|
function = self.parse_function("""
|
||||||
|
@ -1023,7 +1024,7 @@ class ClinicParserTest(TestCase):
|
||||||
""")
|
""")
|
||||||
self.assertEqual(3, len(function.parameters))
|
self.assertEqual(3, len(function.parameters))
|
||||||
conv = function.parameters['something_else'].converter
|
conv = function.parameters['something_else'].converter
|
||||||
self.assertIsInstance(conv, clinic.str_converter)
|
self.assertIsInstance(conv, str_converter)
|
||||||
|
|
||||||
def test_param_default_parameters_out_of_order(self):
|
def test_param_default_parameters_out_of_order(self):
|
||||||
err = (
|
err = (
|
||||||
|
@ -2040,7 +2041,7 @@ class ClinicParserTest(TestCase):
|
||||||
block = self.parse('module os\nos.access\n path: "s"')
|
block = self.parse('module os\nos.access\n path: "s"')
|
||||||
module, function = block.signatures
|
module, function = block.signatures
|
||||||
conv = (function.parameters['path']).converter
|
conv = (function.parameters['path']).converter
|
||||||
self.assertIsInstance(conv, clinic.str_converter)
|
self.assertIsInstance(conv, str_converter)
|
||||||
|
|
||||||
def test_legacy_converters_non_string_constant_annotation(self):
|
def test_legacy_converters_non_string_constant_annotation(self):
|
||||||
err = "Annotations must be either a name, a function call, or a string"
|
err = "Annotations must be either a name, a function call, or a string"
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -25,13 +25,15 @@ from .identifiers import (
|
||||||
)
|
)
|
||||||
from .utils import (
|
from .utils import (
|
||||||
FormatCounterFormatter,
|
FormatCounterFormatter,
|
||||||
|
NULL,
|
||||||
|
Null,
|
||||||
|
Sentinels,
|
||||||
|
VersionTuple,
|
||||||
compute_checksum,
|
compute_checksum,
|
||||||
create_regex,
|
create_regex,
|
||||||
write_file,
|
|
||||||
VersionTuple,
|
|
||||||
Sentinels,
|
|
||||||
unspecified,
|
|
||||||
unknown,
|
unknown,
|
||||||
|
unspecified,
|
||||||
|
write_file,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,13 +63,15 @@ __all__ = [
|
||||||
|
|
||||||
# Utility functions
|
# Utility functions
|
||||||
"FormatCounterFormatter",
|
"FormatCounterFormatter",
|
||||||
|
"NULL",
|
||||||
|
"Null",
|
||||||
|
"Sentinels",
|
||||||
|
"VersionTuple",
|
||||||
"compute_checksum",
|
"compute_checksum",
|
||||||
"create_regex",
|
"create_regex",
|
||||||
"write_file",
|
|
||||||
"VersionTuple",
|
|
||||||
"Sentinels",
|
|
||||||
"unspecified",
|
|
||||||
"unknown",
|
"unknown",
|
||||||
|
"unspecified",
|
||||||
|
"write_file",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -531,3 +531,19 @@ converters: ConverterDict = {}
|
||||||
# these callables follow the same rules as those for "converters" above.
|
# these callables follow the same rules as those for "converters" above.
|
||||||
# note however that they will never be called with keyword-only parameters.
|
# note however that they will never be called with keyword-only parameters.
|
||||||
legacy_converters: ConverterDict = {}
|
legacy_converters: ConverterDict = {}
|
||||||
|
|
||||||
|
|
||||||
|
def add_legacy_c_converter(
|
||||||
|
format_unit: str,
|
||||||
|
**kwargs: Any
|
||||||
|
) -> Callable[[CConverterClassT], CConverterClassT]:
|
||||||
|
def closure(f: CConverterClassT) -> CConverterClassT:
|
||||||
|
added_f: Callable[..., CConverter]
|
||||||
|
if not kwargs:
|
||||||
|
added_f = f
|
||||||
|
else:
|
||||||
|
added_f = functools.partial(f, **kwargs)
|
||||||
|
if format_unit:
|
||||||
|
legacy_converters[format_unit] = added_f
|
||||||
|
return f
|
||||||
|
return closure
|
||||||
|
|
1211
Tools/clinic/libclinic/converters.py
Normal file
1211
Tools/clinic/libclinic/converters.py
Normal file
File diff suppressed because it is too large
Load diff
|
@ -6,8 +6,9 @@ import functools
|
||||||
import inspect
|
import inspect
|
||||||
from typing import Final, Any, TYPE_CHECKING
|
from typing import Final, Any, TYPE_CHECKING
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from clinic import Clinic, CReturnConverter, self_converter
|
from clinic import Clinic, CReturnConverter
|
||||||
from libclinic.converter import CConverter
|
from libclinic.converter import CConverter
|
||||||
|
from libclinic.converters import self_converter
|
||||||
|
|
||||||
from libclinic import VersionTuple, unspecified
|
from libclinic import VersionTuple, unspecified
|
||||||
|
|
||||||
|
|
|
@ -82,3 +82,12 @@ class Sentinels(enum.Enum):
|
||||||
|
|
||||||
unspecified: Final = Sentinels.unspecified
|
unspecified: Final = Sentinels.unspecified
|
||||||
unknown: Final = Sentinels.unknown
|
unknown: Final = Sentinels.unknown
|
||||||
|
|
||||||
|
|
||||||
|
# This one needs to be a distinct class, unlike the other two
|
||||||
|
class Null:
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return '<Null>'
|
||||||
|
|
||||||
|
|
||||||
|
NULL = Null()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue