From e0850fd6991e11223fffb42d95659ea597f53c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Sat, 13 Mar 2021 11:08:21 +1100 Subject: [PATCH 1/4] Swap DateTimeFile bases to keep consistent MRO --- grill/names/__init__.py | 16 +++++++++------- tests/test_names.py | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/grill/names/__init__.py b/grill/names/__init__.py index f2d1ec8..6a5025e 100644 --- a/grill/names/__init__.py +++ b/grill/names/__init__.py @@ -56,7 +56,7 @@ def get_default(cls, **kwargs) -> DefaultName: return name -class DateTimeFile(naming.File, DefaultName): +class DateTimeFile(DefaultName, naming.File): """Time based file names respecting iso standard. ============= ================ @@ -110,19 +110,19 @@ class DateTimeFile(naming.File, DefaultName): @property def _defaults(self): + result = super()._defaults time_field = {'year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond'} now = datetime.now() - return dict( - {f: getattr(now, f) for f in time_field}, - suffix='ext', - ) + result.update({f: getattr(now, f) for f in time_field}) + result['suffix'] = 'ext' + return result def get_pattern_list(self) -> typing.List[str]: """Fields / properties names (sorted) to be used when building names. Defaults to [`date`, `time`] + keys of this name's config """ - return ["date", "time"] + list(self.config) + return ["date", "time"] + super().get_pattern_list() @property def name(self) -> str: @@ -171,7 +171,9 @@ def __init__(self, *args, sep='-', **kwargs): @property def _defaults(self): - return {k: v['default'] for k, v in ids.CGAsset.items()} + result = super()._defaults + result.update({k: v['default'] for k, v in ids.CGAsset.items()}) + return result class CGAssetFile(CGAsset, naming.PipeFile): diff --git a/tests/test_names.py b/tests/test_names.py index f72d891..c7d5d02 100644 --- a/tests/test_names.py +++ b/tests/test_names.py @@ -77,3 +77,18 @@ class SubTime(DateTimeFile): tf = SubTime("1999-10-28 1-1-1-1 subclassed.txt") self.assertEqual("subclassed", tf.extra) + + def test_mro(self): + SUFFIX = "abc" + + class TimedAsset(DateTimeFile, CGAssetFile): + file_config = naming.NameConfig(dict(suffix=SUFFIX)) + + @property + def _defaults(self): + result = super()._defaults + result.update(suffix=SUFFIX) + return result + + ta = TimedAsset.get_default(area='test') + self.assertEqual(ta.suffix, SUFFIX) From b1a29ab07de03d388017221cac47a372aac6f1ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Sat, 13 Mar 2021 23:39:12 +1100 Subject: [PATCH 2/4] default extension --- grill/names/__init__.py | 17 +++++++++++++---- tests/test_names.py | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/grill/names/__init__.py b/grill/names/__init__.py index 6a5025e..968ec9b 100644 --- a/grill/names/__init__.py +++ b/grill/names/__init__.py @@ -56,7 +56,17 @@ def get_default(cls, **kwargs) -> DefaultName: return name -class DateTimeFile(DefaultName, naming.File): +class DefaultFile(DefaultName, naming.File): + DEFAULT_SUFFIX = 'ext' + + @property + def _defaults(self): + result = super()._defaults + result['suffix'] = type(self).DEFAULT_SUFFIX + return result + + +class DateTimeFile(DefaultFile): """Time based file names respecting iso standard. ============= ================ @@ -114,7 +124,6 @@ def _defaults(self): time_field = {'year', 'month', 'day', 'hour', 'minute', 'second', 'microsecond'} now = datetime.now() result.update({f: getattr(now, f) for f in time_field}) - result['suffix'] = 'ext' return result def get_pattern_list(self) -> typing.List[str]: @@ -176,7 +185,7 @@ def _defaults(self): return result -class CGAssetFile(CGAsset, naming.PipeFile): +class CGAssetFile(CGAsset, DefaultFile, naming.PipeFile): """Versioned files in the pipeline for a CGAsset. Example: @@ -191,7 +200,7 @@ class CGAssetFile(CGAsset, naming.PipeFile): @property def _defaults(self): result = super()._defaults - result.update(version=1, suffix='ext') + result.update(version=1) return result def get_path_pattern_list(self) -> typing.List[str]: diff --git a/tests/test_names.py b/tests/test_names.py index c7d5d02..e4765ff 100644 --- a/tests/test_names.py +++ b/tests/test_names.py @@ -92,3 +92,18 @@ def _defaults(self): ta = TimedAsset.get_default(area='test') self.assertEqual(ta.suffix, SUFFIX) + + def test_default_suffix(self): + suf1 = 'abc' + class TimedAssetFile(DateTimeFile, CGAssetFile): + DEFAULT_SUFFIX = suf1 + + ta = TimedAssetFile.get_default(area='test') + self.assertEqual(ta.suffix, suf1) + + suf2 = 'xyz' + class TimedAssetFile2(CGAssetFile): + DEFAULT_SUFFIX = suf2 + + ta = TimedAssetFile2.get_default(area='test') + self.assertEqual(ta.suffix, suf2) From db0ecb9d9a3baa64ba797fde886fab04764e3b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Sat, 13 Mar 2021 23:46:23 +1100 Subject: [PATCH 3/4] update test --- tests/test_names.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tests/test_names.py b/tests/test_names.py index e4765ff..740b13b 100644 --- a/tests/test_names.py +++ b/tests/test_names.py @@ -78,21 +78,6 @@ class SubTime(DateTimeFile): tf = SubTime("1999-10-28 1-1-1-1 subclassed.txt") self.assertEqual("subclassed", tf.extra) - def test_mro(self): - SUFFIX = "abc" - - class TimedAsset(DateTimeFile, CGAssetFile): - file_config = naming.NameConfig(dict(suffix=SUFFIX)) - - @property - def _defaults(self): - result = super()._defaults - result.update(suffix=SUFFIX) - return result - - ta = TimedAsset.get_default(area='test') - self.assertEqual(ta.suffix, SUFFIX) - def test_default_suffix(self): suf1 = 'abc' class TimedAssetFile(DateTimeFile, CGAssetFile): From 238ef84321feca8f84483de22465cfa3725bcd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=B3pez=20Barr=C3=B3n?= Date: Sat, 20 Mar 2021 17:28:27 +1100 Subject: [PATCH 4/4] docstring --- grill/names/__init__.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/grill/names/__init__.py b/grill/names/__init__.py index 968ec9b..6a8b6b9 100644 --- a/grill/names/__init__.py +++ b/grill/names/__init__.py @@ -37,7 +37,7 @@ def _table_from_id(id_mapping): class DefaultName(naming.Name): - """ Inherited by: :class:`grill.names.CGAsset` :class:`grill.names.DateTimeFile` + """ Inherited by: :class:`grill.names.CGAsset` Base class for any Name object that wishes to provide `default` functionality via the `get_default` method. @@ -57,6 +57,14 @@ def get_default(cls, **kwargs) -> DefaultName: class DefaultFile(DefaultName, naming.File): + """ Inherited by: :class:`grill.names.DateTimeFile` + + Similar to :class:`grill.names.DefaultName`, provides File Name objects default + creation via the `get_default` method. + + Adds an extra `DEFAULT_SUFFIX='ext'` member that will be used when creating objects. + """ + DEFAULT_SUFFIX = 'ext' @property @@ -210,9 +218,8 @@ def get_path_pattern_list(self) -> typing.List[str]: class LifeTR(naming.Name): - """Taxonomic Rank used for biological classification. + """Taxonomic Rank used for biological classification.""" - """ config = {k: v['pattern'] for k, v in ids.LifeTR.items()} __doc__ += '\n' + _table_from_id(ids.LifeTR) + '\n'