Skip to content

Commit

Permalink
feat: update make_diff_changelog
Browse files Browse the repository at this point in the history
- reset entity counter for property graph nodes and relationships for each cypher statement to make them easier to test
- add _parent object attr to Tags
- handle generating match clauses for entities that rely on other entities for their uniqueness (props, edges, tags)
- add tests for diff changelog to test_014diff_changelog.py
- update versioning tests to turn entity versioning off at the end of test so it doesn't affect subsequent tests involving entities
- bump version from 0.2.4 to 0.2.5
- update dependency versions identified as security risks by dependabot
  • Loading branch information
nelsonwmoore committed Nov 15, 2023
1 parent 055aad5 commit cc0a16a
Show file tree
Hide file tree
Showing 7 changed files with 1,929 additions and 1,374 deletions.
2,449 changes: 1,250 additions & 1,199 deletions python/poetry.lock

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions python/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "bento-meta"
version = "0.2.4"
version = "0.2.5"
description = "Python drivers for Bento Metamodel Database"
authors = [
{ name="Mark A. Jensen", email = "mark.jensen@nih.gov"},
Expand All @@ -20,7 +20,7 @@ classifiers = [

[tool.poetry]
name = "bento-meta"
version = "0.2.4"
version = "0.2.5"
description = "Python drivers for Bento Metamodel Database"
authors = [
"Mark A. Jensen <mark.jensen@nih.gov>",
Expand All @@ -37,7 +37,7 @@ PyYAML = ">=6.0.1"
delfick-project = "^0.7.9"
neo4j = ">=4.0"
nanoid = "^2.0.0"
requests = "^2.28.1"
requests = "2.31.0"
tqdm = "^4.64.1"
setuptools = "^65.4.1"
numpy = {version = "^1.23.5", optional = true}
Expand All @@ -46,6 +46,10 @@ spacy = {version = "^3.4.3", optional = true}
click = {version = "^8.1.3", optional = true}
liquichange = "^0.2.1"
bento-mdf = "^0.9.1"
tornado = "6.3.3"
cryptography = "41.0.3"
certifi = "2023.7.22"
markdown-it-py = "2.2.0"

[tool.poetry.extras]
Tools = ["click", "numpy", "pandas", "spacy", "liquichange"]
Expand Down
223 changes: 170 additions & 53 deletions python/scripts/make_diff_changelog.py

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions python/src/bento_meta/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class Property(Entity):
"units": "units",
"item_domain": "item_domain",
"is_required": "is_required",
"parent_handle": "parent_handle",
"_parent_handle": "_parent_handle",
},
"relationship": {
"concept": {"rel": ":has_concept>", "end_cls": "Concept"},
Expand Down Expand Up @@ -335,11 +335,12 @@ def __init__(self, init=None):
class Tag(Entity):
"""Subclass that allows simple key-value tagging of a model at arbitrary points."""

attspec_ = {"key": "simple", "value": "simple"}
attspec_ = {"key": "simple", "value": "simple", "_parent": "object"}
mapspec_ = {
"label": "tag",
"key": "key",
"property": {"key": "key", "value": "value"},
"relationship": {"_parent": {"rel": "<:has_tag", "end_cls": "Entity"}},
}
(attspec, _mapspec) = mergespec("Tag", attspec_, mapspec_)

Expand Down
202 changes: 104 additions & 98 deletions python/tests/test_007versioning.py
Original file line number Diff line number Diff line change
@@ -1,106 +1,112 @@
import re
import sys
sys.path.insert(0,'.')
sys.path.insert(0,'..')

sys.path.insert(0, ".")
sys.path.insert(0, "..")
from pdb import set_trace

import pytest
from bento_meta.entity import *
from bento_meta.objects import *
from pdb import set_trace


def test_object_versioning():
Entity.versioning(True)
assert Entity.versioning_on
Entity.set_version_count(3)
assert Entity.version_count==3
Entity.set_version_count(1)
# r1
# / \
# n1 n2
# /|\
# p1 p2 p3
n1=Node({"handle":"n1"})
n2=Node({"handle":"n2"})
r1=Edge({"handle":"r1","src":n1,"dst":n2})
p1=Property({"handle":"p1"})
p2=Property({"handle":"p2"})
p3=Property({"handle":"p3"})
n2.props['p1']=p1
n2.props['p2']=p2
n2.props['p3']=p3

assert r1.src == n1
assert r1.dst == n2
assert n2.props['p1'] == p1

for e in [n1,n2,r1,p1,p2,p3]:
assert e._from==1
assert not e._to

dup = n1.dup()
assert dup != n1
Entity.set_version_count(2) # bump version

# r1 r21
# / \ / \
# n1 n2 n21
# /|\ |
# p1 p2 p3 p21

n21=Node({"handle":"n21"})
r21=Edge({"handle":"r21","src":n2,"dst":n21})
p21=Property({"handle":"p21"})
n21.props['p21']=p21
assert r1.dst == r21.src

for e in [r21,n21,p21]:
assert e._from == 2
assert not e._to

for e in [n1,n2,r1,p1,p2,p3]:
assert e._from == 1

Entity.set_version_count(3)

# r1 r21
# / \ / \
# n1 n2 n21
# /|\ |
# p1 p2 p3 p21

n31=Node({"handle":"n31"})
n21.delete()
r21.dst=n31
assert r21.dst == n31
assert r21._prev
assert r21._prev._next == r21
assert r21._prev.handle == "r21"
assert r21._prev.dst == n21

n1._commit = "blarf"
assert n1._commit == "blarf"
assert not n1._prev._commit # prev version attr still empth
assert not n1._prev._prev # only two versions of n1
assert r1._prev # changing n1 induced a change on r1 (owner of n1)
assert r1.src._commit == "blarf" # latest r1 src is the latest n1
assert not r1._prev.src._commit # old r1 src, old n1, has empty category attr
assert not r1._prev._prev # only 2 versions of r1
prev = n1._prev
n1.model="test2" # change another attr shouldn't dup
assert n1._prev == prev # and it didn't dup
assert prev._next == n1 # yep

Entity.set_version_count(4)
# r1 r21 --
# / \ / \
# n1* n2 -- n31
# /|\ \ /
# p1 p2 p3 p41 p21

p41=Property({"handle":"p41"})
n2.props['p41']=p41
assert n2._prev
assert not 'p41' in n2._prev.props
assert n2.props['p41'] == p41

Entity.versioning(True)
assert Entity.versioning_on
Entity.set_version_count(3)
assert Entity.version_count == 3
Entity.set_version_count(1)
# r1
# / \
# n1 n2
# /|\
# p1 p2 p3
n1 = Node({"handle": "n1"})
n2 = Node({"handle": "n2"})
r1 = Edge({"handle": "r1", "src": n1, "dst": n2})
p1 = Property({"handle": "p1"})
p2 = Property({"handle": "p2"})
p3 = Property({"handle": "p3"})
n2.props["p1"] = p1
n2.props["p2"] = p2
n2.props["p3"] = p3

assert r1.src == n1
assert r1.dst == n2
assert n2.props["p1"] == p1

for e in [n1, n2, r1, p1, p2, p3]:
assert e._from == 1
assert not e._to

dup = n1.dup()
assert dup != n1
Entity.set_version_count(2) # bump version

# r1 r21
# / \ / \
# n1 n2 n21
# /|\ |
# p1 p2 p3 p21

n21 = Node({"handle": "n21"})
r21 = Edge({"handle": "r21", "src": n2, "dst": n21})
p21 = Property({"handle": "p21"})
n21.props["p21"] = p21
assert r1.dst == r21.src

for e in [r21, n21, p21]:
assert e._from == 2
assert not e._to

for e in [n1, n2, r1, p1, p2, p3]:
assert e._from == 1

Entity.set_version_count(3)

# r1 r21
# / \ / \
# n1 n2 n21
# /|\ |
# p1 p2 p3 p21

n31 = Node({"handle": "n31"})
n21.delete()
r21.dst = n31
assert r21.dst == n31
assert r21._prev
assert r21._prev._next == r21
assert r21._prev.handle == "r21"
assert r21._prev.dst == n21

n1._commit = "blarf"
assert n1._commit == "blarf"
assert not n1._prev._commit # prev version attr still empth
assert not n1._prev._prev # only two versions of n1
assert r1._prev # changing n1 induced a change on r1 (owner of n1)
assert r1.src._commit == "blarf" # latest r1 src is the latest n1
assert not r1._prev.src._commit # old r1 src, old n1, has empty category attr
assert not r1._prev._prev # only 2 versions of r1
prev = n1._prev
n1.model = "test2" # change another attr shouldn't dup
assert n1._prev == prev # and it didn't dup
assert prev._next == n1 # yep

Entity.set_version_count(4)
# r1 r21 --
# / \ / \
# n1* n2 -- n31
# /|\ \ /
# p1 p2 p3 p41 p21

p41 = Property({"handle": "p41"})
n2.props["p41"] = p41
assert n2._prev
assert not "p41" in n2._prev.props
assert n2.props["p41"] == p41
Entity.versioning(False)
assert not Entity.versioning_on


if __name__ == "__main__":
test_object_versioning()
test_object_versioning()
26 changes: 7 additions & 19 deletions python/tests/test_014changelog.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
import os
import sys

from bento_mdf.diff import diff_models
from bento_mdf.mdf import MDF
from bento_meta.objects import Property
from bento_meta.util.changelog import update_config_changeset_id
from scripts.make_diff_changelog import convert_diff_to_changelog
from liquichange.changelog import Changeset

sys.path.append("../")

from scripts.make_mapping_changelog import convert_mappings_to_changelog
from scripts.make_model_changelog import (
convert_model_to_changelog,
escape_quotes_in_attr,
)

sys.path.append("../")

# define filepaths for sample MDFs
CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))
TEST_MDF = os.path.join(CURRENT_DIRECTORY, "samples", "test_mdf.yml")
Expand All @@ -38,21 +38,6 @@ def test_make_model_changelog():
assert len(changelog.subelements) == 46


# make_diff_changelog
def test_make_diff_changelog():
mdf_old = MDF(TEST_MDF, handle=MODEL_HDL, _commit=_COMMIT, raiseError=True)
mdf_new = MDF(TEST_MDF_DIFF, handle=MODEL_HDL, _commit=_COMMIT, raiseError=True)
diff = diff_models(mdl_a=mdf_old.model, mdl_b=mdf_new.model)
changelog = convert_diff_to_changelog(
diff=diff,
model_handle=MODEL_HDL,
author=AUTHOR,
config_file_path=TEST_CHANGELOG_CONFIG,
)
update_config_changeset_id(TEST_CHANGELOG_CONFIG, 1)
assert len(changelog.subelements) == 33


# make_mapping_changelog
def test_make_mapping_changelog():
changelog = convert_mappings_to_changelog(
Expand All @@ -62,6 +47,9 @@ def test_make_mapping_changelog():
_commit=_COMMIT,
)
update_config_changeset_id(TEST_CHANGELOG_CONFIG, 1)
sample_changeset = changelog.subelements[0]
assert isinstance(sample_changeset, Changeset)
assert sample_changeset.run_always is True
assert len(changelog.subelements) == 6


Expand Down
Loading

0 comments on commit cc0a16a

Please sign in to comment.