Skip to content

Commit

Permalink
Enhancement: Testing - Add Black to tox file for code formatting (net…
Browse files Browse the repository at this point in the history
  • Loading branch information
jmcgill298 authored and thomasblass committed Oct 25, 2020
1 parent e51fc00 commit 42c2cb7
Show file tree
Hide file tree
Showing 9 changed files with 129 additions and 74 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[![Build Status](https://travis-ci.org/networktocode/ntc-templates.svg?branch=master)](https://travis-ci.org/networktocode/ntc-templates)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)

NTC TEMPLATES
=============
Expand Down
11 changes: 5 additions & 6 deletions lib/ntc_templates/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,16 @@ def _clitable_to_dict(cli_table):
def parse_output(platform=None, command=None, data=None):
"""Return the structured data based on the output from a network device."""
template_dir = _get_template_dir()
cli_table = clitable.CliTable('index', template_dir)
cli_table = clitable.CliTable("index", template_dir)

attrs = dict(
Command=command,
Platform=platform
)
attrs = {"Command": command, "Platform": platform}
try:
cli_table.ParseCmd(data, attrs)
structured_data = _clitable_to_dict(cli_table)
except clitable.CliTableError as e:
raise Exception('Unable to parse command "%s" on platform %s - %s' % (command, platform, str(e)))
raise Exception(
'Unable to parse command "{0}" on platform {1} - {2}'.format(command, platform, str(e))
)
# Invalid or Missing template
# module.fail_json(msg='parsing error', error=str(e))
# rather than fail, fallback to return raw text
Expand Down
19 changes: 19 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[tool.black]
line-length = 100
target-version = ['py36']
include = '\.pyi?$'
exclude = '''
/(
\.eggs
| \.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
)/
| test-templates\.py
'''
51 changes: 24 additions & 27 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,40 @@
from codecs import open
from setuptools import setup, find_packages

version = ''
with open('lib/ntc_templates/__init__.py', 'r') as fd:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
fd.read(), re.MULTILINE).group(1)
with open("lib/ntc_templates/__init__.py", "r") as fd:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', fd.read(), re.MULTILINE).group(1)

if not version:
raise RuntimeError('Cannot find version information')
raise RuntimeError("Cannot find version information")

with open('README.md', 'r', 'utf-8') as f:
with open("README.md", "r", "utf-8") as f:
readme = f.read()

with open('CHANGELOG', 'r', 'utf-8') as f:
with open("CHANGELOG", "r", "utf-8") as f:
history = f.read()

long_description = readme + '\n\n' + history
long_description = readme + "\n\n" + history

config = {
'name': 'ntc_templates',
'package_dir': {'': 'lib'},
'packages': find_packages('lib'),
'version': version,
'package_data': {'ntc_templates': ['templates/*']},
'description': 'Package to return structured data from the output of network devices.',
'long_description': long_description,
'long_description_content_type': 'text/markdown',
'author': 'network.toCode()',
'author_email': 'info@networktocode.com',
'url': 'https://github.com/networktocode/ntc-templates',
'install_requires': [
'textfsm',
'terminal',
"name": "ntc_templates",
"package_dir": {"": "lib"},
"packages": find_packages("lib"),
"version": version,
"package_data": {"ntc_templates": ["templates/*"]},
"description": "Package to return structured data from the output of network devices.",
"long_description": long_description,
"long_description_content_type": "text/markdown",
"author": "network.toCode()",
"author_email": "info@networktocode.com",
"url": "https://github.com/networktocode/ntc-templates",
"install_requires": ["textfsm", "terminal"],
"classifiers": [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"Programming Language :: Python :: 3",
],
'classifiers': ['Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'Programming Language :: Python :: 3'],
'zip_safe': False
"zip_safe": False,
}

setup(**config)
4 changes: 2 additions & 2 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
def load_index_data():
"""Load data from index file."""
index_data = []
with open('%s%sindex' % (_get_template_dir(), os.sep)) as indexfs:
with open("{0}{1}index".format(_get_template_dir(), os.sep)) as indexfs:
data = csv.reader(indexfs)
for row in data:
if len(row) > 2 and row[0] != 'Template':
if len(row) > 2 and row[0] != "Template":
index_data.append(row)
return index_data
78 changes: 57 additions & 21 deletions tests/test_index_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,53 +17,89 @@ def check_order(current_os, prior_os, cmd_len, prior_len, os_choices, used_os, c
add_os_check.append(current_os)

if used_os != sorted(used_os):
msg = "OS's are not in alpabetical order, current order: '{}'".format(used_os)
msg = "OS's are not in alpabetical order, current order: '{0}'".format(used_os)
return False, msg
elif add_os_check != sorted(add_os_check):
msg = "OS's are not in alpabetical order, current order: '{}'".format(add_os_check)
msg = "OS's are not in alpabetical order, current order: '{0}'".format(add_os_check)
return False, msg

if current_os not in os_choices:
msg = "'{}' is not one of the valid options '{}'".format(current_os, used_os)
msg = "'{0}' is not one of the valid options '{1}'".format(current_os, used_os)
return False, msg

if not prior_os and prior_len == 0:
# Starting Point
return True, ''
return True, ""
elif current_os == prior_os and cmd_len == prior_len and cmd == min(prior_cmd, cmd):
msg = (
"OS is the same and command same length, "
"please set {} before {} to be in alphabetical order".format(cmd, prior_cmd)
"please set {0} before {1} to be in alphabetical order".format(cmd, prior_cmd)
)
return False, msg
elif current_os == prior_os and cmd_len <= prior_len:
# OS is the same as previous, and cmd_len is smaller or equal to prior so good
return True, ''
return True, ""
elif current_os != prior_os and current_os not in used_os:
# prior OS has changed, do not need to check for length yet
return True, ''
return True, ""
elif current_os == prior_os and cmd_len > prior_len:
msg = "Current Command len '{}' larger then previous '{}', for command '{}'".format(
msg = "Current Command len '{0}' larger then previous '{1}', for command '{2}'".format(
cmd_len, prior_len, cmd
)
return False, msg
elif current_os != prior_os and current_os in used_os:
msg = "'{}' OS was already used in list on command '{}'".format(current_os, cmd)
msg = "'{0}' OS was already used in list on command '{1}'".format(current_os, cmd)
return False, msg
else:
msg = "Failed for unknown reason"
return False, msg


def test_index_ordering():

os_choices = [
'a10', 'alcatel_aos', 'alcatel_sros', 'arista_eos', 'aruba_os', 'avaya_ers', 'avaya_vsp',
'brocade_fastiron', 'brocade_netiron', 'brocade_nos', 'brocade_vdx', 'brocade_vyos',
'checkpoint_gaia', 'ciena_6x', 'cisco_asa', 'cisco_ios', 'cisco_nxos', 'cisco_s300',
'cisco_wlc', 'cisco_xe', 'cisco_xr', 'dell_force10', 'enterasys', 'extreme', 'f5_ltm',
'fortinet_fortios', 'hp_comware', 'hp_procurve', 'huawei_vrp', 'juniper', 'juniper_junos',
'juniper_screenos', 'linux', 'ovs_linux', 'paloalto_panos', 'quanta_mesh','ruckus_fastiron',
'ubiquiti_edgeswitch', 'vmware_nsxv', 'vyatta_vyos', 'vyos', 'watchguard_firebox',
"a10",
"alcatel_aos",
"alcatel_sros",
"arista_eos",
"aruba_os",
"avaya_ers",
"avaya_vsp",
"brocade_fastiron",
"brocade_netiron",
"brocade_nos",
"brocade_vdx",
"brocade_vyos",
"checkpoint_gaia",
"ciena_6x",
"cisco_asa",
"cisco_ios",
"cisco_nxos",
"cisco_s300",
"cisco_wlc",
"cisco_xe",
"cisco_xr",
"dell_force10",
"enterasys",
"extreme",
"f5_ltm",
"fortinet_fortios",
"hp_comware",
"hp_procurve",
"huawei_vrp",
"juniper",
"juniper_junos",
"juniper_screenos",
"linux",
"ovs_linux",
"paloalto_panos",
"quanta_mesh",
"ruckus_fastiron",
"ubiquiti_edgeswitch",
"vmware_nsxv",
"vyatta_vyos",
"vyos",
"watchguard_firebox",
]

prior_os = ""
Expand All @@ -74,16 +110,16 @@ def test_index_ordering():
index = load_index_data()
for row in index:
template = row[0].strip()
os = '_'.join(template.split('_')[:2])
cmd = '_'.join(template.split('_')[2:])
os = "_".join(template.split("_")[:2])
cmd = "_".join(template.split("_")[2:])
cmd_len = len(cmd)
check_val, check_msg = check_order(
os, prior_os, cmd_len, prior_len, os_choices, used_os, cmd, prior_cmd
)
if not check_val:
#assertFalse(check_val, msg=check_msg)
print("Error on line: {}".format(row))
print("Error Message: {}".format(check_msg))
# assertFalse(check_val, msg=check_msg)
print("Error on line: {0}".format(row))
print("Error Message: {0}".format(check_msg))
assert check_val
if os not in used_os:
used_os.append(os)
Expand Down
20 changes: 10 additions & 10 deletions tests/test_structured_data_against_parsed_reference_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,33 @@

def return_test_files():
"""Return a list of all the *.raw files to run tests against."""
platform_dirs = glob.glob('tests/*')
platforms = (glob.glob('%s/*' % platform) for platform in platform_dirs)
platform_dirs = glob.glob("tests/*")
platforms = (glob.glob("{0}/*".format(platform)) for platform in platform_dirs)
template_dirs = (item for sublist in platforms for item in sublist)
test_commands = (glob.glob('%s/*.raw' % template_dir) for template_dir in template_dirs)
test_commands = (glob.glob("{0}/*.raw".format(template_dir)) for template_dir in template_dirs)

return (item for sublist in test_commands for item in sublist)


@pytest.fixture(scope='function', params=return_test_files())
@pytest.fixture(scope="function", params=return_test_files())
def load_template_test(request):
"""Return each *.raw file to run tests on."""
return request.param


def raw_template_test(raw_file):
"""Return structured data along with reference data."""
parsed_file = '%s.parsed' % raw_file[:-4]
parts = raw_file.split('/')
parsed_file = "{0}.parsed".format(raw_file[:-4])
parts = raw_file.split("/")
platform = parts[1]
command = ' '.join(parts[2].split('_'))
with open(raw_file, 'r') as data:
command = " ".join(parts[2].split("_"))
with open(raw_file, "r") as data:
rawoutput = data.read()
structured = parse_output(platform=platform, command=command, data=rawoutput)
with open(parsed_file, 'r') as data:
with open(parsed_file, "r") as data:
parsed_data = yaml.safe_load(data.read())

return structured, parsed_data['parsed_sample']
return structured, parsed_data["parsed_sample"]


def test_raw_data_against_mock(load_template_test):
Expand Down
14 changes: 7 additions & 7 deletions tests/test_testcases_exists.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@


KNOWN_MISSING_TESTS = {
'cisco_ios_show_vlan',
'cisco_nxos_show_interface_brief',
'cisco_nxos_show_ip_ospf_neighbor_vrf',
'cisco_xr_show_controllers',
"cisco_ios_show_vlan",
"cisco_nxos_show_interface_brief",
"cisco_nxos_show_ip_ospf_neighbor_vrf",
"cisco_xr_show_controllers",
}


Expand All @@ -25,7 +25,7 @@ def test_verify_parsed_and_reference_data_exists():
index = sorted(load_index_data())
for row in index:
template = row[0].strip()
template_short = template.split('.template')[0]
template_short = template.split(".template")[0]
platform = row[2].strip()
for directory in os.listdir("tests"):
if re.match(platform, directory):
Expand All @@ -34,6 +34,6 @@ def test_verify_parsed_and_reference_data_exists():
cut = len(platform_directory) + 1
command = template_short[cut:]
if template_short not in KNOWN_MISSING_TESTS:
cases = 'tests/%s/%s/*.raw' % (platform_directory, command)
cases = "tests/{0}/{1}/*.raw".format(platform_directory, command)
test_list = glob.glob(cases)
assert len(test_list) != 0, 'Could not find tests for %s' % template
assert len(test_list) != 0, "Could not find tests for {0}".format(template)
5 changes: 4 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ envlist = py36
deps =
pytest
PyYAML
black

whitelist_externals =
git
rm

commands = pytest -vv
commands =
pytest -vv
black ./ --diff --check

0 comments on commit 42c2cb7

Please sign in to comment.