enbid-ananke 0.3.1__py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

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 (67) hide show
  1. enbid_ananke/Enbid-2.0/.DS_Store +0 -0
  2. enbid_ananke/Enbid-2.0/COPYING +341 -0
  3. enbid_ananke/Enbid-2.0/COPYRIGHT +18 -0
  4. enbid_ananke/Enbid-2.0/Documentation/enbid.pdf +0 -0
  5. enbid_ananke/Enbid-2.0/Documentation/users-guide.pdf +0 -0
  6. enbid_ananke/Enbid-2.0/Documentation/users-guide.tex +679 -0
  7. enbid_ananke/Enbid-2.0/Documentation/users-guide.tex.flc +4 -0
  8. enbid_ananke/Enbid-2.0/Enbid +0 -0
  9. enbid_ananke/Enbid-2.0/Examples/hernquist1_small/snapshot_ici +0 -0
  10. enbid_ananke/Enbid-2.0/Examples/hernquist1_small/snapshot_ici_typelist +2 -0
  11. enbid_ananke/Enbid-2.0/Examples/uniform_6d_box_4/snapshot_ici +0 -0
  12. enbid_ananke/Enbid-2.0/Examples/uniform_6d_box_4/snapshot_ici_3d.ascii +10000 -0
  13. enbid_ananke/Enbid-2.0/Examples/uniform_6d_box_4/snapshot_ici_6d.ascii +10000 -0
  14. enbid_ananke/Enbid-2.0/parameterfiles/myparameterfile1 +37 -0
  15. enbid_ananke/Enbid-2.0/parameterfiles/myparameterfile2 +37 -0
  16. enbid_ananke/Enbid-2.0/parameterfiles/myparameterfile3 +37 -0
  17. enbid_ananke/Enbid-2.0/parameterfiles/myparameterfile4 +37 -0
  18. enbid_ananke/Enbid-2.0/periodic_lengths.txt +5 -0
  19. enbid_ananke/Enbid-2.0/src/Makefile +43 -0
  20. enbid_ananke/Enbid-2.0/src/allocate.cpp +47 -0
  21. enbid_ananke/Enbid-2.0/src/allocate.o +0 -0
  22. enbid_ananke/Enbid-2.0/src/allvars.cpp +62 -0
  23. enbid_ananke/Enbid-2.0/src/allvars.h +263 -0
  24. enbid_ananke/Enbid-2.0/src/allvars.o +0 -0
  25. enbid_ananke/Enbid-2.0/src/begrun.cpp +361 -0
  26. enbid_ananke/Enbid-2.0/src/begrun.o +0 -0
  27. enbid_ananke/Enbid-2.0/src/density_nd.cpp +130 -0
  28. enbid_ananke/Enbid-2.0/src/density_nd.o +0 -0
  29. enbid_ananke/Enbid-2.0/src/functions.cpp +256 -0
  30. enbid_ananke/Enbid-2.0/src/functions.h +20 -0
  31. enbid_ananke/Enbid-2.0/src/functions.o +0 -0
  32. enbid_ananke/Enbid-2.0/src/init.cpp +299 -0
  33. enbid_ananke/Enbid-2.0/src/init.o +0 -0
  34. enbid_ananke/Enbid-2.0/src/io.cpp +255 -0
  35. enbid_ananke/Enbid-2.0/src/io.o +0 -0
  36. enbid_ananke/Enbid-2.0/src/main.cpp +108 -0
  37. enbid_ananke/Enbid-2.0/src/main.o +0 -0
  38. enbid_ananke/Enbid-2.0/src/ngb_search.cpp +2315 -0
  39. enbid_ananke/Enbid-2.0/src/ngb_search.h +35 -0
  40. enbid_ananke/Enbid-2.0/src/ngb_search.o +0 -0
  41. enbid_ananke/Enbid-2.0/src/nr.cpp +186 -0
  42. enbid_ananke/Enbid-2.0/src/nr.h +13 -0
  43. enbid_ananke/Enbid-2.0/src/nr.o +0 -0
  44. enbid_ananke/Enbid-2.0/src/proto.h +22 -0
  45. enbid_ananke/Enbid-2.0/src/read_ic.cpp +434 -0
  46. enbid_ananke/Enbid-2.0/src/read_ic.o +0 -0
  47. enbid_ananke/Enbid-2.0/src/tree.cpp +973 -0
  48. enbid_ananke/Enbid-2.0/src/tree.h +34 -0
  49. enbid_ananke/Enbid-2.0/src/tree.o +0 -0
  50. enbid_ananke/Enbid-2.0/src/tree_search.cpp +597 -0
  51. enbid_ananke/Enbid-2.0/src/tree_search.o +0 -0
  52. enbid_ananke/__init__.py +318 -0
  53. enbid_ananke/__license__/LICENSE +339 -0
  54. enbid_ananke/__license__/__init__.py +9 -0
  55. enbid_ananke/__metadata__.py +160 -0
  56. enbid_ananke/_builtin_utils.py +62 -0
  57. enbid_ananke/_constants.py +56 -0
  58. enbid_ananke/_defaults.py +36 -0
  59. enbid_ananke/_name.py +10 -0
  60. enbid_ananke/_templates.py +71 -0
  61. enbid_ananke/_version.py +21 -0
  62. enbid_ananke/utils.py +11 -0
  63. enbid_ananke-0.3.1.dist-info/LICENSE +339 -0
  64. enbid_ananke-0.3.1.dist-info/METADATA +33 -0
  65. enbid_ananke-0.3.1.dist-info/RECORD +67 -0
  66. enbid_ananke-0.3.1.dist-info/WHEEL +7 -0
  67. enbid_ananke-0.3.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Contains the EnBiD module metadata.
4
+ """
5
+ import _sitebuiltins
6
+ import textwrap
7
+ from typing import Final
8
+ from datetime import datetime
9
+
10
+ from . import _version
11
+
12
+ try:
13
+ from .__license__ import __license_full__
14
+ except ImportError:
15
+ __license_full__ = ""
16
+
17
+ __all__ = ['__project__', '__description__', '__url__', '__year__', '__author__', '__contributors__', '__license__',
18
+ '__version__', '__date__', '__maintainer__', '__email__', '__classifiers__',
19
+ '__credits__', '__doi__', '__citation__', '__adsurl__', '__bibtex__', '__copyright__', '__readme__',
20
+ 'copyright', 'credits', 'license', 'readme']
21
+
22
+ # PROJECT METADATA
23
+ __project__ = "py-EnBiD-ananke"
24
+ __description__ = "Python wrapper for EnBiD (Sharma & Steinmetz 2011 <http://ascl.net/1109.012>) for py-ananke <https://github.com/athob/py-ananke>."
25
+ __url__ = "https://github.com/athob/py-EnBiD-ananke"
26
+ __year__ = 2022
27
+ __author__ = "Adrien Thob"
28
+ __contributors__ = ["Robyn Sanderson", "Andrew Eden"]
29
+ __supporters__ = ["Sanjib Sharma"]
30
+ __feedback__ = ["the extended Galaxy Dynamics @ UPenn group", "the participants of the \"anankethon\" workshops"]
31
+ __license__ = "GNU General Public License v2 or later (GPLv2+)" # TODO change to longer version?
32
+ __license_classifier__ = "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)"
33
+ __license_short__ = "Licensed under the GNU GPL v2 or later"
34
+
35
+ # SOFTWARE METADATA
36
+ __version__: Final[str] = _version.get_versions()['version']
37
+ __date__: str = _version.get_versions()['date']
38
+ __date__: datetime = datetime.fromisoformat(f"{__date__[:-2]}:{__date__[-2:]}")
39
+ __maintainer__ = "Adrien Thob"
40
+ __email__ = "athob@sas.upenn.edu"
41
+ __status_classifier__ = "Development Status :: 5 - Production/Stable"
42
+ __classifiers__ = [
43
+ __status_classifier__,
44
+ "Environment :: Console",
45
+ "Intended Audience :: Science/Research",
46
+ __license_classifier__,
47
+ "Natural Language :: English",
48
+ "Operating System :: Unix",
49
+ "Programming Language :: Python :: 3",
50
+ "Topic :: Scientific/Engineering :: Astronomy"
51
+ ]
52
+
53
+ # CREDITS METADATA
54
+ __credits__ = textwrap.fill(f"""
55
+ Thanks to {', '.join(__contributors__)[::-1].replace(',','& ', 1)[::-1]} for their contributions,
56
+ to {', '.join(__supporters__)[::-1].replace(',','& ', 1)[::-1]} for their support & guidance,
57
+ and to the wider community for their suggestions and feedback,
58
+ including {', '.join(__feedback__)[::-1].replace(',','& ', 1)[::-1]}.
59
+ """.strip('\n'))
60
+
61
+ # CITING METADATA
62
+ __doi__ = "10.21105/joss.06234"
63
+ __citation__ = textwrap.fill("""
64
+ Thob, Adrien C. R. et al. 2024, “Generating synthetic star catalogs
65
+ from simulated data for next-gen observatories with py-ananke”,
66
+ The Journal of Open Source Software, 9, 6234, doi:10.21105/joss.06234.
67
+ """.strip('\n'))
68
+ __adsurl__ = "https://ui.adsabs.harvard.edu/abs/2024JOSS....9.6234T"
69
+ __adsexportcitation__ = f"{__adsurl__}/exportcitation"
70
+ __bibtex__ = """
71
+ @ARTICLE{2024JOSS....9.6234T,
72
+ author = {{Thob}, Adrien C.~R. and {Sanderson}, Robyn E. and
73
+ {Eden}, Andrew P. and {Nikakhtar}, Farnik and
74
+ {Panithanpaisal}, Nondh and {Garavito-Camargo}, Nicol{\\'a}s
75
+ and {Sharma}, Sanjib},
76
+ title = "{Generating synthetic star catalogs from simulated data
77
+ for next-gen observatories with py-ananke}",
78
+ journal = {The Journal of Open Source Software},
79
+ keywords = {C++, astronomy, galaxies, stars, simulations,
80
+ mock observations, Jupyter Notebook, Python,
81
+ Astrophysics - Astrophysics of Galaxies,
82
+ Astrophysics - Instrumentation and Methods for Astrophysics},
83
+ year = 2024,
84
+ month = oct,
85
+ volume = {9},
86
+ number = {102},
87
+ eid = {6234},
88
+ pages = {6234},
89
+ doi = {10.21105/joss.06234},
90
+ archivePrefix = {arXiv},
91
+ eprint = {2312.02268},
92
+ primaryClass = {astro-ph.GA},
93
+ adsurl = {https://ui.adsabs.harvard.edu/abs/2024JOSS....9.6234T},
94
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
95
+ }
96
+ """.strip('\n')
97
+ __citing__ = '\n\n'.join(map(textwrap.fill, f"""
98
+ If {__project__} has played a role in your research project or software
99
+ development, we kindly request that you acknowledge and cite the
100
+ project. Citing {__project__} not only gives credit to the dedicated
101
+ efforts of its creators but also helps others discover and benefit
102
+ from this software.
103
+
104
+ To cite {__project__}, please use DOI {__doi__} as a
105
+ reference in your publications, or cite as the following:
106
+
107
+ {{__citation__}}
108
+
109
+ Alternatively, you may use one of the entries associated with
110
+ {__project__} as listed by The SAO/NASA Astrophysics Data System:
111
+ <{__adsexportcitation__}>
112
+ such as the following BibTeX entry:
113
+
114
+ {{__bibtex__}}
115
+ """.strip('\n').split('\n\n'))).format(__citation__=__citation__, __bibtex__=__bibtex__)
116
+
117
+ # COPYRIGHT METADATA
118
+ __copyright_short__ = f"Copyright (C) {__year__}-{__date__.year} {__author__}"
119
+ __copyright__ = f"""
120
+ {textwrap.fill(f"{__project__} v{__version__}: {__description__}")}
121
+
122
+ {__copyright_short__}
123
+
124
+ This program is free software; you can redistribute it and/or modify
125
+ it under the terms of the GNU General Public License as published by
126
+ the Free Software Foundation; either version 2 of the License, or
127
+ (at your option) any later version.
128
+
129
+ This program is distributed in the hope that it will be useful,
130
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
131
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
132
+ GNU General Public License for more details.
133
+
134
+ You should have received a copy of the GNU General Public License along
135
+ with this program; if not, write to the Free Software Foundation, Inc.,
136
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
137
+
138
+ --CITING-------------------------------------------------------------
139
+
140
+ {__citing__}
141
+ """.strip('\n')
142
+
143
+ # README
144
+ __readme__ = f"""
145
+ {__copyright__}
146
+
147
+ --CREDITS------------------------------------------------------------
148
+
149
+ {__credits__}
150
+ """.strip('\n')
151
+
152
+ # DEFINING PRINTERS
153
+ copyright = _sitebuiltins._Printer('copyright', __copyright__)
154
+ credits = _sitebuiltins._Printer('credits', __credits__)
155
+ license = _sitebuiltins._Printer('license', __license_full__)
156
+ readme = _sitebuiltins._Printer('readme', __readme__)
157
+
158
+
159
+ if __name__ == '__main__':
160
+ raise NotImplementedError()
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Module utilities using built-in implementation
4
+ """
5
+ import sys
6
+ from types import ModuleType
7
+ import subprocess
8
+ import importlib.util
9
+ import re
10
+
11
+ __all__ = ['Singleton', 'execute', 'get_version_of_command', 'import_source_file']
12
+
13
+
14
+ class Singleton(type):
15
+ """
16
+ Singleton metaclass.
17
+ Credit https://stackoverflow.com/q/6760685
18
+ """
19
+ _instances = {}
20
+ def __call__(cls, *args, **kwargs):
21
+ if cls not in cls._instances:
22
+ cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
23
+ return cls._instances[cls]
24
+
25
+
26
+ def _execute_generator(args, **kwargs):
27
+ popen = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, **kwargs)
28
+ for stdout_line in iter(popen.stdout.readline, ""):
29
+ yield stdout_line
30
+ popen.stdout.close()
31
+ return_code = popen.wait()
32
+ if return_code:
33
+ raise subprocess.CalledProcessError(return_code, args)
34
+
35
+
36
+ def execute(args, verbose=True, **kwargs):
37
+ """
38
+ Run the command described by args, and use
39
+ verbose kwarg to redirect output/error stream
40
+ to python output stream.
41
+ Credit https://stackoverflow.com/a/4417735
42
+ """
43
+ for path in _execute_generator(args, **kwargs):
44
+ print(path, end="") if verbose else None
45
+
46
+
47
+ def get_version_of_command(cmd):
48
+ return re.findall("((?:[0-9]+\.)+[0-9]+)",
49
+ str(subprocess.check_output([cmd, '--version'])))[0]
50
+
51
+
52
+ def import_source_file(module_name, file_path) -> ModuleType:
53
+ # based on https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly
54
+ spec = importlib.util.spec_from_file_location(module_name, file_path)
55
+ module = importlib.util.module_from_spec(spec)
56
+ sys.modules[module_name] = module
57
+ spec.loader.exec_module(module)
58
+ return module
59
+
60
+
61
+ if __name__ == '__main__':
62
+ raise NotImplementedError()
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Contains the EnBiD module constants.
4
+ """
5
+ import pathlib
6
+ from dataclasses import dataclass
7
+
8
+ from ._name import *
9
+ from ._builtin_utils import Singleton
10
+
11
+ __all__ = ['NAME', 'LOG_DIR', 'SRC_DIR', 'ENBID_URL', 'CONSTANTS', 'SNAPSHOT_FILEBASE', 'ENBID_OUT_EXT', 'HASH_EXT', 'HASH_ENCODING']
12
+
13
+ ENBID2 = 'Enbid-2.0'
14
+ ENBID_URL = 'https://sourceforge.net/projects/enbid/files/latest/download'
15
+ ENBID_EXEC = 'Enbid'
16
+ LOG_DIR = 'log'
17
+ SRC_DIR = 'src'
18
+
19
+ ENBID_PARAMFILE = 'enbid_paramfile'
20
+ USEDVALUES_SUFFIX = '_enbid-usedvalues'
21
+ SNAPSHOT_FILEBASE = 'SnapshotFileBase'
22
+ ENBID_OUT_EXT = 'est'
23
+ HASH_EXT = 'hash'
24
+ HASH_ENCODING = 'ascii'
25
+
26
+ @dataclass()
27
+ class Constants(metaclass=Singleton):
28
+ enbid2: str = ENBID2
29
+ enbid_exec: str = ENBID_EXEC
30
+ _enbid: pathlib.Path = None
31
+ enbid_paramfile: str = ENBID_PARAMFILE
32
+
33
+ @property
34
+ def enbid_cpp(self):
35
+ return pathlib.Path(__file__).resolve().parent / self.enbid2
36
+
37
+ @property
38
+ def enbid(self):
39
+ if isinstance(self._enbid, pathlib.Path):
40
+ return self._enbid
41
+ else:
42
+ return self.enbid_cpp / self.enbid_exec
43
+
44
+ @enbid.setter
45
+ def enbid(self, path: pathlib.Path):
46
+ self._enbid = path
47
+
48
+ @property
49
+ def usedvalues(self):
50
+ return f"{self.enbid_paramfile}{USEDVALUES_SUFFIX}"
51
+
52
+ CONSTANTS = Constants()
53
+
54
+
55
+ if __name__ == '__main__':
56
+ raise NotImplementedError()
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Contains the EnBiD module defaults.
4
+ """
5
+ import tempfile
6
+
7
+ from ._templates import *
8
+
9
+ __all__ = ['DEFAULT_NGB', 'DEFAULT_FOR_PARAMFILE']
10
+
11
+ TO_ENBID_FILENAME = 'to_enbid'
12
+ DEFAULT_NGB = 64
13
+
14
+ DEFAULT_FOR_PARAMFILE = {
15
+ TTAGS.fname: TO_ENBID_FILENAME,
16
+ # TTAGS.des_num_ngb: DEFAULT_NGB,
17
+ TTAGS.spatial_scale: 1.0,
18
+ TTAGS.part_boundary: 7,
19
+ TTAGS.node_splitting_criterion: 1,
20
+ TTAGS.cubic_cells: 0,
21
+ TTAGS.median_splitting_on: 1,
22
+ TTAGS.type_of_smoothing: 3,
23
+ TTAGS.vol_corr: 1,
24
+ TTAGS.type_of_kernel: 3,
25
+ TTAGS.kernel_bias_correction: 1,
26
+ TTAGS.anisotropy_kernel: 0,
27
+ TTAGS.anisotropy: 0,
28
+ TTAGS.type_list_on: 0,
29
+ TTAGS.periodic_boundary_on: 0
30
+ }
31
+
32
+ TEMP_DIR = tempfile.TemporaryDirectory()
33
+
34
+
35
+ if __name__ == '__main__':
36
+ raise NotImplementedError()
enbid_ananke/_name.py ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ """
4
+ __all__ = ['NAME']
5
+
6
+ NAME = 'enbid_ananke'
7
+
8
+
9
+ if __name__ == '__main__':
10
+ raise NotImplementedError()
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Contains the EnBiD module templates.
4
+ """
5
+ from string import Template
6
+ from dataclasses import dataclass
7
+
8
+ from ._builtin_utils import Singleton
9
+
10
+ __all__ = ['TTAGS', 'ENBID_PARAMFILE_TEMPLATE']
11
+
12
+ @dataclass(frozen=True)
13
+ class TemplateTags(metaclass=Singleton):
14
+ fname: str = 'fname'
15
+ des_num_ngb: str = 'des_num_ngb'
16
+ spatial_scale: str = 'spatial_scale'
17
+ part_boundary: str = 'part_boundary'
18
+ node_splitting_criterion: str = 'node_splitting_criterion'
19
+ cubic_cells: str = 'cubic_cells'
20
+ median_splitting_on: str = 'median_splitting_on'
21
+ type_of_smoothing: str = 'type_of_smoothing'
22
+ vol_corr: str = 'vol_corr'
23
+ type_of_kernel: str = 'type_of_kernel'
24
+ kernel_bias_correction: str = 'kernel_bias_correction'
25
+ anisotropy_kernel: str = 'anisotropy_kernel'
26
+ anisotropy: str = 'anisotropy'
27
+ des_num_ngb_a: str = 'des_num_ngb_a'
28
+ type_list_on: str = 'type_list_on'
29
+ periodic_boundary_on: str = 'periodic_boundary_on'
30
+
31
+ TTAGS = TemplateTags()
32
+
33
+ ENBID_PARAMFILE_TEMPLATE = Template(f"""% Input and Output
34
+ InitCondFile ${{{TTAGS.fname}}}
35
+
36
+ %-------------------------------------------------------
37
+ ICFormat 0 % O)ASCII 1)Gadget 2)User defined
38
+ SnapshotFileBase _d3n${{{TTAGS.des_num_ngb}}}
39
+
40
+ %-------------------------------------------------------
41
+ % Tree related options
42
+ SpatialScale ${{{TTAGS.spatial_scale}}} % x->x/SpatialScale and v->v
43
+ PartBoundary ${{{TTAGS.part_boundary}}} % Min particles in a node to do boundary correction
44
+ NodeSplittingCriterion ${{{TTAGS.node_splitting_criterion}}} % 0)Alternate 1) Min Entropy
45
+ CubicCells ${{{TTAGS.cubic_cells}}} % use 1 in spherically symmetric systems
46
+ MedianSplittingOn ${{{TTAGS.median_splitting_on}}}
47
+
48
+ %--------------------------------------------------------
49
+ % Smoothing options AM=adaptive metric Ker=Kernel Sp=Spherical Pr=Product
50
+ % 0) None 1)FiEstAS 2)Ker Sp Normal 3)Ker Sp AM 4)KerPr Normal 5)KerPr AM
51
+ TypeOfSmoothing ${{{TTAGS.type_of_smoothing}}}
52
+ DesNumNgb ${{{TTAGS.des_num_ngb}}} % 2-10 for Fiestas and 25-100 for Kernel
53
+ VolCorr ${{{TTAGS.vol_corr}}} % 0) Disbale 1) Enable
54
+
55
+ %--------------------------------------------------------
56
+ % Kernel smoothing related options
57
+ % 0) B-Spline 1)top hat 2)Bi_weight (1-x^2)^2 3)Epanechikov 4)CIC 5)TSC
58
+ TypeOfKernel ${{{TTAGS.type_of_kernel}}}
59
+ KernelBiasCorrection ${{{TTAGS.kernel_bias_correction}}} % 0)none 1)shift central particle
60
+ AnisotropicKernel ${{{TTAGS.anisotropy_kernel}}} % 0) Isotropic 1) Anisotropic
61
+ Anisotropy ${{{TTAGS.anisotropy}}} % fix minimum c/a minor/major axis ratio
62
+ DesNumNgbA ${{{TTAGS.des_num_ngb_a}}} % Neighbors for cal covar metric for Anisotropic Ker
63
+ %--------------------------------------------------------
64
+ % other miscellaneous option
65
+ TypeListOn ${{{TTAGS.type_list_on}}}
66
+ PeriodicBoundaryOn ${{{TTAGS.periodic_boundary_on}}}
67
+ %--------------------------------------------------------""")
68
+
69
+
70
+ if __name__ == '__main__':
71
+ raise NotImplementedError()
@@ -0,0 +1,21 @@
1
+
2
+ # This file was generated by 'versioneer.py' (0.29) from
3
+ # revision-control system data, or from the parent directory name of an
4
+ # unpacked source archive. Distribution tarballs contain a pre-generated copy
5
+ # of this file.
6
+
7
+ import json
8
+
9
+ version_json = '''
10
+ {
11
+ "date": "2025-06-27T18:26:14-0400",
12
+ "dirty": false,
13
+ "error": null,
14
+ "full-revisionid": "88fd859a1d0a1491f3b68091c84388493eaa9d47",
15
+ "version": "0.3.1"
16
+ }
17
+ ''' # END VERSION_JSON
18
+
19
+
20
+ def get_versions():
21
+ return json.loads(version_json)
enbid_ananke/utils.py ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Module miscellaneous utilities
4
+ """
5
+ from enbid_ananke._builtin_utils import Singleton, execute
6
+
7
+ __all__ = ['Singleton', 'execute']
8
+
9
+
10
+ if __name__ == '__main__':
11
+ raise NotImplementedError()