make run Beremiz and PLCOpen Editor, if full path contain non-lating
authorAndrey Skvortsov <andrej.skvortzov@gmail.com>
Thu, 20 Apr 2017 13:01:45 +0300
changeset 1680 6db967480b7d
parent 1679 2fcea15858a5
child 1681 21f40ed5238f
make run Beremiz and PLCOpen Editor, if full path contain non-lating
characters

There was a problem in About dialog and in project properites tab and
probably in my other places, when str is automatically converted to
unicode string using ascii.
This patch converts str to unicode using proper encoding at the very beggining.
Beremiz.py
BeremizIDE.py
Beremiz_service.py
NativeLib.py
PLCControler.py
PLCOpenEditor.py
ProjectController.py
canfestival/canfestival.py
connectors/__init__.py
plcopen/definitions.py
plcopen/plcopen.py
py_ext/PythonFileCTNMixin.py
py_ext/py_ext.py
runtime/NevowServer.py
svgui/svgui.py
targets/__init__.py
util/paths.py
version.py
wxglade_hmi/wxglade_hmi.py
--- a/Beremiz.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/Beremiz.py	Thu Apr 20 13:01:45 2017 +0300
@@ -27,12 +27,13 @@
 import os, sys, getopt
 import time
 import __builtin__
+import util.paths as paths
 
 class BeremizIDELauncher:
     def __init__(self):
         self.updateinfo_url = None
         self.extensions = []
-        self.app_dir = os.path.dirname(os.path.realpath(__file__))
+        self.app_dir = paths.AbsDir(__file__)
         self.projectOpen = None
         self.buildpath = None
         self.splash = None
--- a/BeremizIDE.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/BeremizIDE.py	Thu Apr 20 13:01:45 2017 +0300
@@ -30,9 +30,10 @@
 import random
 import time
 import version
+import util.paths as paths
 from types import ListType
 
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
+beremiz_dir = paths.AbsDir(__file__)
 
 def Bpath(*args):
     return os.path.join(beremiz_dir,*args)
--- a/Beremiz_service.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/Beremiz_service.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -96,7 +97,8 @@
         usage()
         sys.exit()
 
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
+import util.paths as paths
+beremiz_dir = paths.AbsDir(__file__)
 
 if len(argv) > 1:
     usage()
--- a/NativeLib.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/NativeLib.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -23,9 +24,10 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 import os
+import util.paths as paths
 from POULibrary import POULibrary
 
 class NativeLibrary(POULibrary):
     def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "NativeLib.xml") 
+        return paths.AbsNeighbourFile(__file__, "NativeLib.xml") 
 
--- a/PLCControler.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/PLCControler.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -28,6 +29,7 @@
 from copy import deepcopy
 import os,sys,re
 import datetime
+import util.paths as paths
 from time import localtime
 from collections import OrderedDict, namedtuple
 
@@ -88,7 +90,7 @@
                    LOCATION_VAR_OUTPUT,
                    LOCATION_VAR_MEMORY] = range(6)
 
-ScriptDirectory = os.path.split(os.path.realpath(__file__))[0]
+ScriptDirectory = paths.AbsDir(__file__)
 
 def GetUneditableNames():
     _ = lambda x:x
--- a/PLCOpenEditor.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/PLCOpenEditor.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -25,8 +26,9 @@
 import wx
 import os, sys, platform, time, traceback, getopt
 import version
-
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
+import util.paths as paths
+
+beremiz_dir = paths.AbsDir(__file__)
 
 __version__ = "$Revision: 1.130 $"
 
--- a/ProjectController.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/ProjectController.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -41,6 +42,7 @@
 
 import targets
 import connectors
+import util.paths as paths
 from util.misc import CheckPathPerm, GetClassImporter
 from util.MiniTextControler import MiniTextControler
 from util.ProcessLogger import ProcessLogger
@@ -56,7 +58,7 @@
 from targets.typemapping import UnpackDebugBuffer
 from ConfigTreeNode import ConfigTreeNode, XSDSchemaErrorMessage
 
-base_folder = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]
+base_folder = paths.AbsParentDir(__file__)
 
 MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$")
 
@@ -567,7 +569,7 @@
         return children
 
     def ConfNodePath(self):
-        return os.path.split(__file__)[0]
+        return paths.AbsDir(__file__)
 
     def CTNPath(self, CTNName=None):
         return self.ProjectPath
--- a/canfestival/canfestival.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/canfestival/canfestival.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -23,8 +24,9 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 import os, sys, shutil
-
-base_folder = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
+import util.paths as paths
+
+base_folder = paths.AbsParentDir(__file__, 2)
 CanFestivalPath = os.path.join(base_folder, "CanFestival-3")
 sys.path.append(os.path.join(CanFestivalPath, "objdictgen"))
 
@@ -579,7 +581,7 @@
             format_dict["nodes_close"] += 'NODE_CLOSE(%s)\n    '%(nodename)
             format_dict["nodes_stop"] += 'NODE_STOP(%s)\n    '%(nodename)
         
