diff --git a/clams/app/__init__.py b/clams/app/__init__.py index 1264cc3..564af67 100644 --- a/clams/app/__init__.py +++ b/clams/app/__init__.py @@ -138,6 +138,7 @@ def annotate(self, mmif: Union[str, dict, Mmif], **runtime_params: List[str]) -> """ if not isinstance(mmif, Mmif): mmif = Mmif(mmif) + existing_view_ids = {view.id for view in mmif.views} issued_warnings = [] for key in runtime_params: if key not in self.annotate_param_spec: @@ -156,7 +157,8 @@ def annotate(self, mmif: Union[str, dict, Mmif], **runtime_params: List[str]) -> warnings_view = annotated.new_view() self.sign_view(warnings_view, refined) warnings_view.metadata.warnings = issued_warnings - td = datetime.now() - t + run_id = datetime.now() + td = run_id - t runningTime = refined.get('runningTime', False) hwFetch = refined.get('hwFetch', False) runtime_recs = {} @@ -180,7 +182,8 @@ def annotate(self, mmif: Union[str, dict, Mmif], **runtime_params: List[str]) -> name, mem = gpu.split(', ') runtime_recs['cuda'].append(self._cuda_device_name_concat(name, mem)) for annotated_view in annotated.views: - if annotated_view.metadata.app == self.metadata.identifier: + if annotated_view.id not in existing_view_ids and annotated_view.metadata.app == self.metadata.identifier: + annotated_view.metadata.timestamp = run_id profiling_data = {} if runningTime: profiling_data['runningTime'] = str(td) diff --git a/tests/metadata.py b/tests/metadata.py index 454e2fa..05b9669 100644 --- a/tests/metadata.py +++ b/tests/metadata.py @@ -1,19 +1,17 @@ -from mmif import AnnotationTypes, DocumentTypes - -from clams import AppMetadata +from clams.appmetadata import AppMetadata +from mmif.vocabulary import DocumentTypes, AnnotationTypes def appmetadata() -> AppMetadata: metadata = AppMetadata( - name="Example CLAMS App for testing", - description="This app doesn't do anything", + name="Example Clams App", + description="An example app for testing.", app_license="MIT", - identifier=f"https://apps.clams.ai/example", - output=[{'@type': AnnotationTypes.TimeFrame}], - dependencies=['clams-python==develop-ver', 'mmif-pyhon==0.0.999'], - url="https://fakegithub.com/some/repository" + identifier="example-app", + url="http://example.com/example-app", ) metadata.add_input(DocumentTypes.TextDocument) - metadata.add_input_oneof(DocumentTypes.AudioDocument, str(DocumentTypes.VideoDocument)) - metadata.add_parameter(name='raise_error', description='force raise a ValueError', type='boolean', default='false') + metadata.add_input_oneof(DocumentTypes.VideoDocument, DocumentTypes.AudioDocument) + metadata.add_output(AnnotationTypes.TimeFrame) + metadata.add_parameter(name='raise_error', description='a dummy parameter', type='boolean', default=False) return metadata diff --git a/tests/test_clamsapp.py b/tests/test_clamsapp.py index 1c0af8f..6ac1072 100644 --- a/tests/test_clamsapp.py +++ b/tests/test_clamsapp.py @@ -282,7 +282,9 @@ def test_annotate(self): self.assertEqual(len(out_mmif.views), 4) views = list(out_mmif.views) # insertion order is kept - self.assertTrue(views[0].metadata.timestamp < views[1].metadata.timestamp) + self.assertEqual(views[0].metadata.timestamp, views[1].metadata.timestamp) + self.assertEqual(views[2].metadata.timestamp, views[3].metadata.timestamp) + self.assertTrue(views[1].metadata.timestamp < views[2].metadata.timestamp) def test_annotate_returns_invalid_mmif(self): m = Mmif(self.in_mmif) @@ -409,6 +411,26 @@ def test_est_gpu_mem_typ_validation(self): # Should have auto-corrected self.assertEqual(metadata.est_gpu_mem_typ, metadata.est_gpu_mem_min) + def test_run_id(self): + # first run + out_mmif = Mmif(self.app.annotate(self.in_mmif)) + app_views = [v for v in out_mmif.views if v.metadata.app == self.app.metadata.identifier] + self.assertTrue(len(app_views) > 0) + first_timestamp = app_views[0].metadata.timestamp + for view in app_views[1:]: + self.assertEqual(first_timestamp, view.metadata.timestamp) + # second run + out_mmif2 = Mmif(self.app.annotate(out_mmif)) + app_views2 = [v for v in out_mmif2.views if v.metadata.app == self.app.metadata.identifier] + self.assertEqual(len(app_views2), len(app_views) * 2) + second_timestamp = app_views2[-1].metadata.timestamp + self.assertNotEqual(first_timestamp, second_timestamp) + for view in app_views2: + if view.id in [v.id for v in app_views]: + self.assertEqual(first_timestamp, view.metadata.timestamp) + else: + self.assertEqual(second_timestamp, view.metadata.timestamp) + class TestRestifier(unittest.TestCase):