diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index c1489e4..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: python
-python:
-    - "3.5"
-    - "3.6"
-
-# command to install dependencies
-install:
-    - pip install pipenv
-    - pipenv install
-
-# command to run tests and lint
-script:
-    - python -m unittest discover
-    - pipenv check --style ./algviz
diff --git a/Pipfile b/Pipfile
deleted file mode 100644
index f7b79a0..0000000
--- a/Pipfile
+++ /dev/null
@@ -1,14 +0,0 @@
-[[source]]
-
-url = "https://pypi.python.org/simple"
-verify_ssl = true
-name = "pypi"
-
-
-[dev-packages]
-
-
-
-[packages]
-
-svgwrite = "*"
diff --git a/Pipfile.lock b/Pipfile.lock
deleted file mode 100644
index 509ea8c..0000000
--- a/Pipfile.lock
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-    "_meta": {
-        "hash": {
-            "sha256": "5e8fc6baf1666ec9b09e547e42962949b4ec5f9b38dfc5945d8c5d961d6482a3"
-        },
-        "host-environment-markers": {
-            "implementation_name": "cpython",
-            "implementation_version": "3.5.2",
-            "os_name": "nt",
-            "platform_machine": "AMD64",
-            "platform_python_implementation": "CPython",
-            "platform_release": "10",
-            "platform_system": "Windows",
-            "platform_version": "10.0.16299",
-            "python_full_version": "3.5.2",
-            "python_version": "3.5",
-            "sys_platform": "win32"
-        },
-        "pipfile-spec": 6,
-        "requires": {},
-        "sources": [
-            {
-                "name": "pypi",
-                "url": "https://pypi.python.org/simple",
-                "verify_ssl": true
-            }
-        ]
-    },
-    "default": {
-        "pyparsing": {
-            "hashes": [
-                "sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010",
-                "sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04",
-                "sha256:9e8143a3e15c13713506886badd96ca4b579a87fbdf49e550dbfc057d6cb218e",
-                "sha256:281683241b25fe9b80ec9d66017485f6deff1af5cde372469134b56ca8447a07",
-                "sha256:b8b3117ed9bdf45e14dcc89345ce638ec7e0e29b2b579fa1ecf32ce45ebac8a5",
-                "sha256:8f1e18d3fd36c6795bb7e02a39fd05c611ffc2596c1e0d995d34d67630426c18",
-                "sha256:e4d45427c6e20a59bf4f88c639dcc03ce30d193112047f94012102f235853a58"
-            ],
-            "version": "==2.2.0"
-        },
-        "svgwrite": {
-            "hashes": [
-                "sha256:679507bb71c4eefb0d6c15643dbb8489ed0e3088330f46df30d7dc2abd897a82",
-                "sha256:451c7f16220d654be0cfdbd13cc6f23aca69e6fd3ca19254e80b5f6d9ca6af5a"
-            ],
-            "version": "==1.1.11"
-        }
-    },
-    "develop": {}
-}
diff --git a/algviz/interface/visitors.py b/algviz/interface/visitors.py
index 2b8dca9..b3653d7 100644
--- a/algviz/interface/visitors.py
+++ b/algviz/interface/visitors.py
@@ -1,6 +1,7 @@
 import abc
 
 from algviz.parser.json_objects import Tokens
+from algviz.parser import structures
 
 class Visitor(metaclass=abc.ABCMeta):
 
@@ -190,3 +191,60 @@ class WidgetVisitor(Visitor):
 
     def visit(self, *args, **kwargs):
         return super().visit(*args, **kwargs)
