From 88095b4f55612fdc44058ff5f50bda8032fce05b Mon Sep 17 00:00:00 2001 From: Jesus Roldan Date: Sun, 4 Oct 2015 15:33:12 -0300 Subject: [PATCH 1/3] Prevent too broad exception --- sqlalchemy_elasticquery/elastic_query.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sqlalchemy_elasticquery/elastic_query.py b/sqlalchemy_elasticquery/elastic_query.py index 28fcb30..c5ab18a 100644 --- a/sqlalchemy_elasticquery/elastic_query.py +++ b/sqlalchemy_elasticquery/elastic_query.py @@ -120,14 +120,15 @@ def parse_field(self, field, field_value): value = field_value return field, operator, value - def verify_operator(self, operator): + @staticmethod + def verify_operator(operator): """ Verify if the operator is valid """ try: if hasattr(OPERATORS[operator], '__call__'): return True else: return False - except: + except ValueError: return False def is_field_allowed(self, field): From 7eacf0901ca4bbd76c904bc4597e134d81fe800b Mon Sep 17 00:00:00 2001 From: Jesus Roldan Date: Sun, 4 Oct 2015 15:33:55 -0300 Subject: [PATCH 2/3] Improve setup and PEP8 validation in test --- setup.py | 4 ++++ test/test.py | 14 +++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 70827ff..662ea7a 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ import os from setuptools import setup + def read(*paths): """Build a file path from *paths* and return the contents.""" with open(os.path.join(*paths), 'r') as f: @@ -17,14 +18,17 @@ def read(*paths): packages=['sqlalchemy_elasticquery'], include_package_data=True, install_requires=[ + 'Flask>=0.10', 'SQLAlchemy>=0.7.8', ], classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Plugins', + 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Database' + 'Topic :: Software Development :: Libraries :: Python Modules' ] ) diff --git a/test/test.py b/test/test.py index cf7c4a6..cb90015 100644 --- a/test/test.py +++ b/test/test.py @@ -4,11 +4,11 @@ from flask.ext.sqlalchemy import SQLAlchemy from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy_elasticquery import elastic_query -from sqlalchemy import and_, or_ from flask import Flask Base = declarative_base() + class City(Base): __tablename__ = 'city' @@ -18,6 +18,7 @@ class City(Base): def __repr__(self): return str(self.id) + class User(Base): __tablename__ = 'users' @@ -31,6 +32,7 @@ class User(Base): def __repr__(self): return str(self.id) + class TestCase(unittest.TestCase): def setUp(self): @@ -67,7 +69,8 @@ def test_simple_query(self): def test_and_operator(self): """ test and operator """ - query_string = '{"filter" : {"and" : {"name" : {"like" : "%Jho%"}, "lastname" : "Galt", "uid" : {"like" : "%1957%"} } } }' + query_string = \ + '{"filter" : {"and" : {"name" : {"like" : "%Jho%"}, "lastname" : "Galt", "uid" : {"like" : "%1957%"} } } }' assert(elastic_query(User, query_string, session).count() == 1) def test_or_operator(self): @@ -77,7 +80,8 @@ def test_or_operator(self): def test_or_and_operator(self): """ test or and operator """ - query_string = '{"filter" : {"or" : { "name" : "Jhon", "lastname" : "Galt" }, "and" : { "uid" : "19571957" } } }' + query_string = \ + '{"filter" : {"or" : { "name" : "Jhon", "lastname" : "Galt" }, "and" : { "uid" : "19571957" } } }' assert(elastic_query(User, query_string, session).count() == 1) def test_sorting(self): @@ -87,7 +91,6 @@ def test_sorting(self): assert(results[0].name == 'Iron') def test_flask(self): - #Flask app app = Flask(__name__) db = SQLAlchemy(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' @@ -126,7 +129,8 @@ def test_allow_fields_option(self): def test_search_for_levels(self): """ test search for levels """ - query_string = '{"filter" : {"or" : { "city.name" : "New York", "lastname" : "Man" } }, "sort": { "name" : "asc" } }' + query_string = \ + '{"filter" : {"or" : { "city.name" : "New York", "lastname" : "Man" } }, "sort": { "name" : "asc" } }' results = elastic_query(User, query_string, session).all() assert(results[0].name == 'Iron') From 37d57095d4210d846f3a01bd54a4cf1acfc3ccd8 Mon Sep 17 00:00:00 2001 From: Jesus Roldan Date: Sun, 4 Oct 2015 16:29:53 -0300 Subject: [PATCH 3/3] Operator: in --- sqlalchemy_elasticquery/elastic_query.py | 7 +++++-- test/test.py | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/sqlalchemy_elasticquery/elastic_query.py b/sqlalchemy_elasticquery/elastic_query.py index c5ab18a..5b9e348 100644 --- a/sqlalchemy_elasticquery/elastic_query.py +++ b/sqlalchemy_elasticquery/elastic_query.py @@ -79,8 +79,11 @@ def __init__(self, model, query, session=None, enabled_fields=None): def search(self): """ This is the most important method """ - # TODO: verify format and emit expetion - filters = json.loads(self.query) + try: + filters = json.loads(self.query) + except ValueError: + return False + result = self.model_query if 'filter'in filters.keys(): result = self.parse_filter(filters['filter']) diff --git a/test/test.py b/test/test.py index cb90015..4ea8d6c 100644 --- a/test/test.py +++ b/test/test.py @@ -75,7 +75,8 @@ def test_and_operator(self): def test_or_operator(self): """ test or operator """ - query_string = '{"filter" : {"or" : { "name" : "Jobs", "lastname" : "Man", "uid" : "19571957" } } }' + query_string = \ + '{"filter" : {"or" : { "name" : "Jobs", "lastname" : "Man", "uid" : "19571957" } } }' assert(elastic_query(User, query_string, session).count() == 2) def test_or_and_operator(self): @@ -86,10 +87,19 @@ def test_or_and_operator(self): def test_sorting(self): """ test operator levels """ - query_string = '{"filter" : {"or" : { "name" : "Jhon", "lastname" : "Man" } }, "sort": { "name" : "asc" } }' + query_string = \ + '{"filter" : {"or" : { "name" : "Jhon", "lastname" : "Man" } }, "sort": { "name" : "asc" } }' results = elastic_query(User, query_string, session).all() assert(results[0].name == 'Iron') + def test_in_operator(self): + """ test operator in """ + query_string = '{"filter" : {"name" : {"in" : ["Jhon", "Peter", "Iron"] } } }' + assert(elastic_query(User, query_string, session).count() == 2) + + query_string = '{"filter" : {"name" : {"in" :["Jhon", "Peter", "Iron"]}, "lastname" : "Galt" } }' + assert(elastic_query(User, query_string, session).count() == 1) + def test_flask(self): app = Flask(__name__) db = SQLAlchemy(app)