Package imgconverter as separate Python module

This is partly because qubes/__init__.py conflicted with core3.
It is also a good practice.
This commit is contained in:
Wojtek Porczyk 2015-09-21 16:00:35 +02:00 committed by Marek Marczykowski-Górecki
parent b6ad625b85
commit 2a0bbe1c6f
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
8 changed files with 115 additions and 98 deletions

View File

@ -19,13 +19,13 @@ rpms:
all: all:
$(MAKE) -C qrexec-lib all $(MAKE) -C qrexec-lib all
$(MAKE) -C qmemman all $(MAKE) -C qmemman all
$(MAKE) -C core all $(MAKE) -C imgconverter all
install: install:
$(MAKE) -C udev install $(MAKE) -C udev install
$(MAKE) -C qrexec-lib install $(MAKE) -C qrexec-lib install
$(MAKE) -C qmemman install $(MAKE) -C qmemman install
$(MAKE) -C core install $(MAKE) -C imgconverter install
install-fedora-kernel-support: install-fedora-kernel-support:
$(MAKE) -C dracut install $(MAKE) -C dracut install
@ -41,4 +41,4 @@ install-debian-kernel-support:
clean: clean:
$(MAKE) -C qrexec-lib clean $(MAKE) -C qrexec-lib clean
$(MAKE) -C qmemman clean $(MAKE) -C qmemman clean
$(MAKE) -C core clean $(MAKE) -C imgconverter clean

View File

@ -1,20 +0,0 @@
PYTHON = /usr/bin/python2
PYTHON_SITEARCH = `python2 -c 'import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1)'`
all:
$(PYTHON) -m compileall .
$(PYTHON) -O -m compileall .
.PHONY: all
clean:
$(RM) *.py[co]
.PHONY: clean
install:
mkdir -p $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
ifeq (1,${DEBIANBUILD})
cp *.py $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
else
cp *.py* $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
endif
.PHONY: install

View File

16
imgconverter/Makefile Normal file
View File

@ -0,0 +1,16 @@
all:
python setup.py build
.PHONY: all
clean:
python setup.py clean
.PHONY: clean
install:
python setup.py install -O1 --skip-build --root $(DESTDIR)
#ifeq (1,${DEBIANBUILD})
# cp *.py $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
#else
# cp *.py* $(DESTDIR)/$(PYTHON_SITEARCH)/qubes/
#endif
.PHONY: install

View File

@ -252,72 +252,4 @@ def make_padlock(dst, colour, size=ICON_MAXSIZE):
cs.write_to_png(dst) cs.write_to_png(dst)
class TestCaseImage(unittest.TestCase):
def setUp(self):
self.rgba = \
'\x00\x00\x00\xff' '\xff\x00\x00\xff' \
'\x00\xff\x00\xff' '\x00\x00\x00\xff'
self.size = (2, 2)
self.image = Image(rgba=self.rgba, size=self.size)
def test_00_init(self):
self.assertEqual(self.image._rgba, self.rgba)
self.assertEqual(self.image._size, self.size)
def test_01_tint(self):
image = self.image.tint('#0000ff')
self.assertEqual(image._rgba,
'\x00\x00\x00\xff' '\x00\x00\xff\xff'
'\x00\x00\xff\xff' '\x00\x00\x00\xff')
def test_10_get_from_stream(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba))
image = Image.get_from_stream(io)
self.assertEqual(image._rgba, self.rgba)
self.assertEqual(image._size, self.size)
def test_11_get_from_stream_malformed(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba[-1])) # one byte too short
with self.assertRaises(Exception):
image = Image.get_from_stream(io)
def test_12_get_from_stream_too_big(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba)) # 2x2
with self.assertRaises(Exception):
image = Image.get_from_stream(io, max_width=1)
io.seek(0)
with self.assertRaises(Exception):
image = Image.get_from_stream(io, max_height=1)
class TestCaseFunctionsAndConstants(unittest.TestCase):
def test_00_imghdrlen(self):
self.assertEqual(imghdrlen(8, 15), len('8 15\n'))
def test_01_re_imghdr(self):
self.assertTrue(re_imghdr.match('8 15\n'))
self.assertIsNone(re_imghdr.match('8 15'))
self.assertIsNone(re_imghdr.match('815\n'))
self.assertIsNone(re_imghdr.match('x yx\n'))
def test_10_hex_to_float_result_00(self):
self.assertEqual(hex_to_float('#000000'), (0.0, 0.0, 0.0))
def test_11_hex_to_float_result_ff(self):
self.assertEqual(hex_to_float('0xffffff'), (1.0, 1.0, 1.0))
def test_12_hex_to_float_depth_3_not_implemented(self):
with self.assertRaises(NotImplementedError):
hex_to_float('123456', depth=3)
if __name__ == '__main__':
unittest.main()
# vim: ft=python sw=4 ts=4 et # vim: ft=python sw=4 ts=4 et

