From edd8fb1b630d313b33eda646a2020550e45b184f Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 22 Mar 2024 14:57:13 -0500 Subject: [PATCH] Remove Tests --- tests/definitions_test.py | 224 --------------------------------- tests/device_types.py | 241 ------------------------------------ tests/generate-slug-list.py | 96 -------------- tests/known-modules.pickle | Bin 31373 -> 0 bytes tests/known-slugs.pickle | Bin 204037 -> 0 bytes tests/pickle_operations.py | 14 --- tests/test_configuration.py | 38 ------ tests/yaml_loader.py | 34 ----- 8 files changed, 647 deletions(-) delete mode 100644 tests/definitions_test.py delete mode 100644 tests/device_types.py delete mode 100644 tests/generate-slug-list.py delete mode 100644 tests/known-modules.pickle delete mode 100644 tests/known-slugs.pickle delete mode 100644 tests/pickle_operations.py delete mode 100644 tests/test_configuration.py delete mode 100644 tests/yaml_loader.py diff --git a/tests/definitions_test.py b/tests/definitions_test.py deleted file mode 100644 index 00144e21f..000000000 --- a/tests/definitions_test.py +++ /dev/null @@ -1,224 +0,0 @@ -from test_configuration import COMPONENT_TYPES, IMAGE_FILETYPES, SCHEMAS, KNOWN_SLUGS, ROOT_DIR, USE_LOCAL_KNOWN_SLUGS, NETBOX_DT_LIBRARY_URL, KNOWN_MODULES, USE_UPSTREAM_DIFF, PRECOMMIT_ALL_SWITCHES -import pickle_operations -from yaml_loader import DecimalSafeLoader -from device_types import DeviceType, ModuleType, verify_filename, validate_components -import decimal -import glob -import json -import os -import tempfile -import psutil -from urllib.request import urlopen - -import pytest -import yaml -from jsonschema import Draft4Validator, RefResolver -from jsonschema.exceptions import ValidationError -from git import Repo - -def _get_definition_files(): - """ - Return a list of all definition files within the specified path. - """ - file_list = [] - - for path, schema in SCHEMAS: - # Initialize the schema - with open(f"schema/{schema}") as schema_file: - schema = json.loads(schema_file.read(), parse_float=decimal.Decimal) - - # Validate that the schema exists - assert schema, f"Schema definition for {path} is empty!" - - # Map each definition file to its schema as a tuple (file, schema) - for file in sorted(glob.glob(f"{path}/*/*", recursive=True)): - file_list.append((file, schema, 'skip')) - - return file_list - -def _get_diff_from_upstream(): - file_list = [] - - repo = Repo(f"{os.path.dirname(os.path.abspath(__file__))}/../") - commits_list = list(repo.iter_commits()) - - if "upstream" not in repo.remotes: - repo.create_remote("upstream", NETBOX_DT_LIBRARY_URL) - - upstream = repo.remotes.upstream - upstream.fetch() - changes = upstream.refs.master.commit.diff(repo.head) - changes = changes + repo.index.diff("HEAD") - - for path, schema in SCHEMAS: - # Initialize the schema - with open(f"schema/{schema}") as schema_file: - schema = json.loads(schema_file.read(), parse_float=decimal.Decimal) - - # Validate that the schema exists - assert schema, f"Schema definition for {path} is empty!" - - # Ensure files are either added, renamed, modified or type changed (do not get deleted files) - CHANGE_TYPE_LIST = ['A', 'R', 'M', 'T'] - - # Iterate through changed files - for file in changes: - # Ensure the files are modified or added, this will disclude deleted files - if file.change_type in CHANGE_TYPE_LIST: - # If the file is renamed, ensure we are picking the right schema - if 'R' in file.change_type and path in file.rename_to: - file_list.append((file.rename_to, schema, file.change_type)) - elif path in file.a_path: - file_list.append((file.a_path, schema, file.change_type)) - elif path in file.b_path: - file_list.append((file.b_path, schema, file.change_type)) - - return file_list - -def _get_image_files(): - """ - Return a list of all image files within the specified path and manufacturer. - """ - file_list = [] - - # Map each image file to its manufacturer - for file in sorted(glob.glob(f"elevation-images{os.path.sep}*{os.path.sep}*", recursive=True)): - # Validate that the file extension is valid - assert file.split(os.path.sep)[2].split('.')[-1] in IMAGE_FILETYPES, f"Invalid file extension: {file}" - - # Map each image file to its manufacturer as a tuple (manufacturer, file) - file_list.append((file.split(os.path.sep)[1], file)) - - return file_list - -def _decimal_file_handler(uri): - """ - Handler to work with floating decimals that fail normal validation. - """ - with urlopen(uri) as url: - result = json.loads(url.read().decode("utf-8"), parse_float=decimal.Decimal) - return result - -def test_environment(): - """ - Run basic sanity checks on the environment to ensure tests are running correctly. - """ - # Validate that definition files exist - if definition_files: - pytest.skip("No changes to definition files found.") - -EVALUATE_ALL = False -if any(x in PRECOMMIT_ALL_SWITCHES for x in psutil.Process(os.getppid()).cmdline()): - EVALUATE_ALL = True - -if USE_UPSTREAM_DIFF and not EVALUATE_ALL: - definition_files = _get_diff_from_upstream() -else: - definition_files = _get_definition_files() -image_files = _get_image_files() - -if USE_LOCAL_KNOWN_SLUGS: - KNOWN_SLUGS = pickle_operations.read_pickle_data(f'{ROOT_DIR}/tests/known-slugs.pickle') - KNOWN_MODULES = pickle_operations.read_pickle_data(f'{ROOT_DIR}/tests/known-modules.pickle') -else: - temp_dir = tempfile.TemporaryDirectory() - repo = Repo.clone_from(url=NETBOX_DT_LIBRARY_URL, to_path=temp_dir.name) - KNOWN_SLUGS = pickle_operations.read_pickle_data(f'{temp_dir.name}/tests/known-slugs.pickle') - KNOWN_MODULES = pickle_operations.read_pickle_data(f'{temp_dir.name}/tests/known-modules.pickle') - - -@pytest.mark.parametrize(('file_path', 'schema', 'change_type'), definition_files) -def test_definitions(file_path, schema, change_type): - """ - Validate each definition file using the provided JSON schema and check for duplicate entries. - """ - # Check file extension. Only .yml or .yaml files are supported. - assert file_path.split('.')[-1] in ('yaml', 'yml'), f"Invalid file extension: {file_path}" - - # Read file - with open(file_path) as definition_file: - content = definition_file.read() - - # Check for trailing newline. YAML files must end with an emtpy newline. - assert content.endswith('\n'), "Missing trailing newline" - - # Load YAML data from file - definition = yaml.load(content, Loader=DecimalSafeLoader) - - # Validate YAML definition against the supplied schema - try: - resolver = RefResolver( - f"file://{os.getcwd()}/schema/devicetype.json", - schema, - handlers={"file": _decimal_file_handler}, - ) - # Validate definition against schema - Draft4Validator(schema, resolver=resolver).validate(definition) - except ValidationError as e: - # Schema validation failure. Ensure you are following the proper format. - pytest.fail(f"{file_path} failed validation: {e}", False) - - # Identify if the definition is for a Device or Module - if "device-types" in file_path: - # A device - this_device = DeviceType(definition, file_path, change_type) - else: - # A module - this_device = ModuleType(definition, file_path, change_type) - - # Verify the slug is valid, only if the definition type is a Device - if this_device.isDevice: - assert this_device.verify_slug(KNOWN_SLUGS), pytest.fail(this_device.failureMessage, False) - - # Verify the filename is valid. Must either be the model or part_number. - assert verify_filename(this_device, (KNOWN_MODULES if not this_device.isDevice else None)), pytest.fail(this_device.failureMessage, False) - - # Check for duplicate components within the definition - assert validate_components(COMPONENT_TYPES, this_device), pytest.fail(this_device.failureMessage, False) - - # Check for empty quotes and fail if found - def iterdict(var): - for dict_value in var.values(): - if isinstance(dict_value, dict): - iterdict(dict_value) - if isinstance(dict_value, list): - iterlist(dict_value) - else: - if(isinstance(dict_value, str) and not dict_value): - pytest.fail(f'{file_path} has empty quotes', False) - - def iterlist(var): - for list_value in var: - if isinstance(list_value, dict): - iterdict(list_value) - elif isinstance(list_value, list): - iterlist(list_value) - - # Check for valid power definitions - if this_device.isDevice: - assert this_device.validate_power(), pytest.fail(this_device.failureMessage, False) - - # Check for images if front_image or rear_image is True - if (definition.get('front_image') or definition.get('rear_image')): - # Find images for given manufacturer, with matching device slug (exact match including case) - manufacturer_images = [image[1] for image in image_files if image[0] == file_path.split('/')[1] and os.path.basename(image[1]).split('.')[0] == this_device.get_slug()] - if not manufacturer_images: - pytest.fail(f'{file_path} has Front or Rear Image set to True but no images found for manufacturer/device (slug={this_device.get_slug()})', False) - elif len(manufacturer_images)>2: - pytest.fail(f'More than 2 images found for device with slug {this_device.get_slug()}: {manufacturer_images}', False) - - # If front_image is True, verify that a front image exists - if(definition.get('front_image')): - front_image = [image_path.split('/')[2] for image_path in manufacturer_images if os.path.basename(image_path).split('.')[1] == 'front'] - - if not front_image: - pytest.fail(f'{file_path} has front_image set to True but no matching image found for device ({manufacturer_images})', False) - - # If rear_image is True, verify that a front image exists - if(definition.get('rear_image')): - rear_image = [image_path.split('/')[2] for image_path in manufacturer_images if os.path.basename(image_path).split('.')[1] == 'rear'] - - if not rear_image: - pytest.fail(f'{file_path} has rear_image set to True but no images found for device', False) - - iterdict(definition) diff --git a/tests/device_types.py b/tests/device_types.py deleted file mode 100644 index 5ae9f62a4..000000000 --- a/tests/device_types.py +++ /dev/null @@ -1,241 +0,0 @@ -import os - -class DeviceType: - def __new__(cls, *args, **kwargs): - return super().__new__(cls) - - def __init__(self, definition, file_path, change_type): - self.file_path = file_path - self.isDevice = True - self.definition = definition - self.manufacturer = definition.get('manufacturer') - self._slug_manufacturer = self._slugify_manufacturer() - self.slug = definition.get('slug') - self.model = definition.get('model') - self._slug_model = self._slugify_model() - self.part_number = definition.get('part_number', "") - self._slug_part_number = self._slugify_part_number() - self.failureMessage = None - self.change_type = change_type - - def _slugify_manufacturer(self): - return self.manufacturer.casefold().replace(" ", "-").replace("sfp+", "sfpp").replace("poe+", "poep").replace("-+", "-plus-").replace("+", "-plus").replace("_", "-").replace("!", "").replace("/", "-").replace(",", "").replace("'", "").replace("*", "-").replace("&", "and") - - def get_slug(self): - if hasattr(self, "slug"): - return self.slug - return None - - def _slugify_model(self): - slugified = self.model.casefold().replace(" ", "-").replace("sfp+", "sfpp").replace("poe+", "poep").replace("-+", "-plus").replace("+", "-plus-").replace("_", "-").replace("&", "-and-").replace("!", "").replace("/", "-").replace(",", "").replace("'", "").replace("*", "-") - if slugified.endswith("-"): - slugified = slugified[:-1] - return slugified - - def _slugify_part_number(self): - slugified = self.part_number.casefold().replace(" ", "-").replace("-+", "-plus").replace("+", "-plus-").replace("_", "-").replace("&", "-and-").replace("!", "").replace("/", "-").replace(",", "").replace("'", "").replace("*", "-") - if slugified.endswith("-"): - slugified = slugified[:-1] - return slugified - - def get_filepath(self): - return self.file_path - - def verify_slug(self, KNOWN_SLUGS): - # Verify the slug is unique, and not already known - known_slug_list_intersect = [(slug, file_path) for slug, file_path in KNOWN_SLUGS if slug == self.slug] - - if len(known_slug_list_intersect) == 0: - pass - elif len(known_slug_list_intersect) == 1: - if self.file_path not in known_slug_list_intersect[0][1]: - if 'R' not in self.change_type: - self.failureMessage = f'{self.file_path} has a duplicate slug: "{self.slug}"' - return False - return True - else: - self.failureMessage = f'{self.file_path} has a duplicate slug "{self.slug}"' - return False - - # Verify the manufacturer is appended to the slug - if not self.slug.startswith(self._slug_manufacturer): - self.failureMessage = f'{self.file_path} contains slug "{self.slug}". Does not start with manufacturer: "{self.manufacturer.casefold()}-"' - return False - - # Verify the slug ends with either the model or part number - if not (self.slug.endswith(self._slug_model) or self.slug.endswith(self._slug_part_number)): - self.failureMessage = f'{self.file_path} has slug "{self.slug}". Does not end with the model "{self._slug_model}" or part_number "{self._slug_part_number}"' - return False - - # Add the slug to the list of known slugs - KNOWN_SLUGS.add((self.slug, self.file_path)) - return True - - def validate_power(self): - # Check if power-ports exists - if self.definition.get('power-ports', False): - # Verify that is_powered is not set to False. If so, there should not be any power-ports defined - if not self.definition.get('is_powered', True): - self.failureMessage = f'{self.file_path} has is_powered set to False, but "power-ports" are defined.' - return False - return True - - # Lastly, check if interfaces exists and has a poe_mode defined - interfaces = self.definition.get('interfaces', False) - if interfaces: - for interface in interfaces: - poe_mode = interface.get('poe_mode', "") - if poe_mode != "" and poe_mode == "pd": - return True - - console_ports = self.definition.get('console-ports', False) - if console_ports: - for console_port in console_ports: - poe = console_port.get('poe', False) - if poe: - return True - - rear_ports = self.definition.get('rear-ports', False) - if rear_ports: - for rear_port in rear_ports: - poe = rear_port.get('poe', False) - if poe: - return True - - # Check if the device is a child device, and if so, assume it has a valid power source from the parent - subdevice_role = self.definition.get('subdevice_role', False) - if subdevice_role: - if subdevice_role == "child": - return True - - # Check if module-bays exists - if self.definition.get('module-bays', False): - # There is not a standardized way to define PSUs that are module bays, so we will just assume they are valid - return True - - # As the very last case, check if is_powered is defined and is False. Otherwise assume the device is powered - if not self.definition.get('is_powered', True): # is_powered defaults to True - # Arriving here means is_powered is set to False, so verify that there are no power-outlets defined - if self.definition.get('power-outlets', False): - self.failureMessage = f'{self.file_path} has is_powered set to False, but "power-outlets" are defined.' - return False - return True - - self.failureMessage = f'{self.file_path} has does not appear to have a valid power source. Ensure either "power-ports" or "interfaces" with "poe_mode" is defined.' - return False - -class ModuleType: - def __new__(cls, *args, **kwargs): - return super().__new__(cls) - - def __init__(self, definition, file_path, change_type): - self.file_path = file_path - self.isDevice = False - self.definition = definition - self.manufacturer = definition.get('manufacturer') - self.model = definition.get('model') - self._slug_model = self._slugify_model() - self.part_number = definition.get('part_number', "") - self._slug_part_number = self._slugify_part_number() - self.change_type = change_type - - def get_filepath(self): - return self.file_path - - def _slugify_model(self): - slugified = self.model.casefold().replace(" ", "-").replace("sfp+", "sfpp").replace("poe+", "poep").replace("-+", "-plus").replace("+", "-plus-").replace("_", "-").replace("&", "-and-").replace("!", "").replace("/", "-").replace(",", "").replace("'", "").replace("*", "-") - if slugified.endswith("-"): - slugified = slugified[:-1] - return slugified - - def _slugify_part_number(self): - slugified = self.part_number.casefold().replace(" ", "-").replace("-+", "-plus").replace("+", "-plus-").replace("_", "-").replace("&", "-and-").replace("!", "").replace("/", "-").replace(",", "").replace("'", "").replace("*", "-") - if slugified.endswith("-"): - slugified = slugified[:-1] - return slugified - -def validate_component_names(component_names: (set or None)): - if len(component_names) > 1: - verify_name = list(component_names[0]) - for index, name in enumerate(component_names): - if index == 0: - continue - - intersection = sorted(set(verify_name) & set(list(name)), key = verify_name.index) - - intersection_len = len(intersection) - verify_subset = verify_name[:intersection_len] - name_subset = list(name)[:intersection_len] - subset_match = sorted(set(verify_subset) & set(name_subset), key = name_subset.index) - - if len(intersection) > 2 and len(subset_match) == len(intersection): - return False - return True - -def verify_filename(device: (DeviceType or ModuleType), KNOWN_MODULES: (set or None)): - head, tail = os.path.split(device.get_filepath()) - filename = tail.rsplit(".", 1)[0].casefold() - - if not (filename == device._slug_model or filename == device._slug_part_number or filename == device.part_number.casefold()): - device.failureMessage = f'{device.file_path} file name is invalid. Must be either the model "{device._slug_model}" or part_number "{device.part_number} / {device._slug_part_number}"' - return False - - if not device.isDevice: - matches = [file_name for file_name, file_path in KNOWN_MODULES if file_name.casefold() == filename.casefold()] - if len(matches) > 1: - device.failureMessage = f'{device.file_path} appears to be duplicated. Found {len(matches)} matches: {", ".join(matches)}' - return False - - return True - -def validate_components(component_types, device_or_module): - for component_type in component_types: - known_names = set() - known_components = [] - defined_components = device_or_module.definition.get(component_type, []) - if not isinstance(defined_components, list): - device_or_module.failureMessage = f'{device_or_module.file_path} has an invalid definition for {component_type}.' - return False - for idx, component in enumerate(defined_components): - if not isinstance(component, dict): - device_or_module.failureMessage = f'{device_or_module.file_path} has an invalid definition for {component_type} ({idx}).' - return False - name = component.get('name') - position = component.get('position') - eval_component = (name, position) - if not isinstance(name, str): - device_or_module.failureMessage = f'{device_or_module.file_path} has an invalid definition for {component_type} name ({idx}).' - return False - if eval_component[0] in known_names: - device_or_module.failureMessage = f'{device_or_module.file_path} has duplicated names within {component_type} ({name}).' - return False - known_components.append(eval_component) - known_names.add(name) - - # Adding check for duplicate positions within a component type - # Stems from https://github.com/netbox-community/devicetype-library/pull/1586 - # and from https://github.com/netbox-community/devicetype-library/issues/1584 - position_set = {} - index = 0 - for name, position in known_components: - if position is not None: - match = [] - if len(position_set) > 0: - match = [key for key,val in position_set.items() if key == position] - if len(match) == 0: - if len(position_set) == 0: - position_set = {position: {known_components[index]}} - else: - position_set.update({position: {known_components[index]}}) - else: - position_set[position].add(known_components[index]) - index = index + 1 - - for position in position_set: - if len(position_set[position]) > 1: - component_names = [name for name,pos in position_set[position]] - if not validate_component_names(component_names): - device_or_module.failureMessage = f'{device_or_module.file_path} has duplicated positions within {component_type} ({position}).' - return False - - return True diff --git a/tests/generate-slug-list.py b/tests/generate-slug-list.py deleted file mode 100644 index cb901c559..000000000 --- a/tests/generate-slug-list.py +++ /dev/null @@ -1,96 +0,0 @@ -import os -import json -import glob -import yaml -import decimal -from yaml_loader import DecimalSafeLoader -from jsonschema import Draft4Validator, RefResolver -from jsonschema.exceptions import ValidationError -from test_configuration import SCHEMAS, KNOWN_SLUGS, ROOT_DIR, KNOWN_MODULES -from urllib.request import urlopen -import pickle_operations - -def _get_type_files(device_or_module): - """ - Return a list of all definition files within the specified path. - """ - file_list = [] - - for path, schema in SCHEMAS: - if path == f'{device_or_module}-types': - # Initialize the schema - with open(f"{ROOT_DIR}/schema/{schema}") as schema_file: - schema = json.loads(schema_file.read(), - parse_float=decimal.Decimal) - - # Validate that the schema exists - if not schema: - print(f"Schema definition for {path} is empty!") - exit(1) - - # Map each definition file to its schema as a tuple (file, schema) - for file in sorted(glob.glob(f"{path}/*/*", recursive=True)): - file_list.append((f'{file}', schema)) - - return file_list - -def _decimal_file_handler(uri): - """ - Handler to work with floating decimals that fail normal validation. - """ - with urlopen(uri) as url: - result = json.loads(url.read().decode("utf-8"), parse_float=decimal.Decimal) - return result - -def load_file(file_path, schema): - # Read file - try: - with open(file_path) as definition_file: - content = definition_file.read() - except Exception as exc: - return (False, f'Error opening "{file_path}". stderr: {exc}') - - # Check for trailing newline. YAML files must end with an emtpy newline. - if not content.endswith('\n'): - return (False, f'{file_path} is missing trailing newline') - - # Load YAML data from file - try: - definition = yaml.load(content, Loader=DecimalSafeLoader) - except Exception as exc: - return (False, f'Error during yaml.load "{file_path}". stderr: {exc}') - - # Validate YAML definition against the supplied schema - try: - resolver = RefResolver( - f"file://{os.getcwd()}/schema/devicetype.json", - schema, - handlers={"file": _decimal_file_handler}, - ) - # Validate definition against schema - Draft4Validator(schema, resolver=resolver).validate(definition) - except ValidationError as exc: - # Schema validation failure. Ensure you are following the proper format. - return (False, f'{file_path} failed validation: {exc}') - - return (True, definition) - -def _generate_knowns(device_or_module): - all_files = _get_type_files(device_or_module) - - for file_path, schema in all_files: - definition_status, definition = load_file(file_path, schema) - if not definition_status: - print(definition) - exit(1) - - if device_or_module == 'device': - KNOWN_SLUGS.add((definition.get('slug'), file_path)) - else: - KNOWN_MODULES.add((os.path.splitext(os.path.basename(file_path))[0], os.path.dirname(file_path))) - -_generate_knowns('device') -pickle_operations.write_pickle_data(KNOWN_SLUGS, f'{ROOT_DIR}/tests/known-slugs.pickle') - -_generate_knowns('module') -pickle_operations.write_pickle_data(KNOWN_MODULES, f'{ROOT_DIR}/tests/known-modules.pickle') \ No newline at end of file diff --git a/tests/known-modules.pickle b/tests/known-modules.pickle deleted file mode 100644 index 9126a10cf5cfa46e82c1163299c0435ba4ba5e6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31373 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 diff --git a/tests/known-slugs.pickle b/tests/known-slugs.pickle deleted file mode 100644 index fc710e9a23ce9312b8cdffa3723bf7d18ee82c6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204037 zcmb5XS#u*vk|x+AvQJ%=8E0nYRb5d>=k#=~HQ8sANZW3~D)A1@2NwmQM}LbF5HTj_s%7|f=h z{^zHU&t{X^&2pfw$E)`@i?>U4URi(o_^;yTmKJ$&YDEeV@%O(NOsA9aNUg@x@p7_M z%lDJj@alXz7>(7smK3X>KBnTw>RSFq&&U_LT7Hk^{VzYdxLK?wcrJBuscOaXr;mRY zKXhO(7Y+__x#{nFdNm)b!Q%FOpwiv6sLHj=Papp#Zar!@3-wUq(BJ*!Zj8Trrv}4i ztyr#&2E$Ju|0-^Ntpy78MwbNk>kWVJv(b1uRr8zoUhH(%ULCxh#i8cj>JqW%qh|9=)p3%xLc|gi^Gw+gaXOivZuR0sfHG6?5o4Rf8wvAV>4Ut6pL6m z`5V!}Y4u6S|Hc=;;#1D?mJ8Yi z*xmmjeu9^rWLuDh*6DUs`(?1f!vnli!LKDLG-CWF!PbP(A%wcB>!0fB^5%Lnd=Is% zuA!GJc+FS?bxGn4Bnqe90SWkuk zmmbZas0P5xMsW@0q)Ol=(%*!|EdcA+F z_WU1w%=9P`_R-D=7}C+);2Z=xX5~hh1Ft zcRi<5dNo%iY)^W*yHt%~F@6-QL8tSm9m+J>Tzr2sA7AS~d^1bavGcp?}!bm;HVAR178yHC$oy)YRME{8Lds?x;pji~O|9_j`+UeLhx| z!B8c*UoMq5OQ+CPd*i`ORq74M`5*blyzm5SJ;6V!Hiz#r9lRgJzhvJ17%JV!wc)y) z)Zf(oFMVx(={kj}OH1%v-q9w4n#l91PE*)AlIp#p{S&B)$k;7*QY@%c6_KgyK*T@A zWA=*iHL#Q8PtR^KK1W*SzZ`7a<;~R%^sDrzdE0hh9=&As`p<(o4*Yzlmck?YL7bL) zyHTjO>56~8tTLXz+iC)hGH$;LOyF~~(%KKMLFuIB75#)f^5%PKH`vJZf?xQ4u$U}Y z1E{K{+9_6w%XJBQ?ZdD(R2T7)uWQl5exs{JyL}SZ$^AKP`PB(r*6~m+)g0>{?`ig*yokU5E8%M-=}IN% z7a6xncpOREQ_0=|o6v8=FP_$l?-m1!qL%c%WtcOt2Ce9 zUg85u7a4I3$rkct{VzUozqq^_PcKw@1qCM8)cuSX@b|u0+zj8orx<&1ySkYTR+F1+ zmF(0?>U_3LibLphi8XYr{ENDmFKGF_RyQd&Shw4C8UimUPI3HKs+>VV%sMqltwDFDodwq9xJ9s}v99n^eL$V83%m3ORH-)0~)$q{@@&`A>qpA&I|C`^0r%UV8RPChivb#Av zT#)PbN$yp!o2?Zk-A=*%B`x-lK#n{sO4^;I4r#p`0m|`Y2oMGb9C5$`{!NkM47rOM zBv5ETprZvi(D;rmumP*E?l6=W>gM{>N4eT;hz(4|l73~r4p#>1WJsU}DINJf;krPo zL6}CMalX_x7O@)a>`q#W{W5K55uw4>;;M_atf?KsB_pipVvbF_2`*|_p@TNIZLpAk z%{x++Vs%$dp^J*+#cT;Iu_Cri-l@{JoX{=JPOHoC;ve!i<4(LjWFE4x$c}r}r{{Q1 zf)ppib(K7ZD#8cpH0>FQ!f~Uotcd?eRj+i0I4x>)b9+7oTmt}6T};k_8q5a(E%EQ` z@l;(6pqEDD`ReM^$0PCLPBV2IpYtpJDIN{xbNpHT@6}xi>-tCW^L4shs3+wrs|Ndx zt?~zy2?u5kuOlzEwFaPEJA~`fXP4tk#yMc5;BCsdi!C!<^-uc*5$W{^mJrbHrCQ>I z#7C@00i-*J#A;0J@^%uh}EPEL7N$-4%ZGjM$`D2i}I}ZVk152@Q0Be z{VTn0UVVMp|IL5NJDAB%rK-l)=PMwBMX`7C&ZL%Z zp6>NRaIm7zCzon6R~6W?yZC7iDuun{Lv`FXm;KZHIqzw#ngGVQnBjp+_dbwS5i-#%#?a=m9YEWZ8U+aigOCin+Z0PglhwGc^&E*HRSf=GPvBpkjLAq9^ z(CLy4Bi;Wsf71X-8!zUF55}af;ZeuSF1AinNMmRE<$HwV00;uf4AStoh@<2YY&Tvs z&1HmB9ISsi8pE%+fii-j%O2c)eYLRPgp~^p?q7Jv)quzXGx?C>G!BMu)#^rFEN-q> zF_^@g(BAQL+E9D;jsv>GzslDUh%s1{$sdUId0j#n^$tm~xBkfZO9qBW6nrgtD$K_= zKt!V0&-!EDKGgesTC3peNZ)4Tp*X2kf{*jthc(pxUcA@aHcvGlv^!ep^zh(KxNDyV@ESHXb{W2n^cw?Q%}Dh86a0(M&kPsK zQd)ymf)9ZB3$B}5Aa;{F!Y61Novx9FGtkwJp6YNkCr$Qjn!vq+{RH$Pvoy46yvc5z zkQfXkn=bo}kru#61tsBAmf{9wH=3u||d-TSKA;AxZ+7CgJ#gUB7Z)WwuU=h@=6{PHwTB^2@pp)9RB@ zyVGnPpYbYg2+WNdd01c$SrM2&4;Lm)u`tycwu^kRaAndID^qRphIx^PGcTuWwF`5M z&G#V=pz=`W?n&Rt|Lm8{2C1|0V(@kX$hra_R+>n2q+3Ry)v3UZbt!1041Dl~J)HUA z=58N+VdL@#4-@Ig28 zd%JB0Y~38~c_!#|n+&MB5oxnB^tgVFG)GY@pS(41>{@}qT;>{d7fKhat4p{z_ZxH< zOBbuXLw0%oU_+uIfp2MXw8H5JR*9HMDi9kJH3)c1i~Bu@0kUM!?K@U)L%`J~q+C

