| LEFT | RIGHT |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # -*- coding: utf-8 -*- | 2 # -*- coding: utf-8 -*- |
| 3 # | 3 # |
| 4 # Copyright 2006-2008 Zuza Software Foundation | 4 # Copyright 2006-2008 Zuza Software Foundation |
| 5 # | 5 # |
| 6 # This file is part of translate. | 6 # This file is part of translate. |
| 7 # | 7 # |
| 8 # translate is free software; you can redistribute it and/or modify | 8 # translate is free software; you can redistribute it and/or modify |
| 9 # it under the terms of the GNU General Public License as published by | 9 # it under the terms of the GNU General Public License as published by |
| 10 # the Free Software Foundation; either version 2 of the License, or | 10 # the Free Software Foundation; either version 2 of the License, or |
| 11 # (at your option) any later version. | 11 # (at your option) any later version. |
| 12 # | 12 # |
| 13 # translate is distributed in the hope that it will be useful, | 13 # translate is distributed in the hope that it will be useful, |
| 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 # GNU General Public License for more details. | 16 # GNU General Public License for more details. |
| 17 # | 17 # |
| 18 # You should have received a copy of the GNU General Public License | 18 # You should have received a copy of the GNU General Public License |
| 19 # along with translate; if not, write to the Free Software | 19 # along with translate; if not, write to the Free Software |
| 20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 21 | 21 |
| 22 """Base classes for storage interfaces. | 22 """Base classes for storage interfaces. |
| 23 | 23 |
| 24 @organization: Zuza Software Foundation | 24 @organization: Zuza Software Foundation |
| 25 @copyright: 2006-2007 Zuza Software Foundation | 25 @copyright: 2006-2007 Zuza Software Foundation |
| 26 @license: U{GPL <http://www.fsf.org/licensing/licenses/gpl.html>} | 26 @license: U{GPL <http://www.fsf.org/licensing/licenses/gpl.html>} |
| 27 """ | 27 """ |
| 28 | 28 |
| 29 try: | 29 try: |
| 30 import cPickle as pickle | 30 import cPickle as pickle |
| 31 except: | 31 except: |
| 32 import pickle | 32 import pickle |
| 33 from exceptions import NotImplementedError | 33 from exceptions import NotImplementedError |
| 34 | 34 |
| 35 def force_override(method, baseclass): | 35 def force_override(method, baseclass): |
| 36 """Forces derived classes to override method.""" | 36 """Forces derived classes to override method.""" |
| 37 | 37 |
| 38 if type(method.im_self) == type(baseclass): | 38 if type(method.im_self) == type(baseclass): |
| 39 # then this is a classmethod and im_self is the actual class | 39 # then this is a classmethod and im_self is the actual class |
| 40 actualclass = method.im_self | 40 actualclass = method.im_self |
| 41 else: | 41 else: |
| 42 actualclass = method.im_class | 42 actualclass = method.im_class |
| 43 if actualclass != baseclass: | 43 if actualclass != baseclass: |
| 44 raise NotImplementedError("%s does not reimplement %s as required by %s"
% (actualclass.__name__, method.__name__, baseclass.__name__)) | 44 raise NotImplementedError("%s does not reimplement %s as required by %s"
% (actualclass.__name__, method.__name__, baseclass.__name__)) |
| 45 | 45 |
| 46 class ParseError(Exception): | 46 class ParseError(Exception): |
| 47 pass | 47 pass |
| 48 | 48 |
| 49 class TranslationUnit(object): | 49 class TranslationUnit(object): |
| 50 """Base class for translation units. | 50 """Base class for translation units. |
| (...skipping 409 matching lines...) Show 10 above Show 10 below |
| 460 return newstore | 460 return newstore |
| 461 parsestring = classmethod(parsestring) | 461 parsestring = classmethod(parsestring) |
| 462 | 462 |
| 463 def parse(self, data): | 463 def parse(self, data): |
| 464 """parser to process the given source string""" | 464 """parser to process the given source string""" |
| 465 self.units = pickle.loads(data).units | 465 self.units = pickle.loads(data).units |
| 466 | 466 |
| 467 def savefile(self, storefile): | 467 def savefile(self, storefile): |
| 468 """Writes the string representation to the given file (or filename).""" | 468 """Writes the string representation to the given file (or filename).""" |
| 469 if isinstance(storefile, basestring): | 469 if isinstance(storefile, basestring): |
| 470 storefile = open(storefile, "w") | 470 storefile = open(storefile, "w") |
| 471 self.fileobj = storefile | 471 self.fileobj = storefile |
| 472 self._assignname() | 472 self._assignname() |
| 473 storestring = str(self) | 473 storestring = str(self) |
| 474 storefile.write(storestring) | 474 storefile.write(storestring) |
| 475 storefile.close() | 475 storefile.close() |
| 476 | 476 |
| 477 def save(self): | 477 def save(self): |
| 478 """Save to the file that data was originally read from, if available.""" | 478 """Save to the file that data was originally read from, if available.""" |
| 479 fileobj = getattr(self, "fileobj", None) | 479 fileobj = getattr(self, "fileobj", None) |
| 480 if not fileobj: | 480 if not fileobj: |
| 481 filename = getattr(self, "filename", None) | 481 filename = getattr(self, "filename", None) |
| 482 if filename: | 482 if filename: |
| 483 fileobj = file(filename, "w") | 483 fileobj = file(filename, "w") |
| 484 else: | 484 else: |
| 485 fileobj.close() | 485 fileobj.close() |
| 486 filename = getattr(fileobj, "name", getattr(fileobj, "filename", Non
e)) | 486 filename = getattr(fileobj, "name", getattr(fileobj, "filename", Non
e)) |
| 487 if not filename: | 487 if not filename: |
| 488 raise ValueError("No file or filename to save to") | 488 raise ValueError("No file or filename to save to") |
| 489 fileobj = fileobj.__class__(filename, "w") | 489 fileobj = fileobj.__class__(filename, "w") |
| 490 self.savefile(fileobj) | 490 self.savefile(fileobj) |
| 491 | 491 |
| 492 def parsefile(cls, storefile): | 492 def parsefile(cls, storefile): |
| 493 """Reads the given file (or opens the given filename) and parses back to
an object.""" | 493 """Reads the given file (or opens the given filename) and parses back to
an object.""" |
| 494 | 494 |
| 495 if isinstance(storefile, basestring): | 495 if isinstance(storefile, basestring): |
| 496 storefile = open(storefile, "r") | 496 storefile = open(storefile, "r") |
| 497 mode = getattr(storefile, "mode", "r") | 497 mode = getattr(storefile, "mode", "r") |
| 498 #For some reason GzipFile returns 1, so we have to test for that here | 498 #For some reason GzipFile returns 1, so we have to test for that here |
| 499 if mode == 1 or "r" in mode: | 499 if mode == 1 or "r" in mode: |
| 500 storestring = storefile.read() | 500 storestring = storefile.read() |
| 501 storefile.close() | 501 storefile.close() |
| 502 else: | 502 else: |
| 503 storestring = "" | 503 storestring = "" |
| 504 newstore = cls.parsestring(storestring) | 504 newstore = cls.parsestring(storestring) |
| 505 newstore.fileobj = storefile | 505 newstore.fileobj = storefile |
| 506 newstore._assignname() | 506 newstore._assignname() |
| 507 return newstore | 507 return newstore |
| 508 parsefile = classmethod(parsefile) | 508 parsefile = classmethod(parsefile) |
| 509 | 509 |
| LEFT | RIGHT |