View File

@ -0,0 +1,75 @@
#!/usr/bin/env python2
from __future__ import absolute_import
import cStringIO as StringIO
import unittest
import qubesimgconverter
class TestCaseImage(unittest.TestCase):
def setUp(self):
self.rgba = \
'\x00\x00\x00\xff' '\xff\x00\x00\xff' \
'\x00\xff\x00\xff' '\x00\x00\x00\xff'
self.size = (2, 2)
self.image = qubesimgconverter.Image(rgba=self.rgba, size=self.size)
def test_00_init(self):
self.assertEqual(self.image._rgba, self.rgba)
self.assertEqual(self.image._size, self.size)
def test_01_tint(self):
image = self.image.tint('#0000ff')
self.assertEqual(image._rgba,
'\x00\x00\x00\xff' '\x00\x00\xff\xff'
'\x00\x00\xff\xff' '\x00\x00\x00\xff')
def test_10_get_from_stream(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba))
image = qubesimgconverter.Image.get_from_stream(io)
self.assertEqual(image._rgba, self.rgba)
self.assertEqual(image._size, self.size)
def test_11_get_from_stream_malformed(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba[-1])) # one byte too short
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io)
def test_12_get_from_stream_too_big(self):
io = StringIO.StringIO('{0[0]} {0[1]}\n{1}'.format(self.size, self.rgba)) # 2x2
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io, max_width=1)
io.seek(0)
with self.assertRaises(Exception):
image = qubesimgconverter.Image.get_from_stream(io, max_height=1)
class TestCaseFunctionsAndConstants(unittest.TestCase):
def test_00_imghdrlen(self):
self.assertEqual(qubesimgconverter.imghdrlen(8, 15), len('8 15\n'))
def test_01_re_imghdr(self):
self.assertTrue(qubesimgconverter.re_imghdr.match('8 15\n'))
self.assertIsNone(qubesimgconverter.re_imghdr.match('8 15'))
self.assertIsNone(qubesimgconverter.re_imghdr.match('815\n'))
self.assertIsNone(qubesimgconverter.re_imghdr.match('x yx\n'))
def test_10_hex_to_float_result_00(self):
self.assertEqual(qubesimgconverter.hex_to_float('#000000'), (0.0, 0.0, 0.0))
def test_11_hex_to_float_result_ff(self):
self.assertEqual(qubesimgconverter.hex_to_float('0xffffff'), (1.0, 1.0, 1.0))
def test_12_hex_to_float_depth_3_not_implemented(self):
with self.assertRaises(NotImplementedError):
qubesimgconverter.hex_to_float('123456', depth=3)
if __name__ == '__main__':
unittest.main()

14
imgconverter/setup.py Normal file
View File

@ -0,0 +1,14 @@
import setuptools
setuptools.setup(
name='qubesimgconverter',
version=open('../version').read().strip(),
author='Invisible Things Lab',
author_email='woju@invisiblethingslab.com',
description='Toolkit for secure transfer and conversion of images between Qubes VMs.',
license='GPL2+',
url='https://www.qubes-os.org/',
packages=['qubesimgconverter'],
)
# vim: ts=4 sts=4 sw=4 et

View File

@ -3,7 +3,7 @@
%define _builddir %(pwd) %define _builddir %(pwd)
%endif %endif
%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")} %{!?python_sitepath: %define python_sitepath %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(0)")}
Name: qubes-utils Name: qubes-utils
Version: %{version} Version: %{version}
@ -77,12 +77,12 @@ rm -rf $RPM_BUILD_ROOT
%{_sbindir}/meminfo-writer %{_sbindir}/meminfo-writer
%{_unitdir}/qubes-meminfo-writer.service %{_unitdir}/qubes-meminfo-writer.service
%{_unitdir}/qubes-meminfo-writer-dom0.service %{_unitdir}/qubes-meminfo-writer-dom0.service
%{python_sitearch}/qubes/__init__.py #%{python_sitearch}/qubes/__init__.py
%{python_sitearch}/qubes/__init__.pyc #%{python_sitearch}/qubes/__init__.pyc
%{python_sitearch}/qubes/__init__.pyo #%{python_sitearch}/qubes/__init__.pyo
%attr(0755,root,root) %{python_sitearch}/qubes/imgconverter.py %{python_sitepath}/qubesimgconverter/__init__.py*
%{python_sitearch}/qubes/imgconverter.pyc %{python_sitepath}/qubesimgconverter/test.py*
%{python_sitearch}/qubes/imgconverter.pyo %{python_sitepath}/qubesimgconverter-%{version}-py?.?.egg-info/*
%files libs %files libs
%{_libdir}/libqrexec-utils.so.2 %{_libdir}/libqrexec-utils.so.2