+
+@default_for_type(type(None))
+class NullVisitor(Visitor):
+    type_ = Tokens.NULL_T
+
+    def uid(self, item):
+        return structures.Null.uid
+
+    def visit(self, *args, **kwargs):
+        return super().visit(*args, **kwargs)
+
+class TreeVisitor(Visitor):
+    """A visitor for trees of all shapes and sizes"""
+    type_ = Tokens.TREE_NODE_T
+
+    @abc.abstractmethod
+    def is_placeholder(self, tree):
+        """Test if the given tree is a placeholder for a non-existent node in
+        rigidly-structured trees.
+
+        For example, in the binary search tree:
+
+            ...........
+            ....2......
+            ..1...3....
+            ........4..
+            ...........
+
+        The first child of `3` should be a placeholder.
+
+        By default, tests if the tree is None.
+        """
+        return tree is None
+
+    @abc.abstractmethod
+    def iter_children(self, tree):
+        """Obviously, return an iterable/generator with the subtrees"""
+        yield from []
+
+    @abc.abstractmethod
+    def get_data(self, tree):
+        return None
+
+    def traverse(self, tree, **kwargs):
+        if self.is_placeholder(tree):
+            NullVisitor(self.output_mngr).traverse(tree, **kwargs)
+        else:
+            super().traverse(tree, **kwargs)
+
+    def visit(self, tree, **kwargs):
+        super().visit(tree, **kwargs)
+        self.output_mngr.next_key(Tokens.DATA)
+        self.data_visitor.traverse(self.get_data(tree))
+        self.output_mngr.next_key(Tokens.CHILDREN)
+        with self.output_mngr.push(mapping=False):
+            for child in self.iter_children(tree):
+                self.traverse(child)
diff --git a/algviz/interface/weird_visitors.py b/algviz/interface/weird_visitors.py
index 45ed59c..4e8f9f8 100644
--- a/algviz/interface/weird_visitors.py
+++ b/algviz/interface/weird_visitors.py
@@ -1,6 +1,8 @@
-from . import visitors
+import collections
 import math
 
+from . import visitors
+
 class BitmapArrayVisitor(visitors.ArrayVisitor):
     """Interpret an `int` as an array of 0s and 1s"""
 
@@ -15,3 +17,24 @@ class BitmapArrayVisitor(visitors.ArrayVisitor):
     def get_item(self, x, i):
         # Return the i'th bit of x
         return int(bool(x & (2**i)))
+
+class ListTreeVisitor(visitors.TreeVisitor):
+    """Interpret a list as a binary tree"""
+    _Node = collections.namedtuple("_Node", ("list_", "index"))
+    def _wrap(self, tree):
+        if isinstance(tree, self._Node):
+            return tree
+        return self._Node(tree, 0)
+
+    def is_placeholder(self, tree):
+        tree = self._wrap(tree)
+        return tree.index >= len(tree.list_)
+
+    def get_data(self, tree):
+        tree = self._wrap(tree)
+        return tree.list_[tree.index]
+
+    def iter_children(self, tree):
+        tree = self._wrap(tree)
+        for i in (1, 2):
+            yield self._Node(tree.list_, 2 * tree.index + i)
diff --git a/algviz/parser/json_objects.py b/algviz/parser/json_objects.py
index ace9048..49e1516 100644
--- a/algviz/parser/json_objects.py
+++ b/algviz/parser/json_objects.py
@@ -116,7 +116,7 @@ class SnapshotDecoder(metaclass=Dispatcher):
 
     @Dispatcher.dispatch(Tokens.TREE_NODE_T)
     def tree_node_decode(self, tree_node, **kwargs):