-        filename = os.path.join(os.path.split(__file__)[0],"cf_runtime.c")
+        filename = paths.AbsNeighbourFile(__file__,"cf_runtime.c")
         cf_main = open(filename).read() % format_dict
         cf_main_path = os.path.join(buildpath, "CF_%(locstr)s.c"%format_dict)
         f = open(cf_main_path,'w')
--- a/connectors/__init__.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/connectors/__init__.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -25,9 +26,9 @@
 # Package initialisation
 
 from os import listdir, path
+import util.paths as paths
 
-
-_base_path = path.split(__file__)[0]
+_base_path = paths.AbsDir(__file__)
 
 
 def _GetLocalConnectorClassFactory(name):
--- a/plcopen/definitions.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/plcopen/definitions.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -24,7 +25,8 @@
 
 
 from os.path import join, split, realpath
-sd = split(realpath(__file__))[0]
+import util.paths as paths
+sd = paths.AbsDir(__file__)
 
 # Override gettext _ in this module
 # since we just want string to be added to dictionnary
--- a/plcopen/plcopen.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/plcopen/plcopen.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -27,6 +28,7 @@
 import os, re
 from lxml import etree
 from collections import OrderedDict
+import util.paths as paths
 
 """
 Dictionary that makes the relation between var names in plcopen and displayed values
@@ -132,7 +134,7 @@
 def TextMatched(str1, str2):
     return str1 and str2 and (str1.upper() == str2.upper())
 
-PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
+PLCOpenParser = GenerateParserFromXSD(paths.AbsNeighbourFile(__file__, "tc6_xml_v201.xsd"))
 PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
 
 LOAD_POU_PROJECT_TEMPLATE = """
@@ -167,7 +169,7 @@
   </body>
 </pou>""" % locals()
 
-PLCOpen_v1_file = open(os.path.join(os.path.split(__file__)[0], "TC6_XML_V10_B.xsd"))
+PLCOpen_v1_file = open(paths.AbsNeighbourFile(__file__, "TC6_XML_V10_B.xsd"))
 PLCOpen_v1_xml = PLCOpen_v1_file.read()
 PLCOpen_v1_file.close()
 PLCOpen_v1_xml = PLCOpen_v1_xml.replace(
--- a/py_ext/PythonFileCTNMixin.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/py_ext/PythonFileCTNMixin.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -24,6 +25,7 @@
 
 import os, re
 from lxml import etree
+import util.paths as paths
 
 from xmlclass import GenerateParserFromXSD
 
@@ -47,8 +49,7 @@
         filepath = self.PythonFileName()
 
         if os.path.isfile(filepath):
-            PythonParser = GenerateParserFromXSD(
-                os.path.join(os.path.dirname(__file__), "py_ext_xsd.xsd"))
+            PythonParser = GenerateParserFromXSD(paths.AbsNeighbourFile(__file__, "py_ext_xsd.xsd"))
 
             xmlfile = open(filepath, 'r')
             pythonfile_xml = xmlfile.read()
--- a/py_ext/py_ext.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/py_ext/py_ext.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -25,15 +26,15 @@
 import os
 from POULibrary import POULibrary
 from PythonFileCTNMixin import PythonFileCTNMixin
+import util.paths as paths
 
 class PythonLibrary(POULibrary):
     def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "pous.xml") 
+        return paths.AbsNeighbourFile(__file__, "pous.xml") 
 
     def Generate_C(self, buildpath, varlist, IECCFLAGS):
         
-        plc_python_filepath = os.path.join(
-            os.path.split(__file__)[0], "plc_python.c")
+        plc_python_filepath = paths.AbsNeighbourFile(__file__, "plc_python.c")
         plc_python_file = open(plc_python_filepath, 'r')
         plc_python_code = plc_python_file.read()
         plc_python_file.close()
--- a/runtime/NevowServer.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/runtime/NevowServer.py	Thu Apr 20 13:01:45 2017 +0300
@@ -4,6 +4,7 @@
 # This file is part of Beremiz runtime.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING.Runtime file for copyrights details.
 #
@@ -22,6 +23,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 import os
+import util.paths as paths
 from nevow import rend, appserver, inevow, tags, loaders, athena
 from nevow.page import renderer
 from twisted.python import util
@@ -122,7 +124,7 @@
 
     def __init__(self, plcState=False, *a, **kw):
         super(WebInterface, self).__init__(*a, **kw)
-        self.jsModules.mapping[u'WebInterface'] = util.sibpath(__file__, 'webinterface.js')
+        self.jsModules.mapping[u'WebInterface'] = paths.AbsNeighbourFile(__file__), 'webinterface.js')
         self.plcState = plcState
         self.MainPage.setPLCState(plcState)
 
--- a/svgui/svgui.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/svgui/svgui.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -27,13 +28,14 @@
 
 from pyjs import translate
 
+import util.paths as paths
 from POULibrary import POULibrary
 from docutil import open_svg
 from py_ext import PythonFileCTNMixin
 
 class SVGUILibrary(POULibrary):
     def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "pous.xml") 
+        return paths.AbsNeighbourFile(__file__, "pous.xml") 
 
 class SVGUI(PythonFileCTNMixin):
 
@@ -49,7 +51,7 @@
     ]
 
     def ConfNodePath(self):
-        return os.path.join(os.path.dirname(__file__))
+        return paths.AbsDir(__file__)
 
     def _getSVGpath(self, project_path=None):
         if project_path is None:
@@ -58,7 +60,7 @@
         return os.path.join(project_path, "gui.svg")
 
     def _getSVGUIserverpath(self):
-        return os.path.join(os.path.dirname(__file__), "svgui_server.py")
+        return paths.AbsNeighbourFile(__file__, "svgui_server.py")
 
     def OnCTNSave(self, from_project_path=None):
         if from_project_path is not None:
@@ -90,13 +92,14 @@
 
         svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
         svguilibfile = open(svguilibpath, 'w')
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "sys.py"), "sys"))
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "_pyjs.js"), 'r').read())
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "pyjslib.py"), "pyjslib"))
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "svguilib.py"), "svguilib"))
+        fpath=paths.AbsDir(__file__)
+        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "sys.py"), "sys"))
+        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "_pyjs.js"), 'r').read())
+        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "pyjslib.py"), "pyjslib"))
+        svguilibfile.write(translate(os.path.join(fpath, "svguilib.py"), "svguilib"))
         svguilibfile.write("pyjslib();\nsvguilib();\n")
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "json.js"), 'r').read())
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "livesvg.js"), 'r').read())
+        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "json.js"), 'r').read())
+        svguilibfile.write(open(os.path.join(fpath, "livesvg.js"), 'r').read())
         svguilibfile.close()
         jsmodules = {"LiveSVGPage": "svguilib.js"}
         res += (("svguilib.js", file(svguilibpath,"rb")),)
--- a/targets/__init__.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/targets/__init__.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -34,8 +35,9 @@
 """
 
 from os import listdir, path
