dapi 0.4.9__tar.gz → 0.5.0__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 (123) hide show
  1. dapi-0.5.0/.github/workflows/build-test.yml +24 -0
  2. dapi-0.5.0/.github/workflows/docs.yml +61 -0
  3. dapi-0.5.0/.github/workflows/pypi.yml +28 -0
  4. dapi-0.5.0/.gitignore +182 -0
  5. dapi-0.5.0/DesignSafe-Badge.svg +262 -0
  6. dapi-0.5.0/PKG-INFO +193 -0
  7. dapi-0.5.0/README.md +162 -0
  8. dapi-0.5.0/_config.yml +48 -0
  9. dapi-0.5.0/dapi/__init__.py +73 -0
  10. {dapi-0.4.9 → dapi-0.5.0}/dapi/apps.py +2 -2
  11. {dapi-0.4.9 → dapi-0.5.0}/dapi/client.py +273 -37
  12. {dapi-0.4.9 → dapi-0.5.0}/dapi/db/__init__.py +2 -1
  13. {dapi-0.4.9 → dapi-0.5.0}/dapi/db/accessor.py +5 -5
  14. {dapi-0.4.9 → dapi-0.5.0}/dapi/db/config.py +3 -3
  15. {dapi-0.4.9 → dapi-0.5.0}/dapi/db/db.py +9 -5
  16. {dapi-0.4.9 → dapi-0.5.0}/dapi/exceptions.py +23 -3
  17. {dapi-0.4.9 → dapi-0.5.0}/dapi/files.py +11 -6
  18. {dapi-0.4.9 → dapi-0.5.0}/dapi/jobs.py +154 -22
  19. dapi-0.5.0/dapi/launcher.py +134 -0
  20. dapi-0.5.0/dapi/systems.py +358 -0
  21. dapi-0.5.0/dapi.png +0 -0
  22. dapi-0.5.0/docs/apps.md +79 -0
  23. dapi-0.5.0/docs/authentication.md +197 -0
  24. dapi-0.5.0/docs/database.md +273 -0
  25. dapi-0.5.0/docs/examples/apps.md +226 -0
  26. dapi-0.5.0/docs/examples/database.md +909 -0
  27. dapi-0.5.0/docs/examples/mpm.md +339 -0
  28. dapi-0.5.0/docs/examples/openfoam.md +471 -0
  29. dapi-0.5.0/docs/examples/opensees.md +471 -0
  30. dapi-0.5.0/docs/examples/pylauncher.md +131 -0
  31. dapi-0.5.0/docs/examples/tms_credentials.md +44 -0
  32. dapi-0.5.0/docs/examples.md +63 -0
  33. dapi-0.5.0/docs/favicon.ico +0 -0
  34. dapi-0.5.0/docs/files.md +89 -0
  35. dapi-0.5.0/docs/index.md +55 -0
  36. dapi-0.5.0/docs/installation.md +98 -0
  37. dapi-0.5.0/docs/jobs.md +495 -0
  38. dapi-0.5.0/docs/nheri.png +0 -0
  39. dapi-0.5.0/docs/quickstart.md +91 -0
  40. dapi-0.5.0/docs/stylesheets/extra.css +17 -0
  41. dapi-0.5.0/docs/systems.md +42 -0
  42. dapi-0.5.0/docs-api/apps.rst +6 -0
  43. dapi-0.5.0/docs-api/auth.rst +4 -0
  44. dapi-0.5.0/docs-api/client.rst +22 -0
  45. dapi-0.5.0/docs-api/conf.py +35 -0
  46. dapi-0.5.0/docs-api/database.rst +12 -0
  47. dapi-0.5.0/docs-api/exceptions.rst +7 -0
  48. dapi-0.5.0/docs-api/files.rst +12 -0
  49. dapi-0.5.0/docs-api/index.rst +18 -0
  50. dapi-0.5.0/docs-api/jobs.rst +34 -0
  51. dapi-0.5.0/docs-api/launcher.rst +4 -0
  52. dapi-0.5.0/docs-api/systems.rst +12 -0
  53. dapi-0.5.0/examples/apps.ipynb +298 -0
  54. dapi-0.5.0/examples/db.ipynb +180 -0
  55. dapi-0.5.0/examples/mpm/mpm-minimal.ipynb +466 -0
  56. dapi-0.5.0/examples/mpm/mpm.ipynb +876 -0
  57. dapi-0.5.0/examples/mpm/uniaxial_stress/entity_sets.json +13 -0
  58. dapi-0.5.0/examples/mpm/uniaxial_stress/mesh.txt +8 -0
  59. dapi-0.5.0/examples/mpm/uniaxial_stress/mpm.json +66 -0
  60. dapi-0.5.0/examples/mpm/uniaxial_stress/particles.txt +5 -0
  61. dapi-0.5.0/examples/mpm/uniaxial_stress/results.ipynb +56 -0
  62. dapi-0.5.0/examples/openfoam/DH1_run/0/U +46 -0
  63. dapi-0.5.0/examples/openfoam/DH1_run/0/boundary +29 -0
  64. dapi-0.5.0/examples/openfoam/DH1_run/0/k +45 -0
  65. dapi-0.5.0/examples/openfoam/DH1_run/0/nut +42 -0
  66. dapi-0.5.0/examples/openfoam/DH1_run/0/omega +45 -0
  67. dapi-0.5.0/examples/openfoam/DH1_run/0/p +42 -0
  68. dapi-0.5.0/examples/openfoam/DH1_run/constant/polyMesh/boundary +75 -0
  69. dapi-0.5.0/examples/openfoam/DH1_run/constant/polyMesh/faces.gz +0 -0
  70. dapi-0.5.0/examples/openfoam/DH1_run/constant/polyMesh/neighbour.gz +0 -0
  71. dapi-0.5.0/examples/openfoam/DH1_run/constant/polyMesh/owner.gz +0 -0
  72. dapi-0.5.0/examples/openfoam/DH1_run/constant/polyMesh/points.gz +0 -0
  73. dapi-0.5.0/examples/openfoam/DH1_run/constant/transportProperties +21 -0
  74. dapi-0.5.0/examples/openfoam/DH1_run/constant/turbulenceProperties +29 -0
  75. dapi-0.5.0/examples/openfoam/DH1_run/foam.foam +0 -0
  76. dapi-0.5.0/examples/openfoam/DH1_run/system/blockMeshDict +203 -0
  77. dapi-0.5.0/examples/openfoam/DH1_run/system/controlDict +74 -0
  78. dapi-0.5.0/examples/openfoam/DH1_run/system/decomposeParDict +47 -0
  79. dapi-0.5.0/examples/openfoam/DH1_run/system/fvSchemes +78 -0
  80. dapi-0.5.0/examples/openfoam/DH1_run/system/fvSolution +116 -0
  81. dapi-0.5.0/examples/openfoam/frame.png +0 -0
  82. dapi-0.5.0/examples/openfoam/mesh.png +0 -0
  83. dapi-0.5.0/examples/openfoam/openfoam-minimal.ipynb +534 -0
  84. dapi-0.5.0/examples/openfoam/openfoam.ipynb +998 -0
  85. dapi-0.5.0/examples/openfoam/paraview.png +0 -0
  86. dapi-0.5.0/examples/opensees/DS_input/Main_multiMotion.tcl +79 -0
  87. dapi-0.5.0/examples/opensees/DS_input/ProfileA.tcl +568 -0
  88. dapi-0.5.0/examples/opensees/DS_input/ProfileB.tcl +511 -0
  89. dapi-0.5.0/examples/opensees/DS_input/ProfileC.tcl +565 -0
  90. dapi-0.5.0/examples/opensees/DS_input/ProfileD.tcl +521 -0
  91. dapi-0.5.0/examples/opensees/DS_input/motion1.vel +6610 -0
  92. dapi-0.5.0/examples/opensees/DS_input/motion2.vel +3997 -0
  93. dapi-0.5.0/examples/opensees/DS_input/plotAcc.py +40 -0
  94. dapi-0.5.0/examples/opensees/DS_input/recordData.txt +2 -0
  95. dapi-0.5.0/examples/opensees/DS_input/respSpectra.py +70 -0
  96. dapi-0.5.0/examples/opensees/OpenSeesMP-dapi.ipynb +535 -0
  97. dapi-0.5.0/examples/opensees/multi-freeField.png +0 -0
  98. dapi-0.5.0/examples/pylauncher/pylauncher_opensees.ipynb +273 -0
  99. dapi-0.5.0/examples/pylauncher/pylauncher_sweep.ipynb +206 -0
  100. dapi-0.5.0/examples/tms_credentials.ipynb +141 -0
  101. dapi-0.5.0/myst.yml +47 -0
  102. dapi-0.5.0/pyproject.toml +58 -0
  103. dapi-0.5.0/tests/auth/test_auth.py +77 -0
  104. dapi-0.5.0/tests/db/test_db.py +63 -0
  105. dapi-0.5.0/tests/files/test_encoding_consistency.py +96 -0
  106. dapi-0.5.0/tests/files/test_uri_translation.py +88 -0
  107. dapi-0.5.0/tests/jobs/__init__.py +0 -0
  108. dapi-0.5.0/tests/jobs/test_archive_config.py +151 -0
  109. dapi-0.5.0/tests/jobs/test_dir_uri.py +62 -0
  110. dapi-0.5.0/tests/jobs/test_job_gen_jobinfo.py +180 -0
  111. dapi-0.5.0/tests/jobs/test_job_status.py +47 -0
  112. dapi-0.5.0/tests/jobs/test_list_jobs.py +185 -0
  113. dapi-0.5.0/tests/jobs/test_parametric_sweep.py +160 -0
  114. dapi-0.5.0/tests/jobs/test_runtime_summary.py +158 -0
  115. dapi-0.5.0/tests/systems/test_credentials.py +299 -0
  116. dapi-0.4.9/PKG-INFO +0 -183
  117. dapi-0.4.9/README.md +0 -151
  118. dapi-0.4.9/dapi/__init__.py +0 -99
  119. dapi-0.4.9/dapi/systems.py +0 -97
  120. dapi-0.4.9/pyproject.toml +0 -51
  121. {dapi-0.4.9 → dapi-0.5.0}/AUTHORS.md +0 -0
  122. {dapi-0.4.9 → dapi-0.5.0}/LICENSE.md +0 -0
  123. {dapi-0.4.9 → dapi-0.5.0}/dapi/auth.py +0 -0
