123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- # -*- coding: utf-8 -*-
- '''
- tests.unit.doc_test
- ~~~~~~~~~~~~~~~~~~~~
- '''
- # Import Python libs
- from __future__ import absolute_import
- import os
- import re
- import logging
- # Import Salt Testing libs
- from tests.support.unit import TestCase
- from tests.support.runtests import RUNTIME_VARS
- # Import Salt libs
- import salt.modules.cmdmod
- import salt.utils.platform
- log = logging.getLogger(__name__)
- class DocTestCase(TestCase):
- '''
- Unit test case for testing doc files and strings.
- '''
- def test_check_for_doc_inline_markup(self):
- '''
- We should not be using the ``:doc:`` inline markup option when
- cross-referencing locations. Use ``:ref:`` or ``:mod:`` instead.
- This test checks for reference to ``:doc:`` usage.
- See Issue #12788 for more information.
- https://github.com/saltstack/salt/issues/12788
- '''
- salt_dir = RUNTIME_VARS.CODE_DIR
- if salt.utils.platform.is_windows():
- if salt.utils.path.which('bash'):
- # Use grep from git-bash when it exists.
- cmd = 'bash -c \'grep -r :doc: ./salt/'
- grep_call = salt.modules.cmdmod.run_stdout(cmd=cmd, cwd=salt_dir).split(os.linesep)
- else:
- # No grep in Windows, use findstr
- # findstr in windows doesn't prepend 'Binary` to binary files, so
- # use the '/P' switch to skip files with unprintable characters
- cmd = 'findstr /C:":doc:" /S /P {0}\\*'.format(salt_dir)
- grep_call = salt.modules.cmdmod.run_stdout(cmd=cmd).split(os.linesep)
- else:
- salt_dir += '/'
- cmd = 'grep -r :doc: ' + salt_dir
- grep_call = salt.modules.cmdmod.run_stdout(cmd=cmd).split(os.linesep)
- test_ret = {}
- for line in grep_call:
- # Skip any .pyc files that may be present
- if line.startswith('Binary'):
- continue
- # Only split on colons not followed by a '\' as is the case with
- # Windows Drives
- regex = re.compile(r':(?!\\)')
- try:
- key, val = regex.split(line, 1)
- except ValueError:
- log.error("Could not split line: %s", line)
- continue
- # Don't test man pages, this file, the tox or nox virtualenv files,
- # the page that documents to not use ":doc:", the doc/conf.py file
- # or the artifacts directory on nox CI test runs
- if 'man' in key \
- or '.tox{}'.format(os.sep) in key \
- or '.nox{}'.format(os.sep) in key \
- or 'artifacts{}'.format(os.sep) in key \
- or key.endswith('test_doc.py') \
- or key.endswith(os.sep.join(['doc', 'conf.py'])) \
- or key.endswith(os.sep.join(['conventions', 'documentation.rst'])) \
- or key.endswith(os.sep.join(['doc', 'topics', 'releases', '2016.11.2.rst'])) \
- or key.endswith(os.sep.join(['doc', 'topics', 'releases', '2016.11.3.rst'])) \
- or key.endswith(os.sep.join(['doc', 'topics', 'releases', '2016.3.5.rst'])):
- continue
- # Set up test return dict
- if test_ret.get(key) is None:
- test_ret[key] = [val.strip()]
- else:
- test_ret[key].append(val.strip())
- # Allow test results to show files with :doc: ref, rather than truncating
- self.maxDiff = None
- # test_ret should be empty, otherwise there are :doc: references present
- self.assertEqual(test_ret, {})
|