x^}5g}WzTOD<@U*1ouNB%3> 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 z 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 diff --git a/tests/pickle_operations.py b/tests/pickle_operations.py deleted file mode 100644 index 193dd4da5..000000000 --- a/tests/pickle_operations.py +++ /dev/null @@ -1,14 +0,0 @@ -import pickle - -def write_pickle_data(data, file_path): - with open(file_path, 'wb') as pickle_file: - pickle.dump(data, pickle_file) - pickle_file.close() - - -def read_pickle_data(file_path): - with open(file_path, 'rb') as pickle_file: - data = pickle.load(pickle_file) - pickle_file.close() - - return data diff --git a/tests/test_configuration.py b/tests/test_configuration.py deleted file mode 100644 index 2082033b7..000000000 --- a/tests/test_configuration.py +++ /dev/null @@ -1,38 +0,0 @@ -import os - -SCHEMAS = ( - ('device-types', 'devicetype.json'), - ('module-types', 'moduletype.json'), -) - -IMAGE_FILETYPES = ( - 'bmp', 'gif', 'pjp', 'jpg', 'pjpeg', 'jpeg', 'jfif', 'png', 'tif', 'tiff', 'webp' -) - -COMPONENT_TYPES = ( - 'console-ports', - 'console-server-ports', - 'power-ports', - 'power-outlets', - 'interfaces', - 'front-ports', - 'rear-ports', - 'device-bays', - 'module-bays', -) - -PRECOMMIT_ALL_SWITCHES = [ - '-a', - '--all-files', - '--all' -] - -ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..')) - -KNOWN_SLUGS = set() -KNOWN_MODULES = set() - -USE_LOCAL_KNOWN_SLUGS = False -USE_UPSTREAM_DIFF = True - -NETBOX_DT_LIBRARY_URL = "https://github.com/netbox-community/devicetype-library.git" \ No newline at end of file diff --git a/tests/yaml_loader.py b/tests/yaml_loader.py deleted file mode 100644 index dac9d522d..000000000 --- a/tests/yaml_loader.py +++ /dev/null @@ -1,34 +0,0 @@ -import decimal - -from yaml.composer import Composer -from yaml.constructor import SafeConstructor -from yaml.parser import Parser -from yaml.reader import Reader -from yaml.resolver import Resolver -from yaml.scanner import Scanner - - -class DecimalSafeConstructor(SafeConstructor): - """Special constructor to override construct_yaml_float() in order to cast "Decimal" types to the value""" - - def construct_yaml_float(self, node): - value = super().construct_yaml_float(node) - # We force the string representation of the float here to avoid things like: - # In [11]: decimal.Decimal(10.11) - # Out[11]: Decimal('10.1099999999999994315658113919198513031005859375') - return decimal.Decimal(f"{value}") - - -DecimalSafeConstructor.add_constructor( - "tag:yaml.org,2002:float", DecimalSafeConstructor.construct_yaml_float -) - - -class DecimalSafeLoader(Reader, Scanner, Parser, Composer, DecimalSafeConstructor, Resolver): - def __init__(self, stream): - Reader.__init__(self, stream) - Scanner.__init__(self) - Parser.__init__(self) - Composer.__init__(self) - DecimalSafeConstructor.__init__(self) - Resolver.__init__(self)