From c40cddd2e2f369b2360a1388ae1bce93e322b43a Mon Sep 17 00:00:00 2001 From: khushi shukla <149226589+khushishukla2813@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:58:49 +0530 Subject: [PATCH 1/4] feat: fix Apache AGE population concurrency and gap analysis AttributeError --- .github/workflows/test.yml | 25 +- .venv/Scripts/python.exe | Bin 0 -> 270104 bytes .venv/Scripts/pythonw.exe | Bin 0 -> 258840 bytes .venv/pyvenv.cfg | 5 + Makefile | 13 +- application/cmd/cre_main.py | 1448 +++--- application/config.py | 5 + application/database/db.py | 366 +- .../frontend/www/bundle.js.LICENSE.txt | 66 - application/tests/cre_main_test.py | 6 +- application/tests/db_test.py | 4578 ++++++++--------- application/tests/web_main_test.py | 9 +- .../external_project_parsers/base_parser.py | 6 +- application/utils/gap_analysis.py | 101 +- application/utils/redis.py | 17 +- application/web/web_main.py | 8 +- application/worker.py | 12 +- cre.py | 3 +- scripts/benchmark_gap.py | 278 +- 19 files changed, 3586 insertions(+), 3360 deletions(-) create mode 100644 .venv/Scripts/python.exe create mode 100644 .venv/Scripts/pythonw.exe create mode 100644 .venv/pyvenv.cfg delete mode 100644 application/frontend/www/bundle.js.LICENSE.txt diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 59c65dc47..febb49b03 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,5 +24,26 @@ jobs: pip install --upgrade pip pip install --upgrade setuptools make install-python - - name: Test - run: make test + - name: Start services + run: | + make start-containers + make docker-age + + - name: Test (Neo4j Backend) + env: + GRAPH_DB_TYPE: neo4j + run: | + make test + + - name: Test (Apache AGE Backend) + env: + GRAPH_DB_TYPE: age + run: | + make test + + - name: Stop services + if: always() + run: | + make docker-neo4j-rm + make docker-redis-rm + make docker-age-rm diff --git a/.venv/Scripts/python.exe b/.venv/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..b58faef9ef3369842bcb32282c278c9560b72f93 GIT binary patch literal 270104 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

)|Qst;coUX48T>p!$-L)9eJ_e|MK)b9ut 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

)|Qst;coUX48T>p!$-L)9eJ_e|MK)b9ut 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/dev/null || docker run -d --name cre-neo4j --env NEO4J_PLUGINS='["apoc"]' --env NEO4J_AUTH=neo4j/password --volume=`pwd`/.neo4j/data:/data --volume=`pwd`/.neo4j/logs:/logs --workdir=/var/lib/neo4j -p 7474:7474 -p 7687:7687 neo4j +docker-age-rm: + docker stop cre-age + docker rm -f cre-age + +docker-age: + docker start cre-age 2>/dev/null || docker run -d --name cre-age -p 5433:5432 -e POSTGRES_PASSWORD=password apache/age:latest + docker-redis-rm: docker stop cre-redis-stack docker rm -f cre-redis-stack @@ -123,9 +130,11 @@ import-projects: import-all: $(shell bash ./scripts/import-all.sh) -import-neo4j: +import-graph: [ -d "./venv" ] && . ./venv/bin/activate &&\ - export FLASK_APP="$(CURDIR)/cre.py" && python cre.py --populate_neo4j_db + export FLASK_APP="$(CURDIR)/cre.py" && python cre.py --populate_graph_db + +import-neo4j: import-graph preload-map-analysis: $(shell RUN_COUNT=5 bash ./scripts/preload_gap_analysis.sh) diff --git a/application/cmd/cre_main.py b/application/cmd/cre_main.py index ead5a4281..8f0e85446 100644 --- a/application/cmd/cre_main.py +++ b/application/cmd/cre_main.py @@ -1,722 +1,726 @@ -import time -import argparse -import json -import logging -import os -import shutil -import yaml -import tempfile -import requests - -from typing import Any, Callable, Dict, Generator, List, Optional, Tuple -from rq import Queue, job, exceptions -from dacite import from_dict -from dacite.config import Config - -from application.utils.external_project_parsers.base_parser import BaseParser -from application import create_app # type: ignore -from application.config import CMDConfig -from application.database import db -from application.defs import cre_defs as defs -from application.defs import osib_defs as odefs -from application.utils import spreadsheet as sheet_utils -from application.utils import redis -from application.utils import spreadsheet_parsers -from alive_progress import alive_bar -from application.prompt_client import prompt_client as prompt_client -from application.utils import gap_analysis - -logging.basicConfig() -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - -app = None - - -def register_node(node: defs.Node, collection: db.Node_collection) -> db.Node: - """ - for each link find if either the root node or the link have a CRE, - then map the one who doesn't to the CRE - if both don't map to anything, just add them in the db as unlinked nodes - """ - if not node or not issubclass(node.__class__, defs.Node): - raise ValueError(f"node is None or not of type Node, node: {node}") - - linked_node = collection.add_node(node) - if node.embeddings: - collection.add_embedding( - linked_node, - doctype=node.doctype, - embeddings=node.embeddings, - embedding_text=node.embeddings_text, - ) - cre_less_nodes: List[defs.Node] = [] - - # we need to know the cres added in case we encounter a higher level CRE, - # in which case we get the higher level CRE to link to these cres - cres_added = [] - - for link in node.links: - if type(link.document).__name__ in [ - defs.Standard.__name__, - defs.Code.__name__, - defs.Tool.__name__, - ]: - # if a node links another node it is likely that a writer wants to reference something - # in that case, find which of the two nodes has at least one CRE attached to it and link both to the parent CRE - cres = collection.find_cres_of_node(link.document) - db_link = collection.add_node(link.document) - if cres: - for cre in cres: - collection.add_link(cre=cre, node=linked_node, ltype=link.ltype) - for unlinked_standard in cre_less_nodes: # if anything in this - collection.add_link( - cre=cre, - node=db.dbNodeFromNode(unlinked_standard), - ltype=link.ltype, - ) - else: - cres = collection.find_cres_of_node(linked_node) - if cres: - for cre in cres: - collection.add_link(cre=cre, node=db_link, ltype=link.ltype) - for unlinked_node in cre_less_nodes: - collection.add_link( - cre=cre, - node=db.dbNodeFromNode(unlinked_node), - ltype=link.ltype, - ) - else: # if neither the root nor a linked node has a CRE, add both as unlinked nodes - cre_less_nodes.append(link.document) - - if link.document.links and len(link.document.links) > 0: - register_node(node=link.document, collection=collection) - - elif type(link.document).__name__ == defs.CRE.__name__: - # dbcre,_ = register_cre(link.document, collection) # CREs are idempotent - c = collection.get_CREs(name=link.document.name)[0] - dbcre = db.dbCREfromCRE(c) - collection.add_link(dbcre, linked_node, ltype=link.ltype) - cres_added.append(dbcre) - for unlinked_standard in cre_less_nodes: # if anything in this - collection.add_link( - cre=dbcre, - node=db.dbNodeFromNode(unlinked_standard), - ltype=link.ltype, - ) - cre_less_nodes = [] - - return linked_node - - -def register_cre(cre: defs.CRE, collection: db.Node_collection) -> Tuple[db.CRE, bool]: - collection = collection.with_graph() - existing = False - if collection.get_CREs(name=cre.id): - existing = True - - dbcre: db.CRE = collection.add_cre(cre) - for link in cre.links: - if type(link.document) == defs.CRE: - other_cre, _ = register_cre(link.document, collection) - - # the following flips the PartOf relationship so that we only have contains relationship in the database - if link.ltype == defs.LinkTypes.Contains: - collection.add_internal_link( - higher=dbcre, - lower=other_cre, - ltype=defs.LinkTypes.Contains, - ) - elif link.ltype == defs.LinkTypes.PartOf: - collection.add_internal_link( - higher=other_cre, - lower=dbcre, - ltype=defs.LinkTypes.Contains, - ) - elif link.ltype == defs.LinkTypes.Related: - collection.add_internal_link( - higher=other_cre, - lower=dbcre, - ltype=defs.LinkTypes.Related, - ) - else: - raise ValueError(f"Unknown link type {link.ltype}") - else: - collection.add_link( - cre=dbcre, - node=register_node(node=link.document, collection=collection), - ltype=link.ltype, - ) - return dbcre, existing - - -def parse_file( - filename: str, yamldocs: List[Dict[str, Any]], scollection: db.Node_collection -) -> Optional[List[defs.Document]]: - """given yaml from export format deserialise to internal standards format and add standards to db""" - - resulting_objects = [] - for contents in yamldocs: - links = [] - - document: Optional[defs.Document] = None - register_callback: Optional[Callable[[Any, Any], Any]] = None - - if not isinstance( - contents, dict - ): # basic object matching, make sure we at least have an object, golang has this build in :( - logger.fatal("Malformed file %s, skipping" % filename) - return None - - if contents.get("links"): - links = contents.pop("links") - - if contents.get("doctype") == defs.Credoctypes.CRE.value: - document = from_dict( - data_class=defs.CRE, - data=contents, - config=Config(cast=[defs.Credoctypes]), - ) - # document = defs.CRE(**contents) - register_callback = register_cre - elif contents.get("doctype") in ( - defs.Credoctypes.Standard.value, - defs.Credoctypes.Code.value, - defs.Credoctypes.Tool.value, - ): - # document = defs.Standard(**contents) - doctype = contents.get("doctype") - data_class = ( - defs.Standard - if doctype == defs.Credoctypes.Standard.value - else ( - defs.Code - if doctype == defs.Credoctypes.Code.value - else defs.Tool if doctype == defs.Credoctypes.Tool.value else None - ) - ) - document = from_dict( - data_class=data_class, - data=contents, - config=Config(cast=[defs.Credoctypes]), - ) - register_callback = register_node - - for link in links: - doclink = parse_file( - filename=filename, - yamldocs=[link.get("document")], - scollection=scollection, - ) - - if doclink: - if len(doclink) > 1: - logger.fatal( - "Parsing single document returned 2 results this is a bug" - ) - document.add_link( - defs.Link( - document=doclink[0], - ltype=link.get("type"), - tags=link.get("tags"), - ) - ) - if register_callback: - register_callback(document, collection=scollection) # type: ignore - else: - logger.warning("Callback to register Document is None, likely missing data") - resulting_objects.append(document) - return resulting_objects - - -def register_standard( - standard_entries: List[defs.Standard], - collection: db.Node_collection = None, - generate_embeddings=True, - calculate_gap_analysis=True, - db_connection_str: str = "", -): - if os.environ.get("CRE_NO_GEN_EMBEDDINGS"): - generate_embeddings = False - - if not standard_entries: - logger.warning("register_standard() called with no standard_entries") - return - - if collection is None: - collection = db_connect(path=db_connection_str) - - conn = redis.connect() - ph = prompt_client.PromptHandler(database=collection) - importing_name = standard_entries[0].name - standard_hash = gap_analysis.make_resources_key([importing_name]) - if calculate_gap_analysis and conn.get(standard_hash): - logger.info( - f"Standard importing job with info-hash {standard_hash} has already returned, skipping" - ) - return - logger.info( - f"Registering resource {importing_name} of length {len(standard_entries)}" - ) - for node in standard_entries: - if not node: - logger.info( - f"encountered empty node while importing {standard_entries[0].name}" - ) - continue - register_node(node, collection) - if node.embeddings: - logger.debug( - f"node has embeddings populated, skipping generation for resource {importing_name}" - ) - generate_embeddings = False - if generate_embeddings and importing_name: - ph.generate_embeddings_for(importing_name) - - if calculate_gap_analysis and not os.environ.get("CRE_NO_CALCULATE_GAP_ANALYSIS"): - # calculate gap analysis - populate_neo4j_db(db_connection_str) - jobs = [] - pending_stadards = collection.standards() - for standard_name in pending_stadards: - if standard_name == importing_name: - continue - - fw_key = gap_analysis.make_resources_key([importing_name, standard_name]) - if not collection.gap_analysis_exists(fw_key): - fw_job = gap_analysis.schedule( - standards=[importing_name, standard_name], database=collection - ) - forward_job_id = fw_job.get("job_id") - try: - forward_job = job.Job.fetch(id=forward_job_id, connection=conn) - jobs.append(forward_job) - except exceptions.NoSuchJobError as nje: - logger.error( - f"Could not find gap analysis job for for {importing_name} and {standard_name} putting {standard_name} back in the queue" - ) - pending_stadards.append(standard_name) - - bw_key = gap_analysis.make_resources_key([standard_name, importing_name]) - if not collection.gap_analysis_exists(bw_key): - bw_job = gap_analysis.schedule( - standards=[standard_name, importing_name], database=collection - ) - backward_job_id = bw_job.get("job_id") - try: - backward_job = job.Job.fetch(id=backward_job_id, connection=conn) - jobs.append(backward_job) - except exceptions.NoSuchJobError as nje: - logger.error( - f"Could not find gap analysis job for for {importing_name} and {standard_name} putting {standard_name} back in the queue" - ) - pending_stadards.append(standard_name) - redis.wait_for_jobs(jobs) - conn.set(standard_hash, value="") - - -def parse_standards_from_spreadsheeet( - cre_file: List[Dict[str, Any]], - cache_location: str, - prompt_handler: prompt_client.PromptHandler, -) -> None: - """given a yaml with standards, build a list of standards in the db""" - collection = db_connect(cache_location) - if any(key.startswith("CRE hierarchy") for key in cre_file[0].keys()): - conn = redis.connect() - collection = collection.with_graph() - redis.empty_queues(conn) - q = Queue(connection=conn) - docs = spreadsheet_parsers.parse_hierarchical_export_format(cre_file) - total_resources = docs.keys() - jobs = [] - logger.info(f"Importing {len(docs.get(defs.Credoctypes.CRE.value))} CREs") - - with alive_bar(len(docs.get(defs.Credoctypes.CRE.value))) as bar: - for cre in docs.pop(defs.Credoctypes.CRE.value): - register_cre(cre, collection) - bar() - - if not os.environ.get("CRE_NO_NEO4J"): - populate_neo4j_db(cache_location) - if not os.environ.get("CRE_NO_GEN_EMBEDDINGS"): - prompt_handler.generate_embeddings_for(defs.Credoctypes.CRE.value) - - import_only = [] - if os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY", None): - import_list = os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY") - try: - import_list_json = json.loads(import_list) - except json.JSONDecodeError as jde: - env_value = os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY") - logger.error(f"value '{env_value}' is not valid json") - raise jde - if type(import_list_json) == list: - import_only.extend(import_list_json) - else: - logger.warning( - f"CRE_ROOT_CSV_IMPORT_ONLY should be a list of standards to import, received {type(import_list_json)} {import_list}" - ) - database = db_connect(cache_location) - for standard_name, standard_entries in docs.items(): - if os.environ.get("CRE_NO_REIMPORT_IF_EXISTS") and database.get_nodes( - name=standard_name - ): - logger.info( - f"Already know of {standard_name} and CRE_NO_REIMPORT_IF_EXISTS is set, skipping" - ) - continue - if import_only and standard_name not in import_only: - logger.info( - f"skipping standard {standard_name} as it's not in the list of {import_only}" - ) - continue - jobs.append( - q.enqueue_call( - description=standard_name, - func=register_standard, - kwargs={ - "standard_entries": standard_entries, - "collection": None, - "db_connection_str": cache_location, - }, - timeout=gap_analysis.GAP_ANALYSIS_TIMEOUT, - ) - ) - t0 = time.perf_counter() - total_standards = len(jobs) - logger.info(f"Importing {total_standards} Standards") - with alive_bar(theme="classic", total=total_standards) as bar: - redis.wait_for_jobs(jobs, bar) - logger.info( - f"imported {total_standards} standards in {time.perf_counter()-t0} seconds" - ) - return total_resources - else: - logger.fatal(f"could not find any useful keys { cre_file[0].keys()}") - - -def get_cre_files_from_disk(cre_loc: str) -> Generator[str, None, None]: - for root, _, cre_docs in os.walk(cre_loc): - for name in cre_docs: - if name.endswith(".yaml") or name.endswith(".yml"): - yield os.path.join(root, name) - - -def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) -> None: - """--add --from_spreadsheet - use the cre db in this repo - import new mappings from - export db to ../../cres/ - """ - database = db_connect(path=cache_loc) - prompt_handler = ai_client_init(database=database) - spreadsheet = sheet_utils.read_spreadsheet( - url=spreadsheet_url, alias="new spreadsheet", validate=False - ) - for _, contents in spreadsheet.items(): - parse_standards_from_spreadsheeet(contents, cache_loc, prompt_handler) - - logger.info( - "Db located at %s got updated, files extracted at %s" % (cache_loc, cre_loc) - ) - - -def add_from_disk(cache_loc: str, cre_loc: str) -> None: - """--add --cre_loc - use the cre db in this repo - import new mappings from - export db to ../../cres/ - """ - database = db_connect(path=cache_loc) - for file in get_cre_files_from_disk(cre_loc): - with open(file, "rb") as standard: - parse_file( - filename=file, - yamldocs=list(yaml.safe_load_all(standard)), - scollection=database, - ) - - -def review_from_spreadsheet(cache: str, spreadsheet_url: str, share_with: str) -> None: - """--review --from_spreadsheet - copy db to new temp dir, - import new mappings from spreadsheet - export db to tmp dir - create new spreadsheet of the new CRE landscape for review - """ - loc, cache = prepare_for_review(cache) - database = db_connect(path=cache) - prompt_handler = ai_client_init(database=database) - spreadsheet = sheet_utils.read_spreadsheet( - url=spreadsheet_url, alias="new spreadsheet", validate=False - ) - for _, contents in spreadsheet.items(): - parse_standards_from_spreadsheeet(contents, database, prompt_handler) - - logger.info( - "Stored temporary files and database in %s if you want to use them next time, set cache to the location of the database in that dir" - % loc - ) - # logger.info("A spreadsheet view is at %s" % sheet_url) - - -def download_graph_from_upstream(cache: str) -> None: - imported_cres = {} - collection = db_connect(path=cache).with_graph() - - def download_cre_from_upstream(creid: str): - cre_response = requests.get( - os.environ.get("CRE_UPSTREAM_API_URL", "https://opencre.org/rest/v1") - + f"/id/{creid}" - ) - if cre_response.status_code != 200: - raise RuntimeError( - f"cannot connect to upstream status code {cre_response.status_code}" - ) - data = cre_response.json() - credict = data["data"] - cre = defs.Document.from_dict(credict) - if cre.id in imported_cres: - return - - register_cre(cre, collection) - imported_cres[cre.id] = "" - for link in cre.links: - if link.document.doctype == defs.Credoctypes.CRE: - download_cre_from_upstream(link.document.id) - - root_cres_response = requests.get( - os.environ.get("CRE_UPSTREAM_API_URL", "https://opencre.org/rest/v1") - + "/root_cres" - ) - if root_cres_response.status_code != 200: - raise RuntimeError( - f"cannot connect to upstream status code {root_cres_response.status_code}" - ) - data = root_cres_response.json() - for root_cre in data["data"]: - cre = defs.Document.from_dict(root_cre) - register_cre(cre, collection) - imported_cres[cre.id] = "" - for link in cre.links: - if link.document.doctype == defs.Credoctypes.CRE: - download_cre_from_upstream(link.document.id) - - -# def review_from_disk(cache: str, cre_file_loc: str, share_with: str) -> None: -# """--review --cre_loc -# copy db to new temp dir, -# import new mappings from yaml files defined in -# export db to tmp dir -# create new spreadsheet of the new CRE landscape for review -# """ -# loc, cache = prepare_for_review(cache) -# database = db_connect(path=cache) -# for file in get_cre_files_from_disk(cre_file_loc): -# with open(file, "rb") as standard: -# parse_file( -# filename=file, -# yamldocs=list(yaml.safe_load_all(standard)), -# scollection=database, -# ) - -# sheet_url = create_spreadsheet( -# collection=database, -# exported_documents=docs, -# title="cre_review", -# share_with=[share_with], -# ) -# logger.info( -# "Stored temporary files and database in %s if you want to use them next time, set cache to the location of the database in that dir" -# % loc -# ) -# logger.info("A spreadsheet view is at %s" % sheet_url) - - -def run(args: argparse.Namespace) -> None: # pragma: no cover - script_path = os.path.dirname(os.path.realpath(__file__)) - os.path.join(script_path, "../cres") - - # if args.review and args.from_spreadsheet: - # review_from_spreadsheet( - # cache=args.cache_file, - # spreadsheet_url=args.from_spreadsheet, - # share_with=args.email, - # ) - # elif args.review and args.cre_loc: - # review_from_disk( - # cache=args.cache_file, cre_file_loc=args.cre_loc, share_with=args.email - # ) - if args.add and args.from_spreadsheet: - add_from_spreadsheet( - spreadsheet_url=args.from_spreadsheet, - cache_loc=args.cache_file, - cre_loc=args.cre_loc, - ) - elif args.add and args.cre_loc and not args.from_spreadsheet: - add_from_disk(cache_loc=args.cache_file, cre_loc=args.cre_loc) - # elif args.review and args.osib_in: - # review_osib_from_file( - # file_loc=args.osib_in, cache=args.cache_file, cre_loc=args.cre_loc - # ) - - # elif args.add and args.osib_in: - # add_osib_from_file( - # file_loc=args.osib_in, cache=args.cache_file, cre_loc=args.cre_loc - # ) - - # elif args.osib_out: - # export_to_osib(file_loc=args.osib_out, cache=args.cache_file) - - if args.delete_map_analysis_for: - cache = db_connect(args.cache_file) - cache.delete_gapanalysis_results_for(args.delete_map_analysis_for) - if args.delete_resource: - cache = db_connect(args.cache_file) - cache.delete_nodes(args.delete_resource) - - # individual resource importing - if args.zap_in: - from application.utils.external_project_parsers.parsers import zap_alerts_parser - - BaseParser().register_resource( - zap_alerts_parser.ZAP, db_connection_str=args.cache_file - ) - if args.cheatsheets_in: - from application.utils.external_project_parsers.parsers import ( - cheatsheets_parser, - ) - - BaseParser().register_resource( - cheatsheets_parser.Cheatsheets, db_connection_str=args.cache_file - ) - if args.github_tools_in: - from application.utils.external_project_parsers.parsers import misc_tools_parser - - BaseParser().register_resource( - misc_tools_parser.MiscTools, db_connection_str=args.cache_file - ) - if args.capec_in: - from application.utils.external_project_parsers.parsers import capec_parser - - BaseParser().register_resource( - capec_parser.Capec, db_connection_str=args.cache_file - ) - if args.cwe_in: - from application.utils.external_project_parsers.parsers import cwe - - BaseParser().register_resource(cwe.CWE, db_connection_str=args.cache_file) - if args.csa_ccm_v4_in: - from application.utils.external_project_parsers.parsers import ccmv4 - - BaseParser().register_resource( - ccmv4.CloudControlsMatrix, db_connection_str=args.cache_file - ) - if args.iso_27001_in: - from application.utils.external_project_parsers.parsers import iso27001 - - BaseParser().register_resource( - iso27001.ISO27001, db_connection_str=args.cache_file - ) - if args.owasp_secure_headers_in: - from application.utils.external_project_parsers.parsers import secure_headers - - BaseParser().register_resource( - secure_headers.SecureHeaders, db_connection_str=args.cache_file - ) - if args.pci_dss_4_in: - from application.utils.external_project_parsers.parsers import pci_dss - - BaseParser().register_resource( - pci_dss.PciDss, db_connection_str=args.cache_file - ) - if args.juiceshop_in: - from application.utils.external_project_parsers.parsers import juiceshop - - BaseParser().register_resource( - juiceshop.JuiceShop, db_connection_str=args.cache_file - ) - if args.dsomm_in: - from application.utils.external_project_parsers.parsers import dsomm - - BaseParser().register_resource(dsomm.DSOMM, db_connection_str=args.cache_file) - if args.cloud_native_security_controls_in: - from application.utils.external_project_parsers.parsers import ( - cloud_native_security_controls, - ) - - BaseParser().register_resource( - cloud_native_security_controls.CloudNativeSecurityControls, - db_connection_str=args.cache_file, - ) - # /end individual resource importing - - if args.import_external_projects: - BaseParser().call_importers(db_connection_str=args.cache_file) - - if args.generate_embeddings: - generate_embeddings(args.cache_file) - if args.populate_neo4j_db: - populate_neo4j_db(args.cache_file) - if args.start_worker: - from application.worker import start_worker - - start_worker() - - if args.preload_map_analysis_target_url: - gap_analysis.preload(target_url=args.preload_map_analysis_target_url) - if args.upstream_sync: - download_graph_from_upstream(args.cache_file) - - -def ai_client_init(database: db.Node_collection): - return prompt_client.PromptHandler(database=database) - - -def db_connect(path: str): - global app - conf = CMDConfig(db_uri=path) - app = create_app(conf=conf) - collection = db.Node_collection() - app_context = app.app_context() - app_context.push() - logger.info(f"successfully connected to the database at {path}") - return collection - - -def create_spreadsheet( - collection: db.Node_collection, - exported_documents: List[Any], - title: str, - share_with: List[str], -) -> Any: - """Reads cre docs exported from a standards_collection.export() - dumps each doc into a workbook""" - flat_dicts = sheet_utils.prepare_spreadsheet(docs=exported_documents) - return sheet_utils.write_spreadsheet( - title=title, docs=flat_dicts, emails=share_with - ) - - -def prepare_for_review(cache: str) -> Tuple[str, str]: - loc = tempfile.mkdtemp() - cache_filename = os.path.basename(cache) - if os.path.isfile(cache): - shutil.copy(cache, loc) - else: - logger.fatal("Could not copy database %s this seems like a bug" % cache) - return loc, os.path.join(loc, cache_filename) - - -def generate_embeddings(db_url: str) -> None: - database = db_connect(path=db_url) - prompt_client.PromptHandler(database, load_all_embeddings=True) - - -def populate_neo4j_db(cache: str): - logger.info(f"Populating neo4j DB: Connecting to SQL DB") - database = db_connect(path=cache) - logger.info(f"Populating neo4j DB: Populating") - database.neo_db.populate_DB(database.session) - logger.info(f"Populating neo4j DB: Complete") +import time +import argparse +import json +import logging +import os +import shutil +import yaml +import tempfile +import requests + +from typing import Any, Callable, Dict, Generator, List, Optional, Tuple +try: + from rq import Queue, job, exceptions +except (ValueError, ImportError): + Queue, job, exceptions = None, None, None + +from dacite import from_dict +from dacite.config import Config + +from application.utils.external_project_parsers.base_parser import BaseParser +from application import create_app # type: ignore +from application.config import CMDConfig +from application.database import db +from application.defs import cre_defs as defs +from application.defs import osib_defs as odefs +from application.utils import spreadsheet as sheet_utils +from application.utils import redis +from application.utils import spreadsheet_parsers +from alive_progress import alive_bar +from application.prompt_client import prompt_client as prompt_client +from application.utils import gap_analysis + +logging.basicConfig() +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + +app = None + + +def register_node(node: defs.Node, collection: db.Node_collection) -> db.Node: + """ + for each link find if either the root node or the link have a CRE, + then map the one who doesn't to the CRE + if both don't map to anything, just add them in the db as unlinked nodes + """ + if not node or not issubclass(node.__class__, defs.Node): + raise ValueError(f"node is None or not of type Node, node: {node}") + + linked_node = collection.add_node(node) + if node.embeddings: + collection.add_embedding( + linked_node, + doctype=node.doctype, + embeddings=node.embeddings, + embedding_text=node.embeddings_text, + ) + cre_less_nodes: List[defs.Node] = [] + + # we need to know the cres added in case we encounter a higher level CRE, + # in which case we get the higher level CRE to link to these cres + cres_added = [] + + for link in node.links: + if type(link.document).__name__ in [ + defs.Standard.__name__, + defs.Code.__name__, + defs.Tool.__name__, + ]: + # if a node links another node it is likely that a writer wants to reference something + # in that case, find which of the two nodes has at least one CRE attached to it and link both to the parent CRE + cres = collection.find_cres_of_node(link.document) + db_link = collection.add_node(link.document) + if cres: + for cre in cres: + collection.add_link(cre=cre, node=linked_node, ltype=link.ltype) + for unlinked_standard in cre_less_nodes: # if anything in this + collection.add_link( + cre=cre, + node=db.dbNodeFromNode(unlinked_standard), + ltype=link.ltype, + ) + else: + cres = collection.find_cres_of_node(linked_node) + if cres: + for cre in cres: + collection.add_link(cre=cre, node=db_link, ltype=link.ltype) + for unlinked_node in cre_less_nodes: + collection.add_link( + cre=cre, + node=db.dbNodeFromNode(unlinked_node), + ltype=link.ltype, + ) + else: # if neither the root nor a linked node has a CRE, add both as unlinked nodes + cre_less_nodes.append(link.document) + + if link.document.links and len(link.document.links) > 0: + register_node(node=link.document, collection=collection) + + elif type(link.document).__name__ == defs.CRE.__name__: + # dbcre,_ = register_cre(link.document, collection) # CREs are idempotent + c = collection.get_CREs(name=link.document.name)[0] + dbcre = db.dbCREfromCRE(c) + collection.add_link(dbcre, linked_node, ltype=link.ltype) + cres_added.append(dbcre) + for unlinked_standard in cre_less_nodes: # if anything in this + collection.add_link( + cre=dbcre, + node=db.dbNodeFromNode(unlinked_standard), + ltype=link.ltype, + ) + cre_less_nodes = [] + + return linked_node + + +def register_cre(cre: defs.CRE, collection: db.Node_collection) -> Tuple[db.CRE, bool]: + collection = collection.with_graph() + existing = False + if collection.get_CREs(name=cre.id): + existing = True + + dbcre: db.CRE = collection.add_cre(cre) + for link in cre.links: + if type(link.document) == defs.CRE: + other_cre, _ = register_cre(link.document, collection) + + # the following flips the PartOf relationship so that we only have contains relationship in the database + if link.ltype == defs.LinkTypes.Contains: + collection.add_internal_link( + higher=dbcre, + lower=other_cre, + ltype=defs.LinkTypes.Contains, + ) + elif link.ltype == defs.LinkTypes.PartOf: + collection.add_internal_link( + higher=other_cre, + lower=dbcre, + ltype=defs.LinkTypes.Contains, + ) + elif link.ltype == defs.LinkTypes.Related: + collection.add_internal_link( + higher=other_cre, + lower=dbcre, + ltype=defs.LinkTypes.Related, + ) + else: + raise ValueError(f"Unknown link type {link.ltype}") + else: + collection.add_link( + cre=dbcre, + node=register_node(node=link.document, collection=collection), + ltype=link.ltype, + ) + return dbcre, existing + + +def parse_file( + filename: str, yamldocs: List[Dict[str, Any]], scollection: db.Node_collection +) -> Optional[List[defs.Document]]: + """given yaml from export format deserialise to internal standards format and add standards to db""" + + resulting_objects = [] + for contents in yamldocs: + links = [] + + document: Optional[defs.Document] = None + register_callback: Optional[Callable[[Any, Any], Any]] = None + + if not isinstance( + contents, dict + ): # basic object matching, make sure we at least have an object, golang has this build in :( + logger.fatal("Malformed file %s, skipping" % filename) + return None + + if contents.get("links"): + links = contents.pop("links") + + if contents.get("doctype") == defs.Credoctypes.CRE.value: + document = from_dict( + data_class=defs.CRE, + data=contents, + config=Config(cast=[defs.Credoctypes]), + ) + # document = defs.CRE(**contents) + register_callback = register_cre + elif contents.get("doctype") in ( + defs.Credoctypes.Standard.value, + defs.Credoctypes.Code.value, + defs.Credoctypes.Tool.value, + ): + # document = defs.Standard(**contents) + doctype = contents.get("doctype") + data_class = ( + defs.Standard + if doctype == defs.Credoctypes.Standard.value + else ( + defs.Code + if doctype == defs.Credoctypes.Code.value + else defs.Tool if doctype == defs.Credoctypes.Tool.value else None + ) + ) + document = from_dict( + data_class=data_class, + data=contents, + config=Config(cast=[defs.Credoctypes]), + ) + register_callback = register_node + + for link in links: + doclink = parse_file( + filename=filename, + yamldocs=[link.get("document")], + scollection=scollection, + ) + + if doclink: + if len(doclink) > 1: + logger.fatal( + "Parsing single document returned 2 results this is a bug" + ) + document.add_link( + defs.Link( + document=doclink[0], + ltype=link.get("type"), + tags=link.get("tags"), + ) + ) + if register_callback: + register_callback(document, collection=scollection) # type: ignore + else: + logger.warning("Callback to register Document is None, likely missing data") + resulting_objects.append(document) + return resulting_objects + + +def register_standard( + standard_entries: List[defs.Standard], + collection: db.Node_collection = None, + generate_embeddings=True, + calculate_gap_analysis=True, + db_connection_str: str = "", +): + if os.environ.get("CRE_NO_GEN_EMBEDDINGS"): + generate_embeddings = False + + if not standard_entries: + logger.warning("register_standard() called with no standard_entries") + return + + if collection is None: + collection = db_connect(path=db_connection_str) + + conn = redis.connect() + ph = prompt_client.PromptHandler(database=collection) + importing_name = standard_entries[0].name + standard_hash = gap_analysis.make_resources_key([importing_name]) + if calculate_gap_analysis and conn.get(standard_hash): + logger.info( + f"Standard importing job with info-hash {standard_hash} has already returned, skipping" + ) + return + logger.info( + f"Registering resource {importing_name} of length {len(standard_entries)}" + ) + for node in standard_entries: + if not node: + logger.info( + f"encountered empty node while importing {standard_entries[0].name}" + ) + continue + register_node(node, collection) + if node.embeddings: + logger.debug( + f"node has embeddings populated, skipping generation for resource {importing_name}" + ) + generate_embeddings = False + if generate_embeddings and importing_name: + ph.generate_embeddings_for(importing_name) + + if calculate_gap_analysis and not os.environ.get("CRE_NO_CALCULATE_GAP_ANALYSIS"): + # calculate gap analysis + populate_graph_db(db_connection_str) + jobs = [] + pending_stadards = collection.standards() + for standard_name in pending_stadards: + if standard_name == importing_name: + continue + + fw_key = gap_analysis.make_resources_key([importing_name, standard_name]) + if not collection.gap_analysis_exists(fw_key): + fw_job = gap_analysis.schedule( + standards=[importing_name, standard_name], database=collection + ) + forward_job_id = fw_job.get("job_id") + try: + forward_job = job.Job.fetch(id=forward_job_id, connection=conn) + jobs.append(forward_job) + except exceptions.NoSuchJobError as nje: + logger.error( + f"Could not find gap analysis job for for {importing_name} and {standard_name} putting {standard_name} back in the queue" + ) + pending_stadards.append(standard_name) + + bw_key = gap_analysis.make_resources_key([standard_name, importing_name]) + if not collection.gap_analysis_exists(bw_key): + bw_job = gap_analysis.schedule( + standards=[standard_name, importing_name], database=collection + ) + backward_job_id = bw_job.get("job_id") + try: + backward_job = job.Job.fetch(id=backward_job_id, connection=conn) + jobs.append(backward_job) + except exceptions.NoSuchJobError as nje: + logger.error( + f"Could not find gap analysis job for for {importing_name} and {standard_name} putting {standard_name} back in the queue" + ) + pending_stadards.append(standard_name) + redis.wait_for_jobs(jobs) + conn.set(standard_hash, value="") + + +def parse_standards_from_spreadsheeet( + cre_file: List[Dict[str, Any]], + cache_location: str, + prompt_handler: prompt_client.PromptHandler, +) -> None: + """given a yaml with standards, build a list of standards in the db""" + collection = db_connect(cache_location) + if any(key.startswith("CRE hierarchy") for key in cre_file[0].keys()): + conn = redis.connect() + collection = collection.with_graph() + redis.empty_queues(conn) + q = Queue(connection=conn) + docs = spreadsheet_parsers.parse_hierarchical_export_format(cre_file) + total_resources = docs.keys() + jobs = [] + logger.info(f"Importing {len(docs.get(defs.Credoctypes.CRE.value))} CREs") + + with alive_bar(len(docs.get(defs.Credoctypes.CRE.value))) as bar: + for cre in docs.pop(defs.Credoctypes.CRE.value): + register_cre(cre, collection) + bar() + + if not os.environ.get("CRE_NO_NEO4J"): + populate_graph_db(cache_location) + if not os.environ.get("CRE_NO_GEN_EMBEDDINGS"): + prompt_handler.generate_embeddings_for(defs.Credoctypes.CRE.value) + + import_only = [] + if os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY", None): + import_list = os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY") + try: + import_list_json = json.loads(import_list) + except json.JSONDecodeError as jde: + env_value = os.environ.get("CRE_ROOT_CSV_IMPORT_ONLY") + logger.error(f"value '{env_value}' is not valid json") + raise jde + if type(import_list_json) == list: + import_only.extend(import_list_json) + else: + logger.warning( + f"CRE_ROOT_CSV_IMPORT_ONLY should be a list of standards to import, received {type(import_list_json)} {import_list}" + ) + database = db_connect(cache_location) + for standard_name, standard_entries in docs.items(): + if os.environ.get("CRE_NO_REIMPORT_IF_EXISTS") and database.get_nodes( + name=standard_name + ): + logger.info( + f"Already know of {standard_name} and CRE_NO_REIMPORT_IF_EXISTS is set, skipping" + ) + continue + if import_only and standard_name not in import_only: + logger.info( + f"skipping standard {standard_name} as it's not in the list of {import_only}" + ) + continue + jobs.append( + q.enqueue_call( + description=standard_name, + func=register_standard, + kwargs={ + "standard_entries": standard_entries, + "collection": None, + "db_connection_str": cache_location, + }, + timeout=gap_analysis.GAP_ANALYSIS_TIMEOUT, + ) + ) + t0 = time.perf_counter() + total_standards = len(jobs) + logger.info(f"Importing {total_standards} Standards") + with alive_bar(theme="classic", total=total_standards) as bar: + redis.wait_for_jobs(jobs, bar) + logger.info( + f"imported {total_standards} standards in {time.perf_counter()-t0} seconds" + ) + return total_resources + else: + logger.fatal(f"could not find any useful keys { cre_file[0].keys()}") + + +def get_cre_files_from_disk(cre_loc: str) -> Generator[str, None, None]: + for root, _, cre_docs in os.walk(cre_loc): + for name in cre_docs: + if name.endswith(".yaml") or name.endswith(".yml"): + yield os.path.join(root, name) + + +def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) -> None: + """--add --from_spreadsheet + use the cre db in this repo + import new mappings from + export db to ../../cres/ + """ + database = db_connect(path=cache_loc) + prompt_handler = ai_client_init(database=database) + spreadsheet = sheet_utils.read_spreadsheet( + url=spreadsheet_url, alias="new spreadsheet", validate=False + ) + for _, contents in spreadsheet.items(): + parse_standards_from_spreadsheeet(contents, cache_loc, prompt_handler) + + logger.info( + "Db located at %s got updated, files extracted at %s" % (cache_loc, cre_loc) + ) + + +def add_from_disk(cache_loc: str, cre_loc: str) -> None: + """--add --cre_loc + use the cre db in this repo + import new mappings from + export db to ../../cres/ + """ + database = db_connect(path=cache_loc) + for file in get_cre_files_from_disk(cre_loc): + with open(file, "rb") as standard: + parse_file( + filename=file, + yamldocs=list(yaml.safe_load_all(standard)), + scollection=database, + ) + + +def review_from_spreadsheet(cache: str, spreadsheet_url: str, share_with: str) -> None: + """--review --from_spreadsheet + copy db to new temp dir, + import new mappings from spreadsheet + export db to tmp dir + create new spreadsheet of the new CRE landscape for review + """ + loc, cache = prepare_for_review(cache) + database = db_connect(path=cache) + prompt_handler = ai_client_init(database=database) + spreadsheet = sheet_utils.read_spreadsheet( + url=spreadsheet_url, alias="new spreadsheet", validate=False + ) + for _, contents in spreadsheet.items(): + parse_standards_from_spreadsheeet(contents, database, prompt_handler) + + logger.info( + "Stored temporary files and database in %s if you want to use them next time, set cache to the location of the database in that dir" + % loc + ) + # logger.info("A spreadsheet view is at %s" % sheet_url) + + +def download_graph_from_upstream(cache: str) -> None: + imported_cres = {} + collection = db_connect(path=cache).with_graph() + + def download_cre_from_upstream(creid: str): + cre_response = requests.get( + os.environ.get("CRE_UPSTREAM_API_URL", "https://opencre.org/rest/v1") + + f"/id/{creid}" + ) + if cre_response.status_code != 200: + raise RuntimeError( + f"cannot connect to upstream status code {cre_response.status_code}" + ) + data = cre_response.json() + credict = data["data"] + cre = defs.Document.from_dict(credict) + if cre.id in imported_cres: + return + + register_cre(cre, collection) + imported_cres[cre.id] = "" + for link in cre.links: + if link.document.doctype == defs.Credoctypes.CRE: + download_cre_from_upstream(link.document.id) + + root_cres_response = requests.get( + os.environ.get("CRE_UPSTREAM_API_URL", "https://opencre.org/rest/v1") + + "/root_cres" + ) + if root_cres_response.status_code != 200: + raise RuntimeError( + f"cannot connect to upstream status code {root_cres_response.status_code}" + ) + data = root_cres_response.json() + for root_cre in data["data"]: + cre = defs.Document.from_dict(root_cre) + register_cre(cre, collection) + imported_cres[cre.id] = "" + for link in cre.links: + if link.document.doctype == defs.Credoctypes.CRE: + download_cre_from_upstream(link.document.id) + + +# def review_from_disk(cache: str, cre_file_loc: str, share_with: str) -> None: +# """--review --cre_loc +# copy db to new temp dir, +# import new mappings from yaml files defined in +# export db to tmp dir +# create new spreadsheet of the new CRE landscape for review +# """ +# loc, cache = prepare_for_review(cache) +# database = db_connect(path=cache) +# for file in get_cre_files_from_disk(cre_file_loc): +# with open(file, "rb") as standard: +# parse_file( +# filename=file, +# yamldocs=list(yaml.safe_load_all(standard)), +# scollection=database, +# ) + +# sheet_url = create_spreadsheet( +# collection=database, +# exported_documents=docs, +# title="cre_review", +# share_with=[share_with], +# ) +# logger.info( +# "Stored temporary files and database in %s if you want to use them next time, set cache to the location of the database in that dir" +# % loc +# ) +# logger.info("A spreadsheet view is at %s" % sheet_url) + + +def run(args: argparse.Namespace) -> None: # pragma: no cover + script_path = os.path.dirname(os.path.realpath(__file__)) + os.path.join(script_path, "../cres") + + # if args.review and args.from_spreadsheet: + # review_from_spreadsheet( + # cache=args.cache_file, + # spreadsheet_url=args.from_spreadsheet, + # share_with=args.email, + # ) + # elif args.review and args.cre_loc: + # review_from_disk( + # cache=args.cache_file, cre_file_loc=args.cre_loc, share_with=args.email + # ) + if args.add and args.from_spreadsheet: + add_from_spreadsheet( + spreadsheet_url=args.from_spreadsheet, + cache_loc=args.cache_file, + cre_loc=args.cre_loc, + ) + elif args.add and args.cre_loc and not args.from_spreadsheet: + add_from_disk(cache_loc=args.cache_file, cre_loc=args.cre_loc) + # elif args.review and args.osib_in: + # review_osib_from_file( + # file_loc=args.osib_in, cache=args.cache_file, cre_loc=args.cre_loc + # ) + + # elif args.add and args.osib_in: + # add_osib_from_file( + # file_loc=args.osib_in, cache=args.cache_file, cre_loc=args.cre_loc + # ) + + # elif args.osib_out: + # export_to_osib(file_loc=args.osib_out, cache=args.cache_file) + + if args.delete_map_analysis_for: + cache = db_connect(args.cache_file) + cache.delete_gapanalysis_results_for(args.delete_map_analysis_for) + if args.delete_resource: + cache = db_connect(args.cache_file) + cache.delete_nodes(args.delete_resource) + + # individual resource importing + if args.zap_in: + from application.utils.external_project_parsers.parsers import zap_alerts_parser + + BaseParser().register_resource( + zap_alerts_parser.ZAP, db_connection_str=args.cache_file + ) + if args.cheatsheets_in: + from application.utils.external_project_parsers.parsers import ( + cheatsheets_parser, + ) + + BaseParser().register_resource( + cheatsheets_parser.Cheatsheets, db_connection_str=args.cache_file + ) + if args.github_tools_in: + from application.utils.external_project_parsers.parsers import misc_tools_parser + + BaseParser().register_resource( + misc_tools_parser.MiscTools, db_connection_str=args.cache_file + ) + if args.capec_in: + from application.utils.external_project_parsers.parsers import capec_parser + + BaseParser().register_resource( + capec_parser.Capec, db_connection_str=args.cache_file + ) + if args.cwe_in: + from application.utils.external_project_parsers.parsers import cwe + + BaseParser().register_resource(cwe.CWE, db_connection_str=args.cache_file) + if args.csa_ccm_v4_in: + from application.utils.external_project_parsers.parsers import ccmv4 + + BaseParser().register_resource( + ccmv4.CloudControlsMatrix, db_connection_str=args.cache_file + ) + if args.iso_27001_in: + from application.utils.external_project_parsers.parsers import iso27001 + + BaseParser().register_resource( + iso27001.ISO27001, db_connection_str=args.cache_file + ) + if args.owasp_secure_headers_in: + from application.utils.external_project_parsers.parsers import secure_headers + + BaseParser().register_resource( + secure_headers.SecureHeaders, db_connection_str=args.cache_file + ) + if args.pci_dss_4_in: + from application.utils.external_project_parsers.parsers import pci_dss + + BaseParser().register_resource( + pci_dss.PciDss, db_connection_str=args.cache_file + ) + if args.juiceshop_in: + from application.utils.external_project_parsers.parsers import juiceshop + + BaseParser().register_resource( + juiceshop.JuiceShop, db_connection_str=args.cache_file + ) + if args.dsomm_in: + from application.utils.external_project_parsers.parsers import dsomm + + BaseParser().register_resource(dsomm.DSOMM, db_connection_str=args.cache_file) + if args.cloud_native_security_controls_in: + from application.utils.external_project_parsers.parsers import ( + cloud_native_security_controls, + ) + + BaseParser().register_resource( + cloud_native_security_controls.CloudNativeSecurityControls, + db_connection_str=args.cache_file, + ) + # /end individual resource importing + + if args.import_external_projects: + BaseParser().call_importers(db_connection_str=args.cache_file) + + if args.generate_embeddings: + generate_embeddings(args.cache_file) + if args.populate_graph_db: + populate_graph_db(args.cache_file) + if args.start_worker: + from application.worker import start_worker + + start_worker() + + if args.preload_map_analysis_target_url: + gap_analysis.preload(target_url=args.preload_map_analysis_target_url) + if args.upstream_sync: + download_graph_from_upstream(args.cache_file) + + +def ai_client_init(database: db.Node_collection): + return prompt_client.PromptHandler(database=database) + + +def db_connect(path: str): + global app + conf = CMDConfig(db_uri=path) + app = create_app(conf=conf) + collection = db.Node_collection() + app_context = app.app_context() + app_context.push() + logger.info(f"successfully connected to the database at {path}") + return collection + + +def create_spreadsheet( + collection: db.Node_collection, + exported_documents: List[Any], + title: str, + share_with: List[str], +) -> Any: + """Reads cre docs exported from a standards_collection.export() + dumps each doc into a workbook""" + flat_dicts = sheet_utils.prepare_spreadsheet(docs=exported_documents) + return sheet_utils.write_spreadsheet( + title=title, docs=flat_dicts, emails=share_with + ) + + +def prepare_for_review(cache: str) -> Tuple[str, str]: + loc = tempfile.mkdtemp() + cache_filename = os.path.basename(cache) + if os.path.isfile(cache): + shutil.copy(cache, loc) + else: + logger.fatal("Could not copy database %s this seems like a bug" % cache) + return loc, os.path.join(loc, cache_filename) + + +def generate_embeddings(db_url: str) -> None: + database = db_connect(path=db_url) + prompt_client.PromptHandler(database, load_all_embeddings=True) + + +def populate_graph_db(cache: str): + logger.info(f"Populating graph DB: Connecting to SQL DB") + database = db_connect(path=cache) + logger.info(f"Populating graph DB: Populating") + database.graph_db.populate_DB(database.session) + logger.info(f"Populating graph DB: Complete") diff --git a/application/config.py b/application/config.py index 8459f8208..53ac5836f 100644 --- a/application/config.py +++ b/application/config.py @@ -13,6 +13,11 @@ class Config: GAP_ANALYSIS_OPTIMIZED = ( os.environ.get("GAP_ANALYSIS_OPTIMIZED", "False").lower() == "true" ) + GRAPH_DB_TYPE = os.environ.get("GRAPH_DB_TYPE", "neo4j").lower() + AGE_URL = ( + os.environ.get("AGE_URL") or "postgresql://postgres:password@localhost:5433/postgres" + ) + AGE_GRAPH = os.environ.get("AGE_GRAPH") or "opencre" class DevelopmentConfig(Config): diff --git a/application/database/db.py b/application/database/db.py index 6c1613277..125b1e409 100644 --- a/application/database/db.py +++ b/application/database/db.py @@ -2,10 +2,13 @@ import networkx as nx import uuid import neo4j +import psycopg2 +from psycopg2.extras import RealDictCursor import os import logging import re import yaml +import threading from pprint import pprint @@ -601,7 +604,7 @@ def _gap_analysis_optimized(self, name_1, name_2): """ MATCH (BaseStandard:NeoStandard {name: $name1}) MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME)*..20]-(CompareStandard)) + MATCH p = (BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME)*..20]-(CompareStandard) WITH p WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE (n:NeoCRE or n = BaseStandard or n = CompareStandard) AND NOT n.name in $denylist) RETURN p @@ -622,7 +625,7 @@ def _gap_analysis_optimized(self, name_1, name_2): """ MATCH (BaseStandard:NeoStandard {name: $name1}) MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME|CONTAINS)*..20]-(CompareStandard)) + MATCH p = (BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME|CONTAINS)*..20]-(CompareStandard) WITH p WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE (n:NeoCRE or n = BaseStandard or n = CompareStandard) AND NOT n.name in $denylist) RETURN p @@ -645,7 +648,7 @@ def _gap_analysis_optimized(self, name_1, name_2): """ MATCH (BaseStandard:NeoStandard {name: $name1}) MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[*..20]-(CompareStandard)) + MATCH p = (BaseStandard)-[*..20]-(CompareStandard) WITH p WHERE length(p) > 1 AND ALL (n in NODES(p) where (n:NeoCRE or n = BaseStandard or n = CompareStandard) AND NOT n.name in $denylist) RETURN p @@ -675,7 +678,7 @@ def _gap_analysis_original(self, name_1, name_2): """ MATCH (BaseStandard:NeoStandard {name: $name1}) MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[*..20]-(CompareStandard)) + MATCH p = (BaseStandard)-[*..20]-(CompareStandard) WITH p WHERE length(p) > 1 AND ALL (n in NODES(p) where (n:NeoCRE or n = BaseStandard or n = CompareStandard) AND NOT n.name in $denylist) RETURN p @@ -689,7 +692,7 @@ def _gap_analysis_original(self, name_1, name_2): """ MATCH (BaseStandard:NeoStandard {name: $name1}) MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|CONTAINS)*..20]-(CompareStandard)) + MATCH p = (BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|CONTAINS)*..20]-(CompareStandard) WITH p WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE (n:NeoCRE or n = BaseStandard or n = CompareStandard) AND NOT n.name in $denylist) RETURN p @@ -793,14 +796,347 @@ def parse_node_no_links(node: NeoDocument) -> cre_defs.Document: return node.to_cre_def(node, parse_links=False) +class AGEDB: + __instance = None + conn: Optional[psycopg2.extensions.connection] = None + graph_name: str = "opencre" + connected: bool = False + _connection_attempted: bool = False + _disabled_permanently: bool = False + _is_connecting: bool = False + _lock = threading.Lock() + + + @classmethod + def instance(cls): + """Singleton instance for Apache AGE database connection.""" + if cls.__instance is None: + with cls._lock: + if cls.__instance is None: + cls.__instance = cls.__new__(cls) + from application.config import Config + cls.graph_name = Config.AGE_GRAPH or "opencre" + cls.conn = None + cls.connected = False + cls._connection_attempted = False + cls._disabled_permanently = False + cls._is_connecting = False + + # If already connected, return + if cls.connected: + return cls.__instance + + # CIRCUIT BREAKER: If disabled or already tried and failed, don't try again + if cls._disabled_permanently: + return cls.__instance + + # Start background connection if not already in progress + if not cls._is_connecting: + with cls._lock: + if not cls._is_connecting and not cls.connected: + cls._is_connecting = True + thread = threading.Thread(target=cls._connect_background) + thread.daemon = True + thread.start() + + return cls.__instance + + @classmethod + def _connect_background(cls): + """Background thread to handle the potentially hanging connection.""" + from application.config import Config + try: + logger.info(f"Background: Attempting to connect to Apache AGE at {Config.AGE_URL}...") + cls.conn = psycopg2.connect(Config.AGE_URL, connect_timeout=10) + cls.conn.autocommit = True + + with cls.conn.cursor() as cursor: + cursor.execute("SET statement_timeout = 10000;") + cursor.execute("CREATE EXTENSION IF NOT EXISTS age;") + cursor.execute("LOAD 'age';") + cursor.execute('SET search_path = ag_catalog, "$user", public;') + # Create graph only if it doesn't exist — ignore 'already exists' error + try: + cursor.execute(f"SELECT create_graph('{cls.graph_name}');") + except Exception: + # Graph already exists, that's fine — reset connection state + cls.conn.rollback() + # Create indexes (ignore errors if already exist) + for idx_query in [ + f"SELECT * FROM cypher('{cls.graph_name}', $$ CREATE INDEX ON :NeoStandard(name) $$) as (a agtype);", + f"SELECT * FROM cypher('{cls.graph_name}', $$ CREATE INDEX ON :NeoCRE(name) $$) as (a agtype);", + ]: + try: + cursor.execute(idx_query) + except Exception: + cls.conn.rollback() + cursor.execute("SET statement_timeout = 30000;") + + cls.connected = True + logger.info("Background: Successfully connected to Apache AGE.") + except Exception as e: + logger.error(f"Background: Apache AGE connection failed: {e}. disabling AGE for this session.") + cls._disabled_permanently = True + cls.connected = False + if cls.conn: + try: cls.conn.close() + except: pass + cls.conn = None + finally: + cls._is_connecting = False + cls._connection_attempted = True + + @classmethod + def instance_blocking(cls, timeout: int = 30): + """Synchronous version of instance() - blocks until connection is ready or timeout.""" + import time + cls.instance() # Start background thread + waited = 0 + while cls._is_connecting and waited < timeout: + time.sleep(0.5) + waited += 0.5 + if not cls.connected: + logger.warning(f"AGE connection not available after {timeout}s.") + return cls.__instance + + @classmethod + def gap_analysis(cls, name_1, name_2): + from application.config import Config + + logger.info(f"AGE Gap Analysis for {name_1} >> {name_2}") + if not cls.conn: + cls.instance() + if not cls.conn: + return [], [] + + # Find base standard nodes + n1 = name_1.replace('"', '\\"') + base_query = f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (n:NeoStandard {{name: \"{n1}\"}}) RETURN n $AGE$) as (n agtype);" + with cls.conn.cursor(cursor_factory=RealDictCursor) as cursor: + cursor.execute(base_query) + base_recs = cursor.fetchall() + base_standards = [cls._parse_agtype(r["n"]) for r in base_recs] + + # Find paths + # Note: Apache AGE does not have allShortestPaths, so we use a limited depth search. + # Depth 6 is usually enough for most OpenCRE relationships. + n2 = name_2.replace('"', '\\"') + path_query = f""" + SELECT * FROM cypher('{cls.graph_name}', $AGE$ + MATCH (BaseStandard:NeoStandard {{name: \"{n1}\"}}) + MATCH (CompareStandard:NeoStandard {{name: \"{n2}\"}}) + MATCH p = (BaseStandard)-[*..6]-(CompareStandard) + RETURN p + LIMIT 50 + $AGE$) as (p agtype); + """ + with cls.conn.cursor(cursor_factory=RealDictCursor) as cursor: + try: + cursor.execute(path_query) + path_recs = cursor.fetchall() + paths = [cls._parse_agpath(r["p"]) for r in path_recs] + except Exception as e: + logger.error(f"AGE Path Query failed: {e}") + paths = [] + + return base_standards, paths + + @classmethod + def _parse_agtype(cls, agtype_val): + """Convert AGE's agtype (usually JSON string or dict) to a format compatible with the app.""" + if isinstance(agtype_val, str): + import json + import re + # AGE appends ::vertex, ::edge, ::path at the end of the string. + # We strip them carefully avoiding :: inside values. + json_str = re.sub(r'::(vertex|edge|path)$', '', agtype_val) + try: + data = json.loads(json_str) + except json.JSONDecodeError: + # Fallback: if it's still failing, it might not be JSON at all + logger.error(f"Failed to parse agtype string: {agtype_val}") + data = {} + else: + data = agtype_val + + # Return a mock object that behaves like the NeoDocument models + class MockNode(dict): + def __init__(self, d): + self.id = str(d.get("id")) + self.label = d.get("label", "") + props = d.get("properties", {}) + self.name = props.get("name") + self.section = props.get("section") + self.subsection = props.get("subsection") + self.external_id = props.get("external_id") + self.section_id = props.get("section_id") + self.version = props.get("version") + self.description = props.get("description") + self.sql_id = str(props.get("sql_id", "")) + + # Map label to doctype for frontend compatibility + self.doctype = "Standard" + if self.label == "NeoCRE": + self.doctype = "CRE" + elif self.label == "NeoTool": + self.doctype = "Tool" + + # Store in dict for JSON serialization to frontend + super().__init__({ + "id": self.id, + "name": self.name, + "section": self.section, + "sectionID": self.section_id, + "subsection": self.subsection, + "version": self.version, + "external_id": self.external_id, + "description": self.description, + "doctype": self.doctype, + "sql_id": self.sql_id + }) + + def to_cre_def(self, *args, **kwargs): + from application.defs import cre_defs + if self.doctype == "CRE": + return cre_defs.CRE(name=self.name, id=self.external_id, description=self.description) + return cre_defs.Standard( + name=self.name, + section=self.section, + subsection=self.subsection, + version=self.version, + sectionID=self.section_id + ) + return MockNode(data) + + @classmethod + def _parse_agpath(cls, agpath_val): + """Translate AGE path to Neo4j-like path record.""" + if isinstance(agpath_val, str): + import json + # AGE sometimes appends ::path to the JSON string + json_str = agpath_val.split("::")[0] + try: + data = json.loads(json_str) + except json.JSONDecodeError: + logger.error(f"Failed to parse agpath string: {agpath_val}") + return {"start": {"id": "stub"}, "end": {"id": "stub"}, "path": []} + else: + data = agpath_val + + # AGE path is a list: [v1, e1, v2, e2, v3, ...] + # Note: Depending on AGE version and driver, structure might vary. + # Usually it's a dict with 'vertices' and 'edges' or a flat list. + # This implementation assumes flat list. + if not isinstance(data, list): + return {"start": {"id": "stub"}, "end": {"id": "stub"}, "path": []} + + vertices = [v for i, v in enumerate(data) if i % 2 == 0] + edges = [e for i, e in enumerate(data) if i % 2 != 0] + + path_steps = [] + for i in range(len(edges)): + step = { + "start": cls._parse_agtype(vertices[i]), + "end": cls._parse_agtype(vertices[i+1]), + "relationship": edges[i].get("label") + } + path_steps.append(step) + + return { + "start": cls._parse_agtype(vertices[0]), + "end": cls._parse_agtype(vertices[-1]), + "path": path_steps + } + + @classmethod + def populate_DB(cls, session): + logger.info("Populating Apache AGE DB from Postgres") + if not cls.conn: + cls.instance_blocking(timeout=30) + if not cls.conn: + logger.error("No AGE connection, skipping population") + return + + with cls.conn.cursor() as cursor: + # Clear existing data + cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (n) DETACH DELETE n $AGE$) as (a agtype);") + + # Migration of Standards + nodes = session.query(Node).all() + logger.info(f"Migrating {len(nodes)} Standards to AGE") + for node in nodes: + try: + name = (node.name or "").replace('"', '\\"') + section = (node.section or "").replace('"', '\\"') + section_id = (node.section_id or "").replace('"', '\\"') + subsection = (node.subsection or "").replace('"', '\\"') + version = (node.version or "").replace('"', '\\"') + link = (node.link or "").replace('"', '\\"') + sid = str(node.id) + cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ CREATE (n:NeoStandard {{name: \"{name}\", section: \"{section}\", section_id: \"{section_id}\", subsection: \"{subsection}\", version: \"{version}\", link: \"{link}\", sql_id: \"{sid}\"}}) $AGE$) as (a agtype);") + except Exception as e: + logger.error(f"Failed to migrate Standard {node.id}: {e}") + + # Migration of CREs + cres = session.query(CRE).all() + logger.info(f"Migrating {len(cres)} CREs to AGE") + for cre in cres: + try: + name = (cre.name or "").replace('"', '\\"') + desc = (cre.description or "").replace('"', '\\"') + eid = (cre.external_id or "").replace('"', '\\"') + sid = str(cre.id) + cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ CREATE (n:NeoCRE {{name: \"{name}\", description: \"{desc}\", external_id: \"{eid}\", sql_id: \"{sid}\"}}) $AGE$) as (a agtype);") + except Exception as e: + logger.error(f"Failed to migrate CRE {cre.id}: {e}") + + # Migration of CRE-CRE Links (InternalLinks) + internal_links = session.query(InternalLinks).all() + logger.info(f"Migrating {len(internal_links)} CRE-CRE links to AGE") + for link in internal_links: + try: + rel_type = re.sub(r'[^a-zA-Z0-9_]', '', link.type.upper()) + gid = str(link.group) + cid = str(link.cre) + cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (a:NeoCRE {{sql_id: \"{gid}\"}}), (b:NeoCRE {{sql_id: \"{cid}\"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);") + except Exception as e: + # logger.debug(f"Failed to migrate CRE-CRE link {link.id}: {e}") + pass + + # Migration of CRE-Standard Links (Links) + links = session.query(Links).all() + logger.info(f"Migrating {len(links)} CRE-Standard links to AGE") + for link in links: + try: + rel_type = re.sub(r'[^a-zA-Z0-9_]', '', link.type.upper()) + cid = str(link.cre) + nid = str(link.node) + cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (a:NeoCRE {{sql_id: \"{cid}\"}}), (b:NeoStandard {{sql_id: \"{nid}\"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);") + except Exception as e: + # logger.debug(f"Failed to migrate CRE-Standard link {link.id}: {e}") + pass + + logger.info(f"Populated {len(nodes)} standards, {len(cres)} CREs, and synchronized all links into AGE graph '{cls.graph_name}'") + + +class GraphDB: + @staticmethod + def instance(): + from application.config import Config + + if Config.GRAPH_DB_TYPE == "age": + return AGEDB.instance() + return NEO_DB.instance() + + class Node_collection: graph: inmemory_graph.CRE_Graph = None - neo_db: NEO_DB = None + graph_db: Any = None session = sqla.session def __init__(self) -> None: if not os.environ.get("NO_LOAD_GRAPH_DB"): - self.neo_db = NEO_DB.instance() + self.graph_db = GraphDB.instance() self.session = sqla.session def with_graph(self) -> "Node_collection": @@ -1799,7 +2135,7 @@ def standards(self) -> List[str]: return list(set([s[0] for s in standards])) def text_search(self, text: str) -> List[Optional[cre_defs.Document]]: - """Given a piece of text, tries to find the best match + r"""Given a piece of text, tries to find the best match for the text in the database. Shortcuts: 'CRE:' will search for the in cre external ids @@ -1818,7 +2154,7 @@ def text_search(self, text: str) -> List[Optional[cre_defs.Document]]: node_search = ( r"(Node|(?P" + types - + "))?((:| )?(?Phttps?://\S+))?((:| )(?P.+$))?" + + r"))?((:| )?(?Phttps?://\S+))?((:| )(?P.+$))?" ) match = re.search(cre_id_search, text, re.IGNORECASE) if match: @@ -2171,12 +2507,12 @@ def dbCREfromCRE(cre: cre_defs.CRE) -> CRE: def gap_analysis( - neo_db: NEO_DB, + graph_db: Any, node_names: List[str], cache_key: str = "", ): cre_db = Node_collection() - base_standard, paths = neo_db.gap_analysis(node_names[0], node_names[1]) + base_standard, paths = graph_db.gap_analysis(node_names[0], node_names[1]) logger.info(f"got db gap analysis for {'>>>'.join(node_names)}, calculating paths") if base_standard is None: return None @@ -2196,8 +2532,8 @@ def gap_analysis( extra_paths_dict[key] = {"paths": {}} for path in paths: - key = path["start"].id - end_key = path["end"].id + key = getattr(path["start"], "id", None) or path["start"].get("id") + end_key = getattr(path["end"], "id", None) or path["end"].get("id") if not end_key: logger.error( f"end_key is empty, this is a bug and this gap analysis will not progress" @@ -2237,8 +2573,8 @@ def gap_analysis( for key in extra_paths_dict: cre_db.add_gap_analysis_result( - cache_key=make_subresources_key(node_names, key), + cache_key=make_subresources_key(node_names, str(key)), ga_object=flask_json.dumps({"result": extra_paths_dict[key]}), ) - logger.info(f"stored gapa analysis for {'>>>'.join(node_names)}, successfully") + logger.info(f"stored gap analysis for {'>>>'.join(node_names)}, successfully") return (node_names, grouped_paths, extra_paths_dict) diff --git a/application/frontend/www/bundle.js.LICENSE.txt b/application/frontend/www/bundle.js.LICENSE.txt deleted file mode 100644 index f37e1e30c..000000000 --- a/application/frontend/www/bundle.js.LICENSE.txt +++ /dev/null @@ -1,66 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -/*! - Copyright (c) 2015 Jed Watson. - Based on code that is Copyright 2013-2015, Facebook, Inc. - All rights reserved. -*/ - -/*! @license DOMPurify 3.0.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.5/LICENSE */ - -/*! fromentries. MIT License. Feross Aboukhadijeh */ - -/** - * @license - * Copyright 2010-2023 Three.js Authors - * SPDX-License-Identifier: MIT - */ - -/** - * Prism: Lightweight, robust, elegant syntax highlighting - * - * @license MIT - * @author Lea Verou - * @namespace - * @public - */ - -/** @license React v0.20.2 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v17.0.2 - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v17.0.2 - * react-is.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -/** @license React v17.0.2 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ diff --git a/application/tests/cre_main_test.py b/application/tests/cre_main_test.py index af313c8a6..b1821ec9b 100644 --- a/application/tests/cre_main_test.py +++ b/application/tests/cre_main_test.py @@ -6,7 +6,11 @@ from typing import Any, Dict, List from unittest import mock from unittest.mock import Mock, patch -from rq import Queue +try: + from rq import Queue +except (ValueError, ImportError): + Queue = None + from application.utils import redis from application.prompt_client import prompt_client as prompt_client from application.tests.utils import data_gen diff --git a/application/tests/db_test.py b/application/tests/db_test.py index 1d13bd0be..53c5e221f 100644 --- a/application/tests/db_test.py +++ b/application/tests/db_test.py @@ -1,2289 +1,2289 @@ -import networkx as nx -from application.utils.gap_analysis import make_resources_key, make_subresources_key -import string -import random -import os -import tempfile -import unittest -from unittest import mock -from unittest.mock import patch -import uuid -from copy import copy, deepcopy -from pprint import pprint -from typing import Any, Dict, List, Union -from flask import json as flask_json - -import yaml -from application.tests.utils.data_gen import export_format_data -from application import create_app, sqla # type: ignore -from application.database import db -from application.defs import cre_defs as defs - - -class TestDB(unittest.TestCase): - def tearDown(self) -> None: - sqla.session.remove() - sqla.drop_all() - self.app_context.pop() - - def setUp(self) -> None: - self.app = create_app(mode="test") - self.app_context = self.app.app_context() - self.app_context.push() - sqla.create_all() - - self.collection = db.Node_collection().with_graph() - self.collection.graph.with_graph( - graph=nx.DiGraph(), graph_data=[] - ) # initialize the graph singleton for the tests to be unique - - collection = self.collection - - dbcre = collection.add_cre( - defs.CRE(id="111-000", description="CREdesc", name="CREname") - ) - self.dbcre = dbcre - dbgroup = collection.add_cre( - defs.CRE(id="111-001", description="Groupdesc", name="GroupName") - ) - dbstandard = collection.add_node( - defs.Standard( - subsection="4.5.6", - section="FooStand", - name="BarStand", - hyperlink="https://example.com", - tags=["788-788", "b", "c"], - ) - ) - - collection.add_node( - defs.Standard( - subsection="4.5.6", - section="Unlinked", - name="Unlinked", - hyperlink="https://example.com", - ) - ) - - collection.session.add(dbcre) - collection.add_link(cre=dbcre, node=dbstandard, ltype=defs.LinkTypes.LinkedTo) - collection.add_internal_link( - lower=dbcre, higher=dbgroup, ltype=defs.LinkTypes.Contains - ) - - self.collection = collection - - def test_get_by_tags(self) -> None: - """ - Given: A CRE with no links and a combination of possible tags: - "tag1,dash-2,underscore_3,space 4,co_mb-ination%5" - A Standard with no links and a combination of possible tags - "tag1, dots.5.5, space 6 , several spaces and newline 7 \n" - some limited overlap between the tag-sets - Expect: - The CRE to be returned when searching for "tag-2" and for ["tag1","underscore_3"] - The Standard to be returned when searching for "space 6" and ["dots.5.5", "space 6"] - Both to be returned when searching for "space" and "tag1" - """ - - dbcre = db.CRE( - description="tagCREdesc1", - name="tagCREname1", - tags="tag1,dash-2,underscore_3,space 4,co_mb-ination%5", - external_id="111-111", - ) - cre = db.CREfromDB(dbcre) - cre.id = "111-111" - dbstandard = db.Node( - subsection="4.5.6.7", - section="tagsstand", - name="tagsstand", - link="https://example.com", - version="", - tags="tag1, dots.5.5, space 6 , several spaces and newline 7 \n", - ntype=defs.Standard.__name__, - ) - standard = db.nodeFromDB(dbstandard) - self.collection.session.add(dbcre) - self.collection.session.add(dbstandard) - self.collection.session.commit() - - self.maxDiff = None - self.assertEqual(self.collection.get_by_tags(["dash-2"]), [cre]) - self.assertEqual(self.collection.get_by_tags(["tag1", "underscore_3"]), [cre]) - self.assertEqual(self.collection.get_by_tags(["space 6"]), [standard]) - self.assertEqual( - self.collection.get_by_tags(["dots.5.5", "space 6"]), [standard] - ) - - self.assertCountEqual([cre, standard], self.collection.get_by_tags(["space"])) - self.assertCountEqual( - [cre, standard], self.collection.get_by_tags(["space", "tag1"]) - ) - self.assertCountEqual(self.collection.get_by_tags(["tag1"]), [cre, standard]) - - self.assertEqual(self.collection.get_by_tags([]), []) - self.assertEqual(self.collection.get_by_tags(["this should not be a tag"]), []) - - def test_get_standards_names(self) -> None: - result = self.collection.get_node_names() - expected = [("Standard", "BarStand"), ("Standard", "Unlinked")] - self.assertEqual(expected, result) - - def test_get_max_internal_connections(self) -> None: - self.assertEqual(self.collection.get_max_internal_connections(), 1) - - dbcrelo = db.CRE(name="internal connections test lo", description="ictlo") - dbcrehi = db.CRE(name="internal connections test hi", description="icthi") - self.collection.session.add(dbcrelo) - self.collection.session.add(dbcrehi) - self.collection.session.commit() - for i in range(0, 100): - dbcre = db.CRE(name=str(i) + " name", description=str(i) + " desc") - self.collection.session.add(dbcre) - self.collection.session.commit() - - # 1 low level cre to multiple groups - self.collection.session.add( - db.InternalLinks(group=dbcre.id, cre=dbcrelo.id) - ) - - # 1 hi level cre to multiple low level - self.collection.session.add( - db.InternalLinks(group=dbcrehi.id, cre=dbcre.id) - ) - - self.collection.session.commit() - - result = self.collection.get_max_internal_connections() - self.assertEqual(result, 100) - - def test_export(self) -> None: - """ - Given: - A CRE "CREname" that links to a CRE "GroupName" and a Standard "BarStand" - Expect: - 2 documents on disk, one for "CREname" - with a link to "BarStand" and "GroupName" and one for "GroupName" with a link to "CREName" - """ - loc = tempfile.mkdtemp() - self.collection = db.Node_collection().with_graph() - collection = self.collection - code0 = defs.Code(name="co0") - code1 = defs.Code(name="co1") - tool0 = defs.Tool(name="t0", tooltype=defs.ToolTypes.Unknown) - dbstandard = collection.add_node( - defs.Standard( - subsection="4.5.6", - section="FooStand", - sectionID="123-123", - name="BarStand", - hyperlink="https://example.com", - tags=["788-788", "b", "c"], - ) - ) - - collection.add_node( - defs.Standard( - subsection="4.5.6", - section="Unlinked", - sectionID="Unlinked", - name="Unlinked", - hyperlink="https://example.com", - ) - ) - self.collection.add_link( - self.dbcre, self.collection.add_node(code0), ltype=defs.LinkTypes.LinkedTo - ) - self.collection.add_node(code1) - self.collection.add_node(tool0) - - expected = [ - defs.CRE( - id="111-001", - description="Groupdesc", - name="GroupName", - links=[ - defs.Link( - document=defs.CRE( - id="111-000", description="CREdesc", name="CREname" - ), - ltype=defs.LinkTypes.Contains, - ) - ], - ), - defs.CRE( - id="111-000", - description="CREdesc", - name="CREname", - links=[ - defs.Link( - document=defs.CRE( - id="112-001", description="Groupdesc", name="GroupName" - ), - ltype=defs.LinkTypes.Contains, - ), - defs.Link( - document=defs.Standard( - name="BarStand", - section="FooStand", - sectionID="456", - subsection="4.5.6", - hyperlink="https://example.com", - tags=["788-788", "b", "c"], - ), - ltype=defs.LinkTypes.LinkedTo, - ), - defs.Link( - document=defs.Code(name="co0"), ltype=defs.LinkTypes.LinkedTo - ), - ], - ), - defs.Standard( - subsection="4.5.6", - section="Unlinked", - name="Unlinked", - sectionID="Unlinked", - hyperlink="https://example.com", - ), - defs.Tool(name="t0", tooltype=defs.ToolTypes.Unknown), - defs.Code(name="co1"), - ] - self.collection.export(loc) - - # load yamls from loc, parse, - # ensure yaml1 is result[0].todict and - # yaml2 is expected[1].todict - group = expected[0].todict() - cre = expected[1].todict() - groupname = ( - expected[0] - .id.replace("/", "-") - .replace(" ", "_") - .replace('"', "") - .replace("'", "") - + ".yaml" - ) - with open(os.path.join(loc, groupname), "r") as f: - doc = yaml.safe_load(f) - self.assertDictEqual(group, doc) - - crename = ( - expected[1] - .id.replace("/", "-") - .replace(" ", "_") - .replace('"', "") - .replace("'", "") - + ".yaml" - ) - self.maxDiff = None - with open(os.path.join(loc, crename), "r") as f: - doc = yaml.safe_load(f) - self.assertCountEqual(cre, doc) - - def test_StandardFromDB(self) -> None: - expected = defs.Standard( - name="foo", - section="bar", - sectionID="213", - subsection="foobar", - hyperlink="https://example.com/foo/bar", - version="1.1.1", - ) - self.assertEqual( - expected, - db.nodeFromDB( - db.Node( - name="foo", - section="bar", - subsection="foobar", - link="https://example.com/foo/bar", - version="1.1.1", - section_id="213", - ntype=defs.Standard.__name__, - ) - ), - ) - - def test_CREfromDB(self) -> None: - c = defs.CRE( - id="243-243", - doctype=defs.Credoctypes.CRE, - description="CREdesc", - name="CREname", - ) - self.assertEqual( - c, - db.CREfromDB( - db.CRE(external_id="243-243", description="CREdesc", name="CREname") - ), - ) - - def test_add_cre(self) -> None: - original_desc = str(uuid.uuid4()) - name = str(uuid.uuid4()) - - c = defs.CRE( - id="243-243", - doctype=defs.Credoctypes.CRE, - description=original_desc, - name=name, - ) - self.assertIsNone( - self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() - ) - - # happy path, add new cre - newCRE = self.collection.add_cre(c) - dbcre = ( - self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() - ) # ensure transaction happened (commit() called) - self.assertIsNotNone(dbcre.id) - self.assertEqual(dbcre.name, c.name) - self.assertEqual(dbcre.description, c.description) - self.assertEqual(dbcre.external_id, c.id) - - # ensure the right thing got returned - self.assertEqual(newCRE.name, c.name) - - # ensure no accidental update (add only adds) - c.description = "description2" - newCRE = self.collection.add_cre(c) - dbcre = ( - self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() - ) - # ensure original description - self.assertEqual(dbcre.description, original_desc) - # ensure original description - self.assertEqual(newCRE.description, original_desc) - - def test_add_node(self) -> None: - original_section = str(uuid.uuid4()) - name = str(uuid.uuid4()) - - s = defs.Standard( - doctype=defs.Credoctypes.Standard, - section=original_section, - subsection=original_section, - name=name, - tags=["788-788", "b", "c"], - ) - - self.assertIsNone( - self.collection.session.query(db.Node) - .filter(db.Node.name == s.name) - .first() - ) - - # happy path, add new standard - newStandard = self.collection.add_node(s) - self.assertIsNotNone(newStandard) - - dbstandard = ( - self.collection.session.query(db.Node) - .filter(db.Node.name == s.name) - .first() - ) # ensure transaction happened (commit() called) - self.assertIsNotNone(dbstandard.id) - self.assertEqual(dbstandard.name, s.name) - self.assertEqual(dbstandard.section, s.section) - self.assertEqual(dbstandard.subsection, s.subsection) - self.assertEqual( - newStandard.name, s.name - ) # ensure the right thing got returned - self.assertEqual(dbstandard.ntype, s.doctype.value) - self.assertEqual(dbstandard.tags, ",".join(s.tags)) - # standards match on all of name,section, subsection <-- if you change even one of them it's a new entry - - def find_cres_of_cre(self) -> None: - dbcre = db.CRE(description="CREdesc1", name="CREname1") - groupless_cre = db.CRE(description="CREdesc2", name="CREname2") - dbgroup = db.CRE(description="Groupdesc1", name="GroupName1") - dbgroup2 = db.CRE(description="Groupdesc2", name="GroupName2") - - only_one_group = db.CRE(description="CREdesc3", name="CREname3") - - self.collection.session.add(dbcre) - self.collection.session.add(groupless_cre) - self.collection.session.add(dbgroup) - self.collection.session.add(dbgroup2) - self.collection.session.add(only_one_group) - self.collection.session.commit() - - internalLink = db.InternalLinks(cre=dbcre.id, group=dbgroup.id, type="Contains") - internalLink2 = db.InternalLinks( - cre=dbcre.id, group=dbgroup2.id, type="Contains" - ) - internalLink3 = db.InternalLinks( - cre=only_one_group.id, group=dbgroup.id, type="Contains" - ) - self.collection.session.add(internalLink) - self.collection.session.add(internalLink2) - self.collection.session.add(internalLink3) - self.collection.session.commit() - - # happy path, find cre with 2 groups - - groups = self.collection.find_cres_of_cre(dbcre) - if not groups: - self.fail("Expected exactly 2 cres") - self.assertEqual(len(groups), 2) - self.assertEqual(groups, [dbgroup, dbgroup2]) - - # find cre with 1 group - group = self.collection.find_cres_of_cre(only_one_group) - - if not group: - self.fail("Expected exactly 1 cre") - self.assertEqual(len(group), 1) - self.assertEqual(group, [dbgroup]) - - # ensure that None is return if there are no groups - groups = self.collection.find_cres_of_cre(groupless_cre) - self.assertIsNone(groups) - - def test_find_cres_of_standard(self) -> None: - dbcre = db.CRE(description="CREdesc1", name="CREname1") - dbgroup = db.CRE(description="CREdesc2", name="CREname2") - dbstandard1 = db.Node( - section="section1", - name="standard1", - ntype=defs.Standard.__name__, - ) - group_standard = db.Node( - section="section2", - name="standard2", - ntype=defs.Standard.__name__, - ) - lone_standard = db.Node( - section="section3", - name="standard3", - ntype=defs.Standard.__name__, - ) - - self.collection.session.add(dbcre) - self.collection.session.add(dbgroup) - self.collection.session.add(dbstandard1) - self.collection.session.add(group_standard) - self.collection.session.add(lone_standard) - self.collection.session.commit() - - self.collection.session.add(db.Links(cre=dbcre.id, node=dbstandard1.id)) - self.collection.session.add(db.Links(cre=dbgroup.id, node=dbstandard1.id)) - self.collection.session.add(db.Links(cre=dbgroup.id, node=group_standard.id)) - self.collection.session.commit() - - # happy path, 1 group and 1 cre link to 1 standard - cres = self.collection.find_cres_of_node(dbstandard1) - - if not cres: - self.fail("Expected 2 cres") - self.assertEqual(len(cres), 2) - self.assertEqual(cres, [dbcre, dbgroup]) - - # group links to standard - cres = self.collection.find_cres_of_node(group_standard) - - if not cres: - self.fail("Expected 1 cre") - self.assertEqual(len(cres), 1) - self.assertEqual(cres, [dbgroup]) - - # no links = None - cres = self.collection.find_cres_of_node(lone_standard) - self.assertIsNone(cres) - - def test_get_CREs(self) -> None: - """Given: a cre 'C1' that links to cres both as a group and a cre and other standards - return the CRE in Document format""" - collection = db.Node_collection() - dbc1 = db.CRE(external_id="123-123", description="gcCD1", name="gcC1") - dbc2 = db.CRE(description="gcCD2", name="gcC2", external_id="444-444") - dbc3 = db.CRE(description="gcCD3", name="gcC3", external_id="555-555") - db_id_only = db.CRE( - description="c_get_by_internal_id_only", - name="cgbiio", - external_id="666-666", - ) - dbs1 = db.Node( - ntype=defs.Standard.__name__, - name="gcS2", - section="gc1", - subsection="gc2", - link="gc3", - version="gc1.1.1", - ) - - dbs2 = db.Node( - ntype=defs.Standard.__name__, - name="gcS3", - section="gc1", - subsection="gc2", - link="gc3", - version="gc3.1.2", - ) - - parent_cre = db.CRE( - external_id="999-999", description="parent cre", name="pcre" - ) - parent_cre2 = db.CRE( - external_id="888-888", description="parent cre2", name="pcre2" - ) - partOf_cre = db.CRE( - external_id="777-777", description="part of cre", name="poc" - ) - - collection.session.add(dbc1) - collection.session.add(dbc2) - collection.session.add(dbc3) - collection.session.add(dbs1) - collection.session.add(dbs2) - collection.session.add(db_id_only) - - collection.session.add(parent_cre) - collection.session.add(parent_cre2) - collection.session.add(partOf_cre) - collection.session.commit() - - collection.session.add( - db.InternalLinks(type="Contains", group=dbc1.id, cre=dbc2.id) - ) - collection.session.add( - db.InternalLinks(type="Contains", group=dbc1.id, cre=dbc3.id) - ) - collection.session.add(db.Links(type="Linked To", cre=dbc1.id, node=dbs1.id)) - - collection.session.add( - db.InternalLinks( - type=defs.LinkTypes.Contains.value, - group=parent_cre.id, - cre=partOf_cre.id, - ) - ) - collection.session.add( - db.InternalLinks( - type=defs.LinkTypes.Contains.value, - group=parent_cre2.id, - cre=partOf_cre.id, - ) - ) - collection.session.commit() - self.maxDiff = None - - # we can retrieve children cres - self.assertEqual( - [ - db.CREfromDB(parent_cre).add_link( - defs.Link( - document=db.CREfromDB(partOf_cre), ltype=defs.LinkTypes.Contains - ) - ) - ], - collection.get_CREs(external_id=parent_cre.external_id), - ) - self.assertEqual( - [ - db.CREfromDB(parent_cre2).add_link( - defs.Link( - document=db.CREfromDB(partOf_cre), ltype=defs.LinkTypes.Contains - ) - ) - ], - collection.get_CREs(external_id=parent_cre2.external_id), - ) - - # we can retrieve children cres with inverted multiple (PartOf) links to their parents - self.assertEqual( - [ - db.CREfromDB(partOf_cre) - .add_link( - defs.Link( - document=db.CREfromDB(parent_cre), ltype=defs.LinkTypes.PartOf - ) - ) - .add_link( - defs.Link( - document=db.CREfromDB(parent_cre2), ltype=defs.LinkTypes.PartOf - ) - ) - ], - collection.get_CREs(external_id=partOf_cre.external_id), - ) - - cd1 = defs.CRE(id="123-123", description="gcCD1", name="gcC1") - cd2 = defs.CRE(id="444-444", description="gcCD2", name="gcC2") - cd3 = defs.CRE(id="555-555", description="gcCD3", name="gcC3") - c_id_only = defs.CRE( - id="666-666", description="c_get_by_internal_id_only", name="cgbiio" - ) - - expected = [ - copy(cd1) - .add_link( - defs.Link( - ltype=defs.LinkTypes.LinkedTo, - document=defs.Standard( - name="gcS2", - section="gc1", - subsection="gc2", - hyperlink="gc3", - version="gc1.1.1", - ), - ) - ) - .add_link( - defs.Link( - ltype=defs.LinkTypes.Contains, - document=copy(cd2), - ) - ) - .add_link(defs.Link(ltype=defs.LinkTypes.Contains, document=copy(cd3))) - ] - self.maxDiff = None - shallow_cd1 = copy(cd1) - shallow_cd1.links = [] - cd2.add_link(defs.Link(ltype=defs.LinkTypes.PartOf, document=shallow_cd1)) - cd3.add_link(defs.Link(ltype=defs.LinkTypes.PartOf, document=shallow_cd1)) - - # empty returns empty - self.assertEqual([], collection.get_CREs()) - - # getting "group cre 1" by name returns gcC1 - res = collection.get_CREs(name="gcC1") - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting "group cre 1" by id returns gcC1 - res = collection.get_CREs(external_id="123-123") - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting "group cre 1" by partial id returns gcC1 - res = collection.get_CREs(external_id="12%", partial=True) - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting "group cre 1" by partial name returns gcC1, gcC2 and gcC3 - res = collection.get_CREs(name="gcC%", partial=True) - self.assertEqual(3, len(res)) - self.assertCountEqual( - [expected[0].todict(), cd2.todict(), cd3.todict()], - [r.todict() for r in res], - ) - - # getting "group cre 1" by partial name and partial id returns gcC1 - res = collection.get_CREs(external_id="1%", name="gcC%", partial=True) - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting "group cre 1" by description returns gcC1 - res = collection.get_CREs(description="gcCD1") - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting "group cre 1" by partial id and partial description returns gcC1 - res = collection.get_CREs(external_id="1%", description="gcC%", partial=True) - self.assertEqual(len(expected), len(res)) - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # getting all the gcC* cres by partial name and partial description returns gcC1, gcC2, gcC3 - res = collection.get_CREs(description="gcC%", name="gcC%", partial=True) - want = [expected[0], cd2, cd3] - for el in res: - found = False - for wel in want: - if el.todict() == wel.todict(): - found = True - self.assertTrue(found) - - self.assertEqual([], collection.get_CREs(external_id="123-123", name="gcC5")) - self.assertEqual([], collection.get_CREs(external_id="1234")) - self.assertEqual([], collection.get_CREs(name="gcC5")) - - # add a standard to gcC1 - collection.session.add(db.Links(type="Linked To", cre=dbc1.id, node=dbs2.id)) - - only_gcS2 = deepcopy(expected) # save a copy of the current expected - expected[0].add_link( - defs.Link( - ltype=defs.LinkTypes.LinkedTo, - document=defs.Standard( - name="gcS3", - section="gc1", - subsection="gc2", - hyperlink="gc3", - version="gc3.1.2", - ), - ) - ) - # we can retrieve the cre with the standard - res = collection.get_CREs(name="gcC1") - self.assertCountEqual(expected[0].todict(), res[0].todict()) - - # we can retrieve ONLY the standard - res = collection.get_CREs(name="gcC1", include_only=["gcS2"]) - self.assertDictEqual(only_gcS2[0].todict(), res[0].todict()) - - ccd2 = copy(cd2) - ccd2.links = [] - ccd3 = copy(cd3) - ccd3.links = [] - no_standards = [ - copy(cd1) - .add_link( - defs.Link( - ltype=defs.LinkTypes.Contains, - document=ccd2, - ) - ) - .add_link(defs.Link(ltype=defs.LinkTypes.Contains, document=ccd3)) - ] - - # if the standard is not linked, we retrieve as normal - res = collection.get_CREs(name="gcC1", include_only=["gcS0"]) - self.assertEqual(no_standards, res) - - self.assertEqual([c_id_only], collection.get_CREs(internal_id=db_id_only.id)) - - def test_get_standards(self) -> None: - """Given: a Standard 'S1' that links to cres - return the Standard in Document format""" - collection = db.Node_collection() - docs: Dict[str, Union[db.CRE, db.Node]] = { - "dbc1": db.CRE(external_id="123-123", description="CD1", name="C1"), - "dbc2": db.CRE(external_id="222-222", description="CD2", name="C2"), - "dbc3": db.CRE(external_id="333-333", description="CD3", name="C3"), - "dbs1": db.Node( - ntype=defs.Standard.__name__, - name="S1", - section="111-111", - section_id="123-123", - subsection="222-222", - link="333-333", - version="4", - ), - } - links = [("dbc1", "dbs1"), ("dbc2", "dbs1"), ("dbc3", "dbs1")] - for k, v in docs.items(): - collection.session.add(v) - collection.session.commit() - - for cre, standard in links: - collection.session.add( - db.Links(type="Linked To", cre=docs[cre].id, node=docs[standard].id) - ) - collection.session.commit() - - expected = [ - defs.Standard( - name="S1", - section="111-111", - sectionID="123-123", - subsection="222-222", - hyperlink="333-333", - version="4", - links=[ - defs.Link( - ltype=defs.LinkTypes.LinkedTo, - document=defs.CRE(id="123-123", name="C1", description="CD1"), - ), - defs.Link( - ltype=defs.LinkTypes.LinkedTo, - document=defs.CRE(id="222-222", name="C2", description="CD2"), - ), - defs.Link( - ltype=defs.LinkTypes.LinkedTo, - document=defs.CRE(id="333-333", name="C3", description="CD3"), - ), - ], - ) - ] - - res = collection.get_nodes(name="S1") - self.assertEqual(expected, res) - - def test_get_nodes_with_pagination(self) -> None: - """Given: a Standard 'S1' that links to cres - return the Standard in Document format and the total pages and the page we are in - """ - collection = db.Node_collection() - docs: Dict[str, Union[db.Node, db.CRE]] = { - "dbc1": db.CRE(external_id="123-123", description="CD1", name="C1"), - "dbc2": db.CRE(external_id="222-222", description="CD2", name="C2"), - "dbc3": db.CRE(external_id="333-333", description="CD3", name="C3"), - "dbs1": db.Node( - name="S1", - section="111-111", - section_id="123-123", - subsection="222-222", - link="333-333", - version="4", - ntype=defs.Standard.__name__, - ), - } - links = [("dbc1", "dbs1"), ("dbc2", "dbs1"), ("dbc3", "dbs1")] - for k, v in docs.items(): - collection.session.add(v) - collection.session.commit() - - for cre, standard in links: - collection.session.add( - db.Links( - cre=docs[cre].id, - node=docs[standard].id, - type=defs.LinkTypes.LinkedTo, - ) - ) - collection.session.commit() - - expected = [ - defs.Standard( - name="S1", - section="111-111", - sectionID="123-123", - subsection="222-222", - hyperlink="333-333", - version="4", - links=[ - defs.Link( - document=defs.CRE(name="C1", description="CD1", id="123-123"), - ltype=defs.LinkTypes.LinkedTo, - ), - defs.Link( - document=defs.CRE(id="222-222", name="C2", description="CD2"), - ltype=defs.LinkTypes.LinkedTo, - ), - defs.Link( - document=defs.CRE(id="333-333", name="C3", description="CD3"), - ltype=defs.LinkTypes.LinkedTo, - ), - ], - ) - ] - total_pages, res, _ = collection.get_nodes_with_pagination(name="S1") - self.assertEqual(total_pages, 1) - self.assertEqual(expected, res) - - only_c1 = [ - defs.Standard( - name="S1", - section="111-111", - sectionID="123-123", - subsection="222-222", - hyperlink="333-333", - version="4", - links=[ - defs.Link( - document=defs.CRE(name="C1", description="CD1", id="123-123"), - ltype=defs.LinkTypes.LinkedTo, - ) - ], - ) - ] - _, res, _ = collection.get_nodes_with_pagination(name="S1", include_only=["C1"]) - self.assertEqual(only_c1, res) - _, res, _ = collection.get_nodes_with_pagination( - name="S1", include_only=["123-123"] - ) - self.assertEqual(only_c1, res) - - self.assertEqual( - collection.get_nodes_with_pagination(name="this should not exit"), - (None, None, None), - ) - - def test_add_internal_link(self) -> None: - """test that internal links are added successfully, - edge cases: - cre or group don't exist - called on a cycle scenario""" - - cres = { - "dbca": self.collection.add_cre( - defs.CRE(id="111-111", description="CA", name="CA") - ), - "dbcb": self.collection.add_cre( - defs.CRE(id="222-222", description="CB", name="CB") - ), - "dbcc": self.collection.add_cre( - defs.CRE(id="333-333", description="CC", name="CC") - ), - } - - # happy path - self.collection.add_internal_link( - higher=cres["dbca"], lower=cres["dbcb"], ltype=defs.LinkTypes.Related - ) - - # "happy path, internal link exists" - res = ( - self.collection.session.query(db.InternalLinks) - .filter( - db.InternalLinks.group == cres["dbca"].id, - db.InternalLinks.cre == cres["dbcb"].id, - ) - .first() - ) - self.assertEqual((res.group, res.cre), (cres["dbca"].id, cres["dbcb"].id)) - - # no cycle, free to insert - self.collection.add_internal_link( - higher=cres["dbcb"], lower=cres["dbcc"], ltype=defs.LinkTypes.Related - ) - res = ( - self.collection.session.query(db.InternalLinks) - .filter( - db.InternalLinks.group == cres["dbcb"].id, - db.InternalLinks.cre == cres["dbcc"].id, - ) - .first() - ) - self.assertEqual((res.group, res.cre), (cres["dbcb"].id, cres["dbcc"].id)) - - # introdcues a cycle, should not be inserted - self.collection.add_internal_link( - higher=cres["dbcc"], lower=cres["dbca"], ltype=defs.LinkTypes.Related - ) - - # cycles are not inserted branch - none_res = ( - self.collection.session.query(db.InternalLinks) - .filter( - db.InternalLinks.group == cres["dbcc"].id, - db.InternalLinks.cre == cres["dbca"].id, - ) - .one_or_none() - ) - self.assertIsNone(none_res) - - def test_text_search(self) -> None: - """Given: - a cre(id="111-111"23-456,name=foo,description='lorem ipsum foo+bar') - a standard(name=Bar,section=blah,subsection=foo, hyperlink='https://example.com/blah/foo') - a standard(name=Bar,section=blah,subsection=foo1, hyperlink='https://example.com/blah/foo1') - a standard(name=Bar,section=blah1,subsection=foo, hyperlink='https://example.com/blah1/foo') - - full_text_search('123-456') returns cre:foo - full_text_search('CRE:foo') and full_text_search('CRE foo') returns cre:foo - full_text_search('CRE:123-456') and full_text_search('CRE 123-456') returns cre:foo - - full_text_search('Standard:Bar') and full_text_search('Standard Bar') returns: [standard:Bar:blah:foo, - standard:Bar:blah:foo1, - standard:Bar:blah1:foo] - - full_text_search('Standard:blah') and full_text_search('Standard blah') returns [standard:Bar::blah:foo, - standard:Bar:blah:foo1] - full_text_search('Standard:blah:foo') returns [standard:Bar:blah:foo] - full_text_search('Standard:foo') returns [standard:Bar:blah:foo, - standard:Bar:blah1:foo] - - - full_text_search('ipsum') returns cre:foo - full_text_search('foo') returns [cre:foo,standard:Bar:blah:foo, standard:Bar:blah:foo1,standard:Bar:blah1:foo] - """ - collection = db.Node_collection() - cre = defs.CRE( - id="123-456", name="textSearchCRE", description="lorem ipsum tsSection+tsC" - ) - collection.add_cre(cre) - - s1 = defs.Standard( - name="textSearchStandard", - section="tsSection", - subsection="tsSubSection", - hyperlink="https://example.com/tsSection/tsSubSection", - ) - collection.add_node(s1) - s2 = defs.Standard( - name="textSearchStandard", - section="tsSection", - subsection="tsSubSection1", - hyperlink="https://example.com/tsSection/tsSubSection1", - ) - collection.add_node(s2) - s3 = defs.Standard( - name="textSearchStandard", - section="tsSection1", - subsection="tsSubSection1", - hyperlink="https://example.com/tsSection1/tsSubSection1", - ) - collection.add_node(s3) - t1 = defs.Tool( - name="textSearchTool", - tooltype=defs.ToolTypes.Offensive, - hyperlink="https://example.com/textSearchTool", - description="test text search with tool", - sectionID="15", - section="rule 15", - ) - collection.add_node(t1) - collection.session.commit() - expected: Dict[str, List[Any]] = { - "123-456": [cre], - "CRE:textSearchCRE": [cre], - "CRE textSearchCRE": [cre], - "CRE:123-456": [cre], - "CRE 123-456": [cre], - "Standard:textSearchStandard": [s1, s2, s3], - "Standard textSearchStandard": [s1, s2, s3], - "Standard:tsSection": [s1, s2], - "Standard tsSection": [s1, s2], - "Standard:tsSection:tsSubSection1": [s2], - "Standard tsSection tsSubSection1": [s2], - "Standard:tsSubSection1": [s2, s3], - "Standard tsSubSection1": [s2, s3], - "Standard:https://example.com/tsSection/tsSubSection1": [s2], - "Standard https://example.com/tsSection1/tsSubSection1": [s3], - "https://example.com/tsSection": [s1, s2, s3], - "ipsum": [cre], - "tsSection": [cre, s1, s2, s3], - "https://example.com/textSearchTool": [t1], - "text search": [t1], - } - self.maxDiff = None - for k, val in expected.items(): - res = self.collection.text_search(k) - self.assertCountEqual(res, val) - - def test_dbNodeFromNode(self) -> None: - data = { - "tool": defs.Tool( - name="fooTool", - description="lorem ipsum tsSection+tsC", - tooltype=defs.ToolTypes.Defensive, - tags=["111-111", "222-222", "333-333"], - ), - "standard": defs.Standard( - name="stand", section="s1", subsection="s2", version="s3" - ), - "code": defs.Code( - name="ccc", - description="c2", - hyperlink="https://example.com/code/hyperlink", - tags=["111-111", "222-222"], - ), - } - expected = { - "tool": db.Node( - name="fooTool", - description="lorem ipsum tsSection+tsC", - tags=",".join( - [defs.ToolTypes.Defensive.value, "111-111", "222-222", "333-333"] - ), - ntype=defs.Credoctypes.Tool.value, - ), - "standard": db.Node( - name="stand", - section="s1", - subsection="s2", - version="s3", - ntype=defs.Credoctypes.Standard.value, - ), - "code": db.Node( - name="ccc", - description="c2", - link="https://example.com/code/hyperlink", - tags="1,2", - ntype=defs.Credoctypes.Code.value, - ), - } - for k, v in data.items(): - nd = db.dbNodeFromNode(v) - for vname, var in vars(nd).items(): - if var and not vname.startswith("_"): - self.assertEqual(var, vars(expected[k]).get(vname)) - - def test_nodeFromDB(self) -> None: - expected = { - "tool": defs.Tool( - name="fooTool", - description="lorem ipsum tsSection+tsC", - tooltype=defs.ToolTypes.Defensive, - tags=["111-111", "222-222", "333-333"], - ), - "standard": defs.Standard( - name="stand", section="s1", subsection="s2", version="s3" - ), - "code": defs.Code( - name="ccc", - description="c2", - hyperlink="https://example.com/code/hyperlink", - tags=["111-111", "222-222"], - ), - } - data = { - "tool": db.Node( - name="fooTool", - description="lorem ipsum tsSection+tsC", - tags=",".join( - [defs.ToolTypes.Defensive.value, "111-111", "222-222", "333-333"] - ), - ntype=defs.Credoctypes.Tool.value, - ), - "standard": db.Node( - name="stand", - section="s1", - subsection="s2", - version="s3", - ntype=defs.Credoctypes.Standard.value, - ), - "code": db.Node( - name="ccc", - description="c2", - link="https://example.com/code/hyperlink", - tags="111-111,222-222", - ntype=defs.Credoctypes.Code.value, - ), - } - for k, v in data.items(): - nd = db.nodeFromDB(v) - for vname, var in vars(nd).items(): - if var and not vname.startswith("_"): - self.assertCountEqual(var, vars(expected[k]).get(vname)) - - def test_object_select(self) -> None: - dbnode1 = db.Node( - name="fooTool", - description="lorem ipsum tsSection+tsC", - tags=f"{defs.ToolTypes.Defensive.value},1", - ) - dbnode2 = db.Node( - name="fooTool", - description="lorem2", - link="https://example.com/foo/bar", - tags=f"{defs.ToolTypes.Defensive.value},1", - ) - - self.collection = db.Node_collection() - collection = db.Node_collection() - collection.session.add(dbnode1) - collection.session.add(dbnode2) - self.assertEqual(collection.object_select(dbnode1), [dbnode1]) - self.assertEqual(collection.object_select(dbnode2), [dbnode2]) - self.assertCountEqual( - collection.object_select(db.Node(name="fooTool")), [dbnode1, dbnode2] - ) - - self.assertEqual(collection.object_select(None), []) - - def test_get_root_cres(self): - """Given: - 6 CRES: - * C0 <-- Root - * C1 <-- Root - * C2 Part Of C0 - * C3 Part Of C1 - * C4 Part Of C2 - * C5 Related to C0 - * C6 Part Of C1 - * C7 Contains C6 <-- Root - 3 Nodes: - * N0 Unlinked - * N1 Linked To C1 - * N2 Linked to C2 - * N3 Linked to C3 - * N4 Linked to C4 - Get_root_cres should return C0, C1 - """ - cres = [] - nodes = [] - dbcres = [] - dbnodes = [] - - # clean the db from setup - sqla.session.remove() - sqla.drop_all() - sqla.create_all() - - collection = db.Node_collection().with_graph() - - for i in range(0, 8): - if i == 0 or i == 1: - cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) - else: - cres.append(defs.CRE(name=f"C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) - - dbcres.append(collection.add_cre(cres[i])) - nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) - dbnodes.append(collection.add_node(nodes[i])) - cres[i].add_link( - defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) - ) - collection.add_link( - cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo - ) - - cres[0].add_link( - defs.Link(document=cres[2].shallow_copy(), ltype=defs.LinkTypes.Contains) - ) - cres[1].add_link( - defs.Link(document=cres[3].shallow_copy(), ltype=defs.LinkTypes.Contains) - ) - cres[2].add_link( - defs.Link(document=cres[4].shallow_copy(), ltype=defs.LinkTypes.Contains) - ) - - cres[3].add_link( - defs.Link(document=cres[5].shallow_copy(), ltype=defs.LinkTypes.Contains) - ) - cres[6].add_link( - defs.Link(document=cres[7].shallow_copy(), ltype=defs.LinkTypes.PartOf) - ) - collection.add_internal_link( - higher=dbcres[0], lower=dbcres[2], ltype=defs.LinkTypes.Contains - ) - collection.add_internal_link( - higher=dbcres[1], lower=dbcres[3], ltype=defs.LinkTypes.Contains - ) - collection.add_internal_link( - higher=dbcres[2], lower=dbcres[4], ltype=defs.LinkTypes.Contains - ) - collection.add_internal_link( - higher=dbcres[3], lower=dbcres[5], ltype=defs.LinkTypes.Contains - ) - collection.add_internal_link( - higher=dbcres[7], lower=dbcres[6], ltype=defs.LinkTypes.Contains - ) - cres[7].add_link( - defs.Link(document=cres[6].shallow_copy(), ltype=defs.LinkTypes.Contains) - ) - - root_cres = collection.get_root_cres() - self.maxDiff = None - self.assertCountEqual(root_cres, [cres[0], cres[1], cres[7]]) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_disconnected(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = False - gap_mock.return_value = (None, None) - - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), None) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_no_nodes(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - - gap_mock.return_value = ([], []) - self.assertEqual( - db.gap_analysis(collection.neo_db, ["788-788", "b"]), - (["788-788", "b"], {}, {}), - ) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_no_links(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - - gap_mock.return_value = ([defs.CRE(name="bob", id="111-111")], []) - self.maxDiff = None - self.assertEqual( - db.gap_analysis(collection.neo_db, ["788-788", "b"]), - ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": {}, - "extra": 0, - } - }, - {"111-111": {"paths": {}}}, - ), - ) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_one_link(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="788-788")], - [ - { - "start": defs.CRE(name="bob", id="788-788"), - "end": defs.CRE(name="bob", id="788-789"), - "path": path, - } - ], - ) - expected = ( - ["788-788", "788-789"], - { - "788-788": { - "start": defs.CRE(name="bob", id="788-788"), - "paths": { - "788-789": { - "end": defs.CRE(name="bob", id="788-789"), - "path": path, - "score": 0, - } - }, - "extra": 0, - } - }, - {"788-788": {"paths": {}}}, - ) - self.maxDiff = None - self.assertEqual( - db.gap_analysis(collection.neo_db, ["788-788", "788-789"]), expected - ) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_one_weak_link(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="111-111"), - }, - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="222-222"), - }, - { - "end": defs.CRE(name="bob", id="333-333"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="222-222"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="111-111")], - [ - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - } - ], - ) - expected = ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": {}, - "extra": 1, - } - }, - { - "111-111": { - "paths": { - "222-222": { - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - "score": 4, - } - } - } - }, - ) - self.maxDiff = None - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), expected) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_duplicate_link_path_existing_lower(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - path2 = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="111-111")], - [ - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - }, - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path2, - }, - ], - ) - expected = ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": { - "222-222": { - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - "score": 0, - } - }, - "extra": 0, - }, - }, - {"111-111": {"paths": {}}}, - ) - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), expected) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_duplicate_link_path_existing_lower_new_in_extras( - self, gap_mock - ): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - path2 = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="111-111")], - [ - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - }, - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path2, - }, - ], - ) - expected = ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": { - "222-222": { - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - "score": 0, - } - }, - "extra": 0, - }, - }, - {"111-111": {"paths": {}}}, - ) - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), expected) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_duplicate_link_path_existing_higher(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - path2 = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="111-111")], - [ - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path2, - }, - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - }, - ], - ) - expected = ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": { - "222-222": { - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - "score": 0, - } - }, - "extra": 0, - } - }, - {"111-111": {"paths": {}}}, - ) - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), expected) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_duplicate_link_path_existing_higher_and_in_extras( - self, gap_mock - ): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - path2 = [ - { - "end": defs.CRE(name="bob", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - { - "end": defs.CRE(name="bob", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob", id="788-788"), - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob", id="111-111")], - [ - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path2, - }, - { - "start": defs.CRE(name="bob", id="111-111"), - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - }, - ], - ) - expected = ( - ["788-788", "b"], - { - "111-111": { - "start": defs.CRE(name="bob", id="111-111"), - "paths": { - "222-222": { - "end": defs.CRE(name="bob", id="222-222"), - "path": path, - "score": 0, - } - }, - "extra": 0, - } - }, - {"111-111": {"paths": {}}}, - ) - self.assertEqual(db.gap_analysis(collection.neo_db, ["788-788", "b"]), expected) - - @patch.object(db.NEO_DB, "gap_analysis") - def test_gap_analysis_dump_to_cache(self, gap_mock): - collection = db.Node_collection() - collection.neo_db.connected = True - path = [ - { - "end": defs.CRE(name="bob1", id="111-111"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob7", id="788-788"), - "score": 0, - }, - { - "end": defs.CRE(name="bob2", id="222-222"), - "relationship": "RELATED", - "start": defs.CRE(name="bob1", id="111-111"), - "score": 2, - }, - { - "end": defs.CRE(name="bob1", id="111-111"), - "relationship": "RELATED", - "start": defs.CRE(name="bob2", id="222-222"), - "score": 2, - }, - { - "end": defs.CRE(name="bob3", id="333-333"), - "relationship": "LINKED_TO", - "start": defs.CRE(name="bob2", id="222-222"), - "score": 4, - }, - ] - gap_mock.return_value = ( - [defs.CRE(name="bob7", id="788-788")], - [ - { - "start": defs.CRE(name="bob7", id="788-788"), - "end": defs.CRE(name="bob2", id="222-222"), - "path": path, - } - ], - ) - - expected_response = ( - ["788-788", "222-222"], - { - "788-788": { - "start": defs.CRE(name="bob7", id="788-788"), - "paths": {}, - "extra": 1, - } - }, - { - "788-788": { - "paths": { - "222-222": { - "end": defs.CRE(name="bob2", id="222-222"), - "path": path, - "score": 4, - } - } - } - }, - ) - response = db.gap_analysis(collection.neo_db, ["788-788", "222-222"]) - - self.maxDiff = None - self.assertEqual( - response, (expected_response[0], expected_response[1], expected_response[2]) - ) - self.assertEqual( - collection.gap_analysis_exists(make_resources_key(["788-788", "222-222"])), - True, - ) - self.assertEqual( - collection.get_gap_analysis_result( - make_resources_key(["788-788", "222-222"]) - ), - flask_json.dumps({"result": expected_response[1]}), - ) - self.assertEqual( - collection.get_gap_analysis_result( - make_subresources_key(["788-788", "222-222"], "788-788") - ), - flask_json.dumps({"result": expected_response[2]["788-788"]}), - ) - - def test_neo_db_parse_node_code(self): - name = "name" - description = "description" - tags = "tags" - version = "version" - hyperlink = "version" - expected = defs.Code( - name=name, - description=description, - tags=tags, - version=version, - hyperlink=hyperlink, - links=[ - defs.Link( - defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" - ) - ], - ) - graph_node = db.NeoCode( - name=name, - description=description, - tags=tags, - version=version, - hyperlink=hyperlink, - related=[ - db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), - ], - ) - - self.assertEqual(db.NEO_DB.parse_node(graph_node).todict(), expected.todict()) - - def test_neo_db_parse_node_standard(self): - name = "name" - description = "description" - tags = "tags" - version = "version" - section = "section" - sectionID = "sectionID" - subsection = "subsection" - hyperlink = "version" - expected = defs.Standard( - name=name, - description=description, - tags=tags, - version=version, - section=section, - sectionID=sectionID, - subsection=subsection, - hyperlink=hyperlink, - links=[ - defs.Link( - defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" - ) - ], - ) - graph_node = db.NeoStandard( - name=name, - description=description, - tags=tags, - version=version, - section=section, - section_id=sectionID, - subsection=subsection, - hyperlink=hyperlink, - related=[ - db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), - ], - ) - self.assertEqual(db.NEO_DB.parse_node(graph_node).todict(), expected.todict()) - - def test_neo_db_parse_node_tool(self): - name = "name" - description = "description" - tags = "tags" - version = "version" - section = "section" - sectionID = "sectionID" - subsection = "subsection" - hyperlink = "version" - tooltype = defs.ToolTypes.Defensive - expected = defs.Tool( - name=name, - tooltype=tooltype, - description=description, - tags=tags, - version=version, - section=section, - sectionID=sectionID, - subsection=subsection, - hyperlink=hyperlink, - links=[ - defs.Link( - defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" - ) - ], - ) - graph_node = db.NeoTool( - name=name, - description=description, - tooltype=tooltype, - tags=tags, - version=version, - section=section, - section_id=sectionID, - subsection=subsection, - hyperlink=hyperlink, - related=[ - db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), - ], - ) - self.assertEqual(db.NEO_DB.parse_node(graph_node).todict(), expected.todict()) - - def test_neo_db_parse_node_cre(self): - name = "name" - description = "description" - tags = "tags" - external_id = "123-123" - expected = defs.CRE( - name=name, - description=description, - id=external_id, - tags=tags, - links=[ - defs.Link( - defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Contains" - ), - defs.Link( - defs.CRE(id="123-123", description="gcCD3", name="gcC3"), "Contains" - ), - defs.Link( - defs.Standard( - hyperlink="gc3", - name="gcS2", - section="gc1", - subsection="gc2", - version="gc1.1.1", - ), - "Linked To", - ), - ], - ) - graph_node = db.NeoCRE( - name=name, - description=description, - tags=tags, - external_id=external_id, - contained_in=[], - contains=[ - db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), - db.NeoCRE(external_id="123-123", description="gcCD3", name="gcC3"), - ], - linked=[ - db.NeoStandard( - hyperlink="gc3", - name="gcS2", - section="gc1", - subsection="gc2", - version="gc1.1.1", - ) - ], - same_as=[], - related=[], - auto_linked_to=[], - ) - - parsed = db.NEO_DB.parse_node(graph_node) - self.maxDiff = None - self.assertEqual(parsed.todict(), expected.todict()) - - def test_neo_db_parse_node_no_links_cre(self): - name = "name" - description = "description" - tags = "tags" - external_id = "123-123" - expected = defs.CRE( - name=name, description=description, id=external_id, tags=tags, links=[] - ) - graph_node = db.NeoCRE( - name=name, - description=description, - tags=tags, - external_id=external_id, - contained_in=[], - contains=[ - db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), - db.NeoCRE(external_id="123-123", description="gcCD3", name="gcC3"), - ], - linked=[ - db.NeoStandard( - hyperlink="gc3", - name="gcS2", - section="gc1", - subsection="gc2", - version="gc1.1.1", - ) - ], - same_as=[], - related=[], - ) - - parsed = db.NEO_DB.parse_node_no_links(graph_node) - self.maxDiff = None - self.assertEqual(parsed.todict(), expected.todict()) - - def test_neo_db_parse_node_Document(self): - name = "name" - id = "id" - description = "description" - tags = "tags" - graph_node = db.NeoDocument( - name=name, - document_id=id, - description=description, - tags=tags, - ) - with self.assertRaises(Exception) as cm: - db.NEO_DB.parse_node(graph_node) - - self.assertEqual(str(cm.exception), "Shouldn't be parsing a NeoDocument") - - def test_neo_db_parse_node_Node(self): - name = "name" - id = "id" - description = "description" - tags = "tags" - graph_node = db.NeoNode( - name=name, - document_id=id, - description=description, - tags=tags, - ) - with self.assertRaises(Exception) as cm: - db.NEO_DB.parse_node(graph_node) - - self.assertEqual(str(cm.exception), "Shouldn't be parsing a NeoNode") - - def test_get_embeddings_by_doc_type_paginated(self): - """Given: a range of embedding for Nodes and a range of embeddings for CREs - when called with doc_type CRE return the cre embeddings - when called with doc_type Standard/Tool return the node embeddings""" - # add cre embeddings - cre_embeddings = [] - for i in range(0, 10): - dbca = db.CRE(external_id=f"{i}", description=f"C{i}", name=f"C{i}") - self.collection.session.add(dbca) - self.collection.session.commit() - - embeddings = [random.uniform(-1, 1) for e in range(0, 768)] - embeddings_text = "".join( - random.choices(string.ascii_uppercase + string.digits, k=100) - ) - cre_embeddings.append( - self.collection.add_embedding( - db_object=dbca, - doctype=defs.Credoctypes.CRE.value, - embeddings=embeddings, - embedding_text=embeddings_text, - ) - ) - - # add node embeddings - node_embeddings = [] - for i in range(0, 10): - dbsa = db.Node( - subsection=f"4.5.{i}", - section=f"FooStand-{i}", - name="BarStand", - link="https://example.com", - ntype=defs.Credoctypes.Standard.value, - ) - self.collection.session.add(dbsa) - self.collection.session.commit() - - embeddings = [random.uniform(-1, 1) for e in range(0, 768)] - embeddings_text = "".join( - random.choices(string.ascii_uppercase + string.digits, k=100) - ) - ne = self.collection.add_embedding( - db_object=dbsa, - doctype=defs.Credoctypes.Standard.value, - embeddings=embeddings, - embedding_text=embeddings_text, - ) - node_embeddings.append(ne) - - ( - cre_emb, - total_pages, - curr_page, - ) = self.collection.get_embeddings_by_doc_type_paginated( - defs.Credoctypes.CRE.value, page=1, per_page=1 - ) - self.assertNotEqual(list(cre_emb.keys())[0], "") - self.assertIn(list(cre_emb.keys())[0], list([e.cre_id for e in cre_embeddings])) - self.assertNotIn( - list(cre_emb.keys())[0], list([e.node_id for e in cre_embeddings]) - ) - self.assertEqual(total_pages, 10) - self.assertEqual(curr_page, 1) - - ( - node_emb, - total_pages, - curr_page, - ) = self.collection.get_embeddings_by_doc_type_paginated( - defs.Credoctypes.Standard.value, page=1, per_page=1 - ) - self.assertNotEqual(list(node_emb.keys())[0], "") - self.assertIn( - list(node_emb.keys())[0], list([e.node_id for e in node_embeddings]) - ) - self.assertNotIn( - list(node_emb.keys())[0], list([e.cre_id for e in cre_embeddings]) - ) - self.assertEqual(total_pages, 10) - self.assertEqual(curr_page, 1) - - ( - tool_emb, - total_pages, - curr_page, - ) = self.collection.get_embeddings_by_doc_type_paginated( - defs.Credoctypes.Tool.value, page=1, per_page=1 - ) - self.assertEqual(total_pages, 0) - self.assertEqual(tool_emb, {}) - - def test_get_embeddings_by_doc_type(self): - """Given: a range of embedding for Nodes and a range of embeddings for CREs - when called with doc_type CRE return the cre embeddings - when called with doc_type Standard/Tool return the node embeddings""" - # add cre embeddings - cre_embeddings = [] - for i in range(0, 10): - dbca = db.CRE(external_id=f"{i}", description=f"C{i}", name=f"C{i}") - self.collection.session.add(dbca) - self.collection.session.commit() - - embeddings = [random.uniform(-1, 1) for e in range(0, 768)] - embeddings_text = "".join( - random.choices(string.ascii_uppercase + string.digits, k=100) - ) - cre_embeddings.append( - self.collection.add_embedding( - db_object=dbca, - doctype=defs.Credoctypes.CRE.value, - embeddings=embeddings, - embedding_text=embeddings_text, - ) - ) - - # add node embeddings - node_embeddings = [] - for i in range(0, 10): - dbsa = db.Node( - subsection=f"4.5.{i}", - section=f"FooStand-{i}", - name="BarStand", - link="https://example.com", - ntype=defs.Credoctypes.Standard.value, - ) - self.collection.session.add(dbsa) - self.collection.session.commit() - - embeddings = [random.uniform(-1, 1) for e in range(0, 768)] - embeddings_text = "".join( - random.choices(string.ascii_uppercase + string.digits, k=100) - ) - ne = self.collection.add_embedding( - db_object=dbsa, - doctype=defs.Credoctypes.Standard.value, - embeddings=embeddings, - embedding_text=embeddings_text, - ) - node_embeddings.append(ne) - - cre_emb = self.collection.get_embeddings_by_doc_type(defs.Credoctypes.CRE.value) - self.assertNotEqual(list(cre_emb.keys())[0], "") - self.assertIn(list(cre_emb.keys())[0], list([e.cre_id for e in cre_embeddings])) - self.assertNotIn( - list(cre_emb.keys())[0], list([e.node_id for e in cre_embeddings]) - ) - - node_emb = self.collection.get_embeddings_by_doc_type( - defs.Credoctypes.Standard.value - ) - self.assertNotEqual(list(node_emb.keys())[0], "") - self.assertIn( - list(node_emb.keys())[0], list([e.node_id for e in node_embeddings]) - ) - self.assertNotIn( - list(node_emb.keys())[0], list([e.cre_id for e in cre_embeddings]) - ) - - tool_emb = self.collection.get_embeddings_by_doc_type( - defs.Credoctypes.Tool.value - ) - self.assertEqual(tool_emb, {}) - - def test_get_standard_names(self): - for s in ["sa", "sb", "sc", "sd"]: - for sub in ["suba", "subb", "subc", "subd"]: - self.collection.add_node( - defs.Standard(name=s, section=sub, subsection=sub) - ) - self.assertCountEqual( - ["BarStand", "Unlinked", "sa", "sb", "sc", "sd"], - self.collection.standards(), - ) - - def test_all_cres_with_pagination(self): - """""" - cres = [] - nodes = [] - dbcres = [] - dbnodes = [] - sqla.session.remove() - sqla.drop_all() - sqla.create_all() - collection = db.Node_collection() - for i in range(0, 8): - if i == 0 or i == 1: - cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) - else: - cres.append(defs.CRE(name=f"C{i}", id=f"{i}")) - - dbcres.append(collection.add_cre(cres[i])) - nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) - dbnodes.append(collection.add_node(nodes[i])) - cres[i].add_link( - defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) - ) - collection.add_link( - cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo - ) - - collection.session.commit() - - paginated_cres, page, total_pages = collection.all_cres_with_pagination( - page=1, per_page=2 - ) - self.maxDiff = None - # from pprint import pprint - # pprint(cres) - self.assertEqual(paginated_cres, [cres[0], cres[1]]) - self.assertEqual(page, 1) - self.assertEqual(total_pages, 4) - - def test_all_cres_with_pagination(self): - """""" - cres = [] - nodes = [] - dbcres = [] - dbnodes = [] - sqla.session.remove() - sqla.drop_all() - sqla.create_all() - collection = db.Node_collection() - for i in range(0, 8): - if i == 0 or i == 1: - cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) - else: - cres.append(defs.CRE(name=f"C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) - - dbcres.append(collection.add_cre(cres[i])) - nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) - dbnodes.append(collection.add_node(nodes[i])) - cres[i].add_link( - defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) - ) - collection.add_link( - cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo - ) - - collection.session.commit() - - paginated_cres, page, total_pages = collection.all_cres_with_pagination( - page=1, per_page=2 - ) - self.maxDiff = None - self.assertEqual(paginated_cres, [cres[0], cres[1]]) - self.assertEqual(page, 1) - self.assertEqual(total_pages, 4) - - def test_get_cre_hierarchy(self) -> None: - # this needs a clean database and a clean graph so reinit everything - # sqla.session.remove() - # sqla.drop_all() - # sqla.create_all() - collection = self.collection # db.Node_collection().with_graph() - # collection.graph.with_graph(graph=nx.DiGraph(), graph_data=[]) - - _, inputDocs = export_format_data() - importItems = [] - for name, items in inputDocs.items(): - for item in items: - importItems.append(item) - if name == defs.Credoctypes.CRE: - dbitem = collection.add_cre(item) - else: - dbitem = collection.add_node(item) - for link in item.links: - if link.document.doctype == defs.Credoctypes.CRE: - linked_item = collection.add_cre(link.document) - if item.doctype == defs.Credoctypes.CRE: - collection.add_internal_link( - dbitem, linked_item, ltype=link.ltype - ) - else: - collection.add_link( - node=dbitem, cre=linked_item, ltype=link.ltype - ) - else: - linked_item = collection.add_node(link.document) - if item.doctype == defs.Credoctypes.CRE: - collection.add_link( - cre=dbitem, node=linked_item, ltype=link.ltype - ) - else: - collection.add_internal_link( - cre=linked_item, node=dbitem, ltype=link.ltype - ) - cres = inputDocs[defs.Credoctypes.CRE] - c0 = [c for c in cres if c.name == "C0"][0] - self.assertEqual(collection.get_cre_hierarchy(c0), 0) - c2 = [c for c in cres if c.name == "C2"][0] - self.assertEqual(collection.get_cre_hierarchy(c2), 1) - c3 = [c for c in cres if c.name == "C3"][0] - self.assertEqual(collection.get_cre_hierarchy(c3), 2) - c4 = [c for c in cres if c.name == "C4"][0] - self.assertEqual(collection.get_cre_hierarchy(c4), 3) - c5 = [c for c in cres if c.name == "C5"][0] - self.assertEqual(collection.get_cre_hierarchy(c5), 4) - c6 = [c for c in cres if c.name == "C6"][0] - self.assertEqual(collection.get_cre_hierarchy(c6), 0) - c7 = [c for c in cres if c.name == "C7"][0] - self.assertEqual(collection.get_cre_hierarchy(c7), 0) - c8 = [c for c in cres if c.name == "C8"][0] - self.assertEqual(collection.get_cre_hierarchy(c8), 0) +import networkx as nx +from application.utils.gap_analysis import make_resources_key, make_subresources_key +import string +import random +import os +import tempfile +import unittest +from unittest import mock +from unittest.mock import patch +import uuid +from copy import copy, deepcopy +from pprint import pprint +from typing import Any, Dict, List, Union +from flask import json as flask_json + +import yaml +from application.tests.utils.data_gen import export_format_data +from application import create_app, sqla # type: ignore +from application.database import db +from application.defs import cre_defs as defs + + +class TestDB(unittest.TestCase): + def tearDown(self) -> None: + sqla.session.remove() + sqla.drop_all() + self.app_context.pop() + + def setUp(self) -> None: + self.app = create_app(mode="test") + self.app_context = self.app.app_context() + self.app_context.push() + sqla.create_all() + + self.collection = db.Node_collection().with_graph() + self.collection.graph.with_graph( + graph=nx.DiGraph(), graph_data=[] + ) # initialize the graph singleton for the tests to be unique + + collection = self.collection + + dbcre = collection.add_cre( + defs.CRE(id="111-000", description="CREdesc", name="CREname") + ) + self.dbcre = dbcre + dbgroup = collection.add_cre( + defs.CRE(id="111-001", description="Groupdesc", name="GroupName") + ) + dbstandard = collection.add_node( + defs.Standard( + subsection="4.5.6", + section="FooStand", + name="BarStand", + hyperlink="https://example.com", + tags=["788-788", "b", "c"], + ) + ) + + collection.add_node( + defs.Standard( + subsection="4.5.6", + section="Unlinked", + name="Unlinked", + hyperlink="https://example.com", + ) + ) + + collection.session.add(dbcre) + collection.add_link(cre=dbcre, node=dbstandard, ltype=defs.LinkTypes.LinkedTo) + collection.add_internal_link( + lower=dbcre, higher=dbgroup, ltype=defs.LinkTypes.Contains + ) + + self.collection = collection + + def test_get_by_tags(self) -> None: + """ + Given: A CRE with no links and a combination of possible tags: + "tag1,dash-2,underscore_3,space 4,co_mb-ination%5" + A Standard with no links and a combination of possible tags + "tag1, dots.5.5, space 6 , several spaces and newline 7 \n" + some limited overlap between the tag-sets + Expect: + The CRE to be returned when searching for "tag-2" and for ["tag1","underscore_3"] + The Standard to be returned when searching for "space 6" and ["dots.5.5", "space 6"] + Both to be returned when searching for "space" and "tag1" + """ + + dbcre = db.CRE( + description="tagCREdesc1", + name="tagCREname1", + tags="tag1,dash-2,underscore_3,space 4,co_mb-ination%5", + external_id="111-111", + ) + cre = db.CREfromDB(dbcre) + cre.id = "111-111" + dbstandard = db.Node( + subsection="4.5.6.7", + section="tagsstand", + name="tagsstand", + link="https://example.com", + version="", + tags="tag1, dots.5.5, space 6 , several spaces and newline 7 \n", + ntype=defs.Standard.__name__, + ) + standard = db.nodeFromDB(dbstandard) + self.collection.session.add(dbcre) + self.collection.session.add(dbstandard) + self.collection.session.commit() + + self.maxDiff = None + self.assertEqual(self.collection.get_by_tags(["dash-2"]), [cre]) + self.assertEqual(self.collection.get_by_tags(["tag1", "underscore_3"]), [cre]) + self.assertEqual(self.collection.get_by_tags(["space 6"]), [standard]) + self.assertEqual( + self.collection.get_by_tags(["dots.5.5", "space 6"]), [standard] + ) + + self.assertCountEqual([cre, standard], self.collection.get_by_tags(["space"])) + self.assertCountEqual( + [cre, standard], self.collection.get_by_tags(["space", "tag1"]) + ) + self.assertCountEqual(self.collection.get_by_tags(["tag1"]), [cre, standard]) + + self.assertEqual(self.collection.get_by_tags([]), []) + self.assertEqual(self.collection.get_by_tags(["this should not be a tag"]), []) + + def test_get_standards_names(self) -> None: + result = self.collection.get_node_names() + expected = [("Standard", "BarStand"), ("Standard", "Unlinked")] + self.assertEqual(expected, result) + + def test_get_max_internal_connections(self) -> None: + self.assertEqual(self.collection.get_max_internal_connections(), 1) + + dbcrelo = db.CRE(name="internal connections test lo", description="ictlo") + dbcrehi = db.CRE(name="internal connections test hi", description="icthi") + self.collection.session.add(dbcrelo) + self.collection.session.add(dbcrehi) + self.collection.session.commit() + for i in range(0, 100): + dbcre = db.CRE(name=str(i) + " name", description=str(i) + " desc") + self.collection.session.add(dbcre) + self.collection.session.commit() + + # 1 low level cre to multiple groups + self.collection.session.add( + db.InternalLinks(group=dbcre.id, cre=dbcrelo.id) + ) + + # 1 hi level cre to multiple low level + self.collection.session.add( + db.InternalLinks(group=dbcrehi.id, cre=dbcre.id) + ) + + self.collection.session.commit() + + result = self.collection.get_max_internal_connections() + self.assertEqual(result, 100) + + def test_export(self) -> None: + """ + Given: + A CRE "CREname" that links to a CRE "GroupName" and a Standard "BarStand" + Expect: + 2 documents on disk, one for "CREname" + with a link to "BarStand" and "GroupName" and one for "GroupName" with a link to "CREName" + """ + loc = tempfile.mkdtemp() + self.collection = db.Node_collection().with_graph() + collection = self.collection + code0 = defs.Code(name="co0") + code1 = defs.Code(name="co1") + tool0 = defs.Tool(name="t0", tooltype=defs.ToolTypes.Unknown) + dbstandard = collection.add_node( + defs.Standard( + subsection="4.5.6", + section="FooStand", + sectionID="123-123", + name="BarStand", + hyperlink="https://example.com", + tags=["788-788", "b", "c"], + ) + ) + + collection.add_node( + defs.Standard( + subsection="4.5.6", + section="Unlinked", + sectionID="Unlinked", + name="Unlinked", + hyperlink="https://example.com", + ) + ) + self.collection.add_link( + self.dbcre, self.collection.add_node(code0), ltype=defs.LinkTypes.LinkedTo + ) + self.collection.add_node(code1) + self.collection.add_node(tool0) + + expected = [ + defs.CRE( + id="111-001", + description="Groupdesc", + name="GroupName", + links=[ + defs.Link( + document=defs.CRE( + id="111-000", description="CREdesc", name="CREname" + ), + ltype=defs.LinkTypes.Contains, + ) + ], + ), + defs.CRE( + id="111-000", + description="CREdesc", + name="CREname", + links=[ + defs.Link( + document=defs.CRE( + id="112-001", description="Groupdesc", name="GroupName" + ), + ltype=defs.LinkTypes.Contains, + ), + defs.Link( + document=defs.Standard( + name="BarStand", + section="FooStand", + sectionID="456", + subsection="4.5.6", + hyperlink="https://example.com", + tags=["788-788", "b", "c"], + ), + ltype=defs.LinkTypes.LinkedTo, + ), + defs.Link( + document=defs.Code(name="co0"), ltype=defs.LinkTypes.LinkedTo + ), + ], + ), + defs.Standard( + subsection="4.5.6", + section="Unlinked", + name="Unlinked", + sectionID="Unlinked", + hyperlink="https://example.com", + ), + defs.Tool(name="t0", tooltype=defs.ToolTypes.Unknown), + defs.Code(name="co1"), + ] + self.collection.export(loc) + + # load yamls from loc, parse, + # ensure yaml1 is result[0].todict and + # yaml2 is expected[1].todict + group = expected[0].todict() + cre = expected[1].todict() + groupname = ( + expected[0] + .id.replace("/", "-") + .replace(" ", "_") + .replace('"', "") + .replace("'", "") + + ".yaml" + ) + with open(os.path.join(loc, groupname), "r") as f: + doc = yaml.safe_load(f) + self.assertDictEqual(group, doc) + + crename = ( + expected[1] + .id.replace("/", "-") + .replace(" ", "_") + .replace('"', "") + .replace("'", "") + + ".yaml" + ) + self.maxDiff = None + with open(os.path.join(loc, crename), "r") as f: + doc = yaml.safe_load(f) + self.assertCountEqual(cre, doc) + + def test_StandardFromDB(self) -> None: + expected = defs.Standard( + name="foo", + section="bar", + sectionID="213", + subsection="foobar", + hyperlink="https://example.com/foo/bar", + version="1.1.1", + ) + self.assertEqual( + expected, + db.nodeFromDB( + db.Node( + name="foo", + section="bar", + subsection="foobar", + link="https://example.com/foo/bar", + version="1.1.1", + section_id="213", + ntype=defs.Standard.__name__, + ) + ), + ) + + def test_CREfromDB(self) -> None: + c = defs.CRE( + id="243-243", + doctype=defs.Credoctypes.CRE, + description="CREdesc", + name="CREname", + ) + self.assertEqual( + c, + db.CREfromDB( + db.CRE(external_id="243-243", description="CREdesc", name="CREname") + ), + ) + + def test_add_cre(self) -> None: + original_desc = str(uuid.uuid4()) + name = str(uuid.uuid4()) + + c = defs.CRE( + id="243-243", + doctype=defs.Credoctypes.CRE, + description=original_desc, + name=name, + ) + self.assertIsNone( + self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() + ) + + # happy path, add new cre + newCRE = self.collection.add_cre(c) + dbcre = ( + self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() + ) # ensure transaction happened (commit() called) + self.assertIsNotNone(dbcre.id) + self.assertEqual(dbcre.name, c.name) + self.assertEqual(dbcre.description, c.description) + self.assertEqual(dbcre.external_id, c.id) + + # ensure the right thing got returned + self.assertEqual(newCRE.name, c.name) + + # ensure no accidental update (add only adds) + c.description = "description2" + newCRE = self.collection.add_cre(c) + dbcre = ( + self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() + ) + # ensure original description + self.assertEqual(dbcre.description, original_desc) + # ensure original description + self.assertEqual(newCRE.description, original_desc) + + def test_add_node(self) -> None: + original_section = str(uuid.uuid4()) + name = str(uuid.uuid4()) + + s = defs.Standard( + doctype=defs.Credoctypes.Standard, + section=original_section, + subsection=original_section, + name=name, + tags=["788-788", "b", "c"], + ) + + self.assertIsNone( + self.collection.session.query(db.Node) + .filter(db.Node.name == s.name) + .first() + ) + + # happy path, add new standard + newStandard = self.collection.add_node(s) + self.assertIsNotNone(newStandard) + + dbstandard = ( + self.collection.session.query(db.Node) + .filter(db.Node.name == s.name) + .first() + ) # ensure transaction happened (commit() called) + self.assertIsNotNone(dbstandard.id) + self.assertEqual(dbstandard.name, s.name) + self.assertEqual(dbstandard.section, s.section) + self.assertEqual(dbstandard.subsection, s.subsection) + self.assertEqual( + newStandard.name, s.name + ) # ensure the right thing got returned + self.assertEqual(dbstandard.ntype, s.doctype.value) + self.assertEqual(dbstandard.tags, ",".join(s.tags)) + # standards match on all of name,section, subsection <-- if you change even one of them it's a new entry + + def find_cres_of_cre(self) -> None: + dbcre = db.CRE(description="CREdesc1", name="CREname1") + groupless_cre = db.CRE(description="CREdesc2", name="CREname2") + dbgroup = db.CRE(description="Groupdesc1", name="GroupName1") + dbgroup2 = db.CRE(description="Groupdesc2", name="GroupName2") + + only_one_group = db.CRE(description="CREdesc3", name="CREname3") + + self.collection.session.add(dbcre) + self.collection.session.add(groupless_cre) + self.collection.session.add(dbgroup) + self.collection.session.add(dbgroup2) + self.collection.session.add(only_one_group) + self.collection.session.commit() + + internalLink = db.InternalLinks(cre=dbcre.id, group=dbgroup.id, type="Contains") + internalLink2 = db.InternalLinks( + cre=dbcre.id, group=dbgroup2.id, type="Contains" + ) + internalLink3 = db.InternalLinks( + cre=only_one_group.id, group=dbgroup.id, type="Contains" + ) + self.collection.session.add(internalLink) + self.collection.session.add(internalLink2) + self.collection.session.add(internalLink3) + self.collection.session.commit() + + # happy path, find cre with 2 groups + + groups = self.collection.find_cres_of_cre(dbcre) + if not groups: + self.fail("Expected exactly 2 cres") + self.assertEqual(len(groups), 2) + self.assertEqual(groups, [dbgroup, dbgroup2]) + + # find cre with 1 group + group = self.collection.find_cres_of_cre(only_one_group) + + if not group: + self.fail("Expected exactly 1 cre") + self.assertEqual(len(group), 1) + self.assertEqual(group, [dbgroup]) + + # ensure that None is return if there are no groups + groups = self.collection.find_cres_of_cre(groupless_cre) + self.assertIsNone(groups) + + def test_find_cres_of_standard(self) -> None: + dbcre = db.CRE(description="CREdesc1", name="CREname1") + dbgroup = db.CRE(description="CREdesc2", name="CREname2") + dbstandard1 = db.Node( + section="section1", + name="standard1", + ntype=defs.Standard.__name__, + ) + group_standard = db.Node( + section="section2", + name="standard2", + ntype=defs.Standard.__name__, + ) + lone_standard = db.Node( + section="section3", + name="standard3", + ntype=defs.Standard.__name__, + ) + + self.collection.session.add(dbcre) + self.collection.session.add(dbgroup) + self.collection.session.add(dbstandard1) + self.collection.session.add(group_standard) + self.collection.session.add(lone_standard) + self.collection.session.commit() + + self.collection.session.add(db.Links(cre=dbcre.id, node=dbstandard1.id)) + self.collection.session.add(db.Links(cre=dbgroup.id, node=dbstandard1.id)) + self.collection.session.add(db.Links(cre=dbgroup.id, node=group_standard.id)) + self.collection.session.commit() + + # happy path, 1 group and 1 cre link to 1 standard + cres = self.collection.find_cres_of_node(dbstandard1) + + if not cres: + self.fail("Expected 2 cres") + self.assertEqual(len(cres), 2) + self.assertEqual(cres, [dbcre, dbgroup]) + + # group links to standard + cres = self.collection.find_cres_of_node(group_standard) + + if not cres: + self.fail("Expected 1 cre") + self.assertEqual(len(cres), 1) + self.assertEqual(cres, [dbgroup]) + + # no links = None + cres = self.collection.find_cres_of_node(lone_standard) + self.assertIsNone(cres) + + def test_get_CREs(self) -> None: + """Given: a cre 'C1' that links to cres both as a group and a cre and other standards + return the CRE in Document format""" + collection = db.Node_collection() + dbc1 = db.CRE(external_id="123-123", description="gcCD1", name="gcC1") + dbc2 = db.CRE(description="gcCD2", name="gcC2", external_id="444-444") + dbc3 = db.CRE(description="gcCD3", name="gcC3", external_id="555-555") + db_id_only = db.CRE( + description="c_get_by_internal_id_only", + name="cgbiio", + external_id="666-666", + ) + dbs1 = db.Node( + ntype=defs.Standard.__name__, + name="gcS2", + section="gc1", + subsection="gc2", + link="gc3", + version="gc1.1.1", + ) + + dbs2 = db.Node( + ntype=defs.Standard.__name__, + name="gcS3", + section="gc1", + subsection="gc2", + link="gc3", + version="gc3.1.2", + ) + + parent_cre = db.CRE( + external_id="999-999", description="parent cre", name="pcre" + ) + parent_cre2 = db.CRE( + external_id="888-888", description="parent cre2", name="pcre2" + ) + partOf_cre = db.CRE( + external_id="777-777", description="part of cre", name="poc" + ) + + collection.session.add(dbc1) + collection.session.add(dbc2) + collection.session.add(dbc3) + collection.session.add(dbs1) + collection.session.add(dbs2) + collection.session.add(db_id_only) + + collection.session.add(parent_cre) + collection.session.add(parent_cre2) + collection.session.add(partOf_cre) + collection.session.commit() + + collection.session.add( + db.InternalLinks(type="Contains", group=dbc1.id, cre=dbc2.id) + ) + collection.session.add( + db.InternalLinks(type="Contains", group=dbc1.id, cre=dbc3.id) + ) + collection.session.add(db.Links(type="Linked To", cre=dbc1.id, node=dbs1.id)) + + collection.session.add( + db.InternalLinks( + type=defs.LinkTypes.Contains.value, + group=parent_cre.id, + cre=partOf_cre.id, + ) + ) + collection.session.add( + db.InternalLinks( + type=defs.LinkTypes.Contains.value, + group=parent_cre2.id, + cre=partOf_cre.id, + ) + ) + collection.session.commit() + self.maxDiff = None + + # we can retrieve children cres + self.assertEqual( + [ + db.CREfromDB(parent_cre).add_link( + defs.Link( + document=db.CREfromDB(partOf_cre), ltype=defs.LinkTypes.Contains + ) + ) + ], + collection.get_CREs(external_id=parent_cre.external_id), + ) + self.assertEqual( + [ + db.CREfromDB(parent_cre2).add_link( + defs.Link( + document=db.CREfromDB(partOf_cre), ltype=defs.LinkTypes.Contains + ) + ) + ], + collection.get_CREs(external_id=parent_cre2.external_id), + ) + + # we can retrieve children cres with inverted multiple (PartOf) links to their parents + self.assertEqual( + [ + db.CREfromDB(partOf_cre) + .add_link( + defs.Link( + document=db.CREfromDB(parent_cre), ltype=defs.LinkTypes.PartOf + ) + ) + .add_link( + defs.Link( + document=db.CREfromDB(parent_cre2), ltype=defs.LinkTypes.PartOf + ) + ) + ], + collection.get_CREs(external_id=partOf_cre.external_id), + ) + + cd1 = defs.CRE(id="123-123", description="gcCD1", name="gcC1") + cd2 = defs.CRE(id="444-444", description="gcCD2", name="gcC2") + cd3 = defs.CRE(id="555-555", description="gcCD3", name="gcC3") + c_id_only = defs.CRE( + id="666-666", description="c_get_by_internal_id_only", name="cgbiio" + ) + + expected = [ + copy(cd1) + .add_link( + defs.Link( + ltype=defs.LinkTypes.LinkedTo, + document=defs.Standard( + name="gcS2", + section="gc1", + subsection="gc2", + hyperlink="gc3", + version="gc1.1.1", + ), + ) + ) + .add_link( + defs.Link( + ltype=defs.LinkTypes.Contains, + document=copy(cd2), + ) + ) + .add_link(defs.Link(ltype=defs.LinkTypes.Contains, document=copy(cd3))) + ] + self.maxDiff = None + shallow_cd1 = copy(cd1) + shallow_cd1.links = [] + cd2.add_link(defs.Link(ltype=defs.LinkTypes.PartOf, document=shallow_cd1)) + cd3.add_link(defs.Link(ltype=defs.LinkTypes.PartOf, document=shallow_cd1)) + + # empty returns empty + self.assertEqual([], collection.get_CREs()) + + # getting "group cre 1" by name returns gcC1 + res = collection.get_CREs(name="gcC1") + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting "group cre 1" by id returns gcC1 + res = collection.get_CREs(external_id="123-123") + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting "group cre 1" by partial id returns gcC1 + res = collection.get_CREs(external_id="12%", partial=True) + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting "group cre 1" by partial name returns gcC1, gcC2 and gcC3 + res = collection.get_CREs(name="gcC%", partial=True) + self.assertEqual(3, len(res)) + self.assertCountEqual( + [expected[0].todict(), cd2.todict(), cd3.todict()], + [r.todict() for r in res], + ) + + # getting "group cre 1" by partial name and partial id returns gcC1 + res = collection.get_CREs(external_id="1%", name="gcC%", partial=True) + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting "group cre 1" by description returns gcC1 + res = collection.get_CREs(description="gcCD1") + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting "group cre 1" by partial id and partial description returns gcC1 + res = collection.get_CREs(external_id="1%", description="gcC%", partial=True) + self.assertEqual(len(expected), len(res)) + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # getting all the gcC* cres by partial name and partial description returns gcC1, gcC2, gcC3 + res = collection.get_CREs(description="gcC%", name="gcC%", partial=True) + want = [expected[0], cd2, cd3] + for el in res: + found = False + for wel in want: + if el.todict() == wel.todict(): + found = True + self.assertTrue(found) + + self.assertEqual([], collection.get_CREs(external_id="123-123", name="gcC5")) + self.assertEqual([], collection.get_CREs(external_id="1234")) + self.assertEqual([], collection.get_CREs(name="gcC5")) + + # add a standard to gcC1 + collection.session.add(db.Links(type="Linked To", cre=dbc1.id, node=dbs2.id)) + + only_gcS2 = deepcopy(expected) # save a copy of the current expected + expected[0].add_link( + defs.Link( + ltype=defs.LinkTypes.LinkedTo, + document=defs.Standard( + name="gcS3", + section="gc1", + subsection="gc2", + hyperlink="gc3", + version="gc3.1.2", + ), + ) + ) + # we can retrieve the cre with the standard + res = collection.get_CREs(name="gcC1") + self.assertCountEqual(expected[0].todict(), res[0].todict()) + + # we can retrieve ONLY the standard + res = collection.get_CREs(name="gcC1", include_only=["gcS2"]) + self.assertDictEqual(only_gcS2[0].todict(), res[0].todict()) + + ccd2 = copy(cd2) + ccd2.links = [] + ccd3 = copy(cd3) + ccd3.links = [] + no_standards = [ + copy(cd1) + .add_link( + defs.Link( + ltype=defs.LinkTypes.Contains, + document=ccd2, + ) + ) + .add_link(defs.Link(ltype=defs.LinkTypes.Contains, document=ccd3)) + ] + + # if the standard is not linked, we retrieve as normal + res = collection.get_CREs(name="gcC1", include_only=["gcS0"]) + self.assertEqual(no_standards, res) + + self.assertEqual([c_id_only], collection.get_CREs(internal_id=db_id_only.id)) + + def test_get_standards(self) -> None: + """Given: a Standard 'S1' that links to cres + return the Standard in Document format""" + collection = db.Node_collection() + docs: Dict[str, Union[db.CRE, db.Node]] = { + "dbc1": db.CRE(external_id="123-123", description="CD1", name="C1"), + "dbc2": db.CRE(external_id="222-222", description="CD2", name="C2"), + "dbc3": db.CRE(external_id="333-333", description="CD3", name="C3"), + "dbs1": db.Node( + ntype=defs.Standard.__name__, + name="S1", + section="111-111", + section_id="123-123", + subsection="222-222", + link="333-333", + version="4", + ), + } + links = [("dbc1", "dbs1"), ("dbc2", "dbs1"), ("dbc3", "dbs1")] + for k, v in docs.items(): + collection.session.add(v) + collection.session.commit() + + for cre, standard in links: + collection.session.add( + db.Links(type="Linked To", cre=docs[cre].id, node=docs[standard].id) + ) + collection.session.commit() + + expected = [ + defs.Standard( + name="S1", + section="111-111", + sectionID="123-123", + subsection="222-222", + hyperlink="333-333", + version="4", + links=[ + defs.Link( + ltype=defs.LinkTypes.LinkedTo, + document=defs.CRE(id="123-123", name="C1", description="CD1"), + ), + defs.Link( + ltype=defs.LinkTypes.LinkedTo, + document=defs.CRE(id="222-222", name="C2", description="CD2"), + ), + defs.Link( + ltype=defs.LinkTypes.LinkedTo, + document=defs.CRE(id="333-333", name="C3", description="CD3"), + ), + ], + ) + ] + + res = collection.get_nodes(name="S1") + self.assertEqual(expected, res) + + def test_get_nodes_with_pagination(self) -> None: + """Given: a Standard 'S1' that links to cres + return the Standard in Document format and the total pages and the page we are in + """ + collection = db.Node_collection() + docs: Dict[str, Union[db.Node, db.CRE]] = { + "dbc1": db.CRE(external_id="123-123", description="CD1", name="C1"), + "dbc2": db.CRE(external_id="222-222", description="CD2", name="C2"), + "dbc3": db.CRE(external_id="333-333", description="CD3", name="C3"), + "dbs1": db.Node( + name="S1", + section="111-111", + section_id="123-123", + subsection="222-222", + link="333-333", + version="4", + ntype=defs.Standard.__name__, + ), + } + links = [("dbc1", "dbs1"), ("dbc2", "dbs1"), ("dbc3", "dbs1")] + for k, v in docs.items(): + collection.session.add(v) + collection.session.commit() + + for cre, standard in links: + collection.session.add( + db.Links( + cre=docs[cre].id, + node=docs[standard].id, + type=defs.LinkTypes.LinkedTo, + ) + ) + collection.session.commit() + + expected = [ + defs.Standard( + name="S1", + section="111-111", + sectionID="123-123", + subsection="222-222", + hyperlink="333-333", + version="4", + links=[ + defs.Link( + document=defs.CRE(name="C1", description="CD1", id="123-123"), + ltype=defs.LinkTypes.LinkedTo, + ), + defs.Link( + document=defs.CRE(id="222-222", name="C2", description="CD2"), + ltype=defs.LinkTypes.LinkedTo, + ), + defs.Link( + document=defs.CRE(id="333-333", name="C3", description="CD3"), + ltype=defs.LinkTypes.LinkedTo, + ), + ], + ) + ] + total_pages, res, _ = collection.get_nodes_with_pagination(name="S1") + self.assertEqual(total_pages, 1) + self.assertEqual(expected, res) + + only_c1 = [ + defs.Standard( + name="S1", + section="111-111", + sectionID="123-123", + subsection="222-222", + hyperlink="333-333", + version="4", + links=[ + defs.Link( + document=defs.CRE(name="C1", description="CD1", id="123-123"), + ltype=defs.LinkTypes.LinkedTo, + ) + ], + ) + ] + _, res, _ = collection.get_nodes_with_pagination(name="S1", include_only=["C1"]) + self.assertEqual(only_c1, res) + _, res, _ = collection.get_nodes_with_pagination( + name="S1", include_only=["123-123"] + ) + self.assertEqual(only_c1, res) + + self.assertEqual( + collection.get_nodes_with_pagination(name="this should not exit"), + (None, None, None), + ) + + def test_add_internal_link(self) -> None: + """test that internal links are added successfully, + edge cases: + cre or group don't exist + called on a cycle scenario""" + + cres = { + "dbca": self.collection.add_cre( + defs.CRE(id="111-111", description="CA", name="CA") + ), + "dbcb": self.collection.add_cre( + defs.CRE(id="222-222", description="CB", name="CB") + ), + "dbcc": self.collection.add_cre( + defs.CRE(id="333-333", description="CC", name="CC") + ), + } + + # happy path + self.collection.add_internal_link( + higher=cres["dbca"], lower=cres["dbcb"], ltype=defs.LinkTypes.Related + ) + + # "happy path, internal link exists" + res = ( + self.collection.session.query(db.InternalLinks) + .filter( + db.InternalLinks.group == cres["dbca"].id, + db.InternalLinks.cre == cres["dbcb"].id, + ) + .first() + ) + self.assertEqual((res.group, res.cre), (cres["dbca"].id, cres["dbcb"].id)) + + # no cycle, free to insert + self.collection.add_internal_link( + higher=cres["dbcb"], lower=cres["dbcc"], ltype=defs.LinkTypes.Related + ) + res = ( + self.collection.session.query(db.InternalLinks) + .filter( + db.InternalLinks.group == cres["dbcb"].id, + db.InternalLinks.cre == cres["dbcc"].id, + ) + .first() + ) + self.assertEqual((res.group, res.cre), (cres["dbcb"].id, cres["dbcc"].id)) + + # introdcues a cycle, should not be inserted + self.collection.add_internal_link( + higher=cres["dbcc"], lower=cres["dbca"], ltype=defs.LinkTypes.Related + ) + + # cycles are not inserted branch + none_res = ( + self.collection.session.query(db.InternalLinks) + .filter( + db.InternalLinks.group == cres["dbcc"].id, + db.InternalLinks.cre == cres["dbca"].id, + ) + .one_or_none() + ) + self.assertIsNone(none_res) + + def test_text_search(self) -> None: + """Given: + a cre(id="111-111"23-456,name=foo,description='lorem ipsum foo+bar') + a standard(name=Bar,section=blah,subsection=foo, hyperlink='https://example.com/blah/foo') + a standard(name=Bar,section=blah,subsection=foo1, hyperlink='https://example.com/blah/foo1') + a standard(name=Bar,section=blah1,subsection=foo, hyperlink='https://example.com/blah1/foo') + + full_text_search('123-456') returns cre:foo + full_text_search('CRE:foo') and full_text_search('CRE foo') returns cre:foo + full_text_search('CRE:123-456') and full_text_search('CRE 123-456') returns cre:foo + + full_text_search('Standard:Bar') and full_text_search('Standard Bar') returns: [standard:Bar:blah:foo, + standard:Bar:blah:foo1, + standard:Bar:blah1:foo] + + full_text_search('Standard:blah') and full_text_search('Standard blah') returns [standard:Bar::blah:foo, + standard:Bar:blah:foo1] + full_text_search('Standard:blah:foo') returns [standard:Bar:blah:foo] + full_text_search('Standard:foo') returns [standard:Bar:blah:foo, + standard:Bar:blah1:foo] + + + full_text_search('ipsum') returns cre:foo + full_text_search('foo') returns [cre:foo,standard:Bar:blah:foo, standard:Bar:blah:foo1,standard:Bar:blah1:foo] + """ + collection = db.Node_collection() + cre = defs.CRE( + id="123-456", name="textSearchCRE", description="lorem ipsum tsSection+tsC" + ) + collection.add_cre(cre) + + s1 = defs.Standard( + name="textSearchStandard", + section="tsSection", + subsection="tsSubSection", + hyperlink="https://example.com/tsSection/tsSubSection", + ) + collection.add_node(s1) + s2 = defs.Standard( + name="textSearchStandard", + section="tsSection", + subsection="tsSubSection1", + hyperlink="https://example.com/tsSection/tsSubSection1", + ) + collection.add_node(s2) + s3 = defs.Standard( + name="textSearchStandard", + section="tsSection1", + subsection="tsSubSection1", + hyperlink="https://example.com/tsSection1/tsSubSection1", + ) + collection.add_node(s3) + t1 = defs.Tool( + name="textSearchTool", + tooltype=defs.ToolTypes.Offensive, + hyperlink="https://example.com/textSearchTool", + description="test text search with tool", + sectionID="15", + section="rule 15", + ) + collection.add_node(t1) + collection.session.commit() + expected: Dict[str, List[Any]] = { + "123-456": [cre], + "CRE:textSearchCRE": [cre], + "CRE textSearchCRE": [cre], + "CRE:123-456": [cre], + "CRE 123-456": [cre], + "Standard:textSearchStandard": [s1, s2, s3], + "Standard textSearchStandard": [s1, s2, s3], + "Standard:tsSection": [s1, s2], + "Standard tsSection": [s1, s2], + "Standard:tsSection:tsSubSection1": [s2], + "Standard tsSection tsSubSection1": [s2], + "Standard:tsSubSection1": [s2, s3], + "Standard tsSubSection1": [s2, s3], + "Standard:https://example.com/tsSection/tsSubSection1": [s2], + "Standard https://example.com/tsSection1/tsSubSection1": [s3], + "https://example.com/tsSection": [s1, s2, s3], + "ipsum": [cre], + "tsSection": [cre, s1, s2, s3], + "https://example.com/textSearchTool": [t1], + "text search": [t1], + } + self.maxDiff = None + for k, val in expected.items(): + res = self.collection.text_search(k) + self.assertCountEqual(res, val) + + def test_dbNodeFromNode(self) -> None: + data = { + "tool": defs.Tool( + name="fooTool", + description="lorem ipsum tsSection+tsC", + tooltype=defs.ToolTypes.Defensive, + tags=["111-111", "222-222", "333-333"], + ), + "standard": defs.Standard( + name="stand", section="s1", subsection="s2", version="s3" + ), + "code": defs.Code( + name="ccc", + description="c2", + hyperlink="https://example.com/code/hyperlink", + tags=["111-111", "222-222"], + ), + } + expected = { + "tool": db.Node( + name="fooTool", + description="lorem ipsum tsSection+tsC", + tags=",".join( + [defs.ToolTypes.Defensive.value, "111-111", "222-222", "333-333"] + ), + ntype=defs.Credoctypes.Tool.value, + ), + "standard": db.Node( + name="stand", + section="s1", + subsection="s2", + version="s3", + ntype=defs.Credoctypes.Standard.value, + ), + "code": db.Node( + name="ccc", + description="c2", + link="https://example.com/code/hyperlink", + tags="1,2", + ntype=defs.Credoctypes.Code.value, + ), + } + for k, v in data.items(): + nd = db.dbNodeFromNode(v) + for vname, var in vars(nd).items(): + if var and not vname.startswith("_"): + self.assertEqual(var, vars(expected[k]).get(vname)) + + def test_nodeFromDB(self) -> None: + expected = { + "tool": defs.Tool( + name="fooTool", + description="lorem ipsum tsSection+tsC", + tooltype=defs.ToolTypes.Defensive, + tags=["111-111", "222-222", "333-333"], + ), + "standard": defs.Standard( + name="stand", section="s1", subsection="s2", version="s3" + ), + "code": defs.Code( + name="ccc", + description="c2", + hyperlink="https://example.com/code/hyperlink", + tags=["111-111", "222-222"], + ), + } + data = { + "tool": db.Node( + name="fooTool", + description="lorem ipsum tsSection+tsC", + tags=",".join( + [defs.ToolTypes.Defensive.value, "111-111", "222-222", "333-333"] + ), + ntype=defs.Credoctypes.Tool.value, + ), + "standard": db.Node( + name="stand", + section="s1", + subsection="s2", + version="s3", + ntype=defs.Credoctypes.Standard.value, + ), + "code": db.Node( + name="ccc", + description="c2", + link="https://example.com/code/hyperlink", + tags="111-111,222-222", + ntype=defs.Credoctypes.Code.value, + ), + } + for k, v in data.items(): + nd = db.nodeFromDB(v) + for vname, var in vars(nd).items(): + if var and not vname.startswith("_"): + self.assertCountEqual(var, vars(expected[k]).get(vname)) + + def test_object_select(self) -> None: + dbnode1 = db.Node( + name="fooTool", + description="lorem ipsum tsSection+tsC", + tags=f"{defs.ToolTypes.Defensive.value},1", + ) + dbnode2 = db.Node( + name="fooTool", + description="lorem2", + link="https://example.com/foo/bar", + tags=f"{defs.ToolTypes.Defensive.value},1", + ) + + self.collection = db.Node_collection() + collection = db.Node_collection() + collection.session.add(dbnode1) + collection.session.add(dbnode2) + self.assertEqual(collection.object_select(dbnode1), [dbnode1]) + self.assertEqual(collection.object_select(dbnode2), [dbnode2]) + self.assertCountEqual( + collection.object_select(db.Node(name="fooTool")), [dbnode1, dbnode2] + ) + + self.assertEqual(collection.object_select(None), []) + + def test_get_root_cres(self): + """Given: + 6 CRES: + * C0 <-- Root + * C1 <-- Root + * C2 Part Of C0 + * C3 Part Of C1 + * C4 Part Of C2 + * C5 Related to C0 + * C6 Part Of C1 + * C7 Contains C6 <-- Root + 3 Nodes: + * N0 Unlinked + * N1 Linked To C1 + * N2 Linked to C2 + * N3 Linked to C3 + * N4 Linked to C4 + Get_root_cres should return C0, C1 + """ + cres = [] + nodes = [] + dbcres = [] + dbnodes = [] + + # clean the db from setup + sqla.session.remove() + sqla.drop_all() + sqla.create_all() + + collection = db.Node_collection().with_graph() + + for i in range(0, 8): + if i == 0 or i == 1: + cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) + else: + cres.append(defs.CRE(name=f"C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) + + dbcres.append(collection.add_cre(cres[i])) + nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) + dbnodes.append(collection.add_node(nodes[i])) + cres[i].add_link( + defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) + ) + collection.add_link( + cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo + ) + + cres[0].add_link( + defs.Link(document=cres[2].shallow_copy(), ltype=defs.LinkTypes.Contains) + ) + cres[1].add_link( + defs.Link(document=cres[3].shallow_copy(), ltype=defs.LinkTypes.Contains) + ) + cres[2].add_link( + defs.Link(document=cres[4].shallow_copy(), ltype=defs.LinkTypes.Contains) + ) + + cres[3].add_link( + defs.Link(document=cres[5].shallow_copy(), ltype=defs.LinkTypes.Contains) + ) + cres[6].add_link( + defs.Link(document=cres[7].shallow_copy(), ltype=defs.LinkTypes.PartOf) + ) + collection.add_internal_link( + higher=dbcres[0], lower=dbcres[2], ltype=defs.LinkTypes.Contains + ) + collection.add_internal_link( + higher=dbcres[1], lower=dbcres[3], ltype=defs.LinkTypes.Contains + ) + collection.add_internal_link( + higher=dbcres[2], lower=dbcres[4], ltype=defs.LinkTypes.Contains + ) + collection.add_internal_link( + higher=dbcres[3], lower=dbcres[5], ltype=defs.LinkTypes.Contains + ) + collection.add_internal_link( + higher=dbcres[7], lower=dbcres[6], ltype=defs.LinkTypes.Contains + ) + cres[7].add_link( + defs.Link(document=cres[6].shallow_copy(), ltype=defs.LinkTypes.Contains) + ) + + root_cres = collection.get_root_cres() + self.maxDiff = None + self.assertCountEqual(root_cres, [cres[0], cres[1], cres[7]]) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_disconnected(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = False + gap_mock.return_value = (None, None) + + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), None) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_no_nodes(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + + gap_mock.return_value = ([], []) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), + (["788-788", "b"], {}, {}), + ) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_no_links(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + + gap_mock.return_value = ([defs.CRE(name="bob", id="111-111")], []) + self.maxDiff = None + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), + ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": {}, + "extra": 0, + } + }, + {"111-111": {"paths": {}}}, + ), + ) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_one_link(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="788-788")], + [ + { + "start": defs.CRE(name="bob", id="788-788"), + "end": defs.CRE(name="bob", id="788-789"), + "path": path, + } + ], + ) + expected = ( + ["788-788", "788-789"], + { + "788-788": { + "start": defs.CRE(name="bob", id="788-788"), + "paths": { + "788-789": { + "end": defs.CRE(name="bob", id="788-789"), + "path": path, + "score": 0, + } + }, + "extra": 0, + } + }, + {"788-788": {"paths": {}}}, + ) + self.maxDiff = None + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "788-789"]), expected + ) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_one_weak_link(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="111-111"), + }, + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="222-222"), + }, + { + "end": defs.CRE(name="bob", id="333-333"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="222-222"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="111-111")], + [ + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + } + ], + ) + expected = ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": {}, + "extra": 1, + } + }, + { + "111-111": { + "paths": { + "222-222": { + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + "score": 4, + } + } + } + }, + ) + self.maxDiff = None + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_duplicate_link_path_existing_lower(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + path2 = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="111-111")], + [ + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + }, + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path2, + }, + ], + ) + expected = ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": { + "222-222": { + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + "score": 0, + } + }, + "extra": 0, + }, + }, + {"111-111": {"paths": {}}}, + ) + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_duplicate_link_path_existing_lower_new_in_extras( + self, gap_mock + ): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + path2 = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="111-111")], + [ + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + }, + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path2, + }, + ], + ) + expected = ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": { + "222-222": { + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + "score": 0, + } + }, + "extra": 0, + }, + }, + {"111-111": {"paths": {}}}, + ) + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_duplicate_link_path_existing_higher(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + path2 = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="111-111")], + [ + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path2, + }, + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + }, + ], + ) + expected = ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": { + "222-222": { + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + "score": 0, + } + }, + "extra": 0, + } + }, + {"111-111": {"paths": {}}}, + ) + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_duplicate_link_path_existing_higher_and_in_extras( + self, gap_mock + ): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + path2 = [ + { + "end": defs.CRE(name="bob", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + { + "end": defs.CRE(name="bob", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob", id="788-788"), + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob", id="111-111")], + [ + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path2, + }, + { + "start": defs.CRE(name="bob", id="111-111"), + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + }, + ], + ) + expected = ( + ["788-788", "b"], + { + "111-111": { + "start": defs.CRE(name="bob", id="111-111"), + "paths": { + "222-222": { + "end": defs.CRE(name="bob", id="222-222"), + "path": path, + "score": 0, + } + }, + "extra": 0, + } + }, + {"111-111": {"paths": {}}}, + ) + self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + + @patch.object(db.graph_db, "gap_analysis") + def test_gap_analysis_dump_to_cache(self, gap_mock): + collection = db.Node_collection() + collection.graph_db.connected = True + path = [ + { + "end": defs.CRE(name="bob1", id="111-111"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob7", id="788-788"), + "score": 0, + }, + { + "end": defs.CRE(name="bob2", id="222-222"), + "relationship": "RELATED", + "start": defs.CRE(name="bob1", id="111-111"), + "score": 2, + }, + { + "end": defs.CRE(name="bob1", id="111-111"), + "relationship": "RELATED", + "start": defs.CRE(name="bob2", id="222-222"), + "score": 2, + }, + { + "end": defs.CRE(name="bob3", id="333-333"), + "relationship": "LINKED_TO", + "start": defs.CRE(name="bob2", id="222-222"), + "score": 4, + }, + ] + gap_mock.return_value = ( + [defs.CRE(name="bob7", id="788-788")], + [ + { + "start": defs.CRE(name="bob7", id="788-788"), + "end": defs.CRE(name="bob2", id="222-222"), + "path": path, + } + ], + ) + + expected_response = ( + ["788-788", "222-222"], + { + "788-788": { + "start": defs.CRE(name="bob7", id="788-788"), + "paths": {}, + "extra": 1, + } + }, + { + "788-788": { + "paths": { + "222-222": { + "end": defs.CRE(name="bob2", id="222-222"), + "path": path, + "score": 4, + } + } + } + }, + ) + response = db.gap_analysis(collection.graph_db, ["788-788", "222-222"]) + + self.maxDiff = None + self.assertEqual( + response, (expected_response[0], expected_response[1], expected_response[2]) + ) + self.assertEqual( + collection.gap_analysis_exists(make_resources_key(["788-788", "222-222"])), + True, + ) + self.assertEqual( + collection.get_gap_analysis_result( + make_resources_key(["788-788", "222-222"]) + ), + flask_json.dumps({"result": expected_response[1]}), + ) + self.assertEqual( + collection.get_gap_analysis_result( + make_subresources_key(["788-788", "222-222"], "788-788") + ), + flask_json.dumps({"result": expected_response[2]["788-788"]}), + ) + + def test_neo_db_parse_node_code(self): + name = "name" + description = "description" + tags = "tags" + version = "version" + hyperlink = "version" + expected = defs.Code( + name=name, + description=description, + tags=tags, + version=version, + hyperlink=hyperlink, + links=[ + defs.Link( + defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" + ) + ], + ) + graph_node = db.NeoCode( + name=name, + description=description, + tags=tags, + version=version, + hyperlink=hyperlink, + related=[ + db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), + ], + ) + + self.assertEqual(db.graph_db.parse_node(graph_node).todict(), expected.todict()) + + def test_neo_db_parse_node_standard(self): + name = "name" + description = "description" + tags = "tags" + version = "version" + section = "section" + sectionID = "sectionID" + subsection = "subsection" + hyperlink = "version" + expected = defs.Standard( + name=name, + description=description, + tags=tags, + version=version, + section=section, + sectionID=sectionID, + subsection=subsection, + hyperlink=hyperlink, + links=[ + defs.Link( + defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" + ) + ], + ) + graph_node = db.NeoStandard( + name=name, + description=description, + tags=tags, + version=version, + section=section, + section_id=sectionID, + subsection=subsection, + hyperlink=hyperlink, + related=[ + db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), + ], + ) + self.assertEqual(db.graph_db.parse_node(graph_node).todict(), expected.todict()) + + def test_neo_db_parse_node_tool(self): + name = "name" + description = "description" + tags = "tags" + version = "version" + section = "section" + sectionID = "sectionID" + subsection = "subsection" + hyperlink = "version" + tooltype = defs.ToolTypes.Defensive + expected = defs.Tool( + name=name, + tooltype=tooltype, + description=description, + tags=tags, + version=version, + section=section, + sectionID=sectionID, + subsection=subsection, + hyperlink=hyperlink, + links=[ + defs.Link( + defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Related" + ) + ], + ) + graph_node = db.NeoTool( + name=name, + description=description, + tooltype=tooltype, + tags=tags, + version=version, + section=section, + section_id=sectionID, + subsection=subsection, + hyperlink=hyperlink, + related=[ + db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), + ], + ) + self.assertEqual(db.graph_db.parse_node(graph_node).todict(), expected.todict()) + + def test_neo_db_parse_node_cre(self): + name = "name" + description = "description" + tags = "tags" + external_id = "123-123" + expected = defs.CRE( + name=name, + description=description, + id=external_id, + tags=tags, + links=[ + defs.Link( + defs.CRE(id="123-123", description="gcCD2", name="gcC2"), "Contains" + ), + defs.Link( + defs.CRE(id="123-123", description="gcCD3", name="gcC3"), "Contains" + ), + defs.Link( + defs.Standard( + hyperlink="gc3", + name="gcS2", + section="gc1", + subsection="gc2", + version="gc1.1.1", + ), + "Linked To", + ), + ], + ) + graph_node = db.NeoCRE( + name=name, + description=description, + tags=tags, + external_id=external_id, + contained_in=[], + contains=[ + db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), + db.NeoCRE(external_id="123-123", description="gcCD3", name="gcC3"), + ], + linked=[ + db.NeoStandard( + hyperlink="gc3", + name="gcS2", + section="gc1", + subsection="gc2", + version="gc1.1.1", + ) + ], + same_as=[], + related=[], + auto_linked_to=[], + ) + + parsed = db.graph_db.parse_node(graph_node) + self.maxDiff = None + self.assertEqual(parsed.todict(), expected.todict()) + + def test_neo_db_parse_node_no_links_cre(self): + name = "name" + description = "description" + tags = "tags" + external_id = "123-123" + expected = defs.CRE( + name=name, description=description, id=external_id, tags=tags, links=[] + ) + graph_node = db.NeoCRE( + name=name, + description=description, + tags=tags, + external_id=external_id, + contained_in=[], + contains=[ + db.NeoCRE(external_id="123-123", description="gcCD2", name="gcC2"), + db.NeoCRE(external_id="123-123", description="gcCD3", name="gcC3"), + ], + linked=[ + db.NeoStandard( + hyperlink="gc3", + name="gcS2", + section="gc1", + subsection="gc2", + version="gc1.1.1", + ) + ], + same_as=[], + related=[], + ) + + parsed = db.graph_db.parse_node_no_links(graph_node) + self.maxDiff = None + self.assertEqual(parsed.todict(), expected.todict()) + + def test_neo_db_parse_node_Document(self): + name = "name" + id = "id" + description = "description" + tags = "tags" + graph_node = db.NeoDocument( + name=name, + document_id=id, + description=description, + tags=tags, + ) + with self.assertRaises(Exception) as cm: + db.graph_db.parse_node(graph_node) + + self.assertEqual(str(cm.exception), "Shouldn't be parsing a NeoDocument") + + def test_neo_db_parse_node_Node(self): + name = "name" + id = "id" + description = "description" + tags = "tags" + graph_node = db.NeoNode( + name=name, + document_id=id, + description=description, + tags=tags, + ) + with self.assertRaises(Exception) as cm: + db.graph_db.parse_node(graph_node) + + self.assertEqual(str(cm.exception), "Shouldn't be parsing a NeoNode") + + def test_get_embeddings_by_doc_type_paginated(self): + """Given: a range of embedding for Nodes and a range of embeddings for CREs + when called with doc_type CRE return the cre embeddings + when called with doc_type Standard/Tool return the node embeddings""" + # add cre embeddings + cre_embeddings = [] + for i in range(0, 10): + dbca = db.CRE(external_id=f"{i}", description=f"C{i}", name=f"C{i}") + self.collection.session.add(dbca) + self.collection.session.commit() + + embeddings = [random.uniform(-1, 1) for e in range(0, 768)] + embeddings_text = "".join( + random.choices(string.ascii_uppercase + string.digits, k=100) + ) + cre_embeddings.append( + self.collection.add_embedding( + db_object=dbca, + doctype=defs.Credoctypes.CRE.value, + embeddings=embeddings, + embedding_text=embeddings_text, + ) + ) + + # add node embeddings + node_embeddings = [] + for i in range(0, 10): + dbsa = db.Node( + subsection=f"4.5.{i}", + section=f"FooStand-{i}", + name="BarStand", + link="https://example.com", + ntype=defs.Credoctypes.Standard.value, + ) + self.collection.session.add(dbsa) + self.collection.session.commit() + + embeddings = [random.uniform(-1, 1) for e in range(0, 768)] + embeddings_text = "".join( + random.choices(string.ascii_uppercase + string.digits, k=100) + ) + ne = self.collection.add_embedding( + db_object=dbsa, + doctype=defs.Credoctypes.Standard.value, + embeddings=embeddings, + embedding_text=embeddings_text, + ) + node_embeddings.append(ne) + + ( + cre_emb, + total_pages, + curr_page, + ) = self.collection.get_embeddings_by_doc_type_paginated( + defs.Credoctypes.CRE.value, page=1, per_page=1 + ) + self.assertNotEqual(list(cre_emb.keys())[0], "") + self.assertIn(list(cre_emb.keys())[0], list([e.cre_id for e in cre_embeddings])) + self.assertNotIn( + list(cre_emb.keys())[0], list([e.node_id for e in cre_embeddings]) + ) + self.assertEqual(total_pages, 10) + self.assertEqual(curr_page, 1) + + ( + node_emb, + total_pages, + curr_page, + ) = self.collection.get_embeddings_by_doc_type_paginated( + defs.Credoctypes.Standard.value, page=1, per_page=1 + ) + self.assertNotEqual(list(node_emb.keys())[0], "") + self.assertIn( + list(node_emb.keys())[0], list([e.node_id for e in node_embeddings]) + ) + self.assertNotIn( + list(node_emb.keys())[0], list([e.cre_id for e in cre_embeddings]) + ) + self.assertEqual(total_pages, 10) + self.assertEqual(curr_page, 1) + + ( + tool_emb, + total_pages, + curr_page, + ) = self.collection.get_embeddings_by_doc_type_paginated( + defs.Credoctypes.Tool.value, page=1, per_page=1 + ) + self.assertEqual(total_pages, 0) + self.assertEqual(tool_emb, {}) + + def test_get_embeddings_by_doc_type(self): + """Given: a range of embedding for Nodes and a range of embeddings for CREs + when called with doc_type CRE return the cre embeddings + when called with doc_type Standard/Tool return the node embeddings""" + # add cre embeddings + cre_embeddings = [] + for i in range(0, 10): + dbca = db.CRE(external_id=f"{i}", description=f"C{i}", name=f"C{i}") + self.collection.session.add(dbca) + self.collection.session.commit() + + embeddings = [random.uniform(-1, 1) for e in range(0, 768)] + embeddings_text = "".join( + random.choices(string.ascii_uppercase + string.digits, k=100) + ) + cre_embeddings.append( + self.collection.add_embedding( + db_object=dbca, + doctype=defs.Credoctypes.CRE.value, + embeddings=embeddings, + embedding_text=embeddings_text, + ) + ) + + # add node embeddings + node_embeddings = [] + for i in range(0, 10): + dbsa = db.Node( + subsection=f"4.5.{i}", + section=f"FooStand-{i}", + name="BarStand", + link="https://example.com", + ntype=defs.Credoctypes.Standard.value, + ) + self.collection.session.add(dbsa) + self.collection.session.commit() + + embeddings = [random.uniform(-1, 1) for e in range(0, 768)] + embeddings_text = "".join( + random.choices(string.ascii_uppercase + string.digits, k=100) + ) + ne = self.collection.add_embedding( + db_object=dbsa, + doctype=defs.Credoctypes.Standard.value, + embeddings=embeddings, + embedding_text=embeddings_text, + ) + node_embeddings.append(ne) + + cre_emb = self.collection.get_embeddings_by_doc_type(defs.Credoctypes.CRE.value) + self.assertNotEqual(list(cre_emb.keys())[0], "") + self.assertIn(list(cre_emb.keys())[0], list([e.cre_id for e in cre_embeddings])) + self.assertNotIn( + list(cre_emb.keys())[0], list([e.node_id for e in cre_embeddings]) + ) + + node_emb = self.collection.get_embeddings_by_doc_type( + defs.Credoctypes.Standard.value + ) + self.assertNotEqual(list(node_emb.keys())[0], "") + self.assertIn( + list(node_emb.keys())[0], list([e.node_id for e in node_embeddings]) + ) + self.assertNotIn( + list(node_emb.keys())[0], list([e.cre_id for e in cre_embeddings]) + ) + + tool_emb = self.collection.get_embeddings_by_doc_type( + defs.Credoctypes.Tool.value + ) + self.assertEqual(tool_emb, {}) + + def test_get_standard_names(self): + for s in ["sa", "sb", "sc", "sd"]: + for sub in ["suba", "subb", "subc", "subd"]: + self.collection.add_node( + defs.Standard(name=s, section=sub, subsection=sub) + ) + self.assertCountEqual( + ["BarStand", "Unlinked", "sa", "sb", "sc", "sd"], + self.collection.standards(), + ) + + def test_all_cres_with_pagination(self): + """""" + cres = [] + nodes = [] + dbcres = [] + dbnodes = [] + sqla.session.remove() + sqla.drop_all() + sqla.create_all() + collection = db.Node_collection() + for i in range(0, 8): + if i == 0 or i == 1: + cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) + else: + cres.append(defs.CRE(name=f"C{i}", id=f"{i}")) + + dbcres.append(collection.add_cre(cres[i])) + nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) + dbnodes.append(collection.add_node(nodes[i])) + cres[i].add_link( + defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) + ) + collection.add_link( + cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo + ) + + collection.session.commit() + + paginated_cres, page, total_pages = collection.all_cres_with_pagination( + page=1, per_page=2 + ) + self.maxDiff = None + # from pprint import pprint + # pprint(cres) + self.assertEqual(paginated_cres, [cres[0], cres[1]]) + self.assertEqual(page, 1) + self.assertEqual(total_pages, 4) + + def test_all_cres_with_pagination(self): + """""" + cres = [] + nodes = [] + dbcres = [] + dbnodes = [] + sqla.session.remove() + sqla.drop_all() + sqla.create_all() + collection = db.Node_collection() + for i in range(0, 8): + if i == 0 or i == 1: + cres.append(defs.CRE(name=f">> C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) + else: + cres.append(defs.CRE(name=f"C{i}", id=f"{i}{i}{i}-{i}{i}{i}")) + + dbcres.append(collection.add_cre(cres[i])) + nodes.append(defs.Standard(section=f"S{i}", name=f"N{i}")) + dbnodes.append(collection.add_node(nodes[i])) + cres[i].add_link( + defs.Link(document=copy(nodes[i]), ltype=defs.LinkTypes.LinkedTo) + ) + collection.add_link( + cre=dbcres[i], node=dbnodes[i], ltype=defs.LinkTypes.LinkedTo + ) + + collection.session.commit() + + paginated_cres, page, total_pages = collection.all_cres_with_pagination( + page=1, per_page=2 + ) + self.maxDiff = None + self.assertEqual(paginated_cres, [cres[0], cres[1]]) + self.assertEqual(page, 1) + self.assertEqual(total_pages, 4) + + def test_get_cre_hierarchy(self) -> None: + # this needs a clean database and a clean graph so reinit everything + # sqla.session.remove() + # sqla.drop_all() + # sqla.create_all() + collection = self.collection # db.Node_collection().with_graph() + # collection.graph.with_graph(graph=nx.DiGraph(), graph_data=[]) + + _, inputDocs = export_format_data() + importItems = [] + for name, items in inputDocs.items(): + for item in items: + importItems.append(item) + if name == defs.Credoctypes.CRE: + dbitem = collection.add_cre(item) + else: + dbitem = collection.add_node(item) + for link in item.links: + if link.document.doctype == defs.Credoctypes.CRE: + linked_item = collection.add_cre(link.document) + if item.doctype == defs.Credoctypes.CRE: + collection.add_internal_link( + dbitem, linked_item, ltype=link.ltype + ) + else: + collection.add_link( + node=dbitem, cre=linked_item, ltype=link.ltype + ) + else: + linked_item = collection.add_node(link.document) + if item.doctype == defs.Credoctypes.CRE: + collection.add_link( + cre=dbitem, node=linked_item, ltype=link.ltype + ) + else: + collection.add_internal_link( + cre=linked_item, node=dbitem, ltype=link.ltype + ) + cres = inputDocs[defs.Credoctypes.CRE] + c0 = [c for c in cres if c.name == "C0"][0] + self.assertEqual(collection.get_cre_hierarchy(c0), 0) + c2 = [c for c in cres if c.name == "C2"][0] + self.assertEqual(collection.get_cre_hierarchy(c2), 1) + c3 = [c for c in cres if c.name == "C3"][0] + self.assertEqual(collection.get_cre_hierarchy(c3), 2) + c4 = [c for c in cres if c.name == "C4"][0] + self.assertEqual(collection.get_cre_hierarchy(c4), 3) + c5 = [c for c in cres if c.name == "C5"][0] + self.assertEqual(collection.get_cre_hierarchy(c5), 4) + c6 = [c for c in cres if c.name == "C6"][0] + self.assertEqual(collection.get_cre_hierarchy(c6), 0) + c7 = [c for c in cres if c.name == "C7"][0] + self.assertEqual(collection.get_cre_hierarchy(c7), 0) + c8 = [c for c in cres if c.name == "C8"][0] + self.assertEqual(collection.get_cre_hierarchy(c8), 0) diff --git a/application/tests/web_main_test.py b/application/tests/web_main_test.py index 9e219b4ce..e456b60a2 100644 --- a/application/tests/web_main_test.py +++ b/application/tests/web_main_test.py @@ -10,7 +10,11 @@ from unittest.mock import patch import redis -import rq +try: + import rq +except (ValueError, ImportError): + rq = None + import os import networkx as nx @@ -29,7 +33,8 @@ def id(self): return "ABC" def get_status(self): - return rq.job.JobStatus.STARTED + return rq.job.JobStatus.STARTED if rq else "started" + class TestMain(unittest.TestCase): diff --git a/application/utils/external_project_parsers/base_parser.py b/application/utils/external_project_parsers/base_parser.py index 5bff50e63..74dc3a6e3 100644 --- a/application/utils/external_project_parsers/base_parser.py +++ b/application/utils/external_project_parsers/base_parser.py @@ -1,5 +1,9 @@ from application.utils.external_project_parsers import base_parser_defs -from rq import Queue +try: + from rq import Queue +except (ValueError, ImportError): + Queue = None + from application.utils import redis from application.prompt_client import prompt_client as prompt_client import logging diff --git a/application/utils/gap_analysis.py b/application/utils/gap_analysis.py index 9e3dab04d..f085dbede 100644 --- a/application/utils/gap_analysis.py +++ b/application/utils/gap_analysis.py @@ -2,7 +2,11 @@ import time import logging import os -from rq import Queue, job, exceptions +try: + from rq import Queue, job, exceptions +except (ValueError, ImportError): + Queue, job, exceptions = None, None, None + from typing import List, Dict from application.utils import redis from flask import json as flask_json @@ -30,7 +34,7 @@ def make_resources_key(array: List[str]): def make_subresources_key(standards: List[str], key: str) -> str: - return str(make_resources_key(standards)) + "->" + key + return f"{str(make_resources_key(standards))}->{str(key)}" def get_path_score(path): @@ -128,48 +132,63 @@ def schedule(standards: List[str], database): logger.info(f"Gap analysis result for {standards_hash} does not exist") - conn = redis.connect() - if conn is None: - logger.error( - "Redis is not available. Please run 'make start-containers' first." - ) - return { - "error": "Redis is not available. Please run 'make start-containers' first." - } - gap_analysis_results = conn.get(standards_hash) - if ( - gap_analysis_results - ): # perhaps its calculated but not cached yet, get it from redis - gap_analysis_dict = json.loads(gap_analysis_results) - if gap_analysis_dict.get("job_id"): - try: - res = job.Job.fetch(id=gap_analysis_dict.get("job_id"), connection=conn) - except exceptions.NoSuchJobError as nje: - logger.error( - f"Could not find job id for gap analysis {standards}, this is a bug" - ) - return {"error": 404} + try: + conn = redis.connect() + if conn is None: + logger.error( + "Redis is not available. Please run 'make start-containers' first." + ) + else: + gap_analysis_results = conn.get(standards_hash) if ( - res.get_status() != job.JobStatus.FAILED - and res.get_status() != job.JobStatus.STOPPED - and res.get_status() != job.JobStatus.CANCELED - ): - logger.info( - f'gap analysis job id {gap_analysis_dict.get("job_id")}, for standards: {standards[0]}>>{standards[1]} already exists, returning early' + gap_analysis_results + ): # perhaps its calculated but not cached yet, get it from redis + gap_analysis_dict = json.loads(gap_analysis_results) + if gap_analysis_dict.get("job_id"): + try: + res = job.Job.fetch(id=gap_analysis_dict.get("job_id"), connection=conn) + except exceptions.NoSuchJobError as nje: + logger.error( + f"Could not find job id for gap analysis {standards}, this is a bug" + ) + return {"error": 404} + if ( + res.get_status() != job.JobStatus.FAILED + and res.get_status() != job.JobStatus.STOPPED + and res.get_status() != job.JobStatus.CANCELED + ): + logger.info( + f'gap analysis job id {gap_analysis_dict.get("job_id")}, for standards: {standards[0]}>>{standards[1]} already exists, returning early' + ) + return {"job_id": gap_analysis_dict.get("job_id")} + if Queue: + q = Queue(connection=conn) + gap_analysis_job = q.enqueue_call( + db.gap_analysis, + kwargs={ + "graph_db": database.graph_db, + "node_names": standards, + "cache_key": standards_hash, + }, + timeout=GAP_ANALYSIS_TIMEOUT, ) - return {"job_id": gap_analysis_dict.get("job_id")} - q = Queue(connection=conn) - gap_analysis_job = q.enqueue_call( - db.gap_analysis, - kwargs={ - "neo_db": database.neo_db, - "node_names": standards, - "cache_key": standards_hash, - }, - timeout=GAP_ANALYSIS_TIMEOUT, + conn.set(standards_hash, json.dumps({"job_id": gap_analysis_job.id, "result": ""})) + return {"job_id": gap_analysis_job.id} + except Exception as e: + logger.warning(f"Redis operation failed or timed out: {e}. Falling back to sync.") + + logger.info("RQ is not available, running gap analysis synchronously") + res = db.gap_analysis( + graph_db=database.graph_db, + node_names=standards, + cache_key=standards_hash, ) - conn.set(standards_hash, json.dumps({"job_id": gap_analysis_job.id, "result": ""})) - return {"job_id": gap_analysis_job.id} + if res: + _, grouped_paths, _ = res + return {"result": grouped_paths} + else: + logger.error(f"Gap analysis failed to return results for {standards}") + return {"error": "Gap analysis failed to return results. Please ensure standard names are correct and the graph is populated."} def preload(target_url: str): diff --git a/application/utils/redis.py b/application/utils/redis.py index 90b2296bd..1175b85f6 100644 --- a/application/utils/redis.py +++ b/application/utils/redis.py @@ -3,7 +3,12 @@ from urllib.parse import urlparse import logging from typing import Callable, List -import rq +try: + import rq +except (ValueError, ImportError): + # rq (specifically rq-scheduler) may fail on Windows due to 'fork' context requirement + rq = None + import time logging.basicConfig() @@ -31,13 +36,14 @@ def connect(): password=os.getenv("REDIS_PASSWORD", None), ssl=False if redis_no_ssl else True, ssl_cert_reqs=None, + socket_timeout=5, ) elif redis_url: logger.debug( f"Attempting to connect to Redis instance using a URL at {redis_url}" ) if redis_url == "redis://localhost:6379": - return redis.from_url(redis_url) + return redis.from_url(redis_url, socket_timeout=5) else: url = urlparse(redis_url) return redis.Redis( @@ -46,12 +52,17 @@ def connect(): password=url.password, ssl=False if redis_no_ssl else True, ssl_cert_reqs=None, + socket_timeout=5, ) else: logger.warning("Starting without Redis, functionality may be limited!") -def wait_for_jobs(jobs: List[rq.job.Job], callback: Callable = None): +def wait_for_jobs(jobs: List, callback: Callable = None): + if not rq: + logger.warning("RQ is not available on this system. Cannot wait for jobs.") + return + def do_nothing(): pass diff --git a/application/web/web_main.py b/application/web/web_main.py index 29567470a..78afb077a 100644 --- a/application/web/web_main.py +++ b/application/web/web_main.py @@ -14,7 +14,11 @@ from typing import Any from application.utils import oscal_utils, redis -from rq import job, exceptions +try: + from rq import job, exceptions +except (ValueError, ImportError): + job, exceptions = None, None + from application.utils import spreadsheet_parsers from application.utils import oscal_utils, redis @@ -738,6 +742,8 @@ def login(): session["name"] = "dev user" return redirect("/chatbot") flow_instance = CREFlow.instance() + if not flow_instance or not flow_instance.flow: + return "Login not configured. Please set up Google OAuth in .env.", 501 authorization_url, state = flow_instance.flow.authorization_url() session["state"] = state return redirect(authorization_url) diff --git a/application/worker.py b/application/worker.py index a26256622..0c6dfa32d 100644 --- a/application/worker.py +++ b/application/worker.py @@ -1,4 +1,8 @@ -from rq import Worker, Queue +try: + from rq import Worker, Queue +except (ValueError, ImportError): + Worker, Queue = None, None + import logging from application.utils import redis @@ -10,6 +14,12 @@ def start_worker(): + if not Worker: + logger.error( + "RQ Worker is not supported on Windows (requires os.fork). " + "Gap analysis will run synchronously in the web server instead." + ) + return logger.info(f"Worker Starting") worker = Worker(listen, connection=redis.connect()) worker.work() diff --git a/cre.py b/cre.py index 2e7a9d5cc..150b861a8 100644 --- a/cre.py +++ b/cre.py @@ -205,9 +205,10 @@ def main() -> None: help="for every node, download the text pointed to by the hyperlink and generate embeddings for the content of the specific node", ) parser.add_argument( + "--populate_graph_db", "--populate_neo4j_db", action="store_true", - help="populate the neo4j db", + help="populate the graph db (Neo4j or Apache AGE)", ) parser.add_argument( "--start_worker", diff --git a/scripts/benchmark_gap.py b/scripts/benchmark_gap.py index dde1e5cb3..2d5d792b0 100644 --- a/scripts/benchmark_gap.py +++ b/scripts/benchmark_gap.py @@ -1,23 +1,3 @@ -""" -Benchmark script for Gap Analysis performance (Issue #587) -=========================================================== - -Measures wall-clock time and peak memory for: - - MODE A: Original exhaustive traversal (always runs wildcard [*..20] twice) - - MODE B: Optimized tiered pruning (early exit on strong/medium links) - -Usage: - # List available standards in Neo4j: - python scripts/benchmark_gap.py --list-standards - - # Run benchmark on two standards: - python scripts/benchmark_gap.py --standard1 "OWASP Top 10 2021" --standard2 "NIST 800-53" - -Requirements: - Neo4j must be running (use: make docker-neo4j) - NEO4J_URL env var or default: neo4j://neo4j:password@localhost:7687 -""" - import argparse import os import sys @@ -29,230 +9,102 @@ sys.path.insert(0, os.path.abspath(_project_root)) try: - from neomodel import config as neo_config, db as neomodel_db - - # Must import the project's DB models so neomodel registers NeoStandard, - # NeoCRE etc. — otherwise resolve_objects=True raises NodeClassNotDefined. - import application.database.db # noqa: F401 + from application.database import db + from application.config import Config except ImportError as exc: print(f"[ERROR] Could not import project modules: {exc}") print(" Make sure you run from the project root with venv activated.") sys.exit(1) -def connect_neo4j(): - url = os.environ.get("NEO4J_URL", "neo4j://neo4j:password@localhost:7687") - neo_config.DATABASE_URL = url - print(f" → Connected to Neo4j at: {url}\n") - - def list_available_standards(): - connect_neo4j() - results, _ = neomodel_db.cypher_query( - "MATCH (n:NeoStandard) RETURN DISTINCT n.name ORDER BY n.name" - ) - if not results: - print(" [!] No NeoStandard nodes found. Import data first:") - print(" make import-neo4j") + collection = db.Node_collection() + standards = collection.standards() + if not standards: + print(" [!] No standards found in database.") return - print(f"Found {len(results)} standards:") - for row in results: - print(f" • {row[0]}") - - -def run_original(name_1, name_2): - """Original pre-PR#716 approach: always runs BOTH queries unconditionally.""" - denylist = ["Cross-cutting concerns"] - - # Query 1 — wildcard (the expensive one) - r1, _ = neomodel_db.cypher_query( - """ - MATCH (BaseStandard:NeoStandard {name: $name1}) - MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[*..20]-(CompareStandard)) - WITH p - WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE - (n:NeoCRE OR n = BaseStandard OR n = CompareStandard) - AND NOT n.name IN $denylist) - RETURN p - """, - {"name1": name_1, "name2": name_2, "denylist": denylist}, - resolve_objects=True, - ) - - # Query 2 — filtered (also always ran) - r2, _ = neomodel_db.cypher_query( - """ - MATCH (BaseStandard:NeoStandard {name: $name1}) - MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|CONTAINS)*..20]-(CompareStandard)) - WITH p - WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE - (n:NeoCRE OR n = BaseStandard OR n = CompareStandard) - AND NOT n.name IN $denylist) - RETURN p - """, - {"name1": name_1, "name2": name_2, "denylist": denylist}, - resolve_objects=True, - ) - - return len(r1) + len(r2), 2 # paths, num_queries_run - - -def run_optimized(name_1, name_2): - """Tiered pruning from PR #716/#717: exits early when strong/medium links found.""" - denylist = ["Cross-cutting concerns"] - - # Tier 1 — strong links only - r, _ = neomodel_db.cypher_query( - """ - MATCH (BaseStandard:NeoStandard {name: $name1}) - MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME)*..20]-(CompareStandard)) - WITH p - WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE - (n:NeoCRE OR n = BaseStandard OR n = CompareStandard) - AND NOT n.name IN $denylist) - RETURN p - """, - {"name1": name_1, "name2": name_2, "denylist": denylist}, - resolve_objects=True, - ) - if r: - return len(r), 1, "Tier 1 — strong links (LINKED_TO/SAME/AUTO)" - - # Tier 2 — adds CONTAINS - r, _ = neomodel_db.cypher_query( - """ - MATCH (BaseStandard:NeoStandard {name: $name1}) - MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[:(LINKED_TO|AUTOMATICALLY_LINKED_TO|SAME|CONTAINS)*..20]-(CompareStandard)) - WITH p - WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE - (n:NeoCRE OR n = BaseStandard OR n = CompareStandard) - AND NOT n.name IN $denylist) - RETURN p - """, - {"name1": name_1, "name2": name_2, "denylist": denylist}, - resolve_objects=True, - ) - if r: - return len(r), 2, "Tier 2 — medium links (adds CONTAINS)" - - # Tier 3 — wildcard fallback - r, _ = neomodel_db.cypher_query( - """ - MATCH (BaseStandard:NeoStandard {name: $name1}) - MATCH (CompareStandard:NeoStandard {name: $name2}) - MATCH p = allShortestPaths((BaseStandard)-[*..20]-(CompareStandard)) - WITH p - WHERE length(p) > 1 AND ALL(n in NODES(p) WHERE - (n:NeoCRE OR n = BaseStandard OR n = CompareStandard) - AND NOT n.name IN $denylist) - RETURN p - """, - {"name1": name_1, "name2": name_2, "denylist": denylist}, - resolve_objects=True, - ) - return len(r), 3, "Tier 3 — wildcard fallback (no strong/medium paths found)" - - -def benchmark(name_1, name_2, runs=3): - connect_neo4j() - print(f"Benchmarking gap analysis: '{name_1}' ↔ '{name_2}'") - print(f"Averaging over {runs} run(s) per mode\n") - print("=" * 68) - - # MODE A — Original - a_times, a_mems, a_paths, a_queries = [], [], 0, 0 - print("▶ MODE A — Original exhaustive (pre-PR #716 behaviour)...") + print(f"Found {len(standards)} standards:") + for s in standards: + print(f" • {s}") + + +def run_benchmark(name_1, name_2, db_type, runs=3): + """Run benchmark for a specific database type.""" + os.environ["GRAPH_DB_TYPE"] = db_type + # Force re-initialization of GraphDB if needed (Factory usually handles this) + collection = db.Node_collection() + graph_db = collection.graph_db + + print(f"▶ Benchmarking {db_type.upper()} gap analysis: '{name_1}' ↔ '{name_2}'") + + times, mems, paths = [], [], 0 for i in range(runs): tracemalloc.start() t0 = time.perf_counter() - a_paths, a_queries = run_original(name_1, name_2) + # db.gap_analysis returns (node_names, grouped_paths, extra_paths_dict) + _, res_paths, _ = db.gap_analysis(graph_db, [name_1, name_2]) + elapsed = time.perf_counter() - t0 _, peak = tracemalloc.get_traced_memory() tracemalloc.stop() - a_times.append(elapsed) - a_mems.append(peak / 1024 / 1024) - print(f" Run {i+1}: {elapsed:.3f}s | peak mem {a_mems[-1]:.2f} MB") + + times.append(elapsed) + mems.append(peak / 1024 / 1024) + # res_paths is a dict of paths, we count all paths in all groups + total_p = sum(len(group["paths"]) + group["extra"] for group in res_paths.values()) + paths = total_p + print(f" Run {i+1}: {elapsed:.3f}s | peak mem {mems[-1]:.2f} MB") - avg_a_t = sum(a_times) / runs - avg_a_m = sum(a_mems) / runs - print() + avg_t = sum(times) / runs + avg_m = sum(mems) / runs + return avg_t, avg_m, paths - # MODE B — Optimized - b_times, b_mems, b_paths, b_queries, b_tier = [], [], 0, 0, "" - print("▶ MODE B — Optimized tiered pruning (GAP_ANALYSIS_OPTIMIZED=true)...") - for i in range(runs): - tracemalloc.start() - t0 = time.perf_counter() - b_paths, b_queries, b_tier = run_optimized(name_1, name_2) - elapsed = time.perf_counter() - t0 - _, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - b_times.append(elapsed) - b_mems.append(peak / 1024 / 1024) - print( - f" Run {i+1}: {elapsed:.3f}s | peak mem {b_mems[-1]:.2f} MB | queries run: {b_queries}" - ) - avg_b_t = sum(b_times) / runs - avg_b_m = sum(b_mems) / runs +def benchmark(name_1, name_2, runs=3): + print(f"Comparative Benchmark: '{name_1}' ↔ '{name_2}'") + print(f"Averaging over {runs} run(s) per backend\n") + print("=" * 68) - t_pct = ((avg_a_t - avg_b_t) / avg_a_t * 100) if avg_a_t > 0 else 0 - m_pct = ((avg_a_m - avg_b_m) / avg_a_m * 100) if avg_a_m > 0 else 0 + # Benchmark Neo4j + neo_t, neo_m, neo_p = run_benchmark(name_1, name_2, "neo4j", runs) + print() - direction = "faster" if t_pct >= 0 else "slower" + # Benchmark AGE + age_t, age_m, age_p = run_benchmark(name_1, name_2, "age", runs) print() + + t_pct = ((neo_t - age_t) / neo_t * 100) if neo_t > 0 else 0 + direction = "faster" if t_pct >= 0 else "slower" + print("=" * 68) print("RESULTS") print("=" * 68) - print(f" Pair: '{name_1}' ↔ '{name_2}' | {runs} run(s)\n") - print(f" {'Metric':<26} {'MODE A (original)':>18} {'MODE B (optimized)':>18}") - print(f" {'-'*26} {'-'*18} {'-'*18}") - print(f" {'Avg time (s)':<26} {avg_a_t:>18.3f} {avg_b_t:>18.3f}") - print(f" {'Avg peak memory (MB)':<26} {avg_a_m:>18.2f} {avg_b_m:>18.2f}") - print(f" {'Total paths returned':<26} {a_paths:>18} {b_paths:>18}") - print(f" {'DB queries executed':<26} {a_queries:>18} {b_queries:>18}") + print(f" Metric Neo4j Apache AGE") + print(f" {'-'*60}") + print(f" Avg time (s) {neo_t:>10.3f} {age_t:>10.3f}") + print(f" Avg peak memory (MB) {neo_m:>10.2f} {age_m:>10.2f}") + print(f" Total paths {neo_p:>10} {age_p:>10}") print() - print(f" ⚡ Mode B is {abs(t_pct):.1f}% {direction} than Mode A") - print( - f" 🧠 Mode B used {abs(m_pct):.1f}% {'less' if m_pct >= 0 else 'more'} peak memory" - ) - print(f" 🔍 Mode B exited at: {b_tier}") + print(f" ⚡ Apache AGE is {abs(t_pct):.1f}% {direction} than Neo4j") print("=" * 68) - # GitHub-ready table - print() - print("### GitHub-ready Benchmark Table\n") - print( - "| Metric | Original (`GAP_ANALYSIS_OPTIMIZED=false`) | Optimized (`GAP_ANALYSIS_OPTIMIZED=true`) | Δ |" - ) - print( - "|--------|------------------------------------------|------------------------------------------|---|" - ) - print( - f"| Avg query time | `{avg_a_t:.3f}s` | `{avg_b_t:.3f}s` | **{abs(t_pct):.1f}% {direction}** |" - ) - print( - f"| Peak memory | `{avg_a_m:.2f} MB` | `{avg_b_m:.2f} MB` | **{abs(m_pct):.1f}% {'less' if m_pct >= 0 else 'more'}** |" - ) - print(f"| Paths returned | `{a_paths}` | `{b_paths}` | — |") - print( - f"| DB queries run | `{a_queries}` (always both) | `{b_queries}` (early exit at {b_tier.split('—')[0].strip()}) | — |" - ) - if __name__ == "__main__": - p = argparse.ArgumentParser(description="Gap analysis benchmark — Issue #587") + p = argparse.ArgumentParser(description="Multi-backend Gap analysis benchmark") p.add_argument("--standard1", default="OWASP Top 10 2021") p.add_argument("--standard2", default="NIST 800-53") p.add_argument("--runs", type=int, default=3) p.add_argument("--list-standards", action="store_true") + p.add_argument("--db", choices=["neo4j", "age", "both"], default="both") args = p.parse_args() - if args.list_standards: - list_available_standards() - else: - benchmark(args.standard1, args.standard2, args.runs) + from application import create_app + app = create_app(mode=os.getenv("FLASK_CONFIG", "development")) + + with app.app_context(): + if args.list_standards: + list_available_standards() + elif args.db == "both": + benchmark(args.standard1, args.standard2, args.runs) + else: + run_benchmark(args.standard1, args.standard2, args.db, args.runs) From d4e265e09822ef4f5ad9a0c5f2a1abb9db7c11ba Mon Sep 17 00:00:00 2001 From: khushi shukla <149226589+khushishukla2813@users.noreply.github.com> Date: Sat, 14 Mar 2026 00:04:27 +0530 Subject: [PATCH 2/4] style: format python files with black --- application/database/db.py | 116 +++++++++++++++++++----------- application/utils/gap_analysis.py | 18 +++-- application/utils/redis.py | 1 + scripts/benchmark_gap.py | 15 ++-- 4 files changed, 97 insertions(+), 53 deletions(-) diff --git a/application/database/db.py b/application/database/db.py index 125b1e409..37f742a55 100644 --- a/application/database/db.py +++ b/application/database/db.py @@ -806,7 +806,6 @@ class AGEDB: _is_connecting: bool = False _lock = threading.Lock() - @classmethod def instance(cls): """Singleton instance for Apache AGE database connection.""" @@ -815,6 +814,7 @@ def instance(cls): if cls.__instance is None: cls.__instance = cls.__new__(cls) from application.config import Config + cls.graph_name = Config.AGE_GRAPH or "opencre" cls.conn = None cls.connected = False @@ -838,18 +838,21 @@ def instance(cls): thread = threading.Thread(target=cls._connect_background) thread.daemon = True thread.start() - + return cls.__instance @classmethod def _connect_background(cls): """Background thread to handle the potentially hanging connection.""" from application.config import Config + try: - logger.info(f"Background: Attempting to connect to Apache AGE at {Config.AGE_URL}...") + logger.info( + f"Background: Attempting to connect to Apache AGE at {Config.AGE_URL}..." + ) cls.conn = psycopg2.connect(Config.AGE_URL, connect_timeout=10) cls.conn.autocommit = True - + with cls.conn.cursor() as cursor: cursor.execute("SET statement_timeout = 10000;") cursor.execute("CREATE EXTENSION IF NOT EXISTS age;") @@ -875,12 +878,16 @@ def _connect_background(cls): cls.connected = True logger.info("Background: Successfully connected to Apache AGE.") except Exception as e: - logger.error(f"Background: Apache AGE connection failed: {e}. disabling AGE for this session.") + logger.error( + f"Background: Apache AGE connection failed: {e}. disabling AGE for this session." + ) cls._disabled_permanently = True cls.connected = False if cls.conn: - try: cls.conn.close() - except: pass + try: + cls.conn.close() + except: + pass cls.conn = None finally: cls._is_connecting = False @@ -890,6 +897,7 @@ def _connect_background(cls): def instance_blocking(cls, timeout: int = 30): """Synchronous version of instance() - blocks until connection is ready or timeout.""" import time + cls.instance() # Start background thread waited = 0 while cls._is_connecting and waited < timeout: @@ -947,9 +955,10 @@ def _parse_agtype(cls, agtype_val): if isinstance(agtype_val, str): import json import re - # AGE appends ::vertex, ::edge, ::path at the end of the string. + + # AGE appends ::vertex, ::edge, ::path at the end of the string. # We strip them carefully avoiding :: inside values. - json_str = re.sub(r'::(vertex|edge|path)$', '', agtype_val) + json_str = re.sub(r"::(vertex|edge|path)$", "", agtype_val) try: data = json.loads(json_str) except json.JSONDecodeError: @@ -973,7 +982,7 @@ def __init__(self, d): self.version = props.get("version") self.description = props.get("description") self.sql_id = str(props.get("sql_id", "")) - + # Map label to doctype for frontend compatibility self.doctype = "Standard" if self.label == "NeoCRE": @@ -982,30 +991,38 @@ def __init__(self, d): self.doctype = "Tool" # Store in dict for JSON serialization to frontend - super().__init__({ - "id": self.id, - "name": self.name, - "section": self.section, - "sectionID": self.section_id, - "subsection": self.subsection, - "version": self.version, - "external_id": self.external_id, - "description": self.description, - "doctype": self.doctype, - "sql_id": self.sql_id - }) + super().__init__( + { + "id": self.id, + "name": self.name, + "section": self.section, + "sectionID": self.section_id, + "subsection": self.subsection, + "version": self.version, + "external_id": self.external_id, + "description": self.description, + "doctype": self.doctype, + "sql_id": self.sql_id, + } + ) def to_cre_def(self, *args, **kwargs): from application.defs import cre_defs + if self.doctype == "CRE": - return cre_defs.CRE(name=self.name, id=self.external_id, description=self.description) + return cre_defs.CRE( + name=self.name, + id=self.external_id, + description=self.description, + ) return cre_defs.Standard( - name=self.name, - section=self.section, - subsection=self.subsection, + name=self.name, + section=self.section, + subsection=self.subsection, version=self.version, - sectionID=self.section_id + sectionID=self.section_id, ) + return MockNode(data) @classmethod @@ -1013,6 +1030,7 @@ def _parse_agpath(cls, agpath_val): """Translate AGE path to Neo4j-like path record.""" if isinstance(agpath_val, str): import json + # AGE sometimes appends ::path to the JSON string json_str = agpath_val.split("::")[0] try: @@ -1022,30 +1040,30 @@ def _parse_agpath(cls, agpath_val): return {"start": {"id": "stub"}, "end": {"id": "stub"}, "path": []} else: data = agpath_val - + # AGE path is a list: [v1, e1, v2, e2, v3, ...] - # Note: Depending on AGE version and driver, structure might vary. + # Note: Depending on AGE version and driver, structure might vary. # Usually it's a dict with 'vertices' and 'edges' or a flat list. # This implementation assumes flat list. if not isinstance(data, list): - return {"start": {"id": "stub"}, "end": {"id": "stub"}, "path": []} + return {"start": {"id": "stub"}, "end": {"id": "stub"}, "path": []} vertices = [v for i, v in enumerate(data) if i % 2 == 0] edges = [e for i, e in enumerate(data) if i % 2 != 0] - + path_steps = [] for i in range(len(edges)): step = { "start": cls._parse_agtype(vertices[i]), - "end": cls._parse_agtype(vertices[i+1]), - "relationship": edges[i].get("label") + "end": cls._parse_agtype(vertices[i + 1]), + "relationship": edges[i].get("label"), } path_steps.append(step) - + return { "start": cls._parse_agtype(vertices[0]), "end": cls._parse_agtype(vertices[-1]), - "path": path_steps + "path": path_steps, } @classmethod @@ -1059,7 +1077,9 @@ def populate_DB(cls, session): with cls.conn.cursor() as cursor: # Clear existing data - cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (n) DETACH DELETE n $AGE$) as (a agtype);") + cursor.execute( + f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (n) DETACH DELETE n $AGE$) as (a agtype);" + ) # Migration of Standards nodes = session.query(Node).all() @@ -1073,7 +1093,9 @@ def populate_DB(cls, session): version = (node.version or "").replace('"', '\\"') link = (node.link or "").replace('"', '\\"') sid = str(node.id) - cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ CREATE (n:NeoStandard {{name: \"{name}\", section: \"{section}\", section_id: \"{section_id}\", subsection: \"{subsection}\", version: \"{version}\", link: \"{link}\", sql_id: \"{sid}\"}}) $AGE$) as (a agtype);") + cursor.execute( + f'SELECT * FROM cypher(\'{cls.graph_name}\', $AGE$ CREATE (n:NeoStandard {{name: "{name}", section: "{section}", section_id: "{section_id}", subsection: "{subsection}", version: "{version}", link: "{link}", sql_id: "{sid}"}}) $AGE$) as (a agtype);' + ) except Exception as e: logger.error(f"Failed to migrate Standard {node.id}: {e}") @@ -1086,7 +1108,9 @@ def populate_DB(cls, session): desc = (cre.description or "").replace('"', '\\"') eid = (cre.external_id or "").replace('"', '\\"') sid = str(cre.id) - cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ CREATE (n:NeoCRE {{name: \"{name}\", description: \"{desc}\", external_id: \"{eid}\", sql_id: \"{sid}\"}}) $AGE$) as (a agtype);") + cursor.execute( + f'SELECT * FROM cypher(\'{cls.graph_name}\', $AGE$ CREATE (n:NeoCRE {{name: "{name}", description: "{desc}", external_id: "{eid}", sql_id: "{sid}"}}) $AGE$) as (a agtype);' + ) except Exception as e: logger.error(f"Failed to migrate CRE {cre.id}: {e}") @@ -1095,10 +1119,12 @@ def populate_DB(cls, session): logger.info(f"Migrating {len(internal_links)} CRE-CRE links to AGE") for link in internal_links: try: - rel_type = re.sub(r'[^a-zA-Z0-9_]', '', link.type.upper()) + rel_type = re.sub(r"[^a-zA-Z0-9_]", "", link.type.upper()) gid = str(link.group) cid = str(link.cre) - cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (a:NeoCRE {{sql_id: \"{gid}\"}}), (b:NeoCRE {{sql_id: \"{cid}\"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);") + cursor.execute( + f'SELECT * FROM cypher(\'{cls.graph_name}\', $AGE$ MATCH (a:NeoCRE {{sql_id: "{gid}"}}), (b:NeoCRE {{sql_id: "{cid}"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);' + ) except Exception as e: # logger.debug(f"Failed to migrate CRE-CRE link {link.id}: {e}") pass @@ -1108,15 +1134,19 @@ def populate_DB(cls, session): logger.info(f"Migrating {len(links)} CRE-Standard links to AGE") for link in links: try: - rel_type = re.sub(r'[^a-zA-Z0-9_]', '', link.type.upper()) + rel_type = re.sub(r"[^a-zA-Z0-9_]", "", link.type.upper()) cid = str(link.cre) nid = str(link.node) - cursor.execute(f"SELECT * FROM cypher('{cls.graph_name}', $AGE$ MATCH (a:NeoCRE {{sql_id: \"{cid}\"}}), (b:NeoStandard {{sql_id: \"{nid}\"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);") + cursor.execute( + f'SELECT * FROM cypher(\'{cls.graph_name}\', $AGE$ MATCH (a:NeoCRE {{sql_id: "{cid}"}}), (b:NeoStandard {{sql_id: "{nid}"}}) CREATE (a)-[:{rel_type}]->(b) $AGE$) as (a agtype);' + ) except Exception as e: # logger.debug(f"Failed to migrate CRE-Standard link {link.id}: {e}") pass - logger.info(f"Populated {len(nodes)} standards, {len(cres)} CREs, and synchronized all links into AGE graph '{cls.graph_name}'") + logger.info( + f"Populated {len(nodes)} standards, {len(cres)} CREs, and synchronized all links into AGE graph '{cls.graph_name}'" + ) class GraphDB: diff --git a/application/utils/gap_analysis.py b/application/utils/gap_analysis.py index f085dbede..6bd95042e 100644 --- a/application/utils/gap_analysis.py +++ b/application/utils/gap_analysis.py @@ -2,6 +2,7 @@ import time import logging import os + try: from rq import Queue, job, exceptions except (ValueError, ImportError): @@ -146,7 +147,9 @@ def schedule(standards: List[str], database): gap_analysis_dict = json.loads(gap_analysis_results) if gap_analysis_dict.get("job_id"): try: - res = job.Job.fetch(id=gap_analysis_dict.get("job_id"), connection=conn) + res = job.Job.fetch( + id=gap_analysis_dict.get("job_id"), connection=conn + ) except exceptions.NoSuchJobError as nje: logger.error( f"Could not find job id for gap analysis {standards}, this is a bug" @@ -172,10 +175,15 @@ def schedule(standards: List[str], database): }, timeout=GAP_ANALYSIS_TIMEOUT, ) - conn.set(standards_hash, json.dumps({"job_id": gap_analysis_job.id, "result": ""})) + conn.set( + standards_hash, + json.dumps({"job_id": gap_analysis_job.id, "result": ""}), + ) return {"job_id": gap_analysis_job.id} except Exception as e: - logger.warning(f"Redis operation failed or timed out: {e}. Falling back to sync.") + logger.warning( + f"Redis operation failed or timed out: {e}. Falling back to sync." + ) logger.info("RQ is not available, running gap analysis synchronously") res = db.gap_analysis( @@ -188,7 +196,9 @@ def schedule(standards: List[str], database): return {"result": grouped_paths} else: logger.error(f"Gap analysis failed to return results for {standards}") - return {"error": "Gap analysis failed to return results. Please ensure standard names are correct and the graph is populated."} + return { + "error": "Gap analysis failed to return results. Please ensure standard names are correct and the graph is populated." + } def preload(target_url: str): diff --git a/application/utils/redis.py b/application/utils/redis.py index 1175b85f6..e2a1d3c94 100644 --- a/application/utils/redis.py +++ b/application/utils/redis.py @@ -3,6 +3,7 @@ from urllib.parse import urlparse import logging from typing import Callable, List + try: import rq except (ValueError, ImportError): diff --git a/scripts/benchmark_gap.py b/scripts/benchmark_gap.py index 2d5d792b0..0a27cb7c6 100644 --- a/scripts/benchmark_gap.py +++ b/scripts/benchmark_gap.py @@ -34,24 +34,26 @@ def run_benchmark(name_1, name_2, db_type, runs=3): # Force re-initialization of GraphDB if needed (Factory usually handles this) collection = db.Node_collection() graph_db = collection.graph_db - + print(f"▶ Benchmarking {db_type.upper()} gap analysis: '{name_1}' ↔ '{name_2}'") - + times, mems, paths = [], [], 0 for i in range(runs): tracemalloc.start() t0 = time.perf_counter() # db.gap_analysis returns (node_names, grouped_paths, extra_paths_dict) _, res_paths, _ = db.gap_analysis(graph_db, [name_1, name_2]) - + elapsed = time.perf_counter() - t0 _, peak = tracemalloc.get_traced_memory() tracemalloc.stop() - + times.append(elapsed) mems.append(peak / 1024 / 1024) # res_paths is a dict of paths, we count all paths in all groups - total_p = sum(len(group["paths"]) + group["extra"] for group in res_paths.values()) + total_p = sum( + len(group["paths"]) + group["extra"] for group in res_paths.values() + ) paths = total_p print(f" Run {i+1}: {elapsed:.3f}s | peak mem {mems[-1]:.2f} MB") @@ -99,8 +101,9 @@ def benchmark(name_1, name_2, runs=3): args = p.parse_args() from application import create_app + app = create_app(mode=os.getenv("FLASK_CONFIG", "development")) - + with app.app_context(): if args.list_standards: list_available_standards() From 6471ca4a76268cb678921dc0e4fd8d1aa926ada5 Mon Sep 17 00:00:00 2001 From: khushi shukla <149226589+khushishukla2813@users.noreply.github.com> Date: Sat, 14 Mar 2026 00:14:41 +0530 Subject: [PATCH 3/4] style: final black formatting and removal of .venv garbage --- application/cmd/cre_main.py | 11 +++++----- application/config.py | 3 ++- application/tests/cre_main_test.py | 1 + application/tests/db_test.py | 20 ++++++++++++++----- application/tests/web_main_test.py | 2 +- .../external_project_parsers/base_parser.py | 1 + 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/application/cmd/cre_main.py b/application/cmd/cre_main.py index 8f0e85446..cfc1e7556 100644 --- a/application/cmd/cre_main.py +++ b/application/cmd/cre_main.py @@ -9,10 +9,11 @@ import requests from typing import Any, Callable, Dict, Generator, List, Optional, Tuple -try: - from rq import Queue, job, exceptions -except (ValueError, ImportError): - Queue, job, exceptions = None, None, None + +try: + from rq import Queue, job, exceptions +except (ValueError, ImportError): + Queue, job, exceptions = None, None, None from dacite import from_dict from dacite.config import Config @@ -723,4 +724,4 @@ def populate_graph_db(cache: str): database = db_connect(path=cache) logger.info(f"Populating graph DB: Populating") database.graph_db.populate_DB(database.session) - logger.info(f"Populating graph DB: Complete") + logger.info(f"Populating graph DB: Complete") diff --git a/application/config.py b/application/config.py index 53ac5836f..693dd9b8b 100644 --- a/application/config.py +++ b/application/config.py @@ -15,7 +15,8 @@ class Config: ) GRAPH_DB_TYPE = os.environ.get("GRAPH_DB_TYPE", "neo4j").lower() AGE_URL = ( - os.environ.get("AGE_URL") or "postgresql://postgres:password@localhost:5433/postgres" + os.environ.get("AGE_URL") + or "postgresql://postgres:password@localhost:5433/postgres" ) AGE_GRAPH = os.environ.get("AGE_GRAPH") or "opencre" diff --git a/application/tests/cre_main_test.py b/application/tests/cre_main_test.py index b1821ec9b..78713c88e 100644 --- a/application/tests/cre_main_test.py +++ b/application/tests/cre_main_test.py @@ -6,6 +6,7 @@ from typing import Any, Dict, List from unittest import mock from unittest.mock import Mock, patch + try: from rq import Queue except (ValueError, ImportError): diff --git a/application/tests/db_test.py b/application/tests/db_test.py index 53c5e221f..6241bdbd3 100644 --- a/application/tests/db_test.py +++ b/application/tests/db_test.py @@ -1399,7 +1399,9 @@ def test_gap_analysis_one_weak_link(self, gap_mock): }, ) self.maxDiff = None - self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected + ) @patch.object(db.graph_db, "gap_analysis") def test_gap_analysis_duplicate_link_path_existing_lower(self, gap_mock): @@ -1461,7 +1463,9 @@ def test_gap_analysis_duplicate_link_path_existing_lower(self, gap_mock): }, {"111-111": {"paths": {}}}, ) - self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected + ) @patch.object(db.graph_db, "gap_analysis") def test_gap_analysis_duplicate_link_path_existing_lower_new_in_extras( @@ -1530,7 +1534,9 @@ def test_gap_analysis_duplicate_link_path_existing_lower_new_in_extras( }, {"111-111": {"paths": {}}}, ) - self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected + ) @patch.object(db.graph_db, "gap_analysis") def test_gap_analysis_duplicate_link_path_existing_higher(self, gap_mock): @@ -1592,7 +1598,9 @@ def test_gap_analysis_duplicate_link_path_existing_higher(self, gap_mock): }, {"111-111": {"paths": {}}}, ) - self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected + ) @patch.object(db.graph_db, "gap_analysis") def test_gap_analysis_duplicate_link_path_existing_higher_and_in_extras( @@ -1661,7 +1669,9 @@ def test_gap_analysis_duplicate_link_path_existing_higher_and_in_extras( }, {"111-111": {"paths": {}}}, ) - self.assertEqual(db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected) + self.assertEqual( + db.gap_analysis(collection.graph_db, ["788-788", "b"]), expected + ) @patch.object(db.graph_db, "gap_analysis") def test_gap_analysis_dump_to_cache(self, gap_mock): diff --git a/application/tests/web_main_test.py b/application/tests/web_main_test.py index e456b60a2..5389cbac3 100644 --- a/application/tests/web_main_test.py +++ b/application/tests/web_main_test.py @@ -10,6 +10,7 @@ from unittest.mock import patch import redis + try: import rq except (ValueError, ImportError): @@ -36,7 +37,6 @@ def get_status(self): return rq.job.JobStatus.STARTED if rq else "started" - class TestMain(unittest.TestCase): def tearDown(self) -> None: sqla.session.remove() diff --git a/application/utils/external_project_parsers/base_parser.py b/application/utils/external_project_parsers/base_parser.py index 74dc3a6e3..5605fbbdb 100644 --- a/application/utils/external_project_parsers/base_parser.py +++ b/application/utils/external_project_parsers/base_parser.py @@ -1,4 +1,5 @@ from application.utils.external_project_parsers import base_parser_defs + try: from rq import Queue except (ValueError, ImportError): From 2b96d37f93d3ea91779eabb7895e88ba4d9847ff Mon Sep 17 00:00:00 2001 From: khushi shukla <149226589+khushishukla2813@users.noreply.github.com> Date: Sat, 14 Mar 2026 00:15:23 +0530 Subject: [PATCH 4/4] chore: remove .venv from tracking (final) --- .venv/Scripts/python.exe | Bin 270104 -> 0 bytes .venv/Scripts/pythonw.exe | Bin 258840 -> 0 bytes .venv/pyvenv.cfg | 5 ----- 3 files changed, 5 deletions(-) delete mode 100644 .venv/Scripts/python.exe delete mode 100644 .venv/Scripts/pythonw.exe delete mode 100644 .venv/pyvenv.cfg diff --git a/.venv/Scripts/python.exe b/.venv/Scripts/python.exe deleted file mode 100644 index b58faef9ef3369842bcb32282c278c9560b72f93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270104 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