+import util.paths as paths
 
-_base_path = path.split(__file__)[0]
+_base_path = paths.AbsDir(__file__)
 def _GetLocalTargetClassFactory(name):
     return lambda:getattr(__import__(name,globals(),locals()), name+"_target")
 
@@ -78,10 +80,10 @@
     return code
 
 def GetHeader():
-    filename = path.join(path.split(__file__)[0],"beremiz.h")
+    filename = paths.AbsNeighbourFile(__file__,"beremiz.h")
     return open(filename).read()
 
 def GetCode(name):
-    filename = path.join(path.split(__file__)[0],name)
+    filename = paths.AbsNeighbourFile(__file__,name)
     return open(filename).read()
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/paths.py	Thu Apr 20 13:01:45 2017 +0300
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+import os, sys
+
+def AbsFile(file):
+    if isinstance(file, str):
+        file = unicode(file,sys.getfilesystemencoding())
+    return file
+
+def AbsDir(file):
+    file = AbsFile(file)
+    return os.path.dirname(os.path.realpath(file))
+
+def AbsNeighbourFile(file, *args):
+    return os.path.join(AbsDir(file), *args)
+
+
+def AbsParentDir(file, level = 1):
+    path = AbsDir(file)
+    for i in range(0, level):
+        path = os.path.dirname(path)
+    return path
--- a/version.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/version.py	Thu Apr 20 13:01:45 2017 +0300
@@ -24,10 +24,11 @@
 
 
 import subprocess, os
+import util.paths as paths
 
 def GetAppRevision():
     rev = None
-    app_dir=os.path.dirname(os.path.realpath(__file__))    
+    app_dir=paths.AbsDir(__file__)
     try:
         pipe = subprocess.Popen(
             ["hg", "id", "-i"],
@@ -88,8 +89,8 @@
     '')
 
     # read license file
-    path=os.path.join(os.path.dirname(os.path.abspath(__file__)))
-    license_path = os.path.join(path, u"COPYING")
+    path=paths.AbsDir(__file__)
+    license_path = os.path.join(path, "COPYING")
     license=''
     if os.path.exists(license_path):
         with open(license_path) as f:
--- a/wxglade_hmi/wxglade_hmi.py	Wed Apr 12 10:20:01 2017 +0000
+++ b/wxglade_hmi/wxglade_hmi.py	Thu Apr 20 13:01:45 2017 +0300
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -26,6 +27,7 @@
 import os, sys, shutil
 from xml.dom import minidom
 
+import util.paths as paths
 from py_ext import PythonFileCTNMixin
 
 class WxGladeHMI(PythonFileCTNMixin):
@@ -41,7 +43,7 @@
         return "wxGlade"
 
     def ConfNodePath(self):
-        return os.path.join(os.path.dirname(__file__))
+        return paths.AbsDir(__file__)
 
     def _getWXGLADEpath(self, project_path=None):
         if project_path is None: