pluginify 1.0.0.post11.dev0__tar.gz → 1.0.0.post16.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/PKG-INFO +1 -1
  2. pluginify-1.0.0.post16.dev0/docs/source/releases/latest/fix-concurrent-writes.yaml +16 -0
  3. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/_version.py +2 -2
  4. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/create_plugin_registries.py +17 -7
  5. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pyproject.toml +1 -1
  6. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/deploy-docs.yaml +0 -0
  7. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/integ_test.yaml +0 -0
  8. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/mypy.yaml +0 -0
  9. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/package-and-publish.yaml +0 -0
  10. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/status-check.yaml +0 -0
  11. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/.github/workflows/tag-and-release.yaml +0 -0
  12. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/LICENSE +0 -0
  13. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/README.md +0 -0
  14. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/1.0.0-no-bug-fixes-required-on-this-release.yaml +0 -0
  15. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/1.19.0-internal-release.yaml +0 -0
  16. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/1.19.0-open-source-upload.yaml +0 -0
  17. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/1.19.0-patch-internal-use-vars-runner.yaml +0 -0
  18. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/ci-fix-perms.yaml +0 -0
  19. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/copy-geoips-functionality.yaml +0 -0
  20. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/ignore-dot-files-and-dirs.yaml +0 -0
  21. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/module-to-class-updates.yaml +0 -0
  22. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/obp-plugin-registry-updates.yaml +0 -0
  23. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/pluginify-updates-jeremy-comments.yaml +0 -0
  24. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/pypi-publish-bug-fix.yaml +0 -0
  25. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/remove-all-geoips-references.yaml +0 -0
  26. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/replace-geoips-functionality.yaml +0 -0
  27. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/update-black-formatting.yaml +0 -0
  28. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/1.0.0/version-update.yaml +0 -0
  29. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/latest/atomic-registry-writes.yaml +0 -0
  30. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/latest/ignore-files-in-utils-directories.yaml +0 -0
  31. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/docs/source/releases/latest/use-geoips-ci.yaml +0 -0
  32. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/__init__.py +0 -0
  33. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/commandline_typer.py +0 -0
  34. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/config.py +0 -0
  35. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/errors.py +0 -0
  36. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/interfaces/__init__.py +0 -0
  37. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/interfaces/base.py +0 -0
  38. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/interfaces/class_based/data_modifiers.py +0 -0
  39. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/interfaces/class_based_plugin.py +0 -0
  40. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/interfaces/yaml_based/configs.py +0 -0
  41. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/plugin_registry.py +0 -0
  42. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/plugins/classes/data_modifiers/cuboid.py +0 -0
  43. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/plugins/yaml/configs/stucco.yaml +0 -0
  44. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/pydantic_models/v1/configs.py +0 -0
  45. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/utils/__init__.py +0 -0
  46. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/utils/context_managers.py +0 -0
  47. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/pluginify/utils/validators.py +0 -0
  48. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/conftest.py +0 -0
  49. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/config/test_config.py +0 -0
  50. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/plugin_registries/files/bad/invalid_interfaces.yaml +0 -0
  51. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/plugin_registries/files/bad/missing_lowest_keys.yaml +0 -0
  52. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/plugin_registries/files/bad/missing_plugin_types.yaml +0 -0
  53. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/plugin_registries/files/good/pluginify.yaml +0 -0
  54. {pluginify-1.0.0.post11.dev0 → pluginify-1.0.0.post16.dev0}/tests/unit_tests/plugin_registries/test_plugin_registries.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pluginify
3
- Version: 1.0.0.post11.dev0
3
+ Version: 1.0.0.post16.dev0
4
4
  Summary: Pluginify package
5
5
  License: LICENSE
6
6
  License-File: LICENSE
@@ -0,0 +1,16 @@
1
+ bug fix:
2
+ - title: "Use NamedTemporaryFile for safer writes"
3
+ description: |
4
+ Plugin registry temp files were still having conflicts when
5
+ written by threads in the same process. To fix this I switched
6
+ to using tempfile.NamedTemporaryFile which is guaranteed to
7
+ avoid conflicts.
8
+ files:
9
+ modified:
10
+ - pluginfiy/create_plugin_registries.py
11
+ related-issue:
12
+ number: null
13
+ repo_url: ''
14
+ date:
15
+ start: 2026-10-30
16
+ finish: 2026-10-30
@@ -3,5 +3,5 @@
3
3
 
4
4
  # DO NOT EDIT
5
5
  # managed by poetry-dynamic-versioning
6
- __version__ = "1.0.0.post11.dev0"
7
- __version_tuple__ = (1, 0, 0, "post11", "dev0")
6
+ __version__ = "1.0.0.post16.dev0"
7
+ __version_tuple__ = (1, 0, 0, "post16", "dev0")
@@ -17,7 +17,7 @@ import logging
17
17
  from importlib import metadata, resources, util, import_module
18
18
  from inspect import signature
19
19
  import json
20
- from os import getpid, makedirs, remove, replace
20
+ from os import makedirs, remove, replace
21
21
  from os.path import (
22
22
  basename,
23
23
  dirname,
@@ -29,6 +29,7 @@ from os.path import (
29
29
  )
30
30
  from pathlib import Path
31
31
  import re
32
+ import tempfile
32
33
  import warnings
33
34
 
34
35
  import yaml
@@ -323,18 +324,27 @@ def write_registered_plugins(pkg_dir, plugins, save_type):
323
324
  # Write to a temporary file and move it into place, so that other processes
324
325
  # reading the registry (for example parallel test workers) never see a
325
326
  # partially written file.
326
- tmp_abspath = f"{reg_plug_abspath}.{getpid()}.tmp"
327
+ tmp_abspath = None
327
328
  try:
328
- with open(tmp_abspath, "w") as plugin_registry:
329
+ with tempfile.NamedTemporaryFile(
330
+ mode="w",
331
+ dir=dirname(reg_plug_abspath),
332
+ suffix=".tmp",
333
+ delete=False,
334
+ ) as plugin_registry:
335
+ tmp_abspath = plugin_registry.name
329
336
  if save_type == "yaml":
330
337
  yaml.safe_dump(plugins, plugin_registry, default_flow_style=False)
331
338
  else:
332
339
  json.dump(plugins, plugin_registry, indent=4)
340
+
333
341
  replace(tmp_abspath, reg_plug_abspath)
334
- except BaseException:
335
- if exists(tmp_abspath):
336
- remove(tmp_abspath)
337
- raise
342
+ finally:
343
+ if tmp_abspath is not None:
344
+ try:
345
+ remove(tmp_abspath)
346
+ except FileNotFoundError:
347
+ pass
338
348
 
339
349
 
340
350
  def create_plugin_registries(plugin_packages, save_type, namespace):
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pluginify" # package available at the root of the project
3
- version = "1.0.0.post11.dev0"
3
+ version = "1.0.0.post16.dev0"
4
4
  description = "Pluginify package"
5
5
  authors = ["Evan Rose", "evrose54@colostate.edu"]
6
6
  readme = "README.md"