-        return structures.TreeNode(data=tree_node.get(Tokens.DATA, structures.Null),
+        return structures.Tree(data=tree_node.get(Tokens.DATA, structures.Null),
                                    children=tree_node.get(Tokens.CHILDREN),
                                    **kwargs)
 
diff --git a/algviz/parser/structures.py b/algviz/parser/structures.py
index 5efe694..65513ba 100644
--- a/algviz/parser/structures.py
+++ b/algviz/parser/structures.py
@@ -162,7 +162,7 @@ class Node(DataStructure):
     # This is a minimal node that isn't responsible for its own edges.  This
     # allows for a more flexible graph implementation (i.e. allowing subgraphs
     # over the same nodes).  If you want to store edges within your node, use
-    # TreeNode or a subclass instead of this.
+    # Tree or a subclass instead of this.
     def __init__(self, data, **kwargs):
         super().__init__(**kwargs)
         self.data = data
@@ -209,7 +209,7 @@ class Widget(DataStructure):
     def untablify(self, obj_table):
         pass
 
-class TreeNode(DataStructure):
+class Tree(DataStructure):
     """A node with some number of children in a fixed order.  Edges are implicit."""
     # A common superclass could be used for linked-list nodes, since linked
     # lists are just skinny trees
@@ -224,7 +224,7 @@ class TreeNode(DataStructure):
 
     def __eq__(self, other):
         return (super().__eq__(other) and
-                isinstance(other, TreeNode) and
+                isinstance(other, Tree) and
                 self.data == other.data and
                 self.children == other.children)
 

Visitor for Trees in Python
Depends on #13 
diff --git a/algviz/interface/test_visitors.py b/algviz/interface/test_visitors.py
index 164c96f..0c31d9b 100644
--- a/algviz/interface/test_visitors.py
+++ b/algviz/interface/test_visitors.py
@@ -20,7 +20,7 @@ class VisitorTestCaseMixin(TempFileMixin):
         text = self.read_tempfile()
         return text, json_objects.decode_json(text)
 
-    def to_hell_and_back_full_result(self, instance, **kwargs):
+    def to_json_and_back_full_result(self, instance, **kwargs):
         """Convenience for test cases where you only need to encode and decode
         one instance.  Returns (json_text, decoded_object)
         """
@@ -28,9 +28,9 @@ class VisitorTestCaseMixin(TempFileMixin):
             self.visitor.traverse(instance, **kwargs)
         return self.read_result()
 
-    def to_hell_and_back(self, instance, **kwargs):
+    def to_json_and_back(self, instance, **kwargs):
         """Visit the object, print it out, decode it, and return the resulting object"""
-        _, snapshots = self.to_hell_and_back_full_result(instance, **kwargs)
+        _, snapshots = self.to_json_and_back_full_result(instance, **kwargs)
         return snapshots[-1].obj_table.getuid(self.visitor.uid(instance))
 
     def test_metadata(self):
@@ -42,7 +42,7 @@ class VisitorTestCaseMixin(TempFileMixin):
                          msg="""This test doesn't work.  We want different
                          instances of identical dictionaries, or else the test
                          can be passed by calling `metadata.clear()`.""")
