hbat 2.2.4__tar.gz → 2.2.6__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 (153) hide show
  1. hbat-2.2.6/.github/workflows/release.yml +480 -0
  2. {hbat-2.2.4 → hbat-2.2.6}/.github/workflows/test.yml +13 -5
  3. {hbat-2.2.4 → hbat-2.2.6}/Makefile +39 -14
  4. {hbat-2.2.4 → hbat-2.2.6}/PKG-INFO +4 -4
  5. {hbat-2.2.4 → hbat-2.2.6}/README.md +2 -2
  6. {hbat-2.2.4 → hbat-2.2.6}/build_standalone_linux.py +88 -24
  7. {hbat-2.2.4 → hbat-2.2.6}/docs/source/conf.py +36 -2
  8. {hbat-2.2.4 → hbat-2.2.6}/docs/source/index.rst +40 -16
  9. {hbat-2.2.4 → hbat-2.2.6}/docs/source/installation.rst +17 -14
  10. {hbat-2.2.4 → hbat-2.2.6}/hbat/_version.py +2 -2
  11. {hbat-2.2.4 → hbat-2.2.6}/hbat/cli/main.py +96 -1
  12. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/pdb_constants.py +104 -0
  13. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/app_config.py +14 -14
  14. hbat-2.2.6/hbat/core/atom_classifier.py +123 -0
  15. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/interactions.py +178 -12
  16. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/np_analyzer.py +209 -118
  17. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/np_vector.py +16 -16
  18. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/pdb_parser.py +18 -9
  19. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/structure.py +15 -0
  20. {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/main_window.py +163 -59
  21. {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/results_panel.py +67 -30
  22. {hbat-2.2.4 → hbat-2.2.6}/hbat.egg-info/SOURCES.txt +20 -12
  23. {hbat-2.2.4 → hbat-2.2.6}/pyproject.toml +1 -1
  24. {hbat-2.2.4 → hbat-2.2.6}/pytest.ini +6 -1
  25. {hbat-2.2.4 → hbat-2.2.6}/requirements-dev.txt +7 -1
  26. {hbat-2.2.4 → hbat-2.2.6}/requirements.txt +4 -1
  27. {hbat-2.2.4 → hbat-2.2.6}/tests/cli/test_cli_main.py +4 -218
  28. {hbat-2.2.4 → hbat-2.2.6}/tests/conftest.py +158 -0
  29. hbat-2.2.6/tests/e2e/__init__.py +0 -0
  30. hbat-2.2.6/tests/e2e/test_cli_workflows.py +458 -0
  31. hbat-2.2.6/tests/e2e/test_complete_workflows.py +357 -0
  32. hbat-2.2.6/tests/e2e/test_gui_workflows.py +540 -0
  33. {hbat-2.2.4 → hbat-2.2.6}/tests/gui/test_gui_components.py +445 -464
  34. hbat-2.2.6/tests/integration/__init__.py +0 -0
  35. hbat-2.2.6/tests/integration/test_analyzer_components.py +484 -0
  36. hbat-2.2.6/tests/integration/test_cli_integration.py +506 -0
  37. hbat-2.2.6/tests/integration/test_molecular_validation.py +209 -0
  38. hbat-2.2.6/tests/integration/test_pdb_parsing.py +837 -0
  39. hbat-2.2.6/tests/performance/__init__.py +6 -0
  40. hbat-2.2.6/tests/performance/test_performance_workflows.py +558 -0
  41. {hbat-2.2.4 → hbat-2.2.6}/tests/run_tests.py +44 -20
  42. hbat-2.2.6/tests/unit/__init__.py +0 -0
  43. hbat-2.2.6/tests/unit/test_cli_parsing.py +341 -0
  44. hbat-2.2.6/tests/unit/test_gui_components.py +406 -0
  45. {hbat-2.2.4/tests/core → hbat-2.2.6/tests/unit}/test_interactions.py +290 -304
  46. hbat-2.2.6/tests/unit/test_parameters.py +446 -0
  47. hbat-2.2.6/tests/unit/test_structures.py +471 -0
  48. hbat-2.2.6/tests/unit/test_vector_math.py +454 -0
  49. hbat-2.2.4/.github/workflows/conda-release.yml +0 -81
  50. hbat-2.2.4/.github/workflows/pr-prerelease.yml +0 -324
  51. hbat-2.2.4/.github/workflows/release.yml +0 -171
  52. hbat-2.2.4/tests/core/__init__.py +0 -5
  53. hbat-2.2.4/tests/core/test_analyzer.py +0 -631
  54. hbat-2.2.4/tests/core/test_np_vector.py +0 -156
  55. hbat-2.2.4/tests/core/test_pdb_fixer.py +0 -366
  56. hbat-2.2.4/tests/core/test_pdb_parser.py +0 -582
  57. hbat-2.2.4/tests/gui/test_numpy_integration.py +0 -103
  58. hbat-2.2.4/tests/test_np_analyzer.py +0 -310
  59. hbat-2.2.4/tests/test_np_vector.py +0 -293
  60. {hbat-2.2.4 → hbat-2.2.6}/.github/workflows/cleanup-prereleases.yml +0 -0
  61. {hbat-2.2.4 → hbat-2.2.6}/CITATION.cff +0 -0
  62. {hbat-2.2.4 → hbat-2.2.6}/CLAUDE.md +0 -0
  63. {hbat-2.2.4 → hbat-2.2.6}/CODE_OF_CONDUCT.md +0 -0
  64. {hbat-2.2.4 → hbat-2.2.6}/CONTRIBUTING.md +0 -0
  65. {hbat-2.2.4 → hbat-2.2.6}/LICENSE +0 -0
  66. {hbat-2.2.4 → hbat-2.2.6}/MANIFEST.in +0 -0
  67. {hbat-2.2.4 → hbat-2.2.6}/build_standalone.py +0 -0
  68. {hbat-2.2.4 → hbat-2.2.6}/build_standalone_windows.py +0 -0
  69. {hbat-2.2.4 → hbat-2.2.6}/conda/meta.yaml +0 -0
  70. {hbat-2.2.4 → hbat-2.2.6}/docs/Makefile +0 -0
  71. {hbat-2.2.4 → hbat-2.2.6}/docs/requirements.txt +0 -0
  72. {hbat-2.2.4 → hbat-2.2.6}/docs/source/_static/custom.css +0 -0
  73. {hbat-2.2.4 → hbat-2.2.6}/docs/source/_static/light-theme.css +0 -0
  74. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/ccd_analyzer.rst +0 -0
  75. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/constants_generator.rst +0 -0
  76. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/generate_ccd_constants.rst +0 -0
  77. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/index.rst +0 -0
  78. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/cli/index.rst +0 -0
  79. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/app.rst +0 -0
  80. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/atomic_data.rst +0 -0
  81. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/index.rst +0 -0
  82. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/misc.rst +0 -0
  83. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/parameters.rst +0 -0
  84. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/pdb_constants.rst +0 -0
  85. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/index.rst +0 -0
  86. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/interactions.rst +0 -0
  87. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/np_analyzer.rst +0 -0
  88. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/np_vector.rst +0 -0
  89. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/pdb_fixer.rst +0 -0
  90. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/pdb_parser.rst +0 -0
  91. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/structure.rst +0 -0
  92. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/examples/index.rst +0 -0
  93. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/gui/index.rst +0 -0
  94. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/index.rst +0 -0
  95. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/utilities/atom_utils.rst +0 -0
  96. {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/utilities/index.rst +0 -0
  97. {hbat-2.2.4 → hbat-2.2.6}/docs/source/cli.rst +0 -0
  98. {hbat-2.2.4 → hbat-2.2.6}/docs/source/development.rst +0 -0
  99. {hbat-2.2.4 → hbat-2.2.6}/docs/source/license.rst +0 -0
  100. {hbat-2.2.4 → hbat-2.2.6}/docs/source/logic.rst +0 -0
  101. {hbat-2.2.4 → hbat-2.2.6}/docs/source/parameters.rst +0 -0
  102. {hbat-2.2.4 → hbat-2.2.6}/docs/source/pdbfixing.rst +0 -0
  103. {hbat-2.2.4 → hbat-2.2.6}/docs/source/quickstart.rst +0 -0
  104. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1bhl.pdb +0 -0
  105. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1gai.pdb +0 -0
  106. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1ubi.pdb +0 -0
  107. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/2izf.pdb +0 -0
  108. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4jsv.pdb +0 -0
  109. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4laz.pdb +0 -0
  110. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4ub7.pdb +0 -0
  111. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4x21.pdb +0 -0
  112. {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/6rsa.pdb +0 -0
  113. {hbat-2.2.4 → hbat-2.2.6}/example_presets/drug_design_strict.hbat +0 -0
  114. {hbat-2.2.4 → hbat-2.2.6}/example_presets/high_resolution.hbat +0 -0
  115. {hbat-2.2.4 → hbat-2.2.6}/example_presets/low_resolution.hbat +0 -0
  116. {hbat-2.2.4 → hbat-2.2.6}/example_presets/membrane_proteins.hbat +0 -0
  117. {hbat-2.2.4 → hbat-2.2.6}/example_presets/nmr_structures.hbat +0 -0
  118. {hbat-2.2.4 → hbat-2.2.6}/example_presets/standard_resolution.hbat +0 -0
  119. {hbat-2.2.4 → hbat-2.2.6}/example_presets/strong_interactions_only.hbat +0 -0
  120. {hbat-2.2.4 → hbat-2.2.6}/example_presets/weak_interactions_permissive.hbat +0 -0
  121. {hbat-2.2.4 → hbat-2.2.6}/hbat/__init__.py +0 -0
  122. {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/__init__.py +0 -0
  123. {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/ccd_analyzer.py +0 -0
  124. {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/constants_generator.py +0 -0
  125. {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/generate_ccd_constants.py +0 -0
  126. {hbat-2.2.4 → hbat-2.2.6}/hbat/cli/__init__.py +0 -0
  127. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/__init__.py +0 -0
  128. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/app.py +0 -0
  129. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/atomic_data.py +0 -0
  130. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/misc.py +0 -0
  131. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/parameters.py +0 -0
  132. {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/residue_bonds.py +0 -0
  133. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/__init__.py +0 -0
  134. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/analysis.py +0 -0
  135. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/analyzer.py +0 -0
  136. {hbat-2.2.4 → hbat-2.2.6}/hbat/core/pdb_fixer.py +0 -0
  137. {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/__init__.py +0 -0
  138. {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/chain_visualization.py +0 -0
  139. {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/parameter_panel.py +0 -0
  140. {hbat-2.2.4 → hbat-2.2.6}/hbat/utilities/__init__.py +0 -0
  141. {hbat-2.2.4 → hbat-2.2.6}/hbat/utilities/atom_utils.py +0 -0
  142. {hbat-2.2.4 → hbat-2.2.6}/hbat.icns +0 -0
  143. {hbat-2.2.4 → hbat-2.2.6}/hbat.ico +0 -0
  144. {hbat-2.2.4 → hbat-2.2.6}/hbat.png +0 -0
  145. {hbat-2.2.4 → hbat-2.2.6}/hbat.svg +0 -0
  146. {hbat-2.2.4 → hbat-2.2.6}/hbat_cli.py +0 -0
  147. {hbat-2.2.4 → hbat-2.2.6}/hbat_gui.py +0 -0
  148. {hbat-2.2.4 → hbat-2.2.6}/setup.cfg +0 -0
  149. {hbat-2.2.4 → hbat-2.2.6}/tests/README.md +0 -0
  150. {hbat-2.2.4 → hbat-2.2.6}/tests/__init__.py +0 -0
  151. {hbat-2.2.4 → hbat-2.2.6}/tests/cli/__init__.py +0 -0
  152. {hbat-2.2.4 → hbat-2.2.6}/tests/gui/__init__.py +0 -0
  153. {hbat-2.2.4/tests/core → hbat-2.2.6/tests/performance}/test_ccd_performance.py +0 -0
@@ -0,0 +1,480 @@
1
+ name: Build and Release
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, reopened]
6
+ branches: [ main ]
7
+ workflow_run:
8
+ workflows: ["Tests"]
9
+ types:
10
+ - completed
11
+ branches: [ main ]
12
+
13
+ jobs:
14
+ generate-version:
15
+ runs-on: ubuntu-latest
16
+ # Skip if Tests workflow failed
17
+ if: ${{ github.event_name == 'pull_request' || github.event.workflow_run.conclusion == 'success' }}
18
+ outputs:
19
+ version: ${{ steps.generate_version.outputs.version }}
20
+ version_tag: ${{ steps.generate_version.outputs.version_tag }}
21
+ github_tag: ${{ steps.generate_version.outputs.github_tag }}
22
+ is_prerelease: ${{ steps.generate_version.outputs.is_prerelease }}
23
+ pr_number: ${{ github.event.number }}
24
+
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ with:
28
+ fetch-depth: 0
29
+
30
+ - name: Generate version for PR
31
+ if: github.event_name == 'pull_request'
32
+ id: generate_pr_version
33
+ run: |
34
+ # Get base version from latest tag or default to 0.0.0
35
+ BASE_VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "0.0.0")
36
+
37
+ # Generate PEP 440 compatible pre-release version
38
+ SHORT_SHA=$(git rev-parse --short HEAD)
39
+ PR_NUMBER=${{ github.event.number }}
40
+
41
+ # Use PEP 440 compatible format
42
+ PRERELEASE_VERSION="${BASE_VERSION}.dev${PR_NUMBER}+${SHORT_SHA}"
43
+ PRERELEASE_TAG="v${PRERELEASE_VERSION}"
44
+
45
+ # GitHub tag for releases (without +sha)
46
+ GITHUB_TAG="v${BASE_VERSION}-pr${PR_NUMBER}.${SHORT_SHA}"
47
+
48
+ echo "version=$PRERELEASE_VERSION" >> $GITHUB_OUTPUT
49
+ echo "version_tag=$PRERELEASE_TAG" >> $GITHUB_OUTPUT
50
+ echo "github_tag=$GITHUB_TAG" >> $GITHUB_OUTPUT
51
+ echo "is_prerelease=true" >> $GITHUB_OUTPUT
52
+
53
+ - name: Generate version for release
54
+ if: github.event_name == 'workflow_run'
55
+ id: generate_release_version
56
+ uses: paulhatch/semantic-version@v5.4.0
57
+ with:
58
+ tag_prefix: "v"
59
+ major_pattern: "(MAJOR)"
60
+ minor_pattern: "(MINOR)"
61
+ version_format: "${major}.${minor}.${patch}"
62
+ bump_each_commit: true
63
+
64
+ - name: Set outputs
65
+ id: generate_version
66
+ run: |
67
+ if [[ "${{ github.event_name }}" == "pull_request" ]]; then
68
+ echo "version=${{ steps.generate_pr_version.outputs.version }}" >> $GITHUB_OUTPUT
69
+ echo "version_tag=${{ steps.generate_pr_version.outputs.version_tag }}" >> $GITHUB_OUTPUT
70
+ echo "github_tag=${{ steps.generate_pr_version.outputs.github_tag }}" >> $GITHUB_OUTPUT
71
+ echo "is_prerelease=true" >> $GITHUB_OUTPUT
72
+ else
73
+ echo "version=${{ steps.generate_release_version.outputs.version }}" >> $GITHUB_OUTPUT
74
+ echo "version_tag=${{ steps.generate_release_version.outputs.version_tag }}" >> $GITHUB_OUTPUT
75
+ echo "github_tag=${{ steps.generate_release_version.outputs.version_tag }}" >> $GITHUB_OUTPUT
76
+ echo "is_prerelease=false" >> $GITHUB_OUTPUT
77
+ fi
78
+
79
+ build-python:
80
+ needs: generate-version
81
+ runs-on: ubuntu-latest
82
+ permissions:
83
+ id-token: write
84
+ contents: read
85
+ attestations: write
86
+
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+
90
+ - name: Set up Python
91
+ uses: actions/setup-python@v4
92
+ with:
93
+ python-version: '3.11'
94
+
95
+ - name: Install dependencies
96
+ run: |
97
+ python -m pip install --upgrade pip
98
+ pip install -r requirements-dev.txt
99
+ pip install -e .
100
+
101
+ - name: Set version for setuptools-scm
102
+ run: |
103
+ git config user.name "GitHub Actions"
104
+ git config user.email "actions@github.com"
105
+ git tag -a "${{ needs.generate-version.outputs.version_tag }}" -m "Release ${{ needs.generate-version.outputs.version_tag }}"
106
+ echo "Created tag: ${{ needs.generate-version.outputs.version_tag }}"
107
+
108
+ - name: Build package
109
+ run: make build
110
+
111
+ - name: Upload build artifacts
112
+ uses: actions/upload-artifact@v4
113
+ with:
114
+ name: python-artifacts
115
+ path: dist/*
116
+ retention-days: 30
117
+
118
+ - name: Publish to PyPI
119
+ if: needs.generate-version.outputs.is_prerelease == 'false'
120
+ uses: pypa/gh-action-pypi-publish@release/v1
121
+ with:
122
+ attestations: true
123
+ skip-existing: true
124
+
125
+ build-macos:
126
+ needs: generate-version
127
+ runs-on: macos-latest
128
+
129
+ steps:
130
+ - uses: actions/checkout@v4
131
+
132
+ - name: Set up Python
133
+ uses: actions/setup-python@v4
134
+ with:
135
+ python-version: '3.11'
136
+
137
+ - name: Install dependencies
138
+ run: |
139
+ python -m pip install --upgrade pip
140
+ pip install -r requirements-dev.txt
141
+ pip install -e .
142
+ brew install python-tk create-dmg
143
+
144
+ - name: Set version for setuptools-scm
145
+ run: |
146
+ git config user.name "GitHub Actions"
147
+ git config user.email "actions@github.com"
148
+ git tag -a "${{ needs.generate-version.outputs.version_tag }}" -m "Release ${{ needs.generate-version.outputs.version_tag }}"
149
+
150
+ - name: Build standalone macOS app
151
+ run: make build-standalone
152
+
153
+ - name: Ad-hoc sign the app
154
+ run: |
155
+ echo "Signing app with ad-hoc signature..."
156
+ codesign --force --deep --sign - dist/HBAT-GUI.app
157
+ codesign --verify --verbose dist/HBAT-GUI.app
158
+
159
+ - name: Remove HBAT-GUI folder
160
+ run: |
161
+ echo "Contents of dist directory:"
162
+ ls -la dist/
163
+ cd dist && rm -rf HBAT-GUI
164
+
165
+ - name: Create DMG installer
166
+ run: |
167
+ create-dmg \
168
+ --volname "HBAT Installer" \
169
+ --window-pos 200 120 \
170
+ --window-size 800 400 \
171
+ --icon-size 100 \
172
+ --icon "HBAT-GUI.app" 200 190 \
173
+ --hide-extension "HBAT-GUI.app" \
174
+ --app-drop-link 600 185 \
175
+ "hbat-${{ needs.generate-version.outputs.version }}.dmg" \
176
+ "dist/"
177
+ mv hbat-${{ needs.generate-version.outputs.version }}.dmg dist/
178
+
179
+ - name: Upload macOS artifact
180
+ uses: actions/upload-artifact@v4
181
+ with:
182
+ name: macos-artifacts
183
+ path: dist/hbat-${{ needs.generate-version.outputs.version }}.dmg
184
+ retention-days: 30
185
+
186
+
187
+ build-linux:
188
+ needs: generate-version
189
+ runs-on: ubuntu-latest
190
+
191
+ steps:
192
+ - uses: actions/checkout@v4
193
+
194
+ - name: Set up Python
195
+ uses: actions/setup-python@v4
196
+ with:
197
+ python-version: '3.11'
198
+
199
+ - name: Install system dependencies
200
+ run: |
201
+ sudo apt-get update
202
+ sudo apt-get install -y python3-tk libfuse2 fuse
203
+
204
+ - name: Install Python dependencies
205
+ run: |
206
+ python -m pip install --upgrade pip
207
+ pip install -r requirements-dev.txt
208
+ pip install -e .
209
+
210
+ - name: Set version for setuptools-scm
211
+ run: |
212
+ git config user.name "GitHub Actions"
213
+ git config user.email "actions@github.com"
214
+ git tag -a "${{ needs.generate-version.outputs.version_tag }}" -m "Release ${{ needs.generate-version.outputs.version_tag }}"
215
+
216
+ - name: Build standalone Linux executables
217
+ env:
218
+ HBAT_VERSION: ${{ needs.generate-version.outputs.version }}
219
+ run: python build_standalone_linux.py
220
+
221
+ - name: Upload Linux artifacts
222
+ uses: actions/upload-artifact@v4
223
+ with:
224
+ name: linux-artifacts
225
+ path: |
226
+ dist/linux/HBAT-GUI
227
+ dist/linux/hbat
228
+ dist/HBAT-*-x86_64.AppImage
229
+ dist/hbat_*.deb
230
+ if-no-files-found: warn
231
+ retention-days: 30
232
+
233
+ build-conda:
234
+ needs: generate-version
235
+ runs-on: ubuntu-latest
236
+
237
+ steps:
238
+ - uses: actions/checkout@v4
239
+ with:
240
+ fetch-depth: 0
241
+
242
+ - name: Create version tag
243
+ run: |
244
+ git config user.name "GitHub Actions"
245
+ git config user.email "actions@github.com"
246
+ git tag -a "${{ needs.generate-version.outputs.version_tag }}" -m "Release ${{ needs.generate-version.outputs.version_tag }}"
247
+
248
+ - name: Setup Miniconda
249
+ uses: conda-incubator/setup-miniconda@v3
250
+ with:
251
+ auto-update-conda: true
252
+ auto-activate-base: false
253
+ python-version: 3.11
254
+ channels: conda-forge,defaults
255
+ channel-priority: true
256
+
257
+ - name: Install conda-build and dependencies
258
+ shell: bash -l {0}
259
+ run: |
260
+ conda install -y conda-build anaconda-client conda-verify
261
+ conda config --set anaconda_upload no
262
+
263
+ - name: Build conda package
264
+ shell: bash -l {0}
265
+ run: |
266
+ export GIT_DESCRIBE_TAG=${{ needs.generate-version.outputs.version_tag }}
267
+ echo "Building conda package with version: ${GIT_DESCRIBE_TAG}"
268
+ conda build conda --output-folder conda-build-output
269
+
270
+ echo "Built conda packages:"
271
+ ls -la conda-build-output/noarch/
272
+
273
+ - name: Upload to Anaconda Cloud
274
+ if: needs.generate-version.outputs.is_prerelease == 'false'
275
+ shell: bash -l {0}
276
+ env:
277
+ ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_API_TOKEN }}
278
+ run: |
279
+ PACKAGE_PATH=$(find conda-build-output -name "hbat-*.tar.bz2" -o -name "hbat-*.conda" | head -n 1)
280
+
281
+ if [ -z "$PACKAGE_PATH" ]; then
282
+ echo "Error: No package found!"
283
+ exit 1
284
+ fi
285
+
286
+ echo "Uploading package: $PACKAGE_PATH"
287
+
288
+ anaconda -t $ANACONDA_API_TOKEN upload \
289
+ --user ${{ secrets.ANACONDA_ORG }} \
290
+ --label main \
291
+ $PACKAGE_PATH
292
+
293
+ - name: Upload conda artifacts
294
+ uses: actions/upload-artifact@v4
295
+ with:
296
+ name: conda-artifacts
297
+ path: conda-build-output/noarch/hbat-*.*
298
+ retention-days: 30
299
+
300
+ build-docs:
301
+ needs: generate-version
302
+ runs-on: ubuntu-latest
303
+
304
+ steps:
305
+ - uses: actions/checkout@v4
306
+
307
+ - name: Set up Python
308
+ uses: actions/setup-python@v4
309
+ with:
310
+ python-version: '3.11'
311
+
312
+ - name: Install dependencies
313
+ run: |
314
+ python -m pip install --upgrade pip
315
+ pip install -r requirements-dev.txt
316
+ pip install -e .
317
+
318
+ - name: Set version for setuptools-scm
319
+ run: |
320
+ git config user.name "GitHub Actions"
321
+ git config user.email "actions@github.com"
322
+ git tag -a "${{ needs.generate-version.outputs.version_tag }}" -m "Release ${{ needs.generate-version.outputs.version_tag }}"
323
+
324
+ - name: Build documentation
325
+ run: make docs
326
+
327
+ - name: Create documentation zip
328
+ run: |
329
+ cd docs/build
330
+ zip -r ../../hbat-docs-${{ needs.generate-version.outputs.version }}.zip html/
331
+ cd ../..
332
+ echo "Documentation archive created"
333
+
334
+ - name: Upload documentation artifact
335
+ uses: actions/upload-artifact@v4
336
+ with:
337
+ name: docs-artifacts
338
+ path: hbat-docs-${{ needs.generate-version.outputs.version }}.zip
339
+ retention-days: 30
340
+
341
+ create-release:
342
+ needs: [generate-version, build-python, build-macos, build-linux, build-conda, build-docs]
343
+ runs-on: ubuntu-latest
344
+ permissions:
345
+ contents: write
346
+ pull-requests: write
347
+
348
+ steps:
349
+ - name: Download Python artifacts
350
+ uses: actions/download-artifact@v4
351
+ with:
352
+ name: python-artifacts
353
+ path: dist/
354
+
355
+ - name: Download macOS artifacts
356
+ uses: actions/download-artifact@v4
357
+ with:
358
+ name: macos-artifacts
359
+ path: dist/
360
+
361
+ - name: Download Linux artifacts
362
+ uses: actions/download-artifact@v4
363
+ with:
364
+ name: linux-artifacts
365
+ path: dist/
366
+
367
+ - name: Download conda artifacts
368
+ uses: actions/download-artifact@v4
369
+ with:
370
+ name: conda-artifacts
371
+ path: dist/
372
+
373
+ - name: Download documentation artifacts
374
+ uses: actions/download-artifact@v4
375
+ with:
376
+ name: docs-artifacts
377
+ path: dist/
378
+
379
+ - name: Create Linux binaries archive
380
+ run: |
381
+ cd dist
382
+ # Create versioned zip of Linux binaries
383
+ if [ -f "linux/HBAT-GUI" ] && [ -f "linux/hbat" ]; then
384
+ zip -j hbat-linux-binaries-${{ needs.generate-version.outputs.version }}.zip linux/HBAT-GUI linux/hbat
385
+ echo "Created Linux binaries archive"
386
+ # Remove the individual files since we have them in the zip
387
+ rm -rf linux/
388
+ fi
389
+ cd ..
390
+
391
+ - name: List all artifacts
392
+ run: |
393
+ echo "Contents of dist directory:"
394
+ find dist -type f -ls
395
+
396
+ - name: Create Release
397
+ uses: softprops/action-gh-release@v2
398
+ with:
399
+ token: ${{ secrets.GITHUB_TOKEN }}
400
+ files: dist/**/*
401
+ tag_name: ${{ needs.generate-version.outputs.github_tag }}
402
+ name: ${{ needs.generate-version.outputs.is_prerelease == 'true' && 'Pre-release' || 'Release' }} ${{ needs.generate-version.outputs.github_tag }}
403
+ body: |
404
+ ${{ needs.generate-version.outputs.is_prerelease == 'true' && format('🚧 **Pre-release build for PR #{0}**', needs.generate-version.outputs.pr_number) || '🎉 **New Release**' }}
405
+
406
+ ${{ needs.generate-version.outputs.is_prerelease == 'true' && 'This is an automated pre-release build. Use for testing purposes only.' || github.event.head_commit.message }}
407
+
408
+ ## Available Downloads
409
+
410
+ ### Python Package
411
+ - Wheel: `hbat-${{ needs.generate-version.outputs.version }}-py3-none-any.whl`
412
+ - Source: `hbat-${{ needs.generate-version.outputs.version }}.tar.gz`
413
+
414
+ ### Standalone Applications
415
+ - **macOS**: `hbat-${{ needs.generate-version.outputs.version }}.dmg`
416
+ - **Linux**:
417
+ - `hbat-linux-binaries-${{ needs.generate-version.outputs.version }}.zip` - Standalone executables (HBAT-GUI and hbat)
418
+ - `HBAT-${{ needs.generate-version.outputs.version }}-x86_64.AppImage` - AppImage package
419
+ - `hbat_${{ needs.generate-version.outputs.version }}_amd64.deb` - Debian package
420
+
421
+ ### Conda Package
422
+ - `hbat-${{ needs.generate-version.outputs.version }}-py0.conda`
423
+
424
+ ### Documentation
425
+ - `hbat-docs-${{ needs.generate-version.outputs.version }}.zip` - Full HTML documentation
426
+
427
+ ## Installation
428
+
429
+ **PIP:**
430
+ ```bash
431
+ pip install https://github.com/${{ github.repository }}/releases/download/${{ needs.generate-version.outputs.github_tag }}/hbat-${{ needs.generate-version.outputs.version }}-py3-none-any.whl
432
+ ```
433
+
434
+ ${{ needs.generate-version.outputs.is_prerelease == 'false' && '**PyPI:**
435
+ ```bash
436
+ pip install hbat
437
+ ```' || '' }}
438
+
439
+ ${{ needs.generate-version.outputs.is_prerelease == 'false' && '**Conda:**
440
+ ```bash
441
+ conda install -c ${{ secrets.ANACONDA_ORG }} hbat
442
+ ```' || '**Conda:**
443
+ Download the package and install locally' }}
444
+ prerelease: ${{ needs.generate-version.outputs.is_prerelease == 'true' }}
445
+ draft: false
446
+
447
+ - name: Comment on PR
448
+ if: needs.generate-version.outputs.is_prerelease == 'true'
449
+ uses: actions/github-script@v7
450
+ with:
451
+ script: |
452
+ const prNumber = ${{ needs.generate-version.outputs.pr_number }};
453
+ const tag = '${{ needs.generate-version.outputs.github_tag }}';
454
+ const version = '${{ needs.generate-version.outputs.version }}';
455
+
456
+ const comment = `## 🚧 Pre-release Ready
457
+
458
+ A pre-release has been created for this PR: **${tag}**
459
+
460
+ ### Quick Install
461
+ \`\`\`bash
462
+ pip install https://github.com/${{ github.repository }}/releases/download/${tag}/hbat-${version}-py3-none-any.whl
463
+ \`\`\`
464
+
465
+ ### Available Artifacts
466
+ - **Python**: wheel and source distribution
467
+ - **macOS**: DMG installer
468
+ - **Linux**: AppImage, DEB package, and standalone executables
469
+ - **Conda**: conda package
470
+ - **Documentation**: HTML documentation zip file
471
+
472
+ View all artifacts at: https://github.com/${{ github.repository }}/releases/tag/${tag}
473
+ `;
474
+
475
+ github.rest.issues.createComment({
476
+ issue_number: prNumber,
477
+ owner: context.repo.owner,
478
+ repo: context.repo.repo,
479
+ body: comment
480
+ });
@@ -38,11 +38,19 @@ jobs:
38
38
 
39
39
  - name: Run coverage
40
40
  run: make test-coverage
41
- if: matrix.python-version == '3.9'
41
+ if: matrix.python-version == '3.10'
42
42
 
43
43
  - name: Upload coverage to Codecov
44
- uses: codecov/codecov-action@v3
45
- if: matrix.python-version == '3.9'
44
+ uses: codecov/codecov-action@v5
45
+ if: matrix.python-version == '3.10'
46
46
  with:
47
- file: ./tests/htmlcov/coverage.xml
48
- fail_ci_if_error: false
47
+ fail_ci_if_error: false
48
+ files: ./coverage.xml
49
+ token: ${{ secrets.CODECOV_TOKEN }}
50
+
51
+ - name: Upload test results to Codecov
52
+ if: ${{ !cancelled() }}
53
+ uses: codecov/test-results-action@v1
54
+ with:
55
+ files: ./junit.xml
56
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  # HBAT Development Makefile
2
2
 
3
- .PHONY: help install install-dev test test-fast test-legacy test-pytest test-core test-cli test-gui test-coverage test-ccd clean lint format type-check docs generate-ccd-bonds
3
+ .PHONY: help install install-dev test test-all test-fast test-legacy test-pytest test-unit test-integration test-e2e test-performance test-cli test-gui test-coverage test-ccd clean lint format type-check docs generate-ccd-bonds
4
4
 
5
5
  # Default target
6
6
  help:
@@ -9,11 +9,15 @@ help:
9
9
  @echo " install-dev Install with development dependencies"
10
10
  @echo ""
11
11
  @echo "Testing:"
12
- @echo " test Run comprehensive test suite (recommended)"
12
+ @echo " test Run comprehensive test suite (excludes slow tests)"
13
+ @echo " test-all Run ALL tests including slow performance tests"
13
14
  @echo " test-fast Run fast tests only (skip slow integration tests)"
14
15
  @echo " test-legacy Run legacy test runner"
15
16
  @echo " test-pytest Run tests with pytest (if available)"
16
- @echo " test-core Run core module tests only"
17
+ @echo " test-unit Run unit tests only (fast, isolated)"
18
+ @echo " test-integration Run integration tests only (component interactions)"
19
+ @echo " test-e2e Run end-to-end workflow tests only"
20
+ @echo " test-performance Run performance benchmark tests only"
17
21
  @echo " test-cli Run CLI tests only"
18
22
  @echo " test-gui Run GUI tests only (requires display)"
19
23
  @echo " test-coverage Generate test coverage report"
@@ -32,6 +36,7 @@ help:
32
36
  @echo "Development:"
33
37
  @echo " clean Clean build artifacts"
34
38
  @echo " docs Build documentation"
39
+ @echo " docs-watch Build docs with auto-reload and open browser"
35
40
  @echo " run-gui Launch GUI application"
36
41
  @echo " run-cli Run CLI with test file"
37
42
  @echo " generate-ccd-bonds Generate residue bond constants from CCD files"
@@ -46,36 +51,52 @@ install-dev:
46
51
 
47
52
  # Testing
48
53
  test:
49
- @echo "Running additional pytest tests if available..."
50
- -pytest tests/ -v
54
+ @echo "Running all tests except slow ones..."
55
+ pytest tests/ -v -m "not slow"
51
56
 
52
57
  test-fast:
53
58
  @echo "Running fast tests only..."
54
59
  cd tests && python run_tests.py --fast
55
60
 
61
+ test-all:
62
+ @echo "Running ALL tests including slow ones..."
63
+ pytest tests/ -v
64
+
56
65
  test-pytest:
57
66
  @echo "Running tests with pytest..."
58
67
  pytest tests/ -v
59
68
 
60
69
  test-cli:
61
70
  @echo "Running CLI tests..."
62
- cd tests && python run_tests.py --cli --fast
63
-
64
- test-core:
65
- @echo "Running core tests..."
66
- cd tests && python run_tests.py --core --fast
71
+ pytest tests/cli/ -v -m "cli"
67
72
 
68
73
  test-coverage:
69
- @echo "Running tests with coverage..."
70
- cd tests && python run_tests.py --coverage
74
+ @echo "Running tests with coverage...(excludes slow tests)"
75
+ pytest tests/ -v -m "not slow" --cov --cov-branch --cov-report=xml --junitxml=junit.xml -o junit_family=legacy
71
76
 
72
77
  test-gui:
73
78
  @echo "Running GUI tests..."
74
- cd tests && python run_tests.py --gui --fast
79
+ pytest tests/gui/ -v -m "gui"
80
+
81
+ test-unit:
82
+ @echo "Running unit tests..."
83
+ pytest tests/unit/ -v -m "unit"
84
+
85
+ test-integration:
86
+ @echo "Running integration tests..."
87
+ pytest tests/integration/ -v -m "integration"
88
+
89
+ test-e2e:
90
+ @echo "Running end-to-end tests..."
91
+ pytest tests/e2e/ -v -m "e2e"
92
+
93
+ test-performance:
94
+ @echo "Running performance tests..."
95
+ pytest tests/performance/ -v -m "performance"
75
96
 
76
97
  test-ccd:
77
98
  @echo "Running CCD performance tests..."
78
- pytest tests/core/test_ccd_performance.py -v -m "ccd"
99
+ pytest tests/performance/test_ccd_performance.py -v -m "ccd"
79
100
 
80
101
  # Code quality
81
102
  lint:
@@ -125,6 +146,10 @@ docs-serve:
125
146
  echo "Documentation not built. Run 'make docs' first."; \
126
147
  fi
127
148
 
149
+ docs-watch:
150
+ @echo "Building and watching documentation with auto-reload (requires sphinx-autobuild)..."
151
+ sphinx-autobuild docs/source/ docs/build/html/ --open-browser
152
+
128
153
  # Development runners
129
154
  run-gui:
130
155
  python hbat_gui.py
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hbat
3
- Version: 2.2.4
3
+ Version: 2.2.6
4
4
  Summary: Hydrogen Bond Analysis Tool for PDB structures
5
- Author-email: Abhishek Tiwari <abhishek_twr@yahoo.com>
5
+ Author-email: Abhishek Tiwari <hbat@abhishek-tiwari.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/abhishektiwari/hbat
8
8
  Project-URL: Bug Reports, https://github.com/abhishektiwari/hbat/issues
@@ -87,8 +87,8 @@ A Python package to automate the analysis of potential hydrogen bonds and simila
87
87
  ![License](https://img.shields.io/github/license/abhishektiwari/hbat)
88
88
  ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/abhishektiwari/hbat/total?label=GitHub%20Downloads)
89
89
  ![SourceForge Downloads](https://img.shields.io/sourceforge/dt/hbat?label=SourceForge%20Downloads)
90
-
91
-
90
+ ![PyPI Downloads](https://img.shields.io/pypi/dm/hbat?label=PyPI%20Downloads)
91
+ [![codecov](https://codecov.io/gh/abhishektiwari/hbat/graph/badge.svg?token=QSKYLB3M1V)](https://codecov.io/gh/abhishektiwari/hbat)
92
92
 
93
93
  ## Background
94
94
 
@@ -15,8 +15,8 @@ A Python package to automate the analysis of potential hydrogen bonds and simila
15
15
  ![License](https://img.shields.io/github/license/abhishektiwari/hbat)
16
16
  ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/abhishektiwari/hbat/total?label=GitHub%20Downloads)
17
17
  ![SourceForge Downloads](https://img.shields.io/sourceforge/dt/hbat?label=SourceForge%20Downloads)
18
-
19
-
18
+ ![PyPI Downloads](https://img.shields.io/pypi/dm/hbat?label=PyPI%20Downloads)
19
+ [![codecov](https://codecov.io/gh/abhishektiwari/hbat/graph/badge.svg?token=QSKYLB3M1V)](https://codecov.io/gh/abhishektiwari/hbat)
20
20
 
21
21
  ## Background
22
22