@@ -0,0 +1,24 @@
1
+ name: Build, Lint, and Test
2
+
3
+ on: [push, pull_request]
4
+ jobs:
5
+ ci:
6
+ strategy:
7
+ fail-fast: false
8
+ matrix:
9
+ python-version: ["3.13"]
10
+ os: [ubuntu-latest]
11
+ runs-on: ${{ matrix.os }}
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Install uv
15
+ uses: astral-sh/setup-uv@v4
16
+ - uses: actions/setup-python@v5
17
+ with:
18
+ python-version: ${{ matrix.python-version }}
19
+ - name: Install dependencies
20
+ run: uv pip install --system ".[dev]"
21
+ - name: Lint and format check
22
+ run: ruff format --check . && ruff check .
23
+ - name: Run tests
24
+ run: pytest tests/
@@ -0,0 +1,61 @@
1
+ name: deploy-docs
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+ pages: write
12
+ id-token: write
13
+
14
+ concurrency:
15
+ group: "pages"
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ build:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v4
26
+
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: "3.13"
30
+
31
+ - name: Set up Node.js
32
+ uses: actions/setup-node@v4
33
+ with:
34
+ node-version: "22"
35
+
36
+ - name: Install dependencies
37
+ run: uv pip install --system ".[docs]"
38
+
39
+ # Build narrative docs (guides, examples) with Jupyter Book / MyST
40
+ - name: Build narrative docs
41
+ run: jupyter-book build --html
42
+
43
+ # Build API reference with Sphinx
44
+ - name: Build API docs
45
+ run: sphinx-build -b html docs-api _build/html/api
46
+
47
+ - name: Upload artifact
48
+ uses: actions/upload-pages-artifact@v3
49
+ with:
50
+ path: ./_build/html
51
+
52
+ deploy:
53
+ environment:
54
+ name: github-pages
55
+ url: ${{ steps.deployment.outputs.page_url }}
56
+ runs-on: ubuntu-latest
57
+ needs: build
58
+ steps:
59
+ - name: Deploy to GitHub Pages
60
+ id: deployment
61
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,28 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ push:
4
+ tags:
5
+ - 'v[0-9]+.[0-9]+.[0-9]+'
6
+ jobs:
7
+ pypi-publish:
8
+ name: Upload release to PyPI
9
+ runs-on: ubuntu-latest
10
+ environment:
11
+ name: pypi
12
+ url: https://pypi.org/p/dapi
13
+ permissions:
14
+ id-token: write
15
+ contents: read
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v4
20
+ - uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.13"
23
+ - name: Build package
24
+ run: uv build
25
+ - name: Publish package distributions to PyPI
26
+ uses: pypa/gh-action-pypi-publish@release/v1
27
+ with:
28
+ verbose: true
dapi-0.5.0/.gitignore ADDED
@@ -0,0 +1,182 @@
1
+ # OS temp files
2
+ **/.DS_Store*
3
+ *~*
4
+ *#*
5
+
6
+ # Byte-compiled / optimized / DLL files
7
+ __pycache__/
8
+ *.py[cod]
9
+ *$py.class
10
+
11
+ # C extensions
12
+ *.so
13
+
14
+ # Distribution / packaging
15
+ .Python
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ downloads/
20
+ eggs/
21
+ .eggs/
22
+ lib/
23
+ lib64/
24
+ parts/
25
+ sdist/
26
+ var/
27
+ wheels/
28
+ share/python-wheels/
29
+ *.egg-info/
30
+ .installed.cfg
31
+ *.egg
32
+ MANIFEST
33
+
34
+ # PyInstaller
35
+ # Usually these files are written by a python script from a template
36
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
37
+ *.manifest
38
+ *.spec
39
+
40
+ # Installer logs
41
+ pip-log.txt
42
+ pip-delete-this-directory.txt
43
+
44
+ # Unit test / coverage reports
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ .coverage
49
+ .coverage.*
50
+ .cache
51
+ nosetests.xml
52
+ coverage.xml
53
+ *.cover
54
+ *.py,cover
55
+ .hypothesis/
56
+ .pytest_cache/
57
+ cover/
58
+
59
+ # Translations
60
+ *.mo
61
+ *.pot
62
+
63
+ # Django stuff:
64
+ *.log
65
+ local_settings.py
66
+ db.sqlite3
67
+ db.sqlite3-journal
68
+
69
+ # Flask stuff:
70
+ instance/
71
+ .webassets-cache
72
+
73
+ # Scrapy stuff:
74
+ .scrapy
75
+
76
+ # Sphinx documentation
77
+ docs/_build/
78
+
79
+ # PyBuilder
80
+ .pybuilder/
81
+ target/
82
+
83
+ # Jupyter Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # IPython
87
+ profile_default/
88
+ ipython_config.py
89
+
90
+ # pyenv
91
+ # For a library or package, you might want to ignore these files since the code is
92
+ # intended to run in multiple environments; otherwise, check them in:
93
+ # .python-version
94
+
95
+ # pipenv
96
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
97
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
98
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
99
+ # install all needed dependencies.
100
+ #Pipfile.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ #poetry.lock
108
+
109
+ # pdm
110
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
111
+ #pdm.lock
112
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
113
+ # in version control.
114
+ # https://pdm.fming.dev/#use-with-ide
115
+ .pdm.toml
116
+
117
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
118
+ __pypackages__/
119
+
120
+ # Celery stuff
121
+ celerybeat-schedule
122
+ celerybeat.pid
123
+
124
+ # SageMath parsed files
125
+ *.sage.py
126
+
127
+ # Environments
128
+ .env
129
+ .venv
130
+ env/
131
+ venv/
132
+ ENV/
133
+ env.bak/
134
+ venv.bak/
135
+
136
+ # Spyder project settings
137
+ .spyderproject
138
+ .spyproject
139
+
140
+ # Rope project settings
141
+ .ropeproject
142
+
143
+ # Jupyter Book build output
144
+ /_build/
145
+ /out/
146
+
147
+ # mkdocs documentation (legacy)
148
+ /site
149
+
150
+ # mypy
151
+ .mypy_cache/
152
+ .dmypy.json
153
+ dmypy.json
154
+
155
+ # Pyre type checker
156
+ .pyre/
157
+
158
+ # pytype static type analyzer
159
+ .pytype/
160
+
161
+ # Cython debug symbols
162
+ cython_debug/
163
+
164
+ # PyCharm
165
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
166
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
167
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
168
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
169
+ #.idea/
170
+
171
+
172
+ # IntelliJ / PyCharm artifacts
173
+ .idea/
174
+
175
+ # VS Code artifacts
176
+ .vscode/
177
+
178
+ # Logs and databases
179
+ *.log
180
+ *.sqlite
181
+
182
+ .aider*
@@ -0,0 +1,262 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ width="151"
4
+ height="20"
5
+ role="img"
6
+ aria-label="|: Open in DesignSafe"
7
+ version="1.1"
8
+ id="svg854"
9
+ sodipodi:docname="DesignSafe-Badge.svg"
10
+ inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
13
+ xmlns:xlink="http://www.w3.org/1999/xlink"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ xmlns:svg="http://www.w3.org/2000/svg"
16
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
17
+ xmlns:cc="http://creativecommons.org/ns#"
18
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
19
+ <defs
20
+ id="defs858" />
21
+ <sodipodi:namedview
22
+ id="namedview856"
23
+ pagecolor="#ffffff"
24
+ bordercolor="#666666"
25
+ borderopacity="1.0"
26
+ inkscape:pageshadow="2"
27
+ inkscape:pageopacity="0.0"
28
+ inkscape:pagecheckerboard="0"
29
+ showgrid="false"
30
+ inkscape:zoom="7.6887417"
31
+ inkscape:cx="29.718777"
32
+ inkscape:cy="19.118863"
33
+ inkscape:window-width="1512"
34
+ inkscape:window-height="916"
35
+ inkscape:window-x="0"
36
+ inkscape:window-y="38"
37
+ inkscape:window-maximized="1"
38
+ inkscape:current-layer="svg854" />
39
+ <title
40
+ id="title824">|: Open in DesignSafe</title>
41
+ <linearGradient
42
+ id="s"
43
+ x2="0"
44
+ y2="54.954529"
45
+ gradientTransform="scale(2.7477263,0.36393726)"
46
+ x1="0"
47
+ y1="0"
48
+ gradientUnits="userSpaceOnUse">
49
+ <stop
50
+ offset="0"
51
+ stop-color="#bbb"
52
+ stop-opacity=".1"
53
+ id="stop826" />
54
+ <stop
55
+ offset="1"
56
+ stop-opacity=".1"
57
+ id="stop828" />
58
+ </linearGradient>
59
+ <clipPath
60
+ id="r">
61
+ <rect
62
+ width="151"
63
+ height="20"
64
+ rx="3"
65
+ fill="#ffffff"
66
+ id="rect831"
67
+ x="0"
68
+ y="0" />
69
+ </clipPath>
70
+ <g
71
+ clip-path="url(#r)"
72
+ id="g840">
73
+ <rect
74
+ width="32"
75
+ height="20"
76
+ fill="#555555"
77
+ id="rect834"
78
+ x="0"
79
+ y="0" />
80
+ <rect
81
+ x="32"
82
+ width="119"
83
+ height="20"
84
+ fill="#007ec6"
85
+ id="rect836"
86
+ y="0" />
87
+ <rect
88
+ width="151"
89
+ height="20"
90
+ fill="url(#s)"
91
+ id="rect838"
92
+ x="0"
93
+ y="0"
94
+ style="fill:url(#s)" />
95
+ </g>
96
+ <g
97
+ fill="#ffffff"
98
+ text-anchor="middle"
99
+ font-family="Verdana, Geneva, 'DejaVu Sans', sans-serif"
100
+ text-rendering="geometricPrecision"
101
+ font-size="110px"
102
+ id="g852">
103
+ <text
104
+ aria-hidden="true"
105
+ x="905"
106
+ y="150"
107
+ fill="#010101"
108
+ fill-opacity="0.3"
109
+ transform="scale(0.1)"
110
+ textLength="1090"
111
+ id="text848"
112
+ lengthAdjust="spacing">Open in DesignSafe</text>
113
+ <text
114
+ x="905"
115
+ y="140"
116
+ transform="scale(0.1)"
117
+ fill="#ffffff"
118
+ textLength="1090"
119
+ id="text850"
120
+ lengthAdjust="spacing">Open in DesignSafe</text>
121
+ </g>
122
+ <metadata
123
+ id="metadata940">
124
+ <rdf:RDF>
125
+ <cc:Work
126
+ rdf:about="">
127
+ <dc:title>|: Open in DesignSafe</dc:title>
128
+ </cc:Work>
129
+ </rdf:RDF>
130
+ </metadata>
131
+ <image
132
+ width="27.200001"
133
+ height="9.6000004"
134
+ preserveAspectRatio="none"
135
+ xlink:href="data:image/png;base64,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
257
+ AyBxax0eqTsCAAAAAElFTkSuQmCC
258
+ "
259
+ id="image3440"
260
+ x="2.3336773"
261
+ y="5.0845823" />
262
+ </svg>