summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Chrétien2015-11-23 17:13:37 +0900
committerBenjamin Chrétien2015-11-23 17:36:08 +0900
commit23cd0c6eb8022a8fb06445f7040c52a058572b91 (patch)
treee06b2791f23edefdf3e9465d7a282cce30793291
downloadaur-23cd0c6eb8022a8fb06445f7040c52a058572b91.tar.gz
Initial commit
-rw-r--r--.SRCINFO17
-rw-r--r--PKGBUILD26
-rw-r--r--python3.patch336
3 files changed, 379 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..580a95d83cb6
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,17 @@
+pkgbase = python-oosheet
+ pkgdesc = OpenOffice.org Spreadsheet scripting library. Patched for Python 3.
+ pkgver = 1.2
+ pkgrel = 1
+ url = http://oosheet.hacklab.com.br/
+ arch = any
+ license = MIT
+ makedepends = python3
+ depends = python
+ depends = libreoffice
+ source = https://github.com/lfagundes/oosheet/archive/v1.2.tar.gz
+ source = python3.patch
+ sha256sums = 8a3778ea8087ee52e9e0ef7f104147ae9fbbc82a7b1a6449d849f71e9872669c
+ sha256sums = c237da30c4734923a0a631b15e11b720c77fefabf4ec5a0ab5dfc47b5a13463a
+
+pkgname = python-oosheet
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..3ce5672f335c
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,26 @@
+pkgname=python-oosheet
+pkgver=1.2
+pkgrel=1
+pkgdesc="OpenOffice.org Spreadsheet scripting library. Patched for Python 3."
+url="http://oosheet.hacklab.com.br/"
+depends=('python' 'libreoffice')
+makedepends=('python3')
+license=('MIT')
+arch=('any')
+source=("https://github.com/lfagundes/oosheet/archive/v${pkgver}.tar.gz"
+ "python3.patch")
+sha256sums=('8a3778ea8087ee52e9e0ef7f104147ae9fbbc82a7b1a6449d849f71e9872669c'
+ 'c237da30c4734923a0a631b15e11b720c77fefabf4ec5a0ab5dfc47b5a13463a')
+
+# Patch comes from: https://github.com/znbn/oosheet/tree/python3
+
+build() {
+ cd "${srcdir}/oosheet-${pkgver}"
+ patch -p1 -i "${srcdir}"/python3.patch
+ python setup.py build
+}
+
+package() {
+ cd "${srcdir}/oosheet-${pkgver}"
+ python setup.py install --root="${pkgdir}" --optimize=1
+}
diff --git a/python3.patch b/python3.patch
new file mode 100644
index 000000000000..e9f536dc283d
--- /dev/null
+++ b/python3.patch
@@ -0,0 +1,336 @@
+From 9464ca1d23c83797e91257641b283bc7bf9c8e5d Mon Sep 17 00:00:00 2001
+From: Luis Fagundes <lhfagundes@hacklab.com.br>
+Date: Thu, 19 Jan 2012 15:31:16 -0200
+Subject: Apply numerous fixes for Python 3 support
+
+- documentation issues.rst (missed commit before)
+
+removed useless line
+
+Change fetching InstallPath winreg key for LibreOffice 3.4 on Windows 7
+
+Correct bug in OOPacker.script_name() for Windows 7
+
+Move OOSheet.Quit() to OODoc.quit()
+
+Fix inconsistent identation
+
+Fix problematic use of single backslash
+
+Fix invalid syntax
+
+Remove unnecessary octal notation
+
+ Octal notatation changes on python3
+
+str doesn't support the buffer API
+
+Fix import
+
+many fixing to make it work on my computer
+
+import winreg instead _winreg (for Python3)
+fixed save_as() method (ods format is default)
+added save() method
+removed spaces after the print function
+
+diff --git a/docs/index.rst b/docs/index.rst
+index 5183561..e8e9c5b 100644
+--- a/docs/index.rst
++++ b/docs/index.rst
+@@ -95,6 +95,12 @@ Luc Jean sent patch that allows OOSheet to run on Windows Vista with default Pyt
+ Changelog
+ =========
+
++- 1.2.1
++
++ - Move OOSheet.Quit() to OODoc.quit()
++ - Correct bug in OOPacker.script_name() for Windows 7
++ - Change fetching InstallPath winreg key for LibreOffice 3.4 on Windows 7
++
+ - 1.2
+
+ - Much better performance when acessing via sockets
+diff --git a/docs/issues.rst b/docs/issues.rst
+new file mode 100644
+index 0000000..c9a1547
+--- /dev/null
++++ b/docs/issues.rst
+@@ -0,0 +1,19 @@
++======
++Issues
++======
++
++Breakpoint issue
++================
++
++It's worth noticing that *ipdb.set_trace() does not work* when you use OOSheet. This is not an issue from this module, it happens in deeper and darker layers of python-uno. If you see an error like this:
++
++ SystemError: 'pyuno runtime is not initialized, (the pyuno.bootstrap needs to be called before using any uno classes)'
++
++it's probably because you have an ipdb breakpoint. Use *pdb* instead.
++
++Connection issues
++=================
++
++In version 1.2 performance got much better when using sockets, by caching the conection. The drawback is that when connection is broken, script must be restarted.
++
++Sometimes the initial connection takes a long time. This was not reported in OpenOffice.org, but with LibreOffice this is a bit common. Any clue on why this helps is very welcome.
+diff --git a/oosheet/__init__.py b/oosheet/__init__.py
+index 2474852..28cdb7f 100644
+--- a/oosheet/__init__.py
++++ b/oosheet/__init__.py
+@@ -1,15 +1,29 @@
+ # -*- coding: utf-8 -*-
+
+ import sys, os, time
+-from columns import name as col_name, index as col_index
++from . import columns
++col_name = columns.name
++col_index = columns.index
+
+ if sys.platform == 'win32':
+ #This is required in order to make pyuno usable with the default python interpreter under windows
+ #Some environment variables must be modified
+
+ #get the install path from registry
+- import _winreg
+- value = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\OpenOffice.org\UNO\InstallPath')
++ try:
++ import winreg
++ except:
++ import _winreg as winreg
++
++ # try with OpenOffice, LibreOffice on W7
++ for _key in ['SOFTWARE\\OpenOffice.org\\UNO\\InstallPath', # OpenOffice 3.3
++ 'SOFTWARE\\Wow6432Node\\LibreOffice\\UNO\\InstallPath']: # LibreOffice 3.4.5 on W7
++ try:
++ value = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, _key)
++ except Exception as detail:
++ _errMess = "%s" % detail
++ else:
++ break # first existing key will do
+ install_folder = '\\'.join(value.split('\\')[:-1]) # 'C:\\Program Files\\OpenOffice.org 3'
+
+ #modify the environment variables
+@@ -17,9 +31,10 @@ if sys.platform == 'win32':
+ os.environ['UNO_PATH'] = install_folder+'\\program\\'
+
+ sys.path.append(install_folder+'\\Basis\\program')
++ sys.path.append(install_folder+'\\program')
+
+ paths = ''
+- for path in ("\\URE\\bin;", "\\Basis\\program;"):
++ for path in ("\\URE\\bin;", "\\Basis\\program;", "'\\program;"):
+ paths += install_folder + path
+ os.environ['PATH'] = paths+ os.environ['PATH']
+
+@@ -50,7 +65,6 @@ class OODoc(object):
+ self.load_cache()
+
+ def connect(self):
+- start = time.time()
+ OODoc._macro_environment = self.macro_environment = self._detect_macro_environment()
+ OODoc._context = self.context = self.get_context()
+ OODoc._model = self.model = self.get_model()
+@@ -163,11 +177,11 @@ class OODoc(object):
+ parentWin = self.model.CurrentController.Frame.ContainerWindow
+
+ aDescriptor = WindowDescriptor()
+- aDescriptor.Type = MODALTOP
+- aDescriptor.WindowServiceName = 'messbox'
+- aDescriptor.ParentIndex = -1
+- aDescriptor.Parent = parentWin
+- aDescriptor.WindowAttributes = OK
++ aDescriptor.Type = MODALTOP
++ aDescriptor.WindowServiceName = 'messbox'
++ aDescriptor.ParentIndex = -1
++ aDescriptor.Parent = parentWin
++ aDescriptor.WindowAttributes = OK
+
+ tk = parentWin.getToolkit()
+ box = tk.createWindow(aDescriptor)
+@@ -188,18 +202,35 @@ class OODoc(object):
+ self.dispatch('.uno:Redo')
+
+ def _file_url(self, filename):
++ """
++ for examples:
++ '/D:/example.ods' tested in Windows absolute path
++ 'example.ods' tested in Windows relative path (in current directory)
++ """
++ if filename.startswith('file://'):
++ filename = filename[7:]
++
+ if not filename.startswith('/'):
+- filename = os.path.join(os.environ['PWD'], filename)
++ #filename = os.path.join(os.environ['PWD'], filename)
++ filename = "/%s" % (os.path.join(os.path.abspath(os.curdir), filename).replace("\\",'/'))
+
+ return 'file://%s' % filename
++
++ def save(self):
++ """
++ Saves the current doc. Be sure it has already have a filename.
++ """
++ self.dispatch('Save')
+
+- def save_as(self, filename):
++ def save_as(self, filename, filtername = 'calc8'):
+ """
+ Saves the current doc to filename. Expects a string representing a path in filesystem.
+ Path can be absolute or relative to PWD environment variable.
+ """
+-
+- self.dispatch('SaveAs', ('URL', self._file_url(filename)))
++ self.dispatch('SaveAs',
++ ('URL', self._file_url(filename)),
++ ('FilterName', filtername)
++ )
+
+ def open(self, filename):
+ """
+@@ -207,6 +238,9 @@ class OODoc(object):
+ """
+ self.dispatch('Open', ('URL', self._file_url(filename)))
+
++ def quit(self):
++ """Closes the OpenOffice.org instance"""
++ self.dispatch('Quit')
+
+ class OOSheet(OODoc):
+ """
+@@ -668,9 +702,9 @@ class OOSheet(OODoc):
+
+ def find(self, query):
+ if isinstance(query, str) or isinstance(query, unicode):
+- test = lambda(cell): cell.string == query
++ test = lambda cell: cell.string == query
+ elif isinstance(query, int) or isinstance(query, float):
+- test = lambda(cell): cell.value == query
++ test = lambda cell: cell.value == query
+ elif type(query) is types.FunctionType:
+ test = query
+ else:
+@@ -931,10 +965,6 @@ class OOSheet(OODoc):
+ self.dispatch('Protection', ('Protection.Locked', False))
+ return self
+
+- def quit(self):
+- """Closes the OpenOffice.org instance"""
+- self.dispatch('Quit')
+-
+
+ class OOPacker():
+ """
+@@ -955,7 +985,7 @@ class OOPacker():
+ @property
+ def script_name(self):
+ """Gets the script name, ignoring the path of the file"""
+- return self.script.rpartition('/')[2]
++ return os.path.basename(self.script)
+
+ def manifest_add(self, path):
+ """
+@@ -964,6 +994,7 @@ class OOPacker():
+ """
+ manifest = []
+ for line in self.doc.open('META-INF/manifest.xml'):
++ line = line.decode('utf-8')
+ if '</manifest:manifest>' in line:
+ manifest.append(' <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="%s"/>' % path)
+ elif ('full-path:"%s"' % path) in line:
+@@ -1005,14 +1036,16 @@ def pack():
+ def print_help():
+ """Prints help message for pack()"""
+ script_name = sys.argv[0].split('/')[-1]
+- print "Usage: %s document script.py" % script_name
++ print("Usage: %s document script.py" % script_name)
+ sys.exit(1)
+
+ def launch():
+- print """
++ print("""
+ # This is just a reminder of the complicated command needed to launch
+ # LibreOffice with proper parameters to be controlled by sockets
+
+- libreoffice -calc -accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"
+-"""
++ libreoffice --calc --nologo --norestore --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"
++ libreoffice --calc --nologo --norestore --accept="socket,host=localhost,port=2002;urp;StarOffice.ServiceManager" --nodefault --headless
++""")
++
+
+diff --git a/oosheet/tests/run_tests.py b/oosheet/tests/run_tests.py
+index cd3e755..1774af7 100755
+--- a/oosheet/tests/run_tests.py
++++ b/oosheet/tests/run_tests.py
+@@ -62,7 +62,7 @@ class OOCalcLauncher(object):
+ def pid(self):
+ sub = subprocess.Popen('ps aux'.split(), stdout=subprocess.PIPE)
+ sub.wait()
+- processes = [ line for line in sub.stdout if 'soffice' in line ]
++ processes = [ line for line in sub.stdout if 'soffice' in line.decode('utf-8') ]
+ try:
+ return int(processes[0].split()[1])
+ except IndexError:
+@@ -106,29 +106,29 @@ def run_tests(event = None):
+ clear()
+ if stop_on_error:
+ test.__call__()
+- print 'OK'
++ print ('OK')
+ else:
+ try:
+ test.__call__()
+ if event:
+ S('Tests.c%d' % (i+10)).string = 'OK'
+ else:
+- print 'OK'
++ print ('OK')
+ ok += 1
+- except Exception, e:
++ except Exception as e:
+ errors += 1
+ if event:
+ S('Tests.d%d' % (i+10)).string = e
+ else:
+- print '%s: %s' % (type(e).__name__, e)
++ print ('%s: %s' % (type(e).__name__, e))
+
+ if event:
+ S('Tests.a1').focus()
+ else:
+ if not errors:
+- print "Passed %d of %d tests" % (ok, ok)
++ print ("Passed %d of %d tests" % (ok, ok))
+ else:
+- print "Passed %d of %d tests (%d errors)" % (ok, ok+errors, errors)
++ print ("Passed %d of %d tests (%d errors)" % (ok, ok+errors, errors))
+
+ return ok
+
+diff --git a/oosheet/tests/tests.py b/oosheet/tests/tests.py
+index 0ab904f..ac9bee9 100644
+--- a/oosheet/tests/tests.py
++++ b/oosheet/tests/tests.py
+@@ -73,7 +73,7 @@ def test_date_only_sets_format_if_not_already_in_date_format():
+ S().sheet.getCellRangeByName('Sheet1.A1').NumberFormat = 30
+ S().sheet.getCellRangeByName('Sheet1.A2').NumberFormat = 38
+
+- S('a1:a3').date = datetime(2011, 02, 20)
++ S('a1:a3').date = datetime(2011, 2, 20)
+
+ # Check if formats have been preserved
+ # lfagundes's environment is pt_BR, so let's check either format
+@@ -680,8 +680,8 @@ def test_user_selection():
+
+ def test_format_as():
+ S().sheet.getCellRangeByName('Sheet1.A1').NumberFormat = 38
+- S('a1').date = datetime(2011, 03, 1)
+- S('a2:3').date = datetime(2011, 03, 8)
++ S('a1').date = datetime(2011, 3, 1)
++ S('a2:3').date = datetime(2011, 3, 8)
+
+ weekday = S('a1').string.split()[0] #probably "wednesday", but might be localized
+ S('a2').format_as('a1')