6
0
Răsfoiți Sursa

moved JSONEncoder class and merged all other Encoders to a single class

Dimitri Korsch 3 ani în urmă
părinte
comite
fcde1d75a7

+ 6 - 1
pycs/__init__.py

@@ -15,6 +15,7 @@ from sqlalchemy import event
 from sqlalchemy import pool
 from sqlalchemy.engine import Engine
 
+from pycs.util.JSONEncoder import JSONEncoder
 
 print('=== Loading settings ===')
 with open('settings.json', encoding='utf8') as file:
@@ -22,7 +23,7 @@ with open('settings.json', encoding='utf8') as file:
 
 # create projects folder
 if not os.path.exists(settings.projects_folder):
-    os.mkdir(settings.projects_folder)
+    os.mkdir(settings.projects_folder) # pragma: no-cover
 
 DB_FILE = Path.cwd() / settings.database
 
@@ -32,6 +33,10 @@ app = Flask(__name__)
 app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_FILE}"
 app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
 
+
+# set json encoder so database objects are serialized correctly
+app.json_encoder = JSONEncoder
+
 # pylint: disable=unused-argument
 @event.listens_for(Engine, "connect")
 def set_sqlite_pragma(dbapi_connection, connection_record):

+ 0 - 16
pycs/database/util/JSONEncoder.py

@@ -1,16 +0,0 @@
-from typing import Any
-
-from flask.json import JSONEncoder as Base
-
-from pycs.database.base import BaseModel
-
-class JSONEncoder(Base):
-    """
-    prepares database objects to be json encoded
-    """
-
-    def default(self, o: Any) -> Any:
-        if isinstance(o, BaseModel):
-            return o.serialize()
-
-        return o.__dict__.copy()

+ 0 - 3
pycs/frontend/WebServer.py

@@ -51,7 +51,6 @@ from pycs.frontend.endpoints.results.GetResults import GetResults
 from pycs.frontend.endpoints.results.RemoveResult import RemoveResult
 from pycs.frontend.endpoints.results.ResetResults import ResetResults
 from pycs.frontend.notifications.NotificationManager import NotificationManager
-from pycs.frontend.util.JSONEncoder import JSONEncoder
 from pycs.jobs.JobRunner import JobRunner
 from pycs.util.PipelineCache import PipelineCache
 
@@ -66,8 +65,6 @@ class WebServer:
     def __init__(self, app, settings: munch.Munch, discovery: bool = True):
 
         self.app = app
-        # set json encoder so database objects are serialized correctly
-        self.app.json_encoder = JSONEncoder
 
         # initialize web server
         if self.is_production:

+ 1 - 2
pycs/frontend/notifications/NotificationManager.py

@@ -6,7 +6,6 @@ from pycs.database.Label import Label
 from pycs.database.Model import Model
 from pycs.database.Project import Project
 from pycs.database.Result import Result
-from pycs.frontend.util.JSONEncoder import JSONEncoder
 from pycs.jobs.Job import Job
 
 
@@ -17,7 +16,7 @@ class NotificationManager:
 
     def __init__(self, sio: Server):
         self.sio = sio
-        self.json = JSONEncoder()
+        self.json = app.json_encoder()
 
     def __emit(self, name, obj):
         enc = self.json.default(obj)

+ 0 - 31
pycs/frontend/util/JSONEncoder.py

@@ -1,31 +0,0 @@
-import datetime
-
-from typing import Any
-
-from flask.json import JSONEncoder as Base
-
-from pycs.database.util.JSONEncoder import JSONEncoder as DatabaseEncoder
-from pycs.jobs.util.JSONEncoder import JSONEncoder as JobsEncoder
-
-
-class JSONEncoder(Base):
-    """
-    prepares job and DB objects to be json encoded
-    """
-
-    def default(self, o: Any) -> Any:
-        module = o.__class__.__module__
-
-        if module.startswith('pycs.database'):
-            return DatabaseEncoder().default(o)
-
-        if module.startswith('pycs.jobs'):
-            return JobsEncoder().default(o)
-
-        if isinstance(o, datetime.datetime):
-            return str(o)
-
-        if isinstance(o, dict):
-            return o
-
-        return o.__dict__

+ 0 - 0
pycs/frontend/util/__init__.py


+ 0 - 17
pycs/jobs/util/JSONEncoder.py

@@ -1,17 +0,0 @@
-from typing import Any
-
-from flask.json import JSONEncoder as Base
-
-
-class JSONEncoder(Base):
-    """
-    prepares job objects to be json encoded
-    """
-
-    def default(self, o: Any) -> Any:
-        # copy = o.__dict__.copy()
-        # del copy['runner']
-        # del copy['group']
-        # return copy
-
-        return o.__dict__.copy()

+ 0 - 0
pycs/jobs/util/__init__.py


+ 22 - 0
pycs/util/JSONEncoder.py

@@ -0,0 +1,22 @@
+import datetime
+import typing as T
+
+from flask import json
+
+class JSONEncoder(json.JSONEncoder):
+    """
+    prepares job and DB objects to be json encoded
+    """
+
+    def default(self, o: T.Any) -> T.Any:
+
+        if hasattr(o, "serialize") and callable(o.serialize):
+            return o.serialize()
+
+        if isinstance(o, datetime.datetime):
+            return str(o)
+
+        if isinstance(o, dict):
+            return o
+
+        return o.__dict__.copy()