From 87d65cac4aa3bf815860030fac78e8e28069e29d Mon Sep 17 00:00:00 2001 From: Luke Campagnola Date: Mon, 24 Mar 2014 20:48:02 -0400 Subject: [PATCH] Add flake tests Correct style in a few files to please Lord Travis --- .travis.yml | 55 ++++++---- pyqtgraph/exporters/PrintExporter.py | 2 +- pyqtgraph/flowchart/eq.py | 2 +- pyqtgraph/flowchart/library/Data.py | 2 +- pyqtgraph/functions.py | 109 ++++++++++--------- pyqtgraph/graphicsItems/PlotCurveItem.py | 4 +- pyqtgraph/graphicsItems/PlotItem/PlotItem.py | 14 ++- pyqtgraph/multiprocess/remoteproxy.py | 2 +- pyqtgraph/opengl/items/GLAxisItem.py | 2 +- pyqtgraph/opengl/items/GLGridItem.py | 2 +- pyqtgraph/opengl/items/GLLinePlotItem.py | 2 +- pyqtgraph/util/colorama/winterm.py | 2 +- setup.py | 6 +- tools/setupHelpers.py | 64 ++++++++++- 14 files changed, 172 insertions(+), 96 deletions(-) diff --git a/.travis.yml b/.travis.yml index a3a2eca4..ec40f754 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,27 +20,38 @@ env: #- PYTHON=2.6 QT=pyqt TEST=standard - PYTHON=2.7 QT=pyqt TEST=extra - PYTHON=2.7 QT=pyside TEST=standard - #- PYTHON=3.3 QT=pyqt TEST=standard - #- PYTHON=3.3 QT=pyside TEST=standard + - PYTHON=3.3 QT=pyqt TEST=standard + - PYTHON=3.3 QT=pyside TEST=standard before_install: - travis_retry sudo apt-get -qq update; - - if [ "${PYTHON}" != "2.7" ]; then - wget http://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86_64.sh -O miniconda.sh && - chmod +x miniconda.sh && - ./miniconda.sh -b && - export PATH=/home/$USER/anaconda/bin:$PATH && - conda update --yes conda && - travis_retry sudo apt-get -qq -y install libgl1-mesa-dri; - fi; +# - if [ "${PYTHON}" != "2.7" ]; then +# wget http://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86_64.sh -O miniconda.sh && +# chmod +x miniconda.sh && +# ./miniconda.sh -b && +# export PATH=/home/$USER/anaconda/bin:$PATH && +# conda update --yes conda && +# travis_retry sudo apt-get -qq -y install libgl1-mesa-dri; +# fi; install: - - travis_retry sudo apt-get -qq -y install python-numpy; - - pip install pytest - - - if [ "${PYTHON}" != "2.7" ]; then + - if [ "${PYTHON}" == "2.7" ]; then + travis_retry sudo apt-get -qq -y install python-numpy python-pytest python-flake8; + if [ ${QT} == 'pyqt' ]; then + travis_retry sudo apt-get -qq -y install python-qt4 python-qt4-gl; + else + travis_retry sudo apt-get -qq -y install python-pyside.qtcore python-pyside.qtgui python-pyside.qtsvg python-pyside.qtopengl; + fi; + elif [ "${PYTHON}" == "3.3" ]; then + travis_retry sudo apt-get -qq -y install python3-numpy python3-pytest python3-flake8; + if [ ${QT} == 'pyqt' ]; then + travis_retry sudo apt-get -qq -y install python3-qt4 python3-qt4-gl; + else + travis_retry sudo apt-get -qq -y install python3-pyside.qtcore python3-pyside.qtgui python3-pyside.qtsvg python3-pyside.qtopengl; + fi; + else conda create -n testenv --yes --quiet pip python=$PYTHON && source activate testenv && if [ ${QT} == 'pyqt' ]; then @@ -48,12 +59,6 @@ install: else conda install --yes --quiet pyside; fi; - else - if [ ${QT} == 'pyqt' ]; then - travis_retry sudo apt-get -qq -y install python-qt4 python-qt4-gl; - else - travis_retry sudo apt-get -qq -y install python-pyside.qtcore python-pyside.qtgui python-pyside.qtsvg python-pyside.qtopengl; - fi; fi; # Install PyOpenGL @@ -75,7 +80,8 @@ before_script: script: - - PYTHONPATH=. py.test + # Run unit tests + - python setup.py test # check line endings - if [ "${TEST}" == "extra" ]; then @@ -85,5 +91,10 @@ script: else true; fi; fi; - + + # Check for style issues + - if [ "${TEST}" == "extra" ]; then + python setup.py style + fi; + diff --git a/pyqtgraph/exporters/PrintExporter.py b/pyqtgraph/exporters/PrintExporter.py index 3e2d45fa..530a1800 100644 --- a/pyqtgraph/exporters/PrintExporter.py +++ b/pyqtgraph/exporters/PrintExporter.py @@ -36,7 +36,7 @@ class PrintExporter(Exporter): dialog = QtGui.QPrintDialog(printer) dialog.setWindowTitle("Print Document") if dialog.exec_() != QtGui.QDialog.Accepted: - return; + return #dpi = QtGui.QDesktopWidget().physicalDpiX() diff --git a/pyqtgraph/flowchart/eq.py b/pyqtgraph/flowchart/eq.py index 89ebe09f..554989b2 100644 --- a/pyqtgraph/flowchart/eq.py +++ b/pyqtgraph/flowchart/eq.py @@ -29,7 +29,7 @@ def eq(a, b): except: return False if (hasattr(e, 'implements') and e.implements('MetaArray')): - return e.asarray().all() + return e.asarray().all() else: return e.all() else: diff --git a/pyqtgraph/flowchart/library/Data.py b/pyqtgraph/flowchart/library/Data.py index 52458bd9..532f6c5b 100644 --- a/pyqtgraph/flowchart/library/Data.py +++ b/pyqtgraph/flowchart/library/Data.py @@ -328,7 +328,7 @@ class ColumnJoinNode(Node): ## Node.restoreState should have created all of the terminals we need ## However: to maintain support for some older flowchart files, we need - ## to manually add any terminals that were not taken care of. + ## to manually add any terminals that were not taken care of. for name in [n for n in state['order'] if n not in inputs]: Node.addInput(self, name, renamable=True, removable=True, multiable=True) inputs = self.inputs() diff --git a/pyqtgraph/functions.py b/pyqtgraph/functions.py index f76a71c9..2325186c 100644 --- a/pyqtgraph/functions.py +++ b/pyqtgraph/functions.py @@ -1424,30 +1424,30 @@ def isocurve(data, level, connected=False, extendToEdge=False, path=False): data = d2 sideTable = [ - [], - [0,1], - [1,2], - [0,2], - [0,3], - [1,3], - [0,1,2,3], - [2,3], - [2,3], - [0,1,2,3], - [1,3], - [0,3], - [0,2], - [1,2], - [0,1], - [] - ] + [], + [0,1], + [1,2], + [0,2], + [0,3], + [1,3], + [0,1,2,3], + [2,3], + [2,3], + [0,1,2,3], + [1,3], + [0,3], + [0,2], + [1,2], + [0,1], + [] + ] edgeKey=[ - [(0,1), (0,0)], - [(0,0), (1,0)], - [(1,0), (1,1)], - [(1,1), (0,1)] - ] + [(0,1), (0,0)], + [(0,0), (1,0)], + [(1,0), (1,1)], + [(1,1), (0,1)] + ] lines = [] @@ -1635,38 +1635,39 @@ def isosurface(data, level): ## edge index tells us which edges are cut by the isosurface. ## (Data stolen from Bourk; see above.) edgeTable = np.array([ - 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, - 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, - 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, - 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, - 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, - 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, - 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, - 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, - 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, - 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, - 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, - 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, - 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, - 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, - 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , - 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, - 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, - 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, - 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, - 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, - 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, - 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, - 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, - 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, - 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, - 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, - 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, - 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, - 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, - 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, - 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, - 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 ], dtype=np.uint16) + 0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, + 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, + 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, + 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, + 0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c, + 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, + 0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac, + 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, + 0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c, + 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, + 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc, + 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, + 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c, + 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, + 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc , + 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, + 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, + 0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, + 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, + 0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, + 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, + 0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, + 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, + 0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460, + 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, + 0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0, + 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, + 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230, + 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, + 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190, + 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, + 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 + ], dtype=np.uint16) ## Table of triangles to use for filling each grid cell. ## Each set of three integers tells us which three edges to diff --git a/pyqtgraph/graphicsItems/PlotCurveItem.py b/pyqtgraph/graphicsItems/PlotCurveItem.py index ea337100..2197a6cd 100644 --- a/pyqtgraph/graphicsItems/PlotCurveItem.py +++ b/pyqtgraph/graphicsItems/PlotCurveItem.py @@ -486,7 +486,7 @@ class PlotCurveItem(GraphicsObject): gl.glStencilOp(gl.GL_REPLACE, gl.GL_KEEP, gl.GL_KEEP) ## draw stencil pattern - gl.glStencilMask(0xFF); + gl.glStencilMask(0xFF) gl.glClear(gl.GL_STENCIL_BUFFER_BIT) gl.glBegin(gl.GL_TRIANGLES) gl.glVertex2f(rect.x(), rect.y()) @@ -520,7 +520,7 @@ class PlotCurveItem(GraphicsObject): gl.glEnable(gl.GL_LINE_SMOOTH) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) - gl.glHint(gl.GL_LINE_SMOOTH_HINT, gl.GL_NICEST); + gl.glHint(gl.GL_LINE_SMOOTH_HINT, gl.GL_NICEST) gl.glDrawArrays(gl.GL_LINE_STRIP, 0, pos.size / pos.shape[-1]) finally: gl.glDisableClientState(gl.GL_VERTEX_ARRAY) diff --git a/pyqtgraph/graphicsItems/PlotItem/PlotItem.py b/pyqtgraph/graphicsItems/PlotItem/PlotItem.py index 847ff3ac..5c102d95 100644 --- a/pyqtgraph/graphicsItems/PlotItem/PlotItem.py +++ b/pyqtgraph/graphicsItems/PlotItem/PlotItem.py @@ -290,16 +290,17 @@ class PlotItem(GraphicsWidget): def getViewBox(self): """Return the :class:`ViewBox ` contained within.""" return self.vb + ## Wrap a few methods from viewBox. - #Important: don't use a settattr(m, getattr(self.vb, m)) as we'd be leaving the viebox alive #because we had a reference to an instance method (creating wrapper methods at runtime instead). - for m in [ - 'setXRange', 'setYRange', 'setXLink', 'setYLink', 'setAutoPan', 'setAutoVisible', - 'setRange', 'autoRange', 'viewRect', 'viewRange', 'setMouseEnabled', 'setLimits', - 'enableAutoRange', 'disableAutoRange', 'setAspectLocked', 'invertY', - 'register', 'unregister']: ## NOTE: If you update this list, please update the class docstring as well. + + for m in ['setXRange', 'setYRange', 'setXLink', 'setYLink', 'setAutoPan', # NOTE: + 'setAutoVisible', 'setRange', 'autoRange', 'viewRect', 'viewRange', # If you update this list, please + 'setMouseEnabled', 'setLimits', 'enableAutoRange', 'disableAutoRange', # update the class docstring + 'setAspectLocked', 'invertY', 'register', 'unregister']: # as well. + def _create_method(name): def method(self, *args, **kwargs): return getattr(self.vb, name)(*args, **kwargs) @@ -310,6 +311,7 @@ class PlotItem(GraphicsWidget): del _create_method + def setLogMode(self, x=None, y=None): """ Set log scaling for x and/or y axes. diff --git a/pyqtgraph/multiprocess/remoteproxy.py b/pyqtgraph/multiprocess/remoteproxy.py index f2896c8b..4e7b7a1c 100644 --- a/pyqtgraph/multiprocess/remoteproxy.py +++ b/pyqtgraph/multiprocess/remoteproxy.py @@ -579,7 +579,7 @@ class Request(object): return self._result if timeout is None: - timeout = self.timeout + timeout = self.timeout if block: start = time.time() diff --git a/pyqtgraph/opengl/items/GLAxisItem.py b/pyqtgraph/opengl/items/GLAxisItem.py index c6c206e4..989a44ca 100644 --- a/pyqtgraph/opengl/items/GLAxisItem.py +++ b/pyqtgraph/opengl/items/GLAxisItem.py @@ -45,7 +45,7 @@ class GLAxisItem(GLGraphicsItem): if self.antialias: glEnable(GL_LINE_SMOOTH) - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) glBegin( GL_LINES ) diff --git a/pyqtgraph/opengl/items/GLGridItem.py b/pyqtgraph/opengl/items/GLGridItem.py index a8d1fb7a..4d6bc9d6 100644 --- a/pyqtgraph/opengl/items/GLGridItem.py +++ b/pyqtgraph/opengl/items/GLGridItem.py @@ -59,7 +59,7 @@ class GLGridItem(GLGraphicsItem): glEnable(GL_LINE_SMOOTH) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) glBegin( GL_LINES ) diff --git a/pyqtgraph/opengl/items/GLLinePlotItem.py b/pyqtgraph/opengl/items/GLLinePlotItem.py index 29c7ab5a..f5cb7545 100644 --- a/pyqtgraph/opengl/items/GLLinePlotItem.py +++ b/pyqtgraph/opengl/items/GLLinePlotItem.py @@ -96,7 +96,7 @@ class GLLinePlotItem(GLGraphicsItem): glEnable(GL_LINE_SMOOTH) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) if self.mode == 'line_strip': glDrawArrays(GL_LINE_STRIP, 0, int(self.pos.size / self.pos.shape[-1])) diff --git a/pyqtgraph/util/colorama/winterm.py b/pyqtgraph/util/colorama/winterm.py index 27088115..9c1c8185 100644 --- a/pyqtgraph/util/colorama/winterm.py +++ b/pyqtgraph/util/colorama/winterm.py @@ -115,6 +115,6 @@ class WinTerm(object): # fill the entire screen with blanks win32.FillConsoleOutputCharacter(handle, ' ', dw_con_size, coord_screen) # now set the buffer's attributes accordingly - win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen ); + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), dw_con_size, coord_screen ) # put the cursor at (0, 0) win32.SetConsoleCursorPosition(handle, (coord_screen.X, coord_screen.Y)) diff --git a/setup.py b/setup.py index 7f2db6bf..3db88a93 100644 --- a/setup.py +++ b/setup.py @@ -97,7 +97,11 @@ class Build(distutils.command.build.build): setup( version=version, - cmdclass={'build': Build, 'deb': helpers.DebCommand, 'test': helpers.TestCommand}, + cmdclass={'build': Build, + 'deb': helpers.DebCommand, + 'test': helpers.TestCommand, + 'debug': helpers.DebugCommand, + 'style': helpers.StyleCommand}, packages=allPackages, package_dir={'pyqtgraph.examples': 'examples'}, ## install examples along with the rest of the source #package_data={'pyqtgraph': ['graphicsItems/PlotItem/*.png']}, diff --git a/tools/setupHelpers.py b/tools/setupHelpers.py index ea6aba3f..b7c00c63 100644 --- a/tools/setupHelpers.py +++ b/tools/setupHelpers.py @@ -9,9 +9,37 @@ except ImportError: output = proc.stdout.read() proc.wait() if proc.returncode != 0: - raise Exception("Process had nonzero return value", proc.returncode) + ex = Exception("Process had nonzero return value %d" % proc.returncode) + ex.returncode = proc.returncode + ex.output = output + raise ex return output +FLAKE_TESTS = ("E101,E111,E112,E113,E122,E125,E133,E223,E224," + "E242,E273,E274,E304,E502,E703,E901,E902," + "W191,W601,W602,W603,W604") + +def checkStyle(): + try: + out = check_output(['flake8', '--select=%s' % FLAKE_TESTS, '--statistics', 'pyqtgraph/']) + ret = 0 + print("All style checks OK.") + except Exception as e: + out = e.output + ret = e.returncode + print(out) + return ret + +def unitTests(): + try: + out = check_output('PYTHONPATH=. py.test', shell=True) + ret = 0 + except Exception as e: + out = e.output + ret = e.returncode + print(out) + return ret + def listAllPackages(pkgroot): path = os.getcwd() n = len(path.split(os.path.sep)) @@ -190,8 +218,8 @@ class DebCommand(Command): raise Exception("Error during debuild.") -class TestCommand(Command): - """Just for learning about distutils; not for running package tests.""" +class DebugCommand(Command): + """Just for learning about distutils.""" description = "" user_options = [] def initialize_options(self): @@ -203,3 +231,33 @@ class TestCommand(Command): cmd = self print(self.distribution.name) print(self.distribution.version) + + +class TestCommand(Command): + description = "Run all package tests and exit immediately with informative return code." + user_options = [] + + def run(self): + sys.exit(unitTests()) + + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + +class StyleCommand(Command): + description = "Check all code for style, exit immediately with informative return code." + user_options = [] + + def run(self): + sys.exit(checkStyle()) + + def initialize_options(self): + pass + + def finalize_options(self): + pass +