Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Graphene sqlalchemy 3.3 #75

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions graphene_sqlalchemy_filter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
from .filters import FilterSet


__version__ = '1.13.0'
__all__ = ['__version__', 'FilterSet', 'FilterableConnectionField']
__version__ = "1.14.0"
__all__ = ["__version__", "FilterSet", "FilterableConnectionField"]
33 changes: 20 additions & 13 deletions graphene_sqlalchemy_filter/connection_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,22 @@
Type,
Union,
) # noqa: F401; pragma: no cover
from graphql import ResolveInfo # noqa: F401; pragma: no cover
from graphene.relay import Connection # noqa: F401; pragma: no cover
from sqlalchemy.orm import Query # noqa: F401; pragma: no cover
from .filters import FilterSet # noqa: F401; pragma: no cover


graphene_sqlalchemy_version_lt_2_1_2 = tuple(
map(int, graphene_sqlalchemy.__version__.split('.'))
) < (2, 1, 2)

graphene_sqlalchemy_version_lt_2_1 = tuple(
map(int, graphene_sqlalchemy.__version__.split('.')[:2])
) < (2, 1)

if graphene_sqlalchemy_version_lt_2_1_2:
default_connection_field_factory = None # pragma: no cover
if graphene_sqlalchemy_version_lt_2_1:
from graphql import ResolveInfo # noqa: F401; pragma: no cover
else:
from graphene_sqlalchemy.fields import default_connection_field_factory
from graphql.type import GraphQLResolveInfo as ResolveInfo # noqa: F401; pragma: no cover


from graphene_sqlalchemy.fields import default_connection_field_factory


DEFAULT_FILTER_ARG: str = 'filters'
Expand All @@ -51,9 +52,7 @@ class FilterableConnectionField(graphene_sqlalchemy.SQLAlchemyConnectionField):
factory: 'Union[FilterableFieldFactory, Callable, None]' = None
filters: dict = {}

def __init_subclass__(cls):
if graphene_sqlalchemy_version_lt_2_1_2:
return # pragma: no cover
def __init_subclass__(cls):

if cls.filters and cls.factory is None:
cls.factory = FilterableFieldFactory(cls.filters)
Expand Down Expand Up @@ -101,10 +100,14 @@ def get_filter_set(cls, info: 'ResolveInfo') -> 'FilterSet':
FilterSet class from field args.

"""
field_name = info.field_asts[0].name.value
if graphene_sqlalchemy_version_lt_2_1:
field_name = info.field_asts[0].name.value
else:
field_name = info.field_name
schema_field = info.parent_type.fields.get(field_name)
filters_type = schema_field.args[cls.filter_arg].type
filters: 'FilterSet' = filters_type.graphene_type

return filters


Expand Down Expand Up @@ -226,7 +229,11 @@ def _get_filter_set(cls, info: 'ResolveInfo') -> 'FilterSet':
FilterSet class from field args.

"""
field_name = info.field_asts[0].name.value

if graphene_sqlalchemy_version_lt_2_1:
field_name = info.field_asts[0].name.value
else:
field_name = info.field_name
schema_field = info.parent_type.fields.get(field_name)
filters_type = schema_field.args[cls.filter_arg].type
filters: 'FilterSet' = filters_type.graphene_type
Expand Down
14 changes: 12 additions & 2 deletions graphene_sqlalchemy_filter/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,15 @@
from graphene.types.utils import get_field_as
from graphene_sqlalchemy import __version__ as gqls_version
from graphene_sqlalchemy.converter import convert_sqlalchemy_type
from graphql import ResolveInfo

graphene_sqlalchemy_version_lt_2_1 = tuple(
map(int, graphene_sqlalchemy.__version__.split('.')[:2])
) < (2, 1)

if graphene_sqlalchemy_version_lt_2_1:
from graphql import ResolveInfo
else:
from graphql.type import GraphQLResolveInfo as ResolveInfo

# Database
from sqlalchemy import and_, cast, inspection, not_, or_, types
Expand Down Expand Up @@ -55,7 +63,7 @@
TSVectorType = object


gqls_version = tuple([int(x) for x in gqls_version.split('.')])
gqls_version = tuple([int(x) for x in gqls_version.split('.')[:2]])


