Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/olpcgames/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'olpcgames/util.py')
-rwxr-xr-xolpcgames/util.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/olpcgames/util.py b/olpcgames/util.py
new file mode 100755
index 0000000..a0c26b0
--- /dev/null
+++ b/olpcgames/util.py
@@ -0,0 +1,85 @@
+"""Abstraction layer for working outside the Sugar environment"""
+import traceback, cStringIO
+import logging
+log = logging.getLogger( 'olpcgames.util' )
+import os
+import os.path
+
+NON_SUGAR_ROOT = '~/.sugar/default/olpcgames'
+
+try:
+ from sugar.activity.activity import get_bundle_path as _get_bundle_path
+ def get_bundle_path( ):
+ """Retrieve bundle path from activity with fix for silly registration bug"""
+ path = _get_bundle_path()
+ if path.endswith( '.activity.activity' ):
+ log.warn( '''Found double .activity suffix in bundle path, truncating: %s''', path )
+ path = path[:-9]
+ return path
+except ImportError:
+ log.warn( '''Do not appear to be running under Sugar, stubbing-in get_bundle_path''' )
+ def get_bundle_path():
+ """Retrieve a substitute data-path for non OLPC systems"""
+ return os.getcwd()
+
+
+def get_activity_root( ):
+ """Return the activity root for data storage operations
+
+ If the activity is present, returns the activity's root,
+ otherwise returns NON_SUGAR_ROOT as the directory.
+ """
+ root = os.environ.get( 'SUGAR_ACTIVITY_ROOT' )
+ if not root:
+ root = NON_SUGAR_ROOT
+ log.debug( 'Activity Root: %s', root )
+ return os.path.expanduser( root )
+
+def data_path(file_name):
+ """Return the full path to a file in the data sub-directory of the bundle"""
+ dirname = os.path.join(get_bundle_path(), 'data' )
+ if not os.path.isdir( dirname ):
+ os.makedirs( dirname )
+ return os.path.join( dirname, file_name )
+def tmp_path(file_name):
+ """Return the full path to a file in the temporary directory"""
+ dirname = os.path.join(get_bundle_path(), 'tmp' )
+ if not os.path.isdir( dirname ):
+ os.makedirs( dirname )
+ return os.path.join(dirname, file_name)
+
+def get_traceback(error):
+ """Get formatted traceback from current exception
+
+ error -- Exception instance raised
+
+ Attempts to produce a 10-level traceback as a string
+ that you can log off. Use like so:
+
+ try:
+ doSomething()
+ except Exception, err:
+ log.error(
+ '''Failure during doSomething with X,Y,Z parameters: %s''',
+ util.get_traceback( err ),
+ )
+ """
+ if error is None:
+ error = []
+ for (f,l,func,statement) in traceback.extract_stack()[:-2]:
+ if statement:
+ statement = ': %s'%( statement, )
+ if func:
+ error.append( '%s.%s (%s)%s'%( f,func,l, statement))
+ else:
+ error.append( '%s (%s)%s'%( f,l, statement))
+ return "\n".join( error )
+ else:
+ exception = str(error)
+ file = cStringIO.StringIO()
+ try:
+ traceback.print_exc( limit=10, file = file )
+ exception = file.getvalue()
+ finally:
+ file.close()
+ return exception