测试gitnore
This commit is contained in:
@@ -25,16 +25,12 @@ class BaseSerializer:
|
||||
self.value = value
|
||||
|
||||
def serialize(self):
|
||||
raise NotImplementedError(
|
||||
"Subclasses of BaseSerializer must implement the serialize() method."
|
||||
)
|
||||
raise NotImplementedError('Subclasses of BaseSerializer must implement the serialize() method.')
|
||||
|
||||
|
||||
class BaseSequenceSerializer(BaseSerializer):
|
||||
def _format(self):
|
||||
raise NotImplementedError(
|
||||
"Subclasses of BaseSequenceSerializer must implement the _format() method."
|
||||
)
|
||||
raise NotImplementedError('Subclasses of BaseSequenceSerializer must implement the _format() method.')
|
||||
|
||||
def serialize(self):
|
||||
imports = set()
|
||||
@@ -59,21 +55,19 @@ class ChoicesSerializer(BaseSerializer):
|
||||
|
||||
class DateTimeSerializer(BaseSerializer):
|
||||
"""For datetime.*, except datetime.datetime."""
|
||||
|
||||
def serialize(self):
|
||||
return repr(self.value), {"import datetime"}
|
||||
return repr(self.value), {'import datetime'}
|
||||
|
||||
|
||||
class DatetimeDatetimeSerializer(BaseSerializer):
|
||||
"""For datetime.datetime."""
|
||||
|
||||
def serialize(self):
|
||||
if self.value.tzinfo is not None and self.value.tzinfo != utc:
|
||||
self.value = self.value.astimezone(utc)
|
||||
imports = ["import datetime"]
|
||||
if self.value.tzinfo is not None:
|
||||
imports.append("from django.utils.timezone import utc")
|
||||
return repr(self.value).replace("datetime.timezone.utc", "utc"), set(imports)
|
||||
return repr(self.value).replace('<UTC>', 'utc'), set(imports)
|
||||
|
||||
|
||||
class DecimalSerializer(BaseSerializer):
|
||||
@@ -129,8 +123,8 @@ class EnumSerializer(BaseSerializer):
|
||||
enum_class = self.value.__class__
|
||||
module = enum_class.__module__
|
||||
return (
|
||||
"%s.%s[%r]" % (module, enum_class.__qualname__, self.value.name),
|
||||
{"import %s" % module},
|
||||
'%s.%s[%r]' % (module, enum_class.__qualname__, self.value.name),
|
||||
{'import %s' % module},
|
||||
)
|
||||
|
||||
|
||||
@@ -148,29 +142,23 @@ class FrozensetSerializer(BaseSequenceSerializer):
|
||||
|
||||
class FunctionTypeSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
if getattr(self.value, "__self__", None) and isinstance(
|
||||
self.value.__self__, type
|
||||
):
|
||||
if getattr(self.value, "__self__", None) and isinstance(self.value.__self__, type):
|
||||
klass = self.value.__self__
|
||||
module = klass.__module__
|
||||
return "%s.%s.%s" % (module, klass.__name__, self.value.__name__), {
|
||||
"import %s" % module
|
||||
}
|
||||
return "%s.%s.%s" % (module, klass.__name__, self.value.__name__), {"import %s" % module}
|
||||
# Further error checking
|
||||
if self.value.__name__ == "<lambda>":
|
||||
if self.value.__name__ == '<lambda>':
|
||||
raise ValueError("Cannot serialize function: lambda")
|
||||
if self.value.__module__ is None:
|
||||
raise ValueError("Cannot serialize function %r: No module" % self.value)
|
||||
|
||||
module_name = self.value.__module__
|
||||
|
||||
if "<" not in self.value.__qualname__: # Qualname can include <locals>
|
||||
return "%s.%s" % (module_name, self.value.__qualname__), {
|
||||
"import %s" % self.value.__module__
|
||||
}
|
||||
if '<' not in self.value.__qualname__: # Qualname can include <locals>
|
||||
return '%s.%s' % (module_name, self.value.__qualname__), {'import %s' % self.value.__module__}
|
||||
|
||||
raise ValueError(
|
||||
"Could not find function %s in %s.\n" % (self.value.__name__, module_name)
|
||||
'Could not find function %s in %s.\n' % (self.value.__name__, module_name)
|
||||
)
|
||||
|
||||
|
||||
@@ -179,14 +167,11 @@ class FunctoolsPartialSerializer(BaseSerializer):
|
||||
# Serialize functools.partial() arguments
|
||||
func_string, func_imports = serializer_factory(self.value.func).serialize()
|
||||
args_string, args_imports = serializer_factory(self.value.args).serialize()
|
||||
keywords_string, keywords_imports = serializer_factory(
|
||||
self.value.keywords
|
||||
).serialize()
|
||||
keywords_string, keywords_imports = serializer_factory(self.value.keywords).serialize()
|
||||
# Add any imports needed by arguments
|
||||
imports = {"import functools", *func_imports, *args_imports, *keywords_imports}
|
||||
imports = {'import functools', *func_imports, *args_imports, *keywords_imports}
|
||||
return (
|
||||
"functools.%s(%s, *%s, **%s)"
|
||||
% (
|
||||
'functools.%s(%s, *%s, **%s)' % (
|
||||
self.value.__class__.__name__,
|
||||
func_string,
|
||||
args_string,
|
||||
@@ -229,10 +214,9 @@ class ModelManagerSerializer(DeconstructableSerializer):
|
||||
class OperationSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
from django.db.migrations.writer import OperationWriter
|
||||
|
||||
string, imports = OperationWriter(self.value, indentation=0).serialize()
|
||||
# Nested operation, trailing comma is handled in upper OperationWriter._write()
|
||||
return string.rstrip(","), imports
|
||||
return string.rstrip(','), imports
|
||||
|
||||
|
||||
class PathLikeSerializer(BaseSerializer):
|
||||
@@ -244,24 +228,22 @@ class PathSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
# Convert concrete paths to pure paths to avoid issues with migrations
|
||||
# generated on one platform being used on a different platform.
|
||||
prefix = "Pure" if isinstance(self.value, pathlib.Path) else ""
|
||||
return "pathlib.%s%r" % (prefix, self.value), {"import pathlib"}
|
||||
prefix = 'Pure' if isinstance(self.value, pathlib.Path) else ''
|
||||
return 'pathlib.%s%r' % (prefix, self.value), {'import pathlib'}
|
||||
|
||||
|
||||
class RegexSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
regex_pattern, pattern_imports = serializer_factory(
|
||||
self.value.pattern
|
||||
).serialize()
|
||||
regex_pattern, pattern_imports = serializer_factory(self.value.pattern).serialize()
|
||||
# Turn off default implicit flags (e.g. re.U) because regexes with the
|
||||
# same implicit and explicit flags aren't equal.
|
||||
flags = self.value.flags ^ re.compile("").flags
|
||||
flags = self.value.flags ^ re.compile('').flags
|
||||
regex_flags, flag_imports = serializer_factory(flags).serialize()
|
||||
imports = {"import re", *pattern_imports, *flag_imports}
|
||||
imports = {'import re', *pattern_imports, *flag_imports}
|
||||
args = [regex_pattern]
|
||||
if flags:
|
||||
args.append(regex_flags)
|
||||
return "re.compile(%s)" % ", ".join(args), imports
|
||||
return "re.compile(%s)" % ', '.join(args), imports
|
||||
|
||||
|
||||
class SequenceSerializer(BaseSequenceSerializer):
|
||||
@@ -273,14 +255,12 @@ class SetSerializer(BaseSequenceSerializer):
|
||||
def _format(self):
|
||||
# Serialize as a set literal except when value is empty because {}
|
||||
# is an empty dict.
|
||||
return "{%s}" if self.value else "set(%s)"
|
||||
return '{%s}' if self.value else 'set(%s)'
|
||||
|
||||
|
||||
class SettingsReferenceSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
return "settings.%s" % self.value.setting_name, {
|
||||
"from django.conf import settings"
|
||||
}
|
||||
return "settings.%s" % self.value.setting_name, {"from django.conf import settings"}
|
||||
|
||||
|
||||
class TupleSerializer(BaseSequenceSerializer):
|
||||
@@ -293,8 +273,8 @@ class TupleSerializer(BaseSequenceSerializer):
|
||||
class TypeSerializer(BaseSerializer):
|
||||
def serialize(self):
|
||||
special_cases = [
|
||||
(models.Model, "models.Model", ["from django.db import models"]),
|
||||
(type(None), "type(None)", []),
|
||||
(models.Model, "models.Model", []),
|
||||
(type(None), 'type(None)', []),
|
||||
]
|
||||
for case, string, imports in special_cases:
|
||||
if case is self.value:
|
||||
@@ -304,9 +284,7 @@ class TypeSerializer(BaseSerializer):
|
||||
if module == builtins.__name__:
|
||||
return self.value.__name__, set()
|
||||
else:
|
||||
return "%s.%s" % (module, self.value.__qualname__), {
|
||||
"import %s" % module
|
||||
}
|
||||
return "%s.%s" % (module, self.value.__qualname__), {"import %s" % module}
|
||||
|
||||
|
||||
class UUIDSerializer(BaseSerializer):
|
||||
@@ -331,11 +309,7 @@ class Serializer:
|
||||
(bool, int, type(None), bytes, str, range): BaseSimpleSerializer,
|
||||
decimal.Decimal: DecimalSerializer,
|
||||
(functools.partial, functools.partialmethod): FunctoolsPartialSerializer,
|
||||
(
|
||||
types.FunctionType,
|
||||
types.BuiltinFunctionType,
|
||||
types.MethodType,
|
||||
): FunctionTypeSerializer,
|
||||
(types.FunctionType, types.BuiltinFunctionType, types.MethodType): FunctionTypeSerializer,
|
||||
collections.abc.Iterable: IterableSerializer,
|
||||
(COMPILED_REGEX_TYPE, RegexObject): RegexSerializer,
|
||||
uuid.UUID: UUIDSerializer,
|
||||
@@ -346,9 +320,7 @@ class Serializer:
|
||||
@classmethod
|
||||
def register(cls, type_, serializer):
|
||||
if not issubclass(serializer, BaseSerializer):
|
||||
raise ValueError(
|
||||
"'%s' must inherit from 'BaseSerializer'." % serializer.__name__
|
||||
)
|
||||
raise ValueError("'%s' must inherit from 'BaseSerializer'." % serializer.__name__)
|
||||
cls._registry[type_] = serializer
|
||||
|
||||
@classmethod
|
||||
@@ -373,7 +345,7 @@ def serializer_factory(value):
|
||||
if isinstance(value, type):
|
||||
return TypeSerializer(value)
|
||||
# Anything that knows how to deconstruct itself.
|
||||
if hasattr(value, "deconstruct"):
|
||||
if hasattr(value, 'deconstruct'):
|
||||
return DeconstructableSerializer(value)
|
||||
for type_, serializer_cls in Serializer._registry.items():
|
||||
if isinstance(value, type_):
|
||||
|
||||
Reference in New Issue
Block a user