def _get_class(obj: 'GRAPHENE_OBJECT_OR_CLASS') -> 'Type[graphene.ObjectType]':
Expand Down Expand Up @@ -308,6 +316,8 @@ def __init_subclass_with_meta__(

default_filter_keys = set(filters_fields.keys())



# Add custom filter objects.
super().__init_subclass_with_meta__(_meta=_meta, **options)

Expand Down
40 changes: 20 additions & 20 deletions noxfile.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,38 @@
import nox


module = 'graphene_sqlalchemy_filter'
tests = 'tests'
module = "graphene_sqlalchemy_filter"
tests = "tests"
dirs = [module, tests]


@nox.session(python='3.9')
@nox.session(python="3.9")
def lint(session):
session.install('flake8', 'black', 'isort==4.3.21')
session.install("flake8", "black", "isort==4.3.21")

session.run('black', '--check', '-l', '79', '-S', *dirs)
session.run('isort', '--check-only', *dirs)
session.run('flake8', '--show-source', '--statistics', *dirs)
session.run("black", "--check", "-l", "79", "-S", *dirs)
session.run("isort", "--check-only", *dirs)
session.run("flake8", "--show-source", "--statistics", *dirs)


@nox.session(python=['3.6', '3.7', '3.8', '3.9'])
@nox.parametrize("graphene_sqlalchemy", ['==2.1.0', '==2.2.0', '==2.2.1'])
@nox.session(python=["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"])
@nox.parametrize("graphene_sqlalchemy", ["==2.1.0", "==2.2.0", "==2.2.1", ">3.0"])
def test(session, graphene_sqlalchemy):
session.install('pytest')
session.install('-e', '.')
session.install(f'graphene-sqlalchemy{graphene_sqlalchemy}')
session.run('pytest', *dirs, *session.posargs)
session.install("pytest")
session.install("-e", ".")
session.install(f"graphene-sqlalchemy{graphene_sqlalchemy}")
session.run("pytest", *dirs, *session.posargs)


@nox.session(python='3.7')
@nox.session(python="3.7")
def coverage(session):
session.install('pytest', 'pytest-cov', 'coverage<5.0.0')
session.install('-e', '.')
session.install("pytest", "pytest-cov", "coverage<5.0.0")
session.install("-e", ".")
session.run(
'pytest',
'--cov-report',
'term-missing',
'--cov',
"pytest",
"--cov-report",
"term-missing",
"--cov",
*dirs,
*session.posargs,
)
47 changes: 24 additions & 23 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,45 @@
from setuptools import find_packages, setup


_version_re = re.compile(r'__version__\s+=\s+(.*)')
_version_re = re.compile(r"__version__\s+=\s+(.*)")


with open('graphene_sqlalchemy_filter/__init__.py', 'rb') as f:
version = str(
ast.literal_eval(_version_re.search(f.read().decode('utf-8')).group(1))
)
with open("graphene_sqlalchemy_filter/__init__.py", "rb") as f:
version = str(ast.literal_eval(_version_re.search(f.read().decode("utf-8")).group(1)))


with open('README.rst', encoding='utf-8') as f:
with open("README.rst", encoding="utf-8") as f:
long_description = f.read()


requirements = [
'graphene-sqlalchemy>=2.1.0,<3',
'SQLAlchemy<2',
"graphene-sqlalchemy>=2.1.0",
"SQLAlchemy<2",
]


setup(
name='graphene-sqlalchemy-filter',
name="graphene-sqlalchemy-filter",
version=version,
description='Filters for Graphene SQLAlchemy integration',
url='https://github.com/art1415926535/graphene-sqlalchemy-filter',
author='Artem Fedotov',
license='MIT',
description="Filters for Graphene SQLAlchemy integration",
url="https://github.com/art1415926535/graphene-sqlalchemy-filter",
author="Artem Fedotov",
license="MIT",
long_description=long_description,
classifiers=[
'Intended Audience :: Developers',
'Topic :: Software Development :: Libraries',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: Implementation :: PyPy',
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: Implementation :: PyPy",
],
keywords='api graphql protocol rest relay graphene',
packages=find_packages(exclude=['tests']),
keywords="api graphql protocol rest relay graphene",
packages=find_packages(exclude=["tests"]),
install_requires=requirements,
python_requires='>=3.6'
python_requires=">=3.6",
)
8 changes: 4 additions & 4 deletions tests/test_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

# Project
from graphene_sqlalchemy_filter.connection_field import (
graphene_sqlalchemy_version_lt_2_1_2,
graphene_sqlalchemy_version_lt_2_1,
)
from tests.graphql_objects import schema
from tests.models import Group, Membership, User
Expand Down Expand Up @@ -175,7 +175,7 @@ def test_nested_response_without_filters(session):
}
}
}"""
if graphene_sqlalchemy_version_lt_2_1_2:
if graphene_sqlalchemy_version_lt_2_1:
query_count = 8 # default
else:
query_count = 5 # graphene_sqlalchemy_filter.ModelLoader
Expand Down Expand Up @@ -224,7 +224,7 @@ def test_nested_response_without_filters(session):


@pytest.mark.skipif(
graphene_sqlalchemy_version_lt_2_1_2, reason='not supported'
graphene_sqlalchemy_version_lt_2_1, reason='not supported'
)
def test_nested_response_with_filters(session):
users = add_users(session)
Expand Down Expand Up @@ -273,7 +273,7 @@ def test_nested_response_with_filters(session):


@pytest.mark.skipif(
graphene_sqlalchemy_version_lt_2_1_2, reason='not supported'
graphene_sqlalchemy_version_lt_2_1, reason='not supported'
)
def test_nested_response_with_recursive_model(session):
add_groups(session, with_parent_group=True)
Expand Down
10 changes: 5 additions & 5 deletions tests/test_nested_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
FilterableConnectionField,
ModelLoader,
NestedFilterableConnectionField,
graphene_sqlalchemy_version_lt_2_1_2,
graphene_sqlalchemy_version_lt_2_1,
)

# This module
from .models import Article, Author, Group, User


@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1_2, reason='not used')
@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1, reason='not used')
@pytest.mark.skipif(
# https://stackoverflow.com/questions/45335276/sqlite-select-query-including-a-values-in-the-where-clause-returns-correctly-w
sqlite3.sqlite_version_info < (3, 15, 2),
Expand Down Expand Up @@ -55,7 +55,7 @@ def test_composite_pk(info, session):
assert a2.text == 'abc'


@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1_2, reason='not used')
@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1, reason='not used')
def test_custom_filter_arg():
custom_filter_arg = 'where'

Expand All @@ -69,7 +69,7 @@ class CustomFiled(FilterableConnectionField):
assert model_loader_class.filter_arg == custom_filter_arg


@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1_2, reason='not used')
@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1, reason='not used')
def test_model_dataloader_creation(info):
info.path = ['user', 'edges', 0, 'node', 'groups']
info.field_name = 'groups'
Expand All @@ -94,7 +94,7 @@ def test_model_dataloader_creation(info):
assert model_loader_1 is not model_loader_3


@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1_2, reason='not used')
@pytest.mark.skipif(graphene_sqlalchemy_version_lt_2_1, reason='not used')
def test_flask_context(info):
class Request:
pass
Expand Down