[WIP] Migrate to tox based environment 57/23757/12
authorLeif Madsen <lmadsen@redhat.com>
Fri, 28 Oct 2016 09:59:53 +0000 (05:59 -0400)
committerzshi <zshi@redhat.com>
Tue, 13 Dec 2016 04:48:12 +0000 (12:48 +0800)
Migrate the custom setup.py to a more formal setup
environment using tox, in the same way that OpenStack
configures their projects.

Adds metadata to tox.ini from the setup.py file, and breaks
out the dependencies from setup.py into requirements.txt
and test-requirements.txt.

Executes flake8 testing for pep8 coverage.

Defaults to using Python 2 for the environment.

Change-Id: Ieaea7d9f3dc227febd8fb1dc9142d478ba197a92
Signed-off-by: Leif Madsen <lmadsen@redhat.com>
Signed-off-by: zshi <zshi@redhat.com>
17 files changed:
.gitignore
docs/dovetailtool/index.rst
docs/plugfest/2016.05/test_plan/application/testcases.rst
docs/plugfest/2016.05/test_plan/index.rst
docs/plugfest/2016.05/test_plan/integration/testcases.rst
docs/testsuites/ipv6/index.rst
docs/userguide/02-certification_criteria.rst
docs/userguide/03-certification_progress.rst
dovetail/container.py
dovetail/parser.py
dovetail/report.py
dovetail/testcase.py
requirements.txt [new file with mode: 0644]
setup.cfg [new file with mode: 0644]
setup.py
test-requirements.txt [new file with mode: 0644]
tox.ini [new file with mode: 0644]

index 913e371..cae3e65 100644 (file)
@@ -2,7 +2,7 @@
 
 # Packages
 *.egg
-*.egg-info
+.testrepository
 dist
 build
 eggs
index a025cd5..592fa56 100644 (file)
@@ -12,5 +12,5 @@ Dovetail Overview
 
    dovetail.tool.overview.rst
    dovetail.tool.installation.rst
-   dovetail.tool.configuation.rst
+   dovetail.tool.configuration.rst
    dovetail.tool.configtemplate.rst
index 0e49c5c..bb1bba7 100644 (file)
@@ -16,8 +16,3 @@ files in this directory that are imported below the toctree command below.
 
 .. toctree::
    :maxdepth: 2
-
-   ./testcase1.rst
-   ./testcase2.rst
-   ./testcase_etc.rst
-
index 61de3bd..e4bf5e9 100644 (file)
@@ -16,4 +16,5 @@ OPNFV Plugfest - test plan
    ./deployment/testcases.rst
    ./integration/testcases.rst
    ./application/testcases.rst
+   ./templates/template.rst
 
index d0f0115..c7211f9 100644 (file)
@@ -18,8 +18,3 @@ files in this directory that are imported below the toctree command below.
 
 .. toctree::
    :maxdepth: 2
-
-   ./testcase1.rst
-   ./testcase2.rst
-   ./testcase_etc.rst
-
index 72fd6a8..a806d64 100644 (file)
@@ -10,6 +10,10 @@ OPNFV IPv6 Compliance Test Plan
    :maxdepth: 2
 
    ./testplan.rst
+   ./testprocedure.rst
+   ./testspecification.rst
+   ./designspecification.rst
    ./ipv6.tc001.specification.rst
    ./ipv6.tc026.specification.rst
+   ./ipv6_all_testcases.rst
 
index a0cdf65..67a7076 100644 (file)
@@ -28,7 +28,7 @@ class Container:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.Container').getLogger()
+        cls.logger = dt_logger.Logger(__name__ + '.Container').getLogger()
 
     @classmethod
     def get(cls, type):
index d8f9fa0..4385325 100644 (file)
@@ -22,7 +22,7 @@ class Parser:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.Parser').getLogger()
+        cls.logger = dt_logger.Logger(__name__ + '.Parser').getLogger()
 
     @classmethod
     def parse_cmd(cls, cmd, testcase):
index 7fd4076..a6fff20 100644 (file)
@@ -36,7 +36,7 @@ class Report:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.Report').getLogger()
+        cls.logger = dt_logger.Logger(__name__ + '.Report').getLogger()
 
     @staticmethod
     def check_result(testcase, db_result):
@@ -126,22 +126,22 @@ class Report:
                 pass_num += 1
 
         if total_num != 0:
-            pass_rate = pass_num/total_num
+            pass_rate = pass_num / total_num
             report_txt += 'Pass Rate: %.2f%% (%s/%s)\n' %\
-                (pass_rate*100, pass_num, total_num)
+                (pass_rate * 100, pass_num, total_num)
             report_txt += 'Assessed test areas:\n'
         for key in sub_report:
             if testcase_num[key] != 0:
-                pass_rate = testcase_passnum[key]/testcase_num[key]
+                pass_rate = testcase_passnum[key] / testcase_num[key]
                 # TO DO: once version scheme settled, adjust accordingly
                 doc_link = dt_cfg.dovetail_config['repo'] +\
                     ('docs/testsuites/%s' % key)
                 report_txt += '- %s results: <%s> pass %.2f%%\n' %\
-                    (key, doc_link, pass_rate*100)
+                    (key, doc_link, pass_rate * 100)
         for key in sub_report:
             if testcase_num[key] != 0:
