diff options
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/base_route.py | 4 | ||||
-rw-r--r-- | pysite/database.py | 24 | ||||
-rw-r--r-- | pysite/decorators.py | 9 | ||||
-rw-r--r-- | pysite/mixins.py | 4 | ||||
-rw-r--r-- | pysite/views/api/bot/tag.py | 6 | ||||
-rw-r--r-- | pysite/views/api/bot/user.py | 2 | ||||
-rw-r--r-- | pysite/views/tests/__init__.py | 1 | ||||
-rw-r--r-- | pysite/views/tests/index.py | 23 |
8 files changed, 48 insertions, 25 deletions
diff --git a/pysite/base_route.py b/pysite/base_route.py index 017a8b6e..400a4649 100644 --- a/pysite/base_route.py +++ b/pysite/base_route.py @@ -156,7 +156,7 @@ class ErrorView(BaseView): """ if hasattr(super(), "setup"): - super().setup(manager, blueprint) + super().setup(manager, blueprint) # pragma: no cover if not cls.name or not cls.error_code: raise RuntimeError("Error views must have both `name` and `error_code` defined") @@ -171,4 +171,4 @@ class ErrorView(BaseView): except KeyError: # This happens if we try to register a handler for a HTTP code that doesn't exist pass else: - raise RuntimeError("Error views must have an `error_code` that is either an `int` or an iterable") + raise RuntimeError("Error views must have an `error_code` that is either an `int` or an iterable") # pragma: no cover # noqa: E501 diff --git a/pysite/database.py b/pysite/database.py index f031e2a8..239a2fdc 100644 --- a/pysite/database.py +++ b/pysite/database.py @@ -228,11 +228,11 @@ class RethinkDB: :return: The document, or None if it wasn't found """ - result = self.run( + result = self.run( # pragma: no cover self.query(table_name).get(key) ) - return dict(result) if result else None + return dict(result) if result else None # pragma: no cover def get_all(self, table_name: str, *keys: str, index: str="id") -> List[Any]: """ @@ -245,7 +245,7 @@ class RethinkDB: :return: A list of matching documents; may be empty if no matches were made """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).get_all(*keys, index=index), coerce=list ) @@ -262,7 +262,7 @@ class RethinkDB: :return: True; but may return False if the timeout was reached """ - result = self.run( + result = self.run( # pragma: no cover self.query(table_name).wait(wait_for=wait_for, timeout=timeout), coerce=dict ) @@ -277,12 +277,12 @@ class RethinkDB: :return: True if the sync was successful; False otherwise """ - result = self.run( + result = self.run( # pragma: no cover self.query(table_name).sync(), coerce=dict ) - return result.get("synced", 0) > 0 + return result.get("synced", 0) > 0 # pragma: no cover def changes(self, table_name: str, squash: Union[bool, int]=False, changefeed_queue_size: int=100_000, include_initial: Optional[bool]=None, include_states: bool=False, @@ -336,7 +336,7 @@ class RethinkDB: :return: A special iterator that will iterate over documents in the changefeed as they're sent. If there is no document waiting, this will block the function until there is. """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).changes( squash=squash, changefeed_queue_size=changefeed_queue_size, include_initial=include_initial, include_states=include_states, include_offsets=False, include_types=include_types @@ -368,7 +368,7 @@ class RethinkDB: :return: A list containing the requested documents, with only the keys requested """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).pluck(*selectors), coerce=list ) @@ -388,7 +388,7 @@ class RethinkDB: :return: A list containing the requested documents, without the keys requested """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).without(*selectors) ) @@ -422,7 +422,7 @@ class RethinkDB: :return: A list of matched documents; may be empty """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).between(lower, upper, index=index, left_bound=left_bound, right_bound=right_bound), coerce=list ) @@ -449,7 +449,7 @@ class RethinkDB: :return: Unknown, needs more testing """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).map(func), coerce=list ) @@ -479,7 +479,7 @@ class RethinkDB: :return: A list of documents that match the predicate; may be empty """ - return self.run( + return self.run( # pragma: no cover self.query(table_name).filter(predicate, default=default), coerce=list ) diff --git a/pysite/decorators.py b/pysite/decorators.py index ff55b929..03d5e6b8 100644 --- a/pysite/decorators.py +++ b/pysite/decorators.py @@ -36,7 +36,6 @@ def api_params(schema: Schema, validation_type: ValidationTypes = ValidationType This data will always be a list, and view functions are expected to be able to handle that in the case of multiple sets of data being provided by the api. """ - def inner_decorator(f): @wraps(f) @@ -48,7 +47,7 @@ def api_params(schema: Schema, validation_type: ValidationTypes = ValidationType data = list(request.get_json()) except JSONDecodeError: - return self.error(ErrorCodes.bad_data_format) + return self.error(ErrorCodes.bad_data_format) # pragma: no cover elif validation_type == ValidationTypes.params: # I really don't like this section here, but I can't think of a better way to do it @@ -65,9 +64,9 @@ def api_params(schema: Schema, validation_type: ValidationTypes = ValidationType # First iteration, store it longest = len(items) - elif len(items) != longest: + elif len(items) != longest: # pragma: no cover # At least one key has a different number of values - return self.error(ErrorCodes.bad_data_format) + return self.error(ErrorCodes.bad_data_format) # pragma: no cover for i in range(longest): # Now we know all keys have the same number of values... obj = {} # New dict to store this set of values @@ -78,7 +77,7 @@ def api_params(schema: Schema, validation_type: ValidationTypes = ValidationType data.append(obj) else: - raise ValueError(f"Unknown validation type: {validation_type}") + raise ValueError(f"Unknown validation type: {validation_type}") # pragma: no cover try: schema.validate(data) diff --git a/pysite/mixins.py b/pysite/mixins.py index 43dcf6d4..930a7eb7 100644 --- a/pysite/mixins.py +++ b/pysite/mixins.py @@ -8,7 +8,7 @@ from rethinkdb.ast import Table from pysite.database import RethinkDB -class DBMixin: +class DBMixin(): """ Mixin for classes that make use of RethinkDB. It can automatically create a table with the specified primary key using the attributes set at class-level. @@ -46,7 +46,7 @@ class DBMixin: """ if hasattr(super(), "setup"): - super().setup(manager, blueprint) + super().setup(manager, blueprint) # pragma: no cover if not cls.table_name: raise RuntimeError("Routes using DBViewMixin must define `table_name`") diff --git a/pysite/views/api/bot/tag.py b/pysite/views/api/bot/tag.py index 2117d948..8818074e 100644 --- a/pysite/views/api/bot/tag.py +++ b/pysite/views/api/bot/tag.py @@ -24,11 +24,11 @@ class TagView(APIView, DBMixin): tag_name = request.args.get("tag_name") if tag_name: - data = self.db.get(self.table_name, tag_name) or {} + data = self.db.get(self.table_name, tag_name) or {} # pragma: no cover else: data = self.db.pluck(self.table_name, "tag_name") or [] - return jsonify(data) + return jsonify(data) # pragma: no cover @api_key def post(self): @@ -54,4 +54,4 @@ class TagView(APIView, DBMixin): else: return self.error(ErrorCodes.incorrect_parameters) - return jsonify({"success": True}) + return jsonify({"success": True}) # pragma: no cover diff --git a/pysite/views/api/bot/user.py b/pysite/views/api/bot/user.py index 174407b8..f80bb826 100644 --- a/pysite/views/api/bot/user.py +++ b/pysite/views/api/bot/user.py @@ -36,4 +36,4 @@ class UserView(APIView, DBMixin): conflict="update" ) - return jsonify(changes) + return jsonify(changes) # pragma: no cover diff --git a/pysite/views/tests/__init__.py b/pysite/views/tests/__init__.py new file mode 100644 index 00000000..adfc1286 --- /dev/null +++ b/pysite/views/tests/__init__.py @@ -0,0 +1 @@ +# .gitkeep diff --git a/pysite/views/tests/index.py b/pysite/views/tests/index.py new file mode 100644 index 00000000..78b7ef2e --- /dev/null +++ b/pysite/views/tests/index.py @@ -0,0 +1,23 @@ +# coding=utf-8 + +from flask import jsonify + +from schema import Schema + +from pysite.base_route import RouteView +from pysite.constants import ValidationTypes +from pysite.decorators import api_params + +SCHEMA = Schema([{"test": str}]) + +REQUIRED_KEYS = ["test"] + + +class TestParamsView(RouteView): + path = "/testparams" + name = "testparams" + + @api_params(schema=SCHEMA, validation_type=ValidationTypes.params) + def post(self, data): + jsonified = jsonify(data) + return jsonified |