diff --git a/.github/workflows/test-python-lib.yml b/.github/workflows/test-python-lib.yml index 1991822c..1ce03c95 100644 --- a/.github/workflows/test-python-lib.yml +++ b/.github/workflows/test-python-lib.yml @@ -22,17 +22,19 @@ jobs: uses: actions/setup-python@v6 with: python-version: 3.13 - - name: Install dependencies + - name: Install python library run: | + cd post-processing python -m pip install --upgrade pip - python -m pip install -r post-processing/requirements.txt + python -m pip install . + python -m pip install .[dev] - name: Run unit tests run: | python -m unittest discover -s post-processing - name: Type check with mypy run: | - python -m mypy post-processing + python -m mypy post-processing/vernier + python -m mypy post-processing/tests - name: Run CLI tools run: | - cd post-processing/tools - ./summarise_vernier.py vernier-output-example-collated + summarise-vernier post-processing/vernier/tools/vernier-output-example-collated diff --git a/.gitignore b/.gitignore index 40a08936..45fa55e5 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,4 @@ documentation/Sphinx/doxylog # Python junk __pycache__/ +*.egg-info \ No newline at end of file diff --git a/post-processing/pyproject.toml b/post-processing/pyproject.toml new file mode 100644 index 00000000..1c70bc31 --- /dev/null +++ b/post-processing/pyproject.toml @@ -0,0 +1,23 @@ +[build-system] +requires = ['setuptools'] +build-backend = 'setuptools.build_meta' + +[project] +name = "Vernier" +description = "Python post-processing library for Vernier profiling tool" +license = {file = 'LICENSE'} +requires-python = '>=3.9' +dependencies = ['numpy'] +version = '0.4.0' + +[project.optional-dependencies] +dev = ['mypy'] + +[project.scripts] +summarise-vernier = 'vernier.tools.summarise_vernier:main' + +[project.urls] +homepage = 'https://github.com/MetOffice/Vernier' +documentation = 'https://MetOffice.github.io/Vernier' +repository = 'https://github.com/MetOffice/Vernier' + diff --git a/post-processing/requirements.txt b/post-processing/requirements.txt deleted file mode 100644 index 568fb903..00000000 --- a/post-processing/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -numpy -mypy diff --git a/post-processing/tests/test_cli_tools.py b/post-processing/tests/test_cli_tools.py index 66b477d2..55c62eb8 100644 --- a/post-processing/tests/test_cli_tools.py +++ b/post-processing/tests/test_cli_tools.py @@ -19,7 +19,7 @@ def setUp(self): """ Initialise useful attributes for testing. """ - self.tools_dir = Path(__file__).parent.parent / 'tools' + self.tools_dir = Path(__file__).parent.parent / 'vernier' / 'tools' self.test_data_dir = Path(__file__).parent / 'data' # pylint: disable=line-too-long self.test_data_kgo = ( diff --git a/post-processing/tests/test_vernier_calliper.py b/post-processing/tests/test_vernier_calliper.py index 3f9bf916..b9e79e04 100644 --- a/post-processing/tests/test_vernier_calliper.py +++ b/post-processing/tests/test_vernier_calliper.py @@ -13,7 +13,7 @@ # pylint: disable=wrong-import-position sys.path.append(str(Path(__file__).parent.parent)) -from vernier.vernier_data import VernierCalliper +from vernier.lib.vernier_data import VernierCalliper class TestVernierCalliper(unittest.TestCase): diff --git a/post-processing/tests/test_vernier_reader.py b/post-processing/tests/test_vernier_reader.py index eb80d849..eaf8d0b8 100644 --- a/post-processing/tests/test_vernier_reader.py +++ b/post-processing/tests/test_vernier_reader.py @@ -9,7 +9,7 @@ # pylint: disable=wrong-import-position sys.path.append(str(Path(__file__).parent.parent)) -from vernier.vernier_reader import VernierReader +from vernier.lib.vernier_reader import VernierReader class TestVernierReader(unittest.TestCase): diff --git a/post-processing/vernier/__init__.py b/post-processing/vernier/__init__.py index ab30defa..246b4d9d 100644 --- a/post-processing/vernier/__init__.py +++ b/post-processing/vernier/__init__.py @@ -1,7 +1,7 @@ -from vernier.vernier_data import VernierData -from vernier.vernier_data import VernierCalliper -from vernier.vernier_data import VernierDataCollation -from vernier.vernier_reader import VernierReader +from vernier.lib.vernier_data import VernierData +from vernier.lib.vernier_data import VernierCalliper +from vernier.lib.vernier_data import VernierDataCollation +from vernier.lib.vernier_reader import VernierReader __all__ = [ "VernierCalliper", diff --git a/post-processing/vernier/lib/__init__.py b/post-processing/vernier/lib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/post-processing/vernier/vernier_data.py b/post-processing/vernier/lib/vernier_data.py similarity index 98% rename from post-processing/vernier/vernier_data.py rename to post-processing/vernier/lib/vernier_data.py index 0509623b..40bd2152 100644 --- a/post-processing/vernier/vernier_data.py +++ b/post-processing/vernier/lib/vernier_data.py @@ -195,7 +195,7 @@ def filter(self, calliper_keys: list[str]): :returns: A new VernierData object containing only the filtered callipers. - :rtype: :py:class:`vernier.VernierData` + :rtype: :py:class:`vernier.lib.vernierData` :raises ValueError: if no callipers are found that match calliper_keys. @@ -286,7 +286,7 @@ def aggregate(self, vernier_data_list=None, internal_consistency=True): objects. :param vernier_data_list: A list of VernierData objects to combine. - :type vernier_datalist: list[:py:class:`vernier.VernierData`] + :type vernier_datalist: list[:py:class:`vernier.lib.vernierData`] :param bool internal_conistency: If set to True (default), callipers between all items in the @@ -294,7 +294,7 @@ def aggregate(self, vernier_data_list=None, internal_consistency=True): :returns: A single VernierData object containing the data from all VernierData objects in vernier_data_list. - :rtype: :py:class:`vernier.VernierData` + :rtype: :py:class:`vernier.lib.vernierData` :raises ValueError: if internal_consistency is set to True and callipers between items in vernier_data_list are not @@ -449,7 +449,7 @@ def get(self, calliper_key: str, rank: Optional[int] = None, thread: Optional[in :returns: A VernierCalliper instance containing the data of all callipers matching the calliper_key - :rtype: :py:class:`vernier.VernierCalliper` + :rtype: :py:class:`vernier.lib.vernierCalliper` """ if calliper_key not in self.calliper_list(): diff --git a/post-processing/vernier/vernier_reader.py b/post-processing/vernier/lib/vernier_reader.py similarity index 98% rename from post-processing/vernier/vernier_reader.py rename to post-processing/vernier/lib/vernier_reader.py index dd2fd29a..42a440d3 100644 --- a/post-processing/vernier/vernier_reader.py +++ b/post-processing/vernier/lib/vernier_reader.py @@ -6,7 +6,7 @@ from concurrent import futures from pathlib import Path import os -from vernier.vernier_data import VernierData +from vernier.lib.vernier_data import VernierData class VernierReader(): diff --git a/post-processing/tools/summarise_vernier.py b/post-processing/vernier/tools/summarise_vernier.py similarity index 90% rename from post-processing/tools/summarise_vernier.py rename to post-processing/vernier/tools/summarise_vernier.py index 704b7a17..7852eb2e 100755 --- a/post-processing/tools/summarise_vernier.py +++ b/post-processing/vernier/tools/summarise_vernier.py @@ -27,8 +27,14 @@ def process_args(): return parser.parse_args() -if __name__ == "__main__": - +def main(): + """ + Main function to process Vernier output and generate summary. + """ args = process_args() timers = VernierReader(args.vernier_output).load() timers.write_txt_output() + + +if __name__ == "__main__": + main() diff --git a/post-processing/tools/vernier-output-example-collated b/post-processing/vernier/tools/vernier-output-example-collated similarity index 100% rename from post-processing/tools/vernier-output-example-collated rename to post-processing/vernier/tools/vernier-output-example-collated