def test_load_with_archive_filepath_modified(self): # Save a visualization for use in the following test case. fp = os.path.join(self.test_dir.name, 'visualization.qzv') Visualization._from_data_dir(self.data_dir).save(fp) # Load the visualization from a filepath then save a different # visualization to the same filepath. Assert that both visualizations # access the correct data. # # `load` used to be lazy, only extracting data when it needed to (e.g. # when `save` or `get_index_paths` was called). This was buggy as the # filepath could have been deleted, or worse, modified to contain a # different .qzv file. Thus, the wrong archive could be extracted on # demand, or the archive could be missing altogether. There isn't an # easy cross-platform compatible way to solve this problem, so # Visualization.load is no longer lazy and always extracts its data # immediately. The real motivation for lazy loading was for quick # inspection of archives without extracting/copying data, so that API # is now provided through Visualization.peek. visualization1 = Visualization.load(fp) new_data_dir = os.path.join(self.test_dir.name, 'viz-output2') os.mkdir(new_data_dir) most_common_viz(new_data_dir, collections.Counter(range(42))) Visualization._from_data_dir(new_data_dir).save(fp) visualization2 = Visualization.load(fp) self.assertEqual(visualization1.get_index_paths(), {'html': 'data/index.html'}) self.assertEqual(visualization2.get_index_paths(), { 'html': 'data/index.html', 'tsv': 'data/index.tsv' })
def test_load_with_archive_filepath_modified(self): # Save a visualization for use in the following test case. fp = os.path.join(self.test_dir.name, 'visualization.qza') Visualization._from_data_dir(self.data_dir, None).save(fp) # Load the visualization from a filepath then save a different # visualization to the same filepath. Assert that both visualizations # access the correct data. # # `load` used to be lazy, only extracting data when it needed to (e.g. # when `save` or `get_index_paths` was called). This was buggy as the # filepath could have been deleted, or worse, modified to contain a # different .qzv file. Thus, the wrong archive could be extracted on # demand, or the archive could be missing altogether. There isn't an # easy cross-platform compatible way to solve this problem, so # Visualization.load is no longer lazy and always extracts its data # immediately. The real motivation for lazy loading was for quick # inspection of archives without extracting/copying data, so that API # is now provided through Visualization.peek. visualization1 = Visualization.load(fp) new_data_dir = os.path.join(self.test_dir.name, 'viz-output2') os.mkdir(new_data_dir) most_common_viz(new_data_dir, collections.Counter(range(42))) Visualization._from_data_dir(new_data_dir, None).save(fp) visualization2 = Visualization.load(fp) self.assertEqual(visualization1.get_index_paths(), {'html': 'data/index.html'}) self.assertEqual(visualization2.get_index_paths(), {'html': 'data/index.html', 'tsv': 'data/index.tsv'})
def test_ne_different_data_different_uuid(self): visualization1 = Visualization._from_data_dir(self.data_dir) data_dir = os.path.join(self.test_dir.name, 'mc-viz-output1') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization2 = Visualization._from_data_dir(data_dir) self.assertNotEqual(visualization1, visualization2)
def test_get_index_paths_multiple_from_data_dir(self): data_dir = os.path.join(self.test_dir.name, 'mc-viz-output2') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization = Visualization._from_data_dir(data_dir) actual = visualization.get_index_paths() expected = {'html': 'data/index.html', 'tsv': 'data/index.tsv'} self.assertEqual(actual, expected)
def test_get_index_paths_multiple_from_data_dir(self): data_dir = os.path.join(self.test_dir.name, 'mc-viz-output2') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization = Visualization._from_data_dir(data_dir, self.provenance) actual = visualization.get_index_paths() expected = {'html': 'data/index.html', 'tsv': 'data/index.tsv'} self.assertEqual(actual, expected)
def test_ne_different_data_different_uuid(self): visualization1 = Visualization._from_data_dir( self.data_dir, self.make_provenance_capture()) data_dir = os.path.join(self.test_dir.name, 'mc-viz-output1') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization2 = Visualization._from_data_dir( data_dir, self.make_provenance_capture()) self.assertNotEqual(visualization1, visualization2)
def test_get_index_paths_relative_false(self): data_dir = os.path.join(self.test_dir.name, 'mc-viz-output2') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization = Visualization._from_data_dir(data_dir, self.provenance) def get_abs_path(rel): return os.path.join(visualization._archiver._temp_dir, rel) actual = visualization.get_index_paths(relative=False) expected = {'html': get_abs_path('data/index.html'), 'tsv': get_abs_path('data/index.tsv')} self.assertEqual(actual, expected)
def test_get_index_paths_relative_false(self): data_dir = os.path.join(self.test_dir.name, 'mc-viz-output2') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) visualization = Visualization._from_data_dir( data_dir, self.make_provenance_capture()) def get_abs_path(rel): return str(visualization._archiver.root_dir / rel) actual = visualization.get_index_paths(relative=False) expected = {'html': get_abs_path('data/index.html'), 'tsv': get_abs_path('data/index.tsv')} self.assertEqual(actual, expected)
def test_get_index_paths_multiple_load(self): data_dir = os.path.join(self.test_dir.name, 'mc-viz-output1') os.mkdir(data_dir) most_common_viz(data_dir, collections.Counter(range(42))) fp = os.path.join(self.test_dir.name, 'visualization.qzv') visualization = Visualization._from_data_dir( data_dir, self.make_provenance_capture()) visualization.save(fp) visualization = Visualization.load(fp) actual = visualization.get_index_paths() expected = {'html': 'data/index.html', 'tsv': 'data/index.tsv'} self.assertEqual(actual, expected)