From 7614c86d0ab1a54ac3e63d95bc20ef892a18cdf0 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Savard Date: Wed, 15 Apr 2009 15:37:21 +0000 Subject: LP 341760 Serializer : Bundler.py up to date --- diff --git a/src/sugar/tutorius/bundler.py b/src/sugar/tutorius/bundler.py index d6fb9e2..3678e86 100644 --- a/src/sugar/tutorius/bundler.py +++ b/src/sugar/tutorius/bundler.py @@ -22,6 +22,7 @@ This module contains all the data handling class of Tutorius import logging import os +import uuid from sugar.tutorius import gtkutils, overlayer from sugar.tutorius.core import Tutorial, State, FiniteStateMachine @@ -158,8 +159,8 @@ class TutorialBundler: editor. """ - TUT_STORE_ROOT = os.getenv("$SUGAR_PREFIX") + "/share/tutorius/" + guid - TUT_BUNDLE_ROOT = os.getenv("$SUGAR_BUNDLE_PATH") + "/data/tutorius/" + TUT_STORE_ROOT = os.getenv("$SUGAR_PREFIX") + "/share/tutorius/Data" + TUT_BUNDLE_ROOT = os.getenv("$SUGAR_BUNDLE_PATH") + "/data/tutorius/Data" INI_ACTIVITY_SECTION = "RELATED_ACTIVITIES" INI_METADATA_SECTION = "GENERAL_METADATA" INI_GUID_PROPERTY = "GUID" @@ -170,104 +171,108 @@ class TutorialBundler: def __init__(self,generated_guid = None): """ TODO. - The GUID associated to the tutorial will be generated in the constructor. + Tutorial_bundler constructor. If a GUID is given in the parameter, the + Tutorial_bundler object will be associated with it. If no GUID is given, + a new GUID will be generated, """ + def __SetGuid(self, value): + self.__guid = value + + def __GetGuid(self): + return self.__guid + + def __DelGuid(self): + del self.__guid + + Guid = property(fget=__SetGuid, + fset=__GetGuid, + fdel=__DelGuid, + doc="The guid associated with the Tutoria_Bundler") + + guid = property(fget=get_guid(), + fset=set_guid()) + + if generated_gui is not None: + self.Guid = generated_guid + else: + self.Guid = uuid.uuid1() + + + #TODO : GUID generation if no guid is given in entry to the constructor. - def write_metadata_file(data, guid=None): + def write_metadata_file(self, data): """ Write metadata to a property file. If a GUID is provided, TutorialBundler will try to find and overwrite the existing property file who contain the - given GUID, and will raise an exception if it cannot find it. If no - GUID is provided, TutorialBundler will create a new property file. + given GUID, and will raise an exception if it cannot find it. """ NotImplementedError - - def write_fsm(fsm, guid=None, metadata_filename = None): - + + def return_ini_file_path(self): + """ + Return the path of the .ini file associated with the guiven guid set in + the Guid property of the Tutorial_Bundler. If the guid is present in + more than one path, the TUT_STORE_ROOT is given priority. """ - Save fsm to disk. If a GUID parameter is provided, the existing GUID is - located in the .ini files in TUT_STORRE_ROOT and TUT_BUNDLE_ROOT and - the corresponding FSM is/are overwritten. If the GUID is not found, an - exception occur. If no GUID is provided, FSM is written in a new file - in TUT_STORE_ROOT. If a new FSM is created, the existing .ini filename - must be given in "metadata_filename". - """ config = SafeConfigParser() - - if guid is not None: + path = None - logging.debug("************ Path of TUT_STORE_ROOT folder of activity : " \ + logging.debug("************ Path of TUT_STORE_ROOT folder of activity : " \ + TUT_STORE_ROOT) - # iterate for each .ini file in the TUT_STORE_ROOT folder + # iterate for each .ini file in the TUT_STORE_ROOT folder - for file_name in os.listdir(TUT_STORE_ROOT): - if file_name.endswith(".ini"): - logging.debug("******************* Found .ini file : " \ - + file_name) - config.read(file_name) - if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid: - xml_filename = config.get(INI_METADATA_SECTION, - INI_XML_FSM_PROPERTY) - save_fsm(fsm, xml_filename, TUT_STORE_ROOT) + for file_name in os.listdir(TUT_STORE_ROOT): + if file_name.endswith(".ini"): + logging.debug("******************* Found .ini file : " \ + + file_name) + config.read(file_name) + if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == self.Guid: + xml_filename = config.get(INI_METADATA_SECTION, + INI_XML_FSM_PROPERTY) + path = TUT_STORE_ROOT + "/" + self.Guid + "/" + file_name + return path - logging.debug("************ Path of TUT_BUNDLE_ROOT folder of activity : " \ + logging.debug("************ Path of TUT_BUNDLE_ROOT folder of activity : " \ + TUT_BUNDLE_ROOT) - ## TODO : Remove code duplication - - # iterate for each .ini file in the TUT_BUNDLE_ROOT folder - for file_name in os.listdir(TUT_BUNDLE_ROOT): - if file_name.endswith(".ini"): - logging.debug("******************* Found .ini file : " \ - + file_name) - config.read(file_name) - if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid: - xml_filename = config.get(INI_METADATA_SECTION, - INI_XML_FSM_PROPERTY) - save_fsm(fsm, xml_filename, TUT_STORE_ROOT) - - elif metadata_filename is not None: - - logging.debug("************ Path of TUT_STORE_ROOT folder of activity : " \ - + TUT_STORE_ROOT) - - # iterate for each .ini file in the TUT_STORE_ROOT folder - - for file_name in os.listdir(TUT_STORE_ROOT): - if file_name == metadata_filename: - logging.debug("******************* Found .ini file : " \ - + file_name) - config.read(file_name) - xml_filename = config.get(INI_METADATA_SECTION, INI_XML_FSM_PROPERTY) - save_fsm(fsm,xml_filename,TUT_STORE_ROOT) + # iterate for each .ini file in the TUT_BUNDLE_ROOT folder + for file_name in os.listdir(TUT_BUNDLE_ROOT): + if file_name.endswith(".ini"): + logging.debug("******************* Found .ini file : " \ + + file_name) + config.read(file_name) + if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid: + path = TUT_BUNDLE_ROOT + "/" + self.Guid + "/" + file_name + return path + + if path is None: + logging.debug("**************** Error : GUID not found") + raise KeyError - - logging.debug("************ Path of TUT_BUNDLE_ROOT folder of activity : " \ - + TUT_BUNDLE_ROOT) - - ## TODO : Remove code duplication - - # iterate for each .ini file in the TUT_BUNDLE_ROOT folder - for file_name in os.listdir(TUT_BUNDLE_ROOT): - if file_name == metadata_filename: - logging.debug("******************* Found .ini file : " \ - + file_name) - config.read(file_name) - if config.get(INI_METADATA_SECTION, INI_GUID_PROPERTY) == guid: - xml_filename = config.get(INI_METADATA_SECTION, - INI_XML_FSM_PROPERTY) - save_fsm(fsm, xml_filename, TUT_STORE_ROOT) - - + def write_fsm(self, fsm, guid=None): + + """ + Save fsm to disk. If a GUID parameter is provided, the existing GUID is + located in the .ini files in TUT_STORRE_ROOT and TUT_BUNDLE_ROOT and + the corresponding FSM is/are created or overwritten. If the GUID is not + found, an exception occur. + """ - return tuto + config = SafeConfigParser() + + if guid is not None: + path = return_ini_file_path() + config.read(path) + xml_filename = config.get(INI_METADATA_SECTION, INI_XML_FSM_PROPERTY) + save_fsm(fsm, xml_filename, TUT_STORE_ROOT) + - def add_resources(typename, file): + def add_resources(self, typename, file): """ Add ressources to metadata. """ diff --git a/src/sugar/tutorius/temp.py b/src/sugar/tutorius/temp.py index f9ca9db..6c7fb85 100644 --- a/src/sugar/tutorius/temp.py +++ b/src/sugar/tutorius/temp.py @@ -1,176 +1 @@ -# Copyright (C) 2009, Tutorius.org -# Copyright (C) 2009, Jean-Christophe Savard -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -""" -This module contains all the data handling class of Tutorius -""" - -import logging -import linecache -import os - -from sugar.tutorius import gtkutils, overlayer -from sugar.tutorius.core import Tutorial, State, FiniteStateMachine -from sugar.tutorius.actions import DialogMessage, OnceWrapper, BubbleMessage -from sugar.tutorius.filters import GtkWidgetEventFilter, TimerEvent - -class TutorialStore: - - def list_avaible_tutorials(self, activity_name): - """ - Recuperate the list of all tutorials present on disk for a - given activity. - """ - # TODO : Temp path; decide how .tml files will be distrribued in file - # architecture - - path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/" - logging.debug("*********** Path of /data/ folder of activity : " + path) - - # Create /data/ folder if no exists - if not os.path.exists(path): - os.mkdir(path) - logging.debug("************* Creating data folder") - - tutoKeyName = {} - - # iterate for each .tml file in the activity /data folder - for file_name in os.listdir(path): - - if file_name.endswith(".tml"): - logging.debug("************** .tml file found : " + file_name) - - # TODO : Filter for just current activity files - # (design convention and/or filter xxxxx.yyyyyy key ? ) - - # Get the key line (always 1st line of .tml file) - key_line = linecache.getline(path + file_name, 1) - key_line = key_line.split("\n")[0] - # Get the name line (always 2nd line of .tml file) - name_line = linecache.getline(path + file_name, 2) - name_line = name_line.split("\n")[0] - # Create dictionary - tutoKeyName[key_line.split("--KEY::")[1]] = \ - name_line.split("--NAME::")[1] - - -## tutoKeyName = {} -## tutoKeyName["Writus.CopyPasteStyle"] = "Copy-paste and style" - - return tutoKeyName - - - -class Serializer: - """ - Class that provide serializing and deserializing of the FSM - used in the tutorials to/from disk. - """ - - def save_fsm(self,fsm): - """ - Save fsm to disk. - """ - NotImplementedError - - def load_fsm(self, guid): - """ - Load fsm from disk. - """ - NotImplementedError - -class XMLSerializer(Serializer): - """ - Class that provide serializing and deserializing of the FSM - used in the tutorials to/from a xml file. - """ - - def save_fsm(self,fsm): - """ - Save fsm to .xml file - """ - path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/" - logging.debug("************ Path of /data/ folder of activity : " \ - + path) - logging.debug("************ User key = " + key) - - # iterate for each .tml file in the activity /data folder - for file_name in os.listdir(path): - - if file_name.endswith(".tml"): - - logging.debug("************ found .tml file : " + file_name) - key_line = linecache.getline(path + file_name, 1) - key_line = key_line.split("\n")[0] - fileKey = key_line.split("--KEY::")[1] - logging.debug("************ fileKey = " + fileKey) - if key == fileKey: - logging.debug("************ Key : " + key + \ - " = fileKey : " + fileKey) - tml = file(path + file_name, "r") - str = tml.read() - pick = str.split("--PICKLE::")[1] - - fsm = pickle.loads(pick) - tuto = {key:Tutorial(key,fsm)} - - return tuto - - - def load_fsm(self, guid): - """ - Load fsm from xml file who .ini file guid match argument guid. - """ - - path = os.getenv("SUGAR_ACTIVITY_ROOT") + "/data/" - # Create /data/ folder if no exists - if not os.path.exists(path): - os.mkdir(path) - logging.debug("************* Creating data folder") - - # Save the dictionnary to .tml file - tutoSave = file(path + filename + ".tml", 'w') - str = "--KEY::" + key + "\n--NAME::" + name + "\n--PICKLE::" + \ - pickle.dumps(fsm,0) - tutoSave.write(str) - tutoSave.close() - - -class TutorialBundler: - """ - This class provide the various data handling methods useable by the tutorial - editor. - """ - - def write_metadata_file(data): - """ - Write metadata to a .ini file. - """ - NotImplementedError - - def write_fsm(fsm): - """ - Write fsm to disk. - """ - NotImplementedError - - def add_resources(typename, file): - """ - Add ressources to metadata. - """ - NotImplementedError \ No newline at end of file +Ex GUID : 79521158-22b4-11de-8cfa-000c293a027a \ No newline at end of file diff --git a/src/sugar/tutorius/tests/run-tests.py b/src/sugar/tutorius/tests/run-tests.py index 182d7b2..0c9219b 100755 --- a/src/sugar/tutorius/tests/run-tests.py +++ b/src/sugar/tutorius/tests/run-tests.py @@ -40,7 +40,6 @@ if __name__=='__main__': runner = unittest.TextTestRunner() runner.run(suite) - coverage.stop() coverage.report(glob(GLOB_PATH)) coverage.erase() -- cgit v0.9.1