From febd87737c525b323679010b6b9126e6c748e46a Mon Sep 17 00:00:00 2001
From: anwinged <anwinged@c733b785-2984-70f4-63a9-da4130069974>
Date: Sun, 11 Mar 2012 08:46:54 +0000
Subject: [PATCH] Objects descriptions and definitions designed

---
 trunk/opal.py       | 167 ++++++++++++++++++++++++++++++++++++++++----
 trunk/tasks/task.js |   3 +-
 trunk/tasks/task.py |  28 +++++---
 3 files changed, 170 insertions(+), 28 deletions(-)

diff --git a/trunk/opal.py b/trunk/opal.py
index 3bb5314..989d165 100644
--- a/trunk/opal.py
+++ b/trunk/opal.py
@@ -2,6 +2,18 @@
 #! coding: utf-8
 
 import subprocess
+import json
+import os, sys
+import datetime
+
+#-------------------------------------------------------------------------------
+
+def GenerateId(data):
+    import hashlib
+    title  = data['title']
+    author = data['author']
+    id = hashlib.md5(title + author).hexdigest()
+    return id
 
 #-------------------------------------------------------------------------------
 
@@ -12,18 +24,78 @@ class LocalServer:
         self.max_run = 2
         self.cur_run = 0
 
+        self.task_descrs = []
         self.task_queue = []
+        self.log = None
 
-    def GetTaskDescriptionList(self):
+        self.Init()
+
+    def Init(self):
+        self.log = open('log.txt', 'w')
+        self.WriteToLog('local server initialized')
+
+    def Close(self):
+        self.WriteToLog('local server closed\n')
+
+    def __del__(self):
+        self.Close()
+
+    def WriteToLog(self, msg):
+        tm = str(datetime.datetime.now())
+        msg = tm + '  ' + msg
+        self.log.write(msg + '\n')
+        print msg
+
+    def Start(self):
         pass
 
+    def Stop(self):
+        pass
+
+    def TestTaskData(self, data):
+        pass
+
+    def LoadTasksDescriptions(self, source = 'tasks.conf'):
+        """
+        """
+        self.task_descrs = []
+
+        self.WriteToLog('tasks interrogation starts')
+        for line in open(source, 'r'):
+            try:
+                # нормализуем указанный путь
+                line = os.path.normpath(line)
+                # считываем данные через shell (важно для скриптовых языков)
+                textdata = subprocess.check_output([line, '-i'], shell = True)
+                # загружаем данные описания задачи
+                data = json.loads(textdata)
+                # провряем их на корректность
+                self.TestTaskData(data)
+                # пакуем все в объект-описание задачи
+                task_descr = TaskDescription(self, line, data)
+                # добавляем в список описаний
+                self.task_descrs.append(task_descr)
+                self.WriteToLog('Task from "{}" asked'.format(line))
+            except IOError, e:
+                self.WriteToLog('file "{}" not found'.format(line))
+            except subprocess.CalledProcessError, e:
+                self.WriteToLog('file "{}" not opened, error {} (msg: {})'.format(line, e, e.output))
+            except ValueError, e:
+                self.WriteToLog('file "{}" not opened, error "{}")'.format(line, e))
+
+    def GetTasksDescriptions(self):
+        """
+        Return list with task descriptions
+        """
+        return self.task_descrs
+
     def GetTaskCount(self):
         pass
 
     def GetTask(self, index):
         pass
 
-    def AddTask(self, *args):
+    def AddTask(self, task):
         pass
 
 #-------------------------------------------------------------------------------
@@ -32,25 +104,82 @@ class TaskDescription:
     """
     Description of the task. Task runs on server.
     """
-    def __init__(self, server, tid, data):
-        self.server = server
-        self.tid = tid
-        self.data = data
+    def __init__(self, server, execpath, data):
+        """
+        ``server`` is owner of task process
+
+        ``execpath`` - path to task executable
+
+        ``data`` is parsed data presentation about models, methods
+        and meta information
+        """
+        self.server     = server
+        self.execpath   = execpath
+        self.data       = data
+        self.models     = []
+        for label, data in self.data['models'].iteritems():
+            self.models.append(ModelDescription(self, label, data))
+
+    def GetModelsDescriptions(self):
+        return self.models
 
 #-------------------------------------------------------------------------------
 
