update import_all test, add some stubs for postgres (#178)

This commit is contained in:
Maxim Kurnikov
2019-09-23 19:47:11 +03:00
committed by GitHub
parent 68aebe2528
commit a85dbff793
11 changed files with 201 additions and 23 deletions

View File

@@ -0,0 +1,24 @@
from .general import (
ArrayAgg as ArrayAgg,
BitAnd as BitAnd,
BitOr as BitOr,
BoolAnd as BoolAnd,
BoolOr as BoolOr,
JSONBAgg as JSONBAgg,
StringAgg as StringAgg,
)
from .statistics import (
Corr as Corr,
CovarPop as CovarPop,
RegrAvgX as RegrAvgX,
RegrAvgY as RegrAvgY,
RegrCount as RegrCount,
RegrIntercept as RegrIntercept,
RegrR2 as RegrR2,
RegrSlope as RegrSlope,
RegrSXX as RegrSXX,
RegrSXY as RegrSXY,
RegrSYY as RegrSYY,
StatAggregate as StatAggregate,
)

View File

@@ -0,0 +1,11 @@
from django.db.models.aggregates import Aggregate
from .mixins import OrderableAggMixin
class ArrayAgg(OrderableAggMixin, Aggregate): ...
class BitAnd(Aggregate): ...
class BitOr(Aggregate): ...
class BoolAnd(Aggregate): ...
class BoolOr(Aggregate): ...
class JSONBAgg(Aggregate): ...
class StringAgg(OrderableAggMixin, Aggregate): ...

View File

@@ -0,0 +1 @@
class OrderableAggMixin: ...

View File

@@ -0,0 +1,14 @@
from django.db.models.aggregates import Aggregate
class StatAggregate(Aggregate): ...
class Corr(StatAggregate): ...
class CovarPop(StatAggregate): ...
class RegrAvgX(StatAggregate): ...
class RegrAvgY(StatAggregate): ...
class RegrCount(StatAggregate): ...
class RegrIntercept(StatAggregate): ...
class RegrR2(StatAggregate): ...
class RegrSlope(StatAggregate): ...
class RegrSXX(StatAggregate): ...
class RegrSXY(StatAggregate): ...
class RegrSYY(StatAggregate): ...

View File

@@ -1,29 +1,81 @@
from typing import Any, Optional from typing import Any, Optional, Sequence
from django.db.models import Index from django.db.models import Index
from django.db.models.query_utils import Q
class PostgresIndex(Index): class PostgresIndex(Index): ...
@property
def max_name_length(self) -> int: ...
class BrinIndex(PostgresIndex): class BrinIndex(PostgresIndex):
def __init__( def __init__(
self, *, autosummarize: Optional[bool] = ..., pages_per_range: Optional[int] = ..., **kwargs: Any self,
*,
autosummarize: Optional[bool] = ...,
pages_per_range: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ... ) -> None: ...
class BTreeIndex(PostgresIndex): class BTreeIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any): ... def __init__(
self,
*,
fillfactor: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ...
class GinIndex(PostgresIndex): class GinIndex(PostgresIndex):
def __init__( def __init__(
self, *, fastupdate: Optional[bool] = ..., gin_pending_list_limit: Optional[int] = ..., **kwargs: Any self,
*,
fastupdate: Optional[bool] = ...,
gin_pending_list_limit: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ... ) -> None: ...
class GistIndex(PostgresIndex): class GistIndex(PostgresIndex):
def __init__(self, *, buffering: Optional[bool] = ..., fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ... def __init__(
self,
*,
buffering: Optional[bool] = ...,
fillfactor: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ...
class HashIndex(PostgresIndex): class HashIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ... def __init__(
self,
*,
fillfactor: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ...
class SpGistIndex(PostgresIndex): class SpGistIndex(PostgresIndex):
def __init__(self, *, fillfactor: Optional[int] = ..., **kwargs: Any) -> None: ... def __init__(
self,
*,
fillfactor: Optional[int] = ...,
fields: Sequence[str] = ...,
name: Optional[str] = ...,
db_tablespace: Optional[str] = ...,
opclasses: Sequence[str] = ...,
condition: Optional[Q] = ...
) -> None: ...

View File

@@ -0,0 +1,18 @@
from django.db.models.lookups import Exact
from django.db.models import Lookup, Transform
from .search import SearchVectorExact
class PostgresSimpleLookup(Lookup):
operator: str
class DataContains(PostgresSimpleLookup): ...
class ContainedBy(PostgresSimpleLookup): ...
class Overlap(PostgresSimpleLookup): ...
class HasKey(PostgresSimpleLookup): ...
class HasKeys(PostgresSimpleLookup): ...
class HasAnyKeys(HasKeys): ...
class Unaccent(Transform): ...
class SearchLookup(SearchVectorExact): ...
class TrigramSimilar(PostgresSimpleLookup): ...
class JSONExact(Exact): ...

View File

@@ -1,10 +1,12 @@
from typing import Any, Dict, Optional, TypeVar, Union from typing import Any, Dict, Optional, TypeVar, Union
from django.db.models.expressions import Combinable, CombinedExpression, Func, Value from django.db.models.expressions import Combinable, CombinedExpression, Func, Value, _OutputField
from django.db.models.lookups import Lookup from django.db.models.lookups import Lookup
from django.db.models import Field from django.db.models import Field
_Expression = Union[str, Combinable, "SearchQueryCombinable"]
class SearchVectorExact(Lookup): ... class SearchVectorExact(Lookup): ...
class SearchVectorField(Field): ... class SearchVectorField(Field): ...
class SearchQueryField(Field): ... class SearchQueryField(Field): ...
@@ -14,10 +16,12 @@ class SearchVectorCombinable:
class SearchVector(SearchVectorCombinable, Func): class SearchVector(SearchVectorCombinable, Func):
config: Optional[Any] = ... config: Optional[Any] = ...
def __init__(self, *expressions: Union[str, Combinable], **extra: Any): ... def __init__(self, *expressions: _Expression, **extra: Any): ...
class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): class CombinedSearchVector(SearchVectorCombinable, CombinedExpression):
def __init__(self, lhs, connector, rhs, config, output_field: Optional[Field, str] = ...): ... def __init__(
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ...
): ...
_T = TypeVar("_T", bound="SearchQueryCombinable") _T = TypeVar("_T", bound="SearchQueryCombinable")
@@ -29,19 +33,31 @@ class SearchQueryCombinable:
def __and__(self: _T, other: SearchQueryCombinable) -> _T: ... def __and__(self: _T, other: SearchQueryCombinable) -> _T: ...
def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ... def __rand__(self: _T, other: SearchQueryCombinable) -> _T: ...
class SearchQuery(SearchQueryCombinable, Value): class SearchQuery(SearchQueryCombinable, Value): # type: ignore
SEARCH_TYPES: Dict[str, str] = {"plain": "plainto_tsquery", "phrase": "phraseto_tsquery", "raw": "to_tsquery"} SEARCH_TYPES: Dict[str, str] = ...
def __init__(self, value, output_field=..., *, config=..., invert=False, search_type="plain"): ... def __init__(
self,
value: str,
output_field: Optional[_OutputField] = ...,
*,
config: Optional[_Expression] = ...,
invert: bool = ...,
search_type: str = ...
): ...
def __invert__(self: _T) -> _T: ... def __invert__(self: _T) -> _T: ...
class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore
def __init__(self, lhs, connector, rhs, config, output_field=...) -> None: ... def __init__(
self, lhs, connector, rhs, config: Optional[_Expression] = ..., output_field: Optional[_OutputField] = ...
) -> None: ...
class SearchRank(Func): class SearchRank(Func):
def __init__(self, vector, query, **extra: Any) -> None: ... def __init__(
self, vector: Union[SearchVector, _Expression], query: Union[SearchQuery, _Expression], **extra: Any
) -> None: ...
class TrigramBase(Func): class TrigramBase(Func):
def __init__(self, expression, string, **extra: Any) -> None: ... def __init__(self, expression: _Expression, string, **extra: Any) -> None: ...
class TrigramSimilarity(TrigramBase): ... class TrigramSimilarity(TrigramBase): ...
class TrigramDistance(TrigramBase): ... class TrigramDistance(TrigramBase): ...

View File

@@ -0,0 +1,3 @@
from django.test import LiveServerTestCase
class StaticLiveServerTestCase(LiveServerTestCase): ...

View File

@@ -5,6 +5,7 @@ from django.db.models.expressions import Func
class Aggregate(Func): class Aggregate(Func):
filter_template: str = ... filter_template: str = ...
filter: Any = ... filter: Any = ...
allow_distinct: bool = ...
def __init__(self, *expressions: Any, distinct: bool = ..., filter: Optional[Any] = ..., **extra: Any) -> None: ... def __init__(self, *expressions: Any, distinct: bool = ..., filter: Optional[Any] = ..., **extra: Any) -> None: ...
class Avg(Aggregate): ... class Avg(Aggregate): ...

View File

@@ -24,5 +24,5 @@ test_lines: List[str] = []
for package in packages: for package in packages:
test_lines.append('import ' + package) test_lines.append('import ' + package)
test_contents = '\n'.join(test_lines) test_contents = '\n'.join(sorted(test_lines))
print(test_contents) print(test_contents)

View File

@@ -4,6 +4,7 @@
import django.apps.config import django.apps.config
import django.apps.registry import django.apps.registry
import django.conf.global_settings import django.conf.global_settings
import django.conf.locale
import django.conf.urls import django.conf.urls
import django.conf.urls.i18n import django.conf.urls.i18n
import django.conf.urls.static import django.conf.urls.static
@@ -24,6 +25,7 @@
import django.contrib.admin.templatetags.admin_urls import django.contrib.admin.templatetags.admin_urls
import django.contrib.admin.templatetags.base import django.contrib.admin.templatetags.base
import django.contrib.admin.templatetags.log import django.contrib.admin.templatetags.log
import django.contrib.admin.tests
import django.contrib.admin.utils import django.contrib.admin.utils
import django.contrib.admin.views import django.contrib.admin.views
import django.contrib.admin.views.autocomplete import django.contrib.admin.views.autocomplete
@@ -32,6 +34,7 @@
import django.contrib.admin.widgets import django.contrib.admin.widgets
import django.contrib.admindocs import django.contrib.admindocs
import django.contrib.admindocs.middleware import django.contrib.admindocs.middleware
import django.contrib.admindocs.urls
import django.contrib.admindocs.utils import django.contrib.admindocs.utils
import django.contrib.admindocs.views import django.contrib.admindocs.views
import django.contrib.auth.admin import django.contrib.auth.admin
@@ -54,6 +57,7 @@
import django.contrib.auth.password_validation import django.contrib.auth.password_validation
import django.contrib.auth.signals import django.contrib.auth.signals
import django.contrib.auth.tokens import django.contrib.auth.tokens
import django.contrib.auth.urls
import django.contrib.auth.validators import django.contrib.auth.validators
import django.contrib.auth.views import django.contrib.auth.views
import django.contrib.contenttypes.admin import django.contrib.contenttypes.admin
@@ -71,10 +75,14 @@
import django.contrib.flatpages.sitemaps import django.contrib.flatpages.sitemaps
import django.contrib.flatpages.templatetags import django.contrib.flatpages.templatetags
import django.contrib.flatpages.templatetags.flatpages import django.contrib.flatpages.templatetags.flatpages
import django.contrib.flatpages.urls
import django.contrib.flatpages.views import django.contrib.flatpages.views
import django.contrib.gis.db.models
import django.contrib.gis.db.models.fields
import django.contrib.humanize.templatetags import django.contrib.humanize.templatetags
import django.contrib.humanize.templatetags.humanize import django.contrib.humanize.templatetags.humanize
import django.contrib.messages.api import django.contrib.messages.api
import django.contrib.messages.constants
import django.contrib.messages.context_processors import django.contrib.messages.context_processors
import django.contrib.messages.middleware import django.contrib.messages.middleware
import django.contrib.messages.storage import django.contrib.messages.storage
@@ -84,6 +92,10 @@
import django.contrib.messages.storage.session import django.contrib.messages.storage.session
import django.contrib.messages.utils import django.contrib.messages.utils
import django.contrib.messages.views import django.contrib.messages.views
import django.contrib.postgres.aggregates
import django.contrib.postgres.aggregates.general
import django.contrib.postgres.aggregates.mixins
import django.contrib.postgres.aggregates.statistics
import django.contrib.postgres.fields import django.contrib.postgres.fields
import django.contrib.postgres.fields.array import django.contrib.postgres.fields.array
import django.contrib.postgres.fields.citext import django.contrib.postgres.fields.citext
@@ -91,7 +103,13 @@
import django.contrib.postgres.fields.jsonb import django.contrib.postgres.fields.jsonb
import django.contrib.postgres.fields.mixins import django.contrib.postgres.fields.mixins
import django.contrib.postgres.fields.ranges import django.contrib.postgres.fields.ranges
import django.contrib.postgres.functions
import django.contrib.postgres.indexes
import django.contrib.postgres.lookups
import django.contrib.postgres.operations import django.contrib.postgres.operations
import django.contrib.postgres.search
import django.contrib.postgres.signals
import django.contrib.postgres.validators
import django.contrib.redirects import django.contrib.redirects
import django.contrib.redirects.middleware import django.contrib.redirects.middleware
import django.contrib.redirects.models import django.contrib.redirects.models
@@ -103,6 +121,7 @@
import django.contrib.sessions.backends.file import django.contrib.sessions.backends.file
import django.contrib.sessions.backends.signed_cookies import django.contrib.sessions.backends.signed_cookies
import django.contrib.sessions.base_session import django.contrib.sessions.base_session
import django.contrib.sessions.exceptions
import django.contrib.sessions.management.commands import django.contrib.sessions.management.commands
import django.contrib.sessions.management.commands.clearsessions import django.contrib.sessions.management.commands.clearsessions
import django.contrib.sessions.middleware import django.contrib.sessions.middleware
@@ -130,6 +149,7 @@
import django.contrib.staticfiles.storage import django.contrib.staticfiles.storage
import django.contrib.staticfiles.templatetags import django.contrib.staticfiles.templatetags
import django.contrib.staticfiles.templatetags.staticfiles import django.contrib.staticfiles.templatetags.staticfiles
import django.contrib.staticfiles.testing
import django.contrib.staticfiles.urls import django.contrib.staticfiles.urls
import django.contrib.staticfiles.utils import django.contrib.staticfiles.utils
import django.contrib.staticfiles.views import django.contrib.staticfiles.views
@@ -141,6 +161,7 @@
import django.core.cache.backends.dummy import django.core.cache.backends.dummy
import django.core.cache.backends.filebased import django.core.cache.backends.filebased
import django.core.cache.backends.locmem import django.core.cache.backends.locmem
import django.core.cache.backends.memcached
import django.core.cache.utils import django.core.cache.utils
import django.core.checks.caches import django.core.checks.caches
import django.core.checks.database import django.core.checks.database
@@ -152,6 +173,7 @@
import django.core.checks.security.csrf import django.core.checks.security.csrf
import django.core.checks.security.sessions import django.core.checks.security.sessions
import django.core.checks.templates import django.core.checks.templates
import django.core.checks.translation
import django.core.checks.urls import django.core.checks.urls
import django.core.exceptions import django.core.exceptions
import django.core.files import django.core.files
@@ -168,12 +190,18 @@
import django.core.handlers.base import django.core.handlers.base
import django.core.handlers.exception import django.core.handlers.exception
import django.core.handlers.wsgi import django.core.handlers.wsgi
import django.core.mail import django.core.mail.backends
import django.core.mail.backends.base
import django.core.mail.message import django.core.mail.message
import django.core.mail.utils import django.core.mail.utils
import django.core.management
import django.core.management.base import django.core.management.base
import django.core.management.color import django.core.management.color
import django.core.management.commands
import django.core.management.commands.dumpdata
import django.core.management.commands.loaddata
import django.core.management.commands.makemessages
import django.core.management.commands.runserver
import django.core.management.commands.testserver
import django.core.management.sql import django.core.management.sql
import django.core.management.templates import django.core.management.templates
import django.core.management.utils import django.core.management.utils
@@ -203,7 +231,11 @@
import django.db.backends.mysql import django.db.backends.mysql
import django.db.backends.mysql.client import django.db.backends.mysql.client
import django.db.backends.postgresql import django.db.backends.postgresql
import django.db.backends.postgresql.base
import django.db.backends.postgresql.client import django.db.backends.postgresql.client
import django.db.backends.postgresql.creation
import django.db.backends.postgresql.operations
import django.db.backends.signals
import django.db.backends.sqlite3 import django.db.backends.sqlite3
import django.db.backends.sqlite3.base import django.db.backends.sqlite3.base
import django.db.backends.sqlite3.creation import django.db.backends.sqlite3.creation
@@ -234,6 +266,7 @@
import django.db.migrations.writer import django.db.migrations.writer
import django.db.models.aggregates import django.db.models.aggregates
import django.db.models.base import django.db.models.base
import django.db.models.constraints
import django.db.models.deletion import django.db.models.deletion
import django.db.models.expressions import django.db.models.expressions
import django.db.models.fields import django.db.models.fields
@@ -247,6 +280,8 @@
import django.db.models.functions import django.db.models.functions
import django.db.models.functions.comparison import django.db.models.functions.comparison
import django.db.models.functions.datetime import django.db.models.functions.datetime
import django.db.models.functions.math
import django.db.models.functions.mixins
import django.db.models.functions.text import django.db.models.functions.text
import django.db.models.functions.window import django.db.models.functions.window
import django.db.models.indexes import django.db.models.indexes
@@ -357,6 +392,7 @@
import django.utils.feedgenerator import django.utils.feedgenerator
import django.utils.formats import django.utils.formats
import django.utils.functional import django.utils.functional
import django.utils.hashable
import django.utils.html import django.utils.html
import django.utils.http import django.utils.http
import django.utils.inspect import django.utils.inspect
@@ -374,7 +410,9 @@
import django.utils.text import django.utils.text
import django.utils.timesince import django.utils.timesince
import django.utils.timezone import django.utils.timezone
import django.utils.topological_sort
import django.utils.translation import django.utils.translation
import django.utils.translation.reloader
import django.utils.translation.template import django.utils.translation.template
import django.utils.translation.trans_null import django.utils.translation.trans_null
import django.utils.translation.trans_real import django.utils.translation.trans_real