diff --git a/.github/workflows/pypi-publish.yaml b/.github/workflows/pypi-publish.yaml index 95a0253..f1da95b 100644 --- a/.github/workflows/pypi-publish.yaml +++ b/.github/workflows/pypi-publish.yaml @@ -1,5 +1,5 @@ # This workflow will upload a Python Package using Twine when a release is created -# For more information see: +# For more information see: # - https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries # - https://docs.pypi.org/trusted-publishers/using-a-publisher/ @@ -23,15 +23,21 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v3 + + - name: Set up 🐍 + uses: actions/setup-python@v4 with: python-version: '3.x' - - name: Install dependencies + cache: 'pip' + cache-dependency-path: pyproject.toml + + - name: 📦 Install dependencies run: | python -m pip install --upgrade pip pip install build - - name: Build package + + - name: 🏗 Build package 🚧 run: python -m build - - name: Publish package distributions to PyPI + + - name: 🚚 Publish package distributions to PyPI 🚀 uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/src/flask_rest_jsonapi_next/data_layers/filtering/alchemy.py b/src/flask_rest_jsonapi_next/data_layers/filtering/alchemy.py index 2201dd0..4df37c2 100644 --- a/src/flask_rest_jsonapi_next/data_layers/filtering/alchemy.py +++ b/src/flask_rest_jsonapi_next/data_layers/filtering/alchemy.py @@ -14,8 +14,11 @@ def create_filters(model, filter_info, resource): :param Resource resource: the resource """ filters = [] + for filter_ in filter_info: - filters.append(Node(model, filter_, resource, resource.schema).resolve()) + resolved = Node(model, filter_, resource, resource.schema).resolve() + if resolved is not None: + filters.append(resolved) return filters @@ -61,17 +64,17 @@ def resolve(self): else: return getattr(self.column, self.operator)(value) - if "or" in self.filter_: + if "or" in self.filter_ and self.filter_["or"]: return or_( Node(self.model, filt, self.resource, self.schema).resolve() for filt in self.filter_["or"] ) - if "and" in self.filter_: + if "and" in self.filter_ and self.filter_["and"]: return and_( Node(self.model, filt, self.resource, self.schema).resolve() for filt in self.filter_["and"] ) - if "not" in self.filter_: + if "not" in self.filter_ and self.filter_["not"]: return not_( Node( self.model, self.filter_["not"], self.resource, self.schema diff --git a/tests/sqlalchemy_filtering_spec.py b/tests/sqlalchemy_filtering_spec.py index ddd1fd7..aaeab84 100644 --- a/tests/sqlalchemy_filtering_spec.py +++ b/tests/sqlalchemy_filtering_spec.py @@ -33,3 +33,13 @@ def test_Node(person_model, person_schema): n.related_model with pytest.raises(InvalidFilters): n.related_schema + + +def test_Node_empty_filter(person_model, person_schema): + for filt in [ + {"and": []}, + {"or": []}, + {"not": []}, + ]: + resolved = Node(person_model, filt, None, person_schema).resolve() + assert resolved is None