-class ObjectDescription:
-    def __init__(self, taskdescr, label, data):
-        pass
-
-class ObjectDefinition:
-    def __init__(self, taskdescr, label, data):
-        pass
-
 class Parameter:
     def __init__(self, paramdescr):
         pass
 
+def DoDataParametrization(data):
+    pass
+
+class ObjectDescription:
+    def __init__(self, parentdescr, label, data):
+        self.parentdescr = parentdescr
+        self.label       = label
+        self.data        = data
+        DoDataParametrization(self.data)
+
+    def GetLabel(self):
+        return self.label
+
+    def GetTitle(self):
+        return self.data.get('title', self.label)
+
+    def GetAuthor(self):
+        return self.data.get('author', 'Unknown')
+
+    def GetId(self):
+        return None
+
+class ModelDescription(ObjectDescription):
+    def __init__(self, taskdescr, label, data):
+        ObjectDescription.__init__(self, taskdescr, label, data)
+        self.methods = []
+        for label, data in self.data['methods'].iteritems():
+            self.methods.append(MethodDescription(self, label, data))
+
+    def GetMethodsDescriptions(self):
+        return self.methods
+
+class MethodDescription(ObjectDescription):
+    def __init__(self, modeldescr, label, data):
+        ObjectDescription.__init__(self, modeldescr, label, data)
+
+#-------------------------------------------------------------------------------
+
+class ObjectDefinition:
+    def __init__(self, objectdescr):
+        self.descr = objectdescr
+        self.params = {}
+
+class ModelDefinition(ObjectDefinition):
+    def __init__(self, modeldescr):
+        ObjectDefinition(self, modeldescr)
+
+class MethodDefinition(ObjectDefinition):
+    def __init__(self, methoddescr):
+        ObjectDefinition(self, methoddescr)
+
 #-------------------------------------------------------------------------------
 
 class Task:
@@ -72,7 +201,15 @@ class Task:
 #-------------------------------------------------------------------------------
 
 def main():
-    pass
+    s = LocalServer()
+    s.LoadTasksDescriptions()
+    ds = s.GetTasksDescriptions()
+    ms = ds[0].GetModelsDescriptions()
+    for m in ms:
+        print m.GetTitle()
+        print m.GetLabel()
+        print m.GetAuthor()
+        print m.GetId()
 
 if __name__ == '__main__':
     main()
diff --git a/trunk/tasks/task.js b/trunk/tasks/task.js
index 6e7faf2..f44dd02 100644
--- a/trunk/tasks/task.js
+++ b/trunk/tasks/task.js
@@ -1,14 +1,13 @@
 {
     "title": "Example task",
     "author": "Anton Vakhrushev",
-
-    "silent": false,
     
     "models": {
     
         "simpleexample": {
         
             "title": "Simple example model",
+            "author": "Anton Vakhrushev",
 
             "data": {
             
diff --git a/trunk/tasks/task.py b/trunk/tasks/task.py
index d3ac794..63f6495 100644
--- a/trunk/tasks/task.py
+++ b/trunk/tasks/task.py
@@ -2,21 +2,27 @@
 
 import sys
 import json
+import os
 
 def main():
 
-##    if len(sys.argv) != 2:
-##        print 'Error!'
-##        return
-##
-##    if sys.argv[1] == '-i':
-    with open('task.js') as f:
-        d = json.load(f)
-        print json.dumps(d, indent = 2)
+#    try:
 
-##    elif sys.argv[1] == '-r':
-##        data = raw_input()
-##        data = json.loads(data)
+    d = os.path.dirname(__file__)
+    os.chdir(d)
+
+    if sys.argv[1] == '-i':
+        with open('task.js') as f:
+            d = json.load(f)
+            print json.dumps(d, indent = 2)
+
+    elif sys.argv[1] == '-r':
+        textdata = raw_input()
+        data = json.loads(data)
+
+#    except:
+#        print 'Error!'
+#        sys.exit(-1)
 
 if __name__ == '__main__':
     main()
\ No newline at end of file