Index: third_party/twisted_8_1/twisted/persisted/sob.py |
diff --git a/third_party/twisted_8_1/twisted/persisted/sob.py b/third_party/twisted_8_1/twisted/persisted/sob.py |
deleted file mode 100644 |
index 4f8dbe5d3ed78f6a237402811a85e1fad0cdb51c..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/persisted/sob.py |
+++ /dev/null |
@@ -1,234 +0,0 @@ |
-# -*- test-case-name: twisted.test.test_sob -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
-""" |
-Save and load Small OBjects to and from files, using various formats. |
- |
-Maintainer: U{Moshe Zadka<mailto:moshez@twistedmatrix.com>} |
-""" |
- |
-import hashlib |
-import os, sys |
-try: |
- import cPickle as pickle |
-except ImportError: |
- import pickle |
-try: |
- import cStringIO as StringIO |
-except ImportError: |
- import StringIO |
-from twisted.python import log, runtime |
-from twisted.persisted import styles |
-from zope.interface import implements, Interface |
- |
-# Note: |
-# These encrypt/decrypt functions only work for data formats |
-# which are immune to having spaces tucked at the end. |
-# All data formats which persist saves hold that condition. |
-def _encrypt(passphrase, data): |
- from Crypto.Cipher import AES as cipher |
- leftover = len(data) % cipher.block_size |
- if leftover: |
- data += ' '*(cipher.block_size - leftover) |
- return cipher.new(hashlib.md5(passphrase).digest()[:16]).encrypt(data) |
- |
-def _decrypt(passphrase, data): |
- from Crypto.Cipher import AES |
- return AES.new(hashlib.md5(passphrase).digest()[:16]).decrypt(data) |
- |
- |
-class IPersistable(Interface): |
- |
- """An object which can be saved in several formats to a file""" |
- |
- def setStyle(style): |
- """Set desired format. |
- |
- @type style: string (one of 'pickle', 'source' or 'xml') |
- """ |
- |
- def save(tag=None, filename=None, passphrase=None): |
- """Save object to file. |
- |
- @type tag: string |
- @type filename: string |
- @type passphrase: string |
- """ |
- |
- |
-class Persistent: |
- |
- implements(IPersistable) |
- |
- style = "pickle" |
- |
- def __init__(self, original, name): |
- self.original = original |
- self.name = name |
- |
- def setStyle(self, style): |
- """Set desired format. |
- |
- @type style: string (one of 'pickle', 'source' or 'xml') |
- """ |
- self.style = style |
- |
- def _getFilename(self, filename, ext, tag): |
- if filename: |
- finalname = filename |
- filename = finalname + "-2" |
- elif tag: |
- filename = "%s-%s-2.%s" % (self.name, tag, ext) |
- finalname = "%s-%s.%s" % (self.name, tag, ext) |
- else: |
- filename = "%s-2.%s" % (self.name, ext) |
- finalname = "%s.%s" % (self.name, ext) |
- return finalname, filename |
- |
- def _saveTemp(self, filename, passphrase, dumpFunc): |
- f = open(filename, 'wb') |
- if passphrase is None: |
- dumpFunc(self.original, f) |
- else: |
- s = StringIO.StringIO() |
- dumpFunc(self.original, s) |
- f.write(_encrypt(passphrase, s.getvalue())) |
- f.close() |
- |
- def _getStyle(self): |
- if self.style == "xml": |
- from twisted.persisted.marmalade import jellyToXML as dumpFunc |
- ext = "tax" |
- elif self.style == "source": |
- from twisted.persisted.aot import jellyToSource as dumpFunc |
- ext = "tas" |
- else: |
- def dumpFunc(obj, file): |
- pickle.dump(obj, file, 2) |
- ext = "tap" |
- return ext, dumpFunc |
- |
- def save(self, tag=None, filename=None, passphrase=None): |
- """Save object to file. |
- |
- @type tag: string |
- @type filename: string |
- @type passphrase: string |
- """ |
- ext, dumpFunc = self._getStyle() |
- if passphrase: |
- ext = 'e' + ext |
- finalname, filename = self._getFilename(filename, ext, tag) |
- log.msg("Saving "+self.name+" application to "+finalname+"...") |
- self._saveTemp(filename, passphrase, dumpFunc) |
- if runtime.platformType == "win32" and os.path.isfile(finalname): |
- os.remove(finalname) |
- os.rename(filename, finalname) |
- log.msg("Saved.") |
- |
-# "Persistant" has been present since 1.0.7, so retain it for compatibility |
-Persistant = Persistent |
- |
-class _EverythingEphemeral(styles.Ephemeral): |
- |
- initRun = 0 |
- |
- def __init__(self, mainMod): |
- """ |
- @param mainMod: The '__main__' module that this class will proxy. |
- """ |
- self.mainMod = mainMod |
- |
- def __getattr__(self, key): |
- try: |
- return getattr(self.mainMod, key) |
- except AttributeError: |
- if self.initRun: |
- raise |
- else: |
- log.msg("Warning! Loading from __main__: %s" % key) |
- return styles.Ephemeral() |
- |
- |
-def load(filename, style, passphrase=None): |
- """Load an object from a file. |
- |
- Deserialize an object from a file. The file can be encrypted. |
- |
- @param filename: string |
- @param style: string (one of 'source', 'xml' or 'pickle') |
- @param passphrase: string |
- """ |
- mode = 'r' |
- if style=='source': |
- from twisted.persisted.aot import unjellyFromSource as _load |
- elif style=='xml': |
- from twisted.persisted.marmalade import unjellyFromXML as _load |
- else: |
- _load, mode = pickle.load, 'rb' |
- if passphrase: |
- fp = StringIO.StringIO(_decrypt(passphrase, |
- open(filename, 'rb').read())) |
- else: |
- fp = open(filename, mode) |
- ee = _EverythingEphemeral(sys.modules['__main__']) |
- sys.modules['__main__'] = ee |
- ee.initRun = 1 |
- try: |
- value = _load(fp) |
- finally: |
- # restore __main__ if an exception is raised. |
- sys.modules['__main__'] = ee.mainMod |
- |
- styles.doUpgrade() |
- ee.initRun = 0 |
- persistable = IPersistable(value, None) |
- if persistable is not None: |
- persistable.setStyle(style) |
- return value |
- |
- |
-def loadValueFromFile(filename, variable, passphrase=None): |
- """Load the value of a variable in a Python file. |
- |
- Run the contents of the file, after decrypting if C{passphrase} is |
- given, in a namespace and return the result of the variable |
- named C{variable}. |
- |
- @param filename: string |
- @param variable: string |
- @param passphrase: string |
- """ |
- if passphrase: |
- mode = 'rb' |
- else: |
- mode = 'r' |
- fileObj = open(filename, mode) |
- d = {'__file__': filename} |
- if passphrase: |
- data = fileObj.read() |
- data = _decrypt(passphrase, data) |
- exec data in d, d |
- else: |
- exec fileObj in d, d |
- value = d[variable] |
- return value |
- |
-def guessType(filename): |
- ext = os.path.splitext(filename)[1] |
- return { |
- '.tac': 'python', |
- '.etac': 'python', |
- '.py': 'python', |
- '.tap': 'pickle', |
- '.etap': 'pickle', |
- '.tas': 'source', |
- '.etas': 'source', |
- '.tax': 'xml', |
- '.etax': 'xml' |
- }[ext] |
- |
-__all__ = ['loadValueFromFile', 'load', 'Persistent', 'Persistant', |
- 'IPersistable', 'guessType'] |