fix git support for v1.5.3 (or higher) by setting "--work-tree"
[translate_toolkit.git] / storage / zip.py
blob174c190ea12d4725f55f8d15287be9495172baec
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # Copyright 2007 Zuza Software Foundation
5 #
6 # This file is part of translate.
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
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 """This module provides functionality to work with zip files."""
24 # Perhaps all methods should work with a wildcard to limit searches in some
25 # way (examples: *.po, base.xlf, pootle-terminology.tbx)
27 #TODO: consider also providing directories as we currently provide files
29 #TODO: refactor with existing zip code (xpi.py, etc.)
31 from translate.storage import factory
32 from translate.storage import directory
33 from translate.misc import wStringIO
34 from os import path
35 from zipfile import ZipFile
37 class ZIPFile(directory.Directory):
38 """This class represents a ZIP file like a directory."""
39 def __init__(self, filename=None):
40 self.filename = filename
41 self.filedata = []
43 def unit_iter(self):
44 """Iterator over all the units in all the files in this zip file."""
45 for dirname, filename in self.file_iter():
46 strfile = wStringIO.StringIO(self.archive.read(path.join(dirname, filename)))
47 strfile.filename = filename
48 store = factory.getobject(strfile)
49 #TODO: don't regenerate all the storage objects
50 for unit in store.unit_iter():
51 yield unit
53 def scanfiles(self):
54 """Populate the internal file data."""
55 self.filedata = []
56 self.archive = ZipFile(self.filename)
57 for completename in self.archive.namelist():
58 dir, name = path.split(completename)
59 self.filedata.append((dir, name))