-                pass_rate = testcase_passnum[key]/testcase_num[key]
-                report_txt += '%s: pass rate %.2f%%\n' % (key, pass_rate*100)
+                pass_rate = testcase_passnum[key] / testcase_num[key]
+                report_txt += '%s: pass rate %.2f%%\n' % (key, pass_rate * 100)
                 report_txt += sub_report[key]
 
         cls.logger.info(report_txt)
@@ -205,7 +205,8 @@ class FunctestCrawler:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.FunctestCrawler').getLogger()
+        cls.logger = \
+            dt_logger.Logger(__name__ + '.FunctestCrawler').getLogger()
 
     def crawl(self, testcase=None):
         store_type = \
@@ -273,7 +274,8 @@ class YardstickCrawler:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.YardstickCrawler').getLogger()
+        cls.logger = \
+            dt_logger.Logger(__name__ + '.YardstickCrawler').getLogger()
 
     def crawl(self, testcase=None):
         store_type = \
@@ -286,7 +288,7 @@ class YardstickCrawler:
 
     def crawl_from_file(self, testcase=None):
         file_path = os.path.join(dt_cfg.dovetail_config['result_dir'],
-                                 testcase+'.out')
+                                 testcase + '.out')
         if not os.path.exists(file_path):
             self.logger.info('result file not found: %s' % file_path)
             return None
@@ -332,7 +334,8 @@ class FunctestChecker:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.FunctestChecker').getLogger()
+        cls.logger = \
+            dt_logger.Logger(__name__ + '.FunctestChecker').getLogger()
 
     def check(self, testcase, db_result):
         sub_testcase_list = testcase.sub_testcase()
@@ -371,7 +374,8 @@ class YardstickChecker:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.YardstickChecker').getLogger()
+        cls.logger = \
+            dt_logger.Logger(__name__ + '.YardstickChecker').getLogger()
 
     @staticmethod
     def check(testcase, result):
index 60ce2b2..9cd8e77 100644 (file)
@@ -30,7 +30,7 @@ class Testcase:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.Testcase').getLogger()
+        cls.logger = dt_logger.Logger(__name__ + '.Testcase').getLogger()
 
     def prepare_cmd(self):
         script_type = self.script_type()
@@ -56,7 +56,7 @@ class Testcase:
 
     def sub_testcase_passed(self, name, passed=None):
         if passed is not None:
-            self.logger.debug('sub_testcase_passed:%s %s' % (name,  passed))
+            self.logger.debug('sub_testcase_passed:%s %s' % (name, passed))
             self.sub_testcase_status[name] = passed
         return self.sub_testcase_status[name]
 
@@ -169,7 +169,7 @@ class Testsuite:
 
     @classmethod
     def create_log(cls):
-        cls.logger = dt_logger.Logger(__name__+'.Testsuite').getLogger()
+        cls.logger = dt_logger.Logger(__name__ + '.Testsuite').getLogger()
 
     def get_test(self, testcase_name):
         if testcase_name in self.testcase_list:
diff --git a/requirements.txt b/requirements.txt
new file mode 100644 (file)
index 0000000..a176ad6
--- /dev/null
@@ -0,0 +1,6 @@
+pbr>=1.6
+coverage>=3.6
+flake8<3.0
+Jinja2>=2.6
+PyYAML>=3.10
+Click
diff --git a/setup.cfg b/setup.cfg
new file mode 100644 (file)
index 0000000..c691f06
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,7 @@
+[metadata]
+name = dovetail
+home-page = https://wiki.opnfv.org/display/dovetail
+
+[entry_points]
+console_scripts =
+    dovetail = dovetail.main:main
index 40dc475..b9f6e14 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -7,32 +7,8 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
-from setuptools import setup, find_packages
+import setuptools
 
-
-setup(
-    name="dovetail",
-    version="0.dev0",
-    packages=find_packages(),
-    include_package_data=True,
-    package_data={
-        'dovetail': [
-            '*.py',
-            'conf/*.py',
-            'conf/*.yml',
-            'utils/*.py',
-        ]
-    },
-    url="https://www.opnfv.org",
-    install_requires=["coverage>=3.6",
-                      "flake8",
-                      "Jinja2>=2.6",
-                      "PyYAML>=3.10",
-                      "Click"
-                      ],
-    entry_points={
-        'console_scripts': [
-            'dovetail=dovetail.main:main',
-        ],
-    }
-)
+setuptools.setup(
+    setup_requires=['pbr>=1.8'],
+    pbr=True)
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644 (file)
index 0000000..8ea9c2b
--- /dev/null
@@ -0,0 +1,6 @@
+pytest
+pykwalify
+mock
+testrepository
+testscenarios
+testtools
diff --git a/tox.ini b/tox.ini
new file mode 100644 (file)
index 0000000..12cf8e3
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,26 @@
+[tox]
+minversion = 1.6
+skipsdist = True
+envlist = py27,pep8
+
+[testenv]
+basepython=python2
+usedevelop = True
+install_command = pip install -U {opts} {packages}
+deps = -r{toxinidir}/requirements.txt
+       -r{toxinidir}/test-requirements.txt
+commands =
+  py.test --basetemp={envtmpdir} {posargs}
+setenv =
+  VIRTUAL_ENV={envdir}
+  HOME = {envtmpdir}
+  PYTHONPATH = {toxinidir}
+
+[testenv:pep8]
+deps = flake8
+commands = flake8 {toxinidir}
+
+[flake8]
+show-source = True
+ignore = E123,E125,H803
+exclude = .tox,dist,docs,.egg,build,.venv,.git