From 71e9c521fc21d8f1cf00098465d8a56323e1e37b Mon Sep 17 00:00:00 2001 From: Michael Walsh Date: Wed, 4 Mar 2026 16:15:26 -0500 Subject: [PATCH] rename commons to neutrons_standard --- .github/workflows/test_and_deploy.yaml | 4 +- README.md | 12 +++--- docs/config.rst | 4 +- docs/singleton.rst | 8 ++-- docs/time.rst | 18 ++++----- pixi.lock | 40 +++++++++---------- pyproject.toml | 26 ++++++------ .../__init__.py | 2 +- .../_version.py | 0 src/{commons => neutrons_standard}/config.py | 0 .../decorators/__init__.py | 0 .../decorators/singleton.py | 0 src/neutrons_standard/help/help_model.py | 12 ++++++ .../resources/application.yml | 0 src/{commons => neutrons_standard}/time.py | 0 tests/conftest.py | 6 +-- tests/resources/application.yml | 2 +- ...ns_next.yml => neutrons_standard_next.yml} | 0 tests/test_config.py | 16 ++++---- tests/test_version.py | 2 +- tests/util/Config_helpers.py | 2 +- 21 files changed, 83 insertions(+), 71 deletions(-) rename src/{commons => neutrons_standard}/__init__.py (85%) rename src/{commons => neutrons_standard}/_version.py (100%) rename src/{commons => neutrons_standard}/config.py (100%) rename src/{commons => neutrons_standard}/decorators/__init__.py (100%) rename src/{commons => neutrons_standard}/decorators/singleton.py (100%) create mode 100644 src/neutrons_standard/help/help_model.py rename src/{commons => neutrons_standard}/resources/application.yml (100%) rename src/{commons => neutrons_standard}/time.py (100%) rename tests/resources/{commons_next.yml => neutrons_standard_next.yml} (100%) diff --git a/.github/workflows/test_and_deploy.yaml b/.github/workflows/test_and_deploy.yaml index 21cb9ab..3a273f9 100644 --- a/.github/workflows/test_and_deploy.yaml +++ b/.github/workflows/test_and_deploy.yaml @@ -8,8 +8,8 @@ on: tags: ["v*"] env: - PKG_NAME: commons - MODULE_NAME: commons + PKG_NAME: neutrons_standard + MODULE_NAME: neutrons_standard # cancel previous job if new commit is pushed concurrency: diff --git a/README.md b/README.md index 2991196..99f10a8 100644 --- a/README.md +++ b/README.md @@ -56,18 +56,18 @@ channels = [ ] [tool.pixi.dependencies] -commons = "*" +neutrons_standard = "*" [tool.pixi.package.run-dependencies] -commons = "*" +neutrons_standard = "*" ``` Then import utilities: ```python -from commons import Config -from commons.decorators.singleton import Singleton -from commons.time import timestamp, isoFromTimestamp +from neutrons_standard import Config +from neutrons_standard.decorators.singleton import Singleton +from neutrons_standard.time import timestamp, isoFromTimestamp ``` See [`readthedocs`](https://pythoncommons.readthedocs.io/en/latest/) for detailed documentation on each module. @@ -114,7 +114,7 @@ Output will be in `docs/_build/html/`. ``` PythonCommons/ -├── src/commons/ # Main package +├── src/neutrons_standard/ # Main package │ ├── config.py # Configuration management │ ├── time.py # Time utilities │ └── decorators/ diff --git a/docs/config.rst b/docs/config.rst index e2913a4..f4c0247 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -9,7 +9,7 @@ Quick Reference .. code-block:: python - from commons import Config + from neutrons_standard import Config # Access values Config["database.host"] # Dot-delimited lookup @@ -169,7 +169,7 @@ Basic Usage .. code-block:: python - from commons import Config + from neutrons_standard import Config # Read values host = Config["database.host"] diff --git a/docs/singleton.rst b/docs/singleton.rst index 33fb002..37f54c4 100644 --- a/docs/singleton.rst +++ b/docs/singleton.rst @@ -9,7 +9,7 @@ Quick Reference .. code-block:: python - from commons.decorators.singleton import Singleton, reset_Singletons + from neutrons_standard.decorators.singleton import Singleton, reset_Singletons @Singleton class MyService: @@ -96,7 +96,7 @@ Reset all singletons: .. code-block:: python - from commons.decorators.singleton import reset_Singletons + from neutrons_standard.decorators.singleton import reset_Singletons reset_Singletons() # Reset all reset_Singletons(fully_unwrap=True) # Fully unwrap all @@ -110,7 +110,7 @@ Pytest Fixture .. code-block:: python import pytest - from commons.decorators.singleton import reset_Singletons + from neutrons_standard.decorators.singleton import reset_Singletons @pytest.fixture(autouse=True) def reset_all_singletons(): @@ -201,7 +201,7 @@ Configuration Objects .. code-block:: python - from commons import Config # Already a Singleton + from neutrons_standard import Config # Already a Singleton # Config is single instance across app cfg = Config diff --git a/docs/time.rst b/docs/time.rst index 3012af2..d4e89d6 100644 --- a/docs/time.rst +++ b/docs/time.rst @@ -9,7 +9,7 @@ Quick Reference .. code-block:: python - from commons.time import timestamp, parseTimestamp, isoFromTimestamp + from neutrons_standard.time import timestamp, parseTimestamp, isoFromTimestamp # Generate timestamps ts = timestamp() # Current time (float seconds) @@ -86,7 +86,7 @@ Event Logging .. code-block:: python - from commons.time import timestamp, isoFromTimestamp + from neutrons_standard.time import timestamp, isoFromTimestamp events = [] for event_type in ["login", "query", "logout"]: @@ -101,7 +101,7 @@ Performance Measurement .. code-block:: python - from commons.time import timestamp + from neutrons_standard.time import timestamp start = timestamp() perform_operation() @@ -113,7 +113,7 @@ Timestamp Conversion Round-Trip .. code-block:: python - from commons.time import timestamp, isoFromTimestamp, parseTimestamp + from neutrons_standard.time import timestamp, isoFromTimestamp, parseTimestamp # Original timestamp ts1 = timestamp() @@ -130,7 +130,7 @@ Configuration Backup Timestamping .. code-block:: python - from commons.time import isoFromTimestamp, timestamp + from neutrons_standard.time import isoFromTimestamp, timestamp from pathlib import Path def backup_file(filepath): @@ -147,7 +147,7 @@ Audit Trails .. code-block:: python - from commons.time import timestamp, isoFromTimestamp + from neutrons_standard.time import timestamp, isoFromTimestamp class AuditLog: def __init__(self): @@ -169,7 +169,7 @@ Time Series Data .. code-block:: python - from commons.time import timestamp, isoFromTimestamp + from neutrons_standard.time import timestamp, isoFromTimestamp class TimeSeries: def __init__(self): @@ -193,7 +193,7 @@ Database Integration .. code-block:: python - from commons.time import timestamp, isoFromTimestamp, parseTimestamp + from neutrons_standard.time import timestamp, isoFromTimestamp, parseTimestamp class DatabaseRecord: def __init__(self, data): @@ -234,7 +234,7 @@ With ``ensureUnique=True``, timestamps strictly increase even in same second: .. code-block:: python - from commons.time import timestamp + from neutrons_standard.time import timestamp times = [timestamp(ensureUnique=True) for _ in range(100)] diff --git a/pixi.lock b/pixi.lock index 6426624..fd64dba 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,7 +12,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-auth-0.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.14.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -233,7 +233,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-auth-0.13.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.14.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -511,15 +511,16 @@ packages: - pkg:pypi/anaconda-auth size: 51059 timestamp: 1772213549452 -- conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhcf101f3_0.conda - sha256: 1c0ca4046ac4728ba0aac1e002fe9530ec0ebd2240649ca370d6e809d4d7e021 - md5: 7db17ced5d5d01d6f72a7cc5f41dce7a +- conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-cli-base-0.8.1-pyhc364b38_1.conda + sha256: 6ba3551f9085546106b23b980c8a71b884bf580c9a03245c0d3fa7fbff44c479 + md5: 7c77aad42e8687238c52e72b4ecf09b0 depends: - python >=3.10 - click - readchar - rich - typer >=0.17 + - pydantic >=2.12 - pydantic-settings >=2.3 - tomli - packaging >=23.0 @@ -530,11 +531,10 @@ packages: - anaconda-client >=1.13.0 - anaconda-cloud-cli >=0.3.0 license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/anaconda-cli-base - size: 29684 - timestamp: 1769448209558 + size: 29565 + timestamp: 1772639433841 - conda: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.14.1-pyhcf101f3_0.conda sha256: 15f36a27ba72fcce0cc19023d55c2bc23cfa78940622df8e0d8d75c6c14b671a md5: 69a7f22cff99ab4b87aa2c5b729b00f8 @@ -949,18 +949,6 @@ packages: - pkg:pypi/colorama size: 27011 timestamp: 1733218222191 -- pypi: . - name: commons - version: 0.2.0.dev2 - sha256: 74652998068a25755ae361a30f9e7be8885d98b0602133995d030694e7dd32e6 - requires_dist: - - numpy>=2.2,<3 - - myst-parser ; extra == 'docs' - - sphinx ; extra == 'docs' - - sphinx-rtd-theme ; extra == 'docs' - - versioningit ; extra == 'docs' - requires_python: '>=3.10' - editable: true - conda: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.4.0-pyh7900ff3_2.conda sha256: 8b2b1c235b7cbfa8488ad88ff934bdad25bac6a4c035714681fbff85b602f3f0 md5: 32c158f481b4fd7630c565030f7bc482 @@ -2579,6 +2567,18 @@ packages: - pkg:pypi/ncurses size: 797030 timestamp: 1738196177597 +- pypi: . + name: neutrons-standard + version: 0.0.0rc2 + sha256: 0c81f443681bdd48fa4846745b4fa912c23f2c24cea89b76e2a666507196aaac + requires_dist: + - numpy>=2.2,<3 + - myst-parser ; extra == 'docs' + - sphinx ; extra == 'docs' + - sphinx-rtd-theme ; extra == 'docs' + - versioningit ; extra == 'docs' + requires_python: '>=3.10' + editable: true - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.3-py310h6de7dc8_0.conda noarch: python sha256: dcc0eee49226ef2f8f58de541a1b0ec492f4f0928ec43b1c26bf498511c363b1 diff --git a/pyproject.toml b/pyproject.toml index b4d861d..4bc8594 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ ### Project Metadata ### ######################## [project] -name = "commons" +name = "neutrons_standard" description = "Python library repo for atomic software components generally applicable across neutrons repositories." dynamic = ["version"] requires-python = ">=3.10" @@ -36,19 +36,19 @@ requires = ["hatchling", "versioningit"] source = "versioningit" [tool.hatch.build.hooks.versioningit-onbuild] -source-file = "src/commons/_version.py" -build-file = "commons/_version.py" +source-file = "src/neutrons_standard/_version.py" +build-file = "neutrons_standard/_version.py" [tool.hatch.build] artifacts = [ - "src/commons/_version.py", - "src/commons/**/*.yml", - "src/commons/**/*.yaml", - "src/commons/**/*.ini", + "src/neutrons_standard/_version.py", + "src/neutrons_standard/**/*.yml", + "src/neutrons_standard/**/*.yaml", + "src/neutrons_standard/**/*.ini", ] [tool.hatch.build.targets.wheel] -packages = ["src/commons"] +packages = ["src/neutrons_standard"] [tool.versioningit.vcs] method = "git" @@ -67,7 +67,7 @@ dirty = "{version}" distance-dirty = "{next_version}.dev{distance}" [tool.versioningit.write] -file = "src/commons/_version.py" +file = "src/neutrons_standard/_version.py" ################### ### Pixi config ### @@ -101,7 +101,7 @@ pillow = ">=12.1.1" # CVE-2026-25990 [tool.pixi.pypi-dependencies] # PyPI dependencies, including this package to allow local editable installs -commons = { path = ".", editable = true } +neutrons_standard = { path = ".", editable = true } jaraco-context = ">=6.1.0" # CVE-2026-23949 # Pixi Build configuration - https://pixi.sh/latest/reference/pixi_manifest/#pixi-build @@ -116,7 +116,7 @@ numpy = "*" "ruamel.yaml" = "*" [tool.pixi.package] -name = "commons" +name = "neutrons_standard" version = "0.0.0" # placeholder, overwritten by sync-version [tool.pixi.package.build] @@ -211,7 +211,7 @@ reset-toml = { cmd = "cp pyproject.toml.bak pyproject.toml; rm pyproject.toml.ba ############## [tool.pytest.ini_options] -addopts = "-v --cov=commons --cov-report=term-missing" +addopts = "-v --cov=neutrons_standard --cov-report=term-missing" pythonpath = [".", "src", "scripts"] testpaths = ["tests"] python_files = ["test*.py"] @@ -239,7 +239,7 @@ select = ["A", "ARG", "ASYNC", "BLE", "C90", "E", "F", "I", "N", "UP032", "W"] ignore = [] [tool.ruff.lint.isort] -known-first-party = ["commons"] +known-first-party = ["neutrons_standard"] [tool.ruff.format] quote-style = "double" diff --git a/src/commons/__init__.py b/src/neutrons_standard/__init__.py similarity index 85% rename from src/commons/__init__.py rename to src/neutrons_standard/__init__.py index 36c2001..a0e09a2 100644 --- a/src/commons/__init__.py +++ b/src/neutrons_standard/__init__.py @@ -1,6 +1,6 @@ """Contains the entry point for the application""" -from commons.decorators.singleton import Singleton +from neutrons_standard.decorators.singleton import Singleton try: diff --git a/src/commons/_version.py b/src/neutrons_standard/_version.py similarity index 100% rename from src/commons/_version.py rename to src/neutrons_standard/_version.py diff --git a/src/commons/config.py b/src/neutrons_standard/config.py similarity index 100% rename from src/commons/config.py rename to src/neutrons_standard/config.py diff --git a/src/commons/decorators/__init__.py b/src/neutrons_standard/decorators/__init__.py similarity index 100% rename from src/commons/decorators/__init__.py rename to src/neutrons_standard/decorators/__init__.py diff --git a/src/commons/decorators/singleton.py b/src/neutrons_standard/decorators/singleton.py similarity index 100% rename from src/commons/decorators/singleton.py rename to src/neutrons_standard/decorators/singleton.py diff --git a/src/neutrons_standard/help/help_model.py b/src/neutrons_standard/help/help_model.py new file mode 100644 index 0000000..2683317 --- /dev/null +++ b/src/neutrons_standard/help/help_model.py @@ -0,0 +1,12 @@ +"""single help module""" + +import webbrowser + +from neutrons_standard.configuration import get_data + + +def help_function(context): + """Open a browser with the appropriate help page""" + help_url = get_data("global.other", "help_url") + if context: + webbrowser.open(help_url) diff --git a/src/commons/resources/application.yml b/src/neutrons_standard/resources/application.yml similarity index 100% rename from src/commons/resources/application.yml rename to src/neutrons_standard/resources/application.yml diff --git a/src/commons/time.py b/src/neutrons_standard/time.py similarity index 100% rename from src/commons/time.py rename to src/neutrons_standard/time.py diff --git a/tests/conftest.py b/tests/conftest.py index 641fdd8..4fca86a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,10 +3,10 @@ import os import pytest -import commons -from commons.decorators.singleton import reset_Singletons +import neutrons_standard +from neutrons_standard.decorators.singleton import reset_Singletons -commons.init("commons") +neutrons_standard.init("neutrons_standard") if not os.environ.get("env"): os.environ["env"] = "test" diff --git a/tests/resources/application.yml b/tests/resources/application.yml index 6e2e9e1..80052f1 100644 --- a/tests/resources/application.yml +++ b/tests/resources/application.yml @@ -9,7 +9,7 @@ templated: user: application: - home: ~/.commons/ + home: ~/.neutrons_standard/ test: multi-substitution: diff --git a/tests/resources/commons_next.yml b/tests/resources/neutrons_standard_next.yml similarity index 100% rename from tests/resources/commons_next.yml rename to tests/resources/neutrons_standard_next.yml diff --git a/tests/test_config.py b/tests/test_config.py index 910d67a..2f4a40c 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -12,11 +12,11 @@ from unittest import mock import pytest -from commons import Spec +from neutrons_standard import Spec from ruamel.yaml import YAML as rYaml -import commons.config as Config_module -from commons.config import ( +import neutrons_standard.config as Config_module +from neutrons_standard.config import ( Config, DeployEnvEnum, Resource, @@ -57,7 +57,7 @@ def test_find_root_dir_special_test_env(): @mock.patch.dict(sys.modules, clear=True) def test_find_root_dir_failure(): # Test that not being able to define the `MODULE_ROOT` raises an exception. - with pytest.raises(Exception, match="Unable to determine commons module-root directory"): + with pytest.raises(Exception, match="Unable to determine neutrons_standard module-root directory"): _find_root_dir() def test_resource_packageMode(caplog): @@ -83,7 +83,7 @@ def test_resource_packageMode(caplog): # Trigger a fresh import for the "Config" module. del sys.modules[f"{package_name}.config"] - from commons.config import _Resource + from neutrons_standard.config import _Resource # `@Singleton` is now active for tests: # we need to reset it, so that we can recreate the class. @@ -110,7 +110,7 @@ def test_resource_not_packageMode(caplog): # Trigger a fresh import for the "Config" module. del sys.modules[f"{package_name}.config"] with caplog.at_level(logging.DEBUG, logger=f"{package_name}.config.Resource"): - from commons.config import _Resource + from neutrons_standard.config import _Resource rs = _Resource() assert not rs._package_mode @@ -137,7 +137,7 @@ def test_resource_packageMode_exists(): # Trigger a fresh import for the "Config" module. del sys.modules[f"{package_name}.config"] - from commons.config import _Resource + from neutrons_standard.config import _Resource # `@Singleton` is now active for tests: # we need to reset it, so that we can recreate the class. @@ -248,7 +248,7 @@ def test_packageVersion_empty(): mock.patch.object(Config_module, "app_version", ""), ): mockSubprocess.check_output.return_value = b"" - with pytest.raises(ValueError, match="The commons Version is not set correctly."): + with pytest.raises(ValueError, match="The neutrons_standard Version is not set correctly."): Config.packageVersion() diff --git a/tests/test_version.py b/tests/test_version.py index 52a3cfc..e9128a1 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,4 +1,4 @@ -from commons import __version__ +from neutrons_standard import __version__ def test_version(): diff --git a/tests/util/Config_helpers.py b/tests/util/Config_helpers.py index 5d2fd18..2fbfc2a 100644 --- a/tests/util/Config_helpers.py +++ b/tests/util/Config_helpers.py @@ -4,7 +4,7 @@ import pytest -from commons.config import Config +from neutrons_standard.config import Config Node = namedtuple("Node", "dict key")