-        result = self.to_hell_and_back(self.sample_instance(),
+        result = self.to_json_and_back(self.sample_instance(),
                                        metadata=mk_metadata())
         self.assertEqual(mk_metadata(), result.metadata)
 
@@ -90,6 +90,6 @@ class ArrayVisitorTestCase(VisitorTestCaseMixin, unittest.TestCase):
         return [1, 2, 3]
 
     def test_array_export_and_import(self):
-        arr = self.to_hell_and_back([1, 2, 3])
+        arr = self.to_json_and_back([1, 2, 3])
         self.assertIsInstance(arr, structures.Array)
         self.assertEqual(list(arr), [1, 2, 3])
diff --git a/algviz/interface/test_weird_visitors.py b/algviz/interface/test_weird_visitors.py
index 11e9f57..b8e8a4e 100644
--- a/algviz/interface/test_weird_visitors.py
+++ b/algviz/interface/test_weird_visitors.py
@@ -1,7 +1,7 @@
 import unittest
 import tempfile
 
-from algviz.parser import json_objects
+from algviz.parser import json_objects, structures
 from . import weird_visitors
 from . import output
 
@@ -26,3 +26,17 @@ class BitmapVisitorTestCase(VisitorTestCaseMixin, unittest.TestCase):
         # (True == 1 but id(True) != id(1))
         self._next_sample_bool ^= True
         return True if self._next_sample_bool else 1
+
+
+class ListTreeVisitorTestCase(VisitorTestCaseMixin, unittest.TestCase):
+    visitor_cls = weird_visitors.ListTreeVisitor
+
+    def test_tree_visit(self):
+        tree = self.to_json_and_back([1, 2])
+        self.assertEqual(tree.data, 1)
+        self.assertEqual(tree.children[1], structures.Null)
+        self.assertEqual(tree.children[0].data, 2)
+        self.assertEqual(tree.children[0].children, [structures.Null] * 2)
+
+    def sample_instance(self):
+        return [4, 2, 6, 1, 3, 5, 7]
diff --git a/algviz/parser/test_json_objects.py b/algviz/parser/test_json_objects.py
index 1f0eac0..74f2f83 100644
--- a/algviz/parser/test_json_objects.py
+++ b/algviz/parser/test_json_objects.py
@@ -147,8 +147,8 @@ class ArrayDecodingTestCase(GenericDecodingTestCase):
         self.unexpected_object = self.factory([1, 2, 3, 4, structures.String("goodbye")])
         self.same_uid_object = self.factory([1, 2, 3])
 
-class TreeNodeDecodingTestCase(GenericDecodingTestCase):
-    cls_under_test = structures.TreeNode
+class TreeDecodingTestCase(GenericDecodingTestCase):
+    cls_under_test = structures.Tree
     def set_up_expectations(self):
         self.snapshot_input = [
             {"T": "treenode", "uid": "L", "children": ["LL", "#null"], "data": 1},

pip install -e .
parse_log_pytest
pygraphviz
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/Agizin/Algorithm-Visualization.git@2dd360e7692621c71abec0afa34c0b9a3136f609#egg=algviz
exceptiongroup==1.2.2
iniconfig==2.1.0
packaging==24.2
pluggy==1.5.0
pygraphviz @ file:///croot/pygraphviz_1671045577740/work
pytest==8.3.5
tomli==2.2.1

name: Algorithm-Visualization
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - atk-1.0=2.36.0=ha1a6a79_0
  - boost-cpp=1.82.0=hdb19cb5_2
  - bzip2=1.0.8=h5eee18b_6
  - c-ares=1.19.1=h5eee18b_0
  - ca-certificates=2025.2.25=h06a4308_0
  - cairo=1.16.0=hb05425b_5
  - expat=2.6.4=h6a678d5_0
  - font-ttf-dejavu-sans-mono=2.37=hd3eb1b0_0
  - font-ttf-inconsolata=2.001=hcb22688_0
  - font-ttf-source-code-pro=2.030=hd3eb1b0_0
  - font-ttf-ubuntu=0.83=h8b1ccd4_0
  - fontconfig=2.14.1=h55d465d_3
  - fonts-anaconda=1=h8fa9717_0
  - fonts-conda-ecosystem=1=hd3eb1b0_0
  - freetype=2.12.1=h4a9f257_0
  - fribidi=1.0.10=h7b6447c_0
  - gdk-pixbuf=2.42.10=h5eee18b_1
  - giflib=5.2.2=h5eee18b_0
  - glib=2.78.4=h6a678d5_0
  - glib-tools=2.78.4=h6a678d5_0
  - gobject-introspection=1.78.1=py39h42194e9_2
  - graphite2=1.3.14=h295c915_1
  - graphviz=2.50.0=h78213b7_2
  - gtk2=2.24.33=h27e1c3a_3
  - gts=0.7.6=hb67d8dd_3
  - harfbuzz=10.2.0=hf296adc_0
  - icu=73.1=h6a678d5_0
  - jpeg=9e=h5eee18b_3
  - krb5=1.20.1=h143b758_1
  - lcms2=2.16=hb9589c4_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - lerc=4.0.0=h6a678d5_0
  - libboost=1.82.0=h109eef0_2
  - libcurl=8.12.1=hc9e6f67_0
  - libdeflate=1.22=h5eee18b_0
  - libedit=3.1.20230828=h5eee18b_0
  - libev=4.33=h7f8727e_1
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgd=2.3.3=h6a678d5_3
  - libglib=2.78.4=hdc74915_0
  - libgomp=11.2.0=h1234567_1
  - libiconv=1.16=h5eee18b_3
  - libnghttp2=1.57.0=h2d74bed_0
  - libpng=1.6.39=h5eee18b_0
  - librsvg=2.56.3=hf6914bd_1
  - libssh2=1.11.1=h251f7ec_0
  - libstdcxx-ng=11.2.0=h1234567_1
  - libtiff=4.5.1=hffd6297_1
  - libtool=2.4.7=h6a678d5_0
  - libuuid=1.41.5=h5eee18b_0
  - libwebp=1.2.4=h11a3e52_1
  - libwebp-base=1.2.4=h5eee18b_1
  - libxcb=1.15=h7f8727e_0
  - libxml2=2.13.5=hfdd30dd_0
  - lz4-c=1.9.4=h6a678d5_1
  - ncurses=6.4=h6a678d5_0
  - ninja=1.12.1=h06a4308_0
  - ninja-base=1.12.1=hdb19cb5_0
  - nspr=4.35=h6a678d5_0
  - nss=3.89.1=h6a678d5_0
  - openjpeg=2.5.2=he7f1fd0_0
  - openssl=3.0.16=h5eee18b_0
  - pango=1.50.7=h0fee60c_1
  - pcre2=10.42=hebb0a14_1
  - pip=25.0=py39h06a4308_0
  - pixman=0.40.0=h7f8727e_1
  - poppler=24.09.0=hcf11d46_1
  - poppler-data=0.4.11=h06a4308_1
  - pygraphviz=1.9=py39h5eee18b_1
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - zstd=1.5.6=hc292b87_0
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - tomli==2.2.1
prefix: /opt/conda/envs/Algorithm-Visualization

algviz/interface/test_visitors.py::WidgetVisitorTestCase::test_metadata algviz/interface/test_visitors.py::WidgetVisitorTestCase::test_varnames algviz/interface/test_visitors.py::WidgetVisitorTestCase::test_widget_export_and_import algviz/interface/test_visitors.py::ArrayVisitorTestCase::test_array_export_and_import algviz/interface/test_visitors.py::ArrayVisitorTestCase::test_metadata algviz/interface/test_visitors.py::ArrayVisitorTestCase::test_varnames algviz/interface/test_weird_visitors.py::BitmapVisitorTestCase::test_bitmap_visit algviz/interface/test_weird_visitors.py::BitmapVisitorTestCase::test_metadata algviz/interface/test_weird_visitors.py::BitmapVisitorTestCase::test_varnames algviz/interface/test_weird_visitors.py::ListTreeVisitorTestCase::test_metadata algviz/interface/test_weird_visitors.py::ListTreeVisitorTestCase::test_tree_visit algviz/interface/test_weird_visitors.py::ListTreeVisitorTestCase::test_varnames algviz/parser/test_json_objects.py::JSONObjectsTestCase::test_aliases_are_not_already_tokens algviz/parser/test_json_objects.py::JSONObjectsTestCase::test_can_handle_missing_outermost_close_bracket algviz/parser/test_json_objects.py::JSONObjectsTestCase::test_fix_aliases algviz/parser/test_json_objects.py::JSONObjectsTestCase::test_literal_decoding algviz/parser/test_json_objects.py::JSONObjectsTestCase::test_var_key_shows_up_in_namespace algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::GenericDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::ArrayDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::TreeDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::NullDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::NullDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::NullDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::NullDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::NullDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::NullDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::NullDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::OtherNullDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::StringDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::StringDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::StringDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::StringDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::StringDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::StringDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::StringDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::PointerDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::GraphDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::NodeDecodingTestCase::test_same_object_method_works_based_on_uid algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_equality_depends_on_uid algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_has_proper_metadata algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_has_proper_type algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_has_proper_uid algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_hash_matches_hash_of_placeholder algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_matches_expected_object algviz/parser/test_json_objects.py::EdgeDecodingTestCase::test_same_object_method_works_based_on_uid
algviz/parser/structures.py algviz/interface/visitors.py algviz/interface/weird_visitors.py Pipfile.lock .travis.yml Pipfile algviz/parser/json_objects.py
algviz/parser/structures.py algviz/interface/visitors.py algviz/interface/weird_visitors.py Pipfile.lock .travis.yml Pipfile algviz/parser/json_objects.py