hbat 2.2.0__tar.gz → 2.2.4__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 (134) hide show
  1. hbat-2.2.4/.github/workflows/cleanup-prereleases.yml +77 -0
  2. hbat-2.2.4/.github/workflows/pr-prerelease.yml +324 -0
  3. {hbat-2.2.0 → hbat-2.2.4}/.github/workflows/test.yml +1 -1
  4. {hbat-2.2.0 → hbat-2.2.4}/Makefile +92 -0
  5. {hbat-2.2.0 → hbat-2.2.4}/PKG-INFO +38 -8
  6. {hbat-2.2.0 → hbat-2.2.4}/README.md +12 -0
  7. hbat-2.2.4/build_standalone_linux.py +384 -0
  8. hbat-2.2.4/build_standalone_windows.py +253 -0
  9. {hbat-2.2.0 → hbat-2.2.4}/conda/meta.yaml +11 -8
  10. {hbat-2.2.0 → hbat-2.2.4}/docs/source/index.rst +6 -0
  11. {hbat-2.2.0 → hbat-2.2.4}/docs/source/installation.rst +14 -0
  12. {hbat-2.2.0 → hbat-2.2.4}/hbat/_version.py +2 -2
  13. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/pdb_parser.py +4 -2
  14. {hbat-2.2.0 → hbat-2.2.4}/hbat.egg-info/SOURCES.txt +4 -0
  15. {hbat-2.2.0 → hbat-2.2.4}/pyproject.toml +27 -8
  16. {hbat-2.2.0 → hbat-2.2.4}/.github/workflows/conda-release.yml +0 -0
  17. {hbat-2.2.0 → hbat-2.2.4}/.github/workflows/release.yml +0 -0
  18. {hbat-2.2.0 → hbat-2.2.4}/CITATION.cff +0 -0
  19. {hbat-2.2.0 → hbat-2.2.4}/CLAUDE.md +0 -0
  20. {hbat-2.2.0 → hbat-2.2.4}/CODE_OF_CONDUCT.md +0 -0
  21. {hbat-2.2.0 → hbat-2.2.4}/CONTRIBUTING.md +0 -0
  22. {hbat-2.2.0 → hbat-2.2.4}/LICENSE +0 -0
  23. {hbat-2.2.0 → hbat-2.2.4}/MANIFEST.in +0 -0
  24. {hbat-2.2.0 → hbat-2.2.4}/build_standalone.py +0 -0
  25. {hbat-2.2.0 → hbat-2.2.4}/docs/Makefile +0 -0
  26. {hbat-2.2.0 → hbat-2.2.4}/docs/requirements.txt +0 -0
  27. {hbat-2.2.0 → hbat-2.2.4}/docs/source/_static/custom.css +0 -0
  28. {hbat-2.2.0 → hbat-2.2.4}/docs/source/_static/light-theme.css +0 -0
  29. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/ccd/ccd_analyzer.rst +0 -0
  30. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/ccd/constants_generator.rst +0 -0
  31. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/ccd/generate_ccd_constants.rst +0 -0
  32. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/ccd/index.rst +0 -0
  33. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/cli/index.rst +0 -0
  34. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/app.rst +0 -0
  35. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/atomic_data.rst +0 -0
  36. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/index.rst +0 -0
  37. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/misc.rst +0 -0
  38. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/parameters.rst +0 -0
  39. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/constants/pdb_constants.rst +0 -0
  40. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/index.rst +0 -0
  41. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/interactions.rst +0 -0
  42. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/np_analyzer.rst +0 -0
  43. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/np_vector.rst +0 -0
  44. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/pdb_fixer.rst +0 -0
  45. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/pdb_parser.rst +0 -0
  46. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/core/structure.rst +0 -0
  47. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/examples/index.rst +0 -0
  48. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/gui/index.rst +0 -0
  49. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/index.rst +0 -0
  50. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/utilities/atom_utils.rst +0 -0
  51. {hbat-2.2.0 → hbat-2.2.4}/docs/source/api/utilities/index.rst +0 -0
  52. {hbat-2.2.0 → hbat-2.2.4}/docs/source/cli.rst +0 -0
  53. {hbat-2.2.0 → hbat-2.2.4}/docs/source/conf.py +0 -0
  54. {hbat-2.2.0 → hbat-2.2.4}/docs/source/development.rst +0 -0
  55. {hbat-2.2.0 → hbat-2.2.4}/docs/source/license.rst +0 -0
  56. {hbat-2.2.0 → hbat-2.2.4}/docs/source/logic.rst +0 -0
  57. {hbat-2.2.0 → hbat-2.2.4}/docs/source/parameters.rst +0 -0
  58. {hbat-2.2.0 → hbat-2.2.4}/docs/source/pdbfixing.rst +0 -0
  59. {hbat-2.2.0 → hbat-2.2.4}/docs/source/quickstart.rst +0 -0
  60. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/1bhl.pdb +0 -0
  61. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/1gai.pdb +0 -0
  62. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/1ubi.pdb +0 -0
  63. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/2izf.pdb +0 -0
  64. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/4jsv.pdb +0 -0
  65. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/4laz.pdb +0 -0
  66. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/4ub7.pdb +0 -0
  67. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/4x21.pdb +0 -0
  68. {hbat-2.2.0 → hbat-2.2.4}/example_pdb_files/6rsa.pdb +0 -0
  69. {hbat-2.2.0 → hbat-2.2.4}/example_presets/drug_design_strict.hbat +0 -0
  70. {hbat-2.2.0 → hbat-2.2.4}/example_presets/high_resolution.hbat +0 -0
  71. {hbat-2.2.0 → hbat-2.2.4}/example_presets/low_resolution.hbat +0 -0
  72. {hbat-2.2.0 → hbat-2.2.4}/example_presets/membrane_proteins.hbat +0 -0
  73. {hbat-2.2.0 → hbat-2.2.4}/example_presets/nmr_structures.hbat +0 -0
  74. {hbat-2.2.0 → hbat-2.2.4}/example_presets/standard_resolution.hbat +0 -0
  75. {hbat-2.2.0 → hbat-2.2.4}/example_presets/strong_interactions_only.hbat +0 -0
  76. {hbat-2.2.0 → hbat-2.2.4}/example_presets/weak_interactions_permissive.hbat +0 -0
  77. {hbat-2.2.0 → hbat-2.2.4}/hbat/__init__.py +0 -0
  78. {hbat-2.2.0 → hbat-2.2.4}/hbat/ccd/__init__.py +0 -0
  79. {hbat-2.2.0 → hbat-2.2.4}/hbat/ccd/ccd_analyzer.py +0 -0
  80. {hbat-2.2.0 → hbat-2.2.4}/hbat/ccd/constants_generator.py +0 -0
  81. {hbat-2.2.0 → hbat-2.2.4}/hbat/ccd/generate_ccd_constants.py +0 -0
  82. {hbat-2.2.0 → hbat-2.2.4}/hbat/cli/__init__.py +0 -0
  83. {hbat-2.2.0 → hbat-2.2.4}/hbat/cli/main.py +0 -0
  84. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/__init__.py +0 -0
  85. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/app.py +0 -0
  86. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/atomic_data.py +0 -0
  87. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/misc.py +0 -0
  88. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/parameters.py +0 -0
  89. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/pdb_constants.py +0 -0
  90. {hbat-2.2.0 → hbat-2.2.4}/hbat/constants/residue_bonds.py +0 -0
  91. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/__init__.py +0 -0
  92. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/analysis.py +0 -0
  93. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/analyzer.py +0 -0
  94. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/app_config.py +0 -0
  95. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/interactions.py +0 -0
  96. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/np_analyzer.py +0 -0
  97. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/np_vector.py +0 -0
  98. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/pdb_fixer.py +0 -0
  99. {hbat-2.2.0 → hbat-2.2.4}/hbat/core/structure.py +0 -0
  100. {hbat-2.2.0 → hbat-2.2.4}/hbat/gui/__init__.py +0 -0
  101. {hbat-2.2.0 → hbat-2.2.4}/hbat/gui/chain_visualization.py +0 -0
  102. {hbat-2.2.0 → hbat-2.2.4}/hbat/gui/main_window.py +0 -0
  103. {hbat-2.2.0 → hbat-2.2.4}/hbat/gui/parameter_panel.py +0 -0
  104. {hbat-2.2.0 → hbat-2.2.4}/hbat/gui/results_panel.py +0 -0
  105. {hbat-2.2.0 → hbat-2.2.4}/hbat/utilities/__init__.py +0 -0
  106. {hbat-2.2.0 → hbat-2.2.4}/hbat/utilities/atom_utils.py +0 -0
  107. {hbat-2.2.0 → hbat-2.2.4}/hbat.icns +0 -0
  108. {hbat-2.2.0 → hbat-2.2.4}/hbat.ico +0 -0
  109. {hbat-2.2.0 → hbat-2.2.4}/hbat.png +0 -0
  110. {hbat-2.2.0 → hbat-2.2.4}/hbat.svg +0 -0
  111. {hbat-2.2.0 → hbat-2.2.4}/hbat_cli.py +0 -0
  112. {hbat-2.2.0 → hbat-2.2.4}/hbat_gui.py +0 -0
  113. {hbat-2.2.0 → hbat-2.2.4}/pytest.ini +0 -0
  114. {hbat-2.2.0 → hbat-2.2.4}/requirements-dev.txt +0 -0
  115. {hbat-2.2.0 → hbat-2.2.4}/requirements.txt +0 -0
  116. {hbat-2.2.0 → hbat-2.2.4}/setup.cfg +0 -0
  117. {hbat-2.2.0 → hbat-2.2.4}/tests/README.md +0 -0
  118. {hbat-2.2.0 → hbat-2.2.4}/tests/__init__.py +0 -0
  119. {hbat-2.2.0 → hbat-2.2.4}/tests/cli/__init__.py +0 -0
  120. {hbat-2.2.0 → hbat-2.2.4}/tests/cli/test_cli_main.py +0 -0
  121. {hbat-2.2.0 → hbat-2.2.4}/tests/conftest.py +0 -0
  122. {hbat-2.2.0 → hbat-2.2.4}/tests/core/__init__.py +0 -0
  123. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_analyzer.py +0 -0
  124. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_ccd_performance.py +0 -0
  125. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_interactions.py +0 -0
  126. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_np_vector.py +0 -0
  127. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_pdb_fixer.py +0 -0
  128. {hbat-2.2.0 → hbat-2.2.4}/tests/core/test_pdb_parser.py +0 -0
  129. {hbat-2.2.0 → hbat-2.2.4}/tests/gui/__init__.py +0 -0
  130. {hbat-2.2.0 → hbat-2.2.4}/tests/gui/test_gui_components.py +0 -0
  131. {hbat-2.2.0 → hbat-2.2.4}/tests/gui/test_numpy_integration.py +0 -0
  132. {hbat-2.2.0 → hbat-2.2.4}/tests/run_tests.py +0 -0
  133. {hbat-2.2.0 → hbat-2.2.4}/tests/test_np_analyzer.py +0 -0
  134. {hbat-2.2.0 → hbat-2.2.4}/tests/test_np_vector.py +0 -0
@@ -0,0 +1,77 @@
1
+ name: Cleanup Pre-releases
2
+
3
+ on:
4
+ schedule:
5
+ # Run daily at 2 AM UTC
6
+ - cron: '0 2 * * *'
7
+ workflow_dispatch:
8
+ inputs:
9
+ days_to_keep:
10
+ description: 'Number of days to keep pre-releases'
11
+ required: false
12
+ default: '7'
13
+ type: string
14
+
15
+ jobs:
16
+ cleanup:
17
+ runs-on: ubuntu-latest
18
+ permissions:
19
+ contents: write
20
+
21
+ steps:
22
+ - uses: actions/checkout@v4
23
+
24
+ - name: Clean up old pre-releases
25
+ uses: actions/github-script@v7
26
+ with:
27
+ script: |
28
+ const daysToKeep = parseInt('${{ github.event.inputs.days_to_keep || '7' }}');
29
+ const cutoffDate = new Date();
30
+ cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
31
+
32
+ console.log(`Cleaning up pre-releases older than ${daysToKeep} days (before ${cutoffDate.toISOString()})`);
33
+
34
+ // Get all releases
35
+ const releases = await github.rest.repos.listReleases({
36
+ owner: context.repo.owner,
37
+ repo: context.repo.repo,
38
+ per_page: 100
39
+ });
40
+
41
+ let deletedCount = 0;
42
+
43
+ for (const release of releases.data) {
44
+ // Only process pre-releases with PR tags
45
+ if (release.prerelease && release.tag_name.includes('-pr')) {
46
+ const releaseDate = new Date(release.created_at);
47
+
48
+ if (releaseDate < cutoffDate) {
49
+ console.log(`Deleting pre-release: ${release.tag_name} (created: ${releaseDate.toISOString()})`);
50
+
51
+ try {
52
+ // Delete the release
53
+ await github.rest.repos.deleteRelease({
54
+ owner: context.repo.owner,
55
+ repo: context.repo.repo,
56
+ release_id: release.id
57
+ });
58
+
59
+ // Delete the tag
60
+ await github.rest.git.deleteRef({
61
+ owner: context.repo.owner,
62
+ repo: context.repo.repo,
63
+ ref: `tags/${release.tag_name}`
64
+ });
65
+
66
+ deletedCount++;
67
+ console.log(`✓ Deleted: ${release.tag_name}`);
68
+ } catch (error) {
69
+ console.error(`✗ Failed to delete ${release.tag_name}:`, error.message);
70
+ }
71
+ } else {
72
+ console.log(`Keeping: ${release.tag_name} (created: ${releaseDate.toISOString()})`);
73
+ }
74
+ }
75
+ }
76
+
77
+ console.log(`Cleanup complete. Deleted ${deletedCount} pre-releases.`);
@@ -0,0 +1,324 @@
1
+ name: PR Pre-release
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, reopened]
6
+ branches: [ main ]
7
+
8
+ jobs:
9
+ generate-prerelease-tag:
10
+ runs-on: ubuntu-latest
11
+ outputs:
12
+ prerelease_tag: ${{ steps.generate_tag.outputs.prerelease_tag }}
13
+ github_tag: ${{ steps.generate_tag.outputs.github_tag }}
14
+ version: ${{ steps.generate_tag.outputs.version }}
15
+ pr_number: ${{ github.event.number }}
16
+ pr_head_sha: ${{ github.event.pull_request.head.sha }}
17
+ pr_title: ${{ github.event.pull_request.title }}
18
+ pr_head_ref: ${{ github.event.pull_request.head.ref }}
19
+
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Generate pre-release tag
26
+ id: generate_tag
27
+ run: |
28
+ # Get base version from latest tag or default to 0.0.0
29
+ BASE_VERSION=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//' || echo "0.0.0")
30
+
31
+ # Generate PEP 440 compatible pre-release version
32
+ SHORT_SHA=$(git rev-parse --short HEAD)
33
+ PR_NUMBER=${{ github.event.number }}
34
+
35
+ # Use PEP 440 compatible format: {base_version}.dev{pr_number}+{sha}
36
+ PRERELEASE_VERSION="${BASE_VERSION}.dev${PR_NUMBER}+${SHORT_SHA}"
37
+ PRERELEASE_TAG="v${PRERELEASE_VERSION}"
38
+
39
+ # Also create a simple tag for GitHub release (without +sha which can cause issues)
40
+ GITHUB_TAG="v${BASE_VERSION}-pr${PR_NUMBER}.${SHORT_SHA}"
41
+
42
+ echo "Base version: $BASE_VERSION"
43
+ echo "Pre-release version: $PRERELEASE_VERSION"
44
+ echo "Pre-release tag: $PRERELEASE_TAG"
45
+ echo "GitHub tag: $GITHUB_TAG"
46
+
47
+ echo "prerelease_tag=$PRERELEASE_TAG" >> $GITHUB_OUTPUT
48
+ echo "version=$PRERELEASE_VERSION" >> $GITHUB_OUTPUT
49
+ echo "github_tag=$GITHUB_TAG" >> $GITHUB_OUTPUT
50
+
51
+ build-prerelease:
52
+ needs: generate-prerelease-tag
53
+ runs-on: ubuntu-latest
54
+ permissions:
55
+ contents: write
56
+ pull-requests: write
57
+
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+
61
+ - name: Set up Python
62
+ uses: actions/setup-python@v4
63
+ with:
64
+ python-version: '3.11'
65
+
66
+ - name: Install dependencies
67
+ run: |
68
+ python -m pip install --upgrade pip
69
+ pip install -r requirements-dev.txt
70
+ pip install -e .
71
+
72
+ - name: Set version for setuptools-scm
73
+ run: |
74
+ git config user.name "GitHub Actions"
75
+ git config user.email "actions@github.com"
76
+ # Create a temporary tag for building
77
+ git tag -a "${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}" -m "Pre-release ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
78
+ echo "Created temporary tag: ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
79
+
80
+ - name: Build package
81
+ run: make build
82
+
83
+ - name: Upload build artifacts
84
+ uses: actions/upload-artifact@v4
85
+ with:
86
+ name: prerelease-build-artifacts-${{ needs.generate-prerelease-tag.outputs.pr_number }}
87
+ path: dist/*
88
+ retention-days: 30
89
+
90
+ - name: Create pre-release
91
+ uses: softprops/action-gh-release@v2
92
+ with:
93
+ token: ${{ secrets.GITHUB_TOKEN }}
94
+ files: |
95
+ dist/hbat-${{ needs.generate-prerelease-tag.outputs.version }}-py3-none-any.whl
96
+ dist/hbat-${{ needs.generate-prerelease-tag.outputs.version }}.tar.gz
97
+ tag_name: ${{ needs.generate-prerelease-tag.outputs.github_tag }}
98
+ name: Pre-release ${{ needs.generate-prerelease-tag.outputs.github_tag }}
99
+ body: |
100
+ 🚧 **Pre-release build for PR #${{ needs.generate-prerelease-tag.outputs.pr_number }}**
101
+
102
+ **Branch:** `${{ needs.generate-prerelease-tag.outputs.pr_head_ref }}`
103
+ **Commit:** ${{ needs.generate-prerelease-tag.outputs.pr_head_sha }}
104
+ **Title:** ${{ needs.generate-prerelease-tag.outputs.pr_title }}
105
+
106
+ This is an automated pre-release build. Use for testing purposes only.
107
+
108
+ **Install with pip:**
109
+ ```bash
110
+ pip install https://github.com/${{ github.repository }}/releases/download/${{ needs.generate-prerelease-tag.outputs.github_tag }}/hbat-${{ needs.generate-prerelease-tag.outputs.version }}-py3-none-any.whl
111
+ ```
112
+ prerelease: true
113
+ draft: false
114
+
115
+ - name: Comment on PR
116
+ uses: actions/github-script@v7
117
+ with:
118
+ script: |
119
+ const prNumber = ${{ needs.generate-prerelease-tag.outputs.pr_number }};
120
+ const tag = '${{ needs.generate-prerelease-tag.outputs.github_tag }}';
121
+ const version = '${{ needs.generate-prerelease-tag.outputs.version }}';
122
+
123
+ const comment = `## 🚧 Pre-release Ready
124
+
125
+ A pre-release has been created for this PR: **${tag}**
126
+
127
+ ### Quick Install
128
+ \`\`\`bash
129
+ pip install https://github.com/${{ github.repository }}/releases/download/${tag}/hbat-${version}-py3-none-any.whl
130
+ \`\`\`
131
+
132
+ ### Available Artifacts
133
+ - Python wheel: \`hbat-${version}-py3-none-any.whl\`
134
+ - Source distribution: \`hbat-${version}.tar.gz\`
135
+ - macOS DMG: \`hbat-${version}.dmg\`
136
+ - Conda package: \`hbat-${version}.tar.bz2\` or \`hbat-${version}.conda\`
137
+
138
+ ### Install Options
139
+ **Pip:**
140
+ \`\`\`bash
141
+ pip install https://github.com/${{ github.repository }}/releases/download/${tag}/hbat-${version}-py3-none-any.whl
142
+ \`\`\`
143
+
144
+ **Conda:** Download the conda package from the release and install locally
145
+
146
+ View all artifacts at: https://github.com/${{ github.repository }}/releases/tag/${tag}
147
+ `;
148
+
149
+ github.rest.issues.createComment({
150
+ issue_number: prNumber,
151
+ owner: context.repo.owner,
152
+ repo: context.repo.repo,
153
+ body: comment
154
+ });
155
+
156
+ build-macos-prerelease:
157
+ needs: generate-prerelease-tag
158
+ runs-on: macos-latest
159
+
160
+ steps:
161
+ - uses: actions/checkout@v4
162
+
163
+ - name: Set up Python
164
+ uses: actions/setup-python@v4
165
+ with:
166
+ python-version: '3.11'
167
+
168
+ - name: Install dependencies
169
+ run: |
170
+ python -m pip install --upgrade pip
171
+ pip install -r requirements-dev.txt
172
+ pip install -e .
173
+ # Install tkinter on macOS
174
+ brew install python-tk create-dmg
175
+
176
+ - name: Set version for setuptools-scm
177
+ run: |
178
+ git config user.name "GitHub Actions"
179
+ git config user.email "actions@github.com"
180
+ git tag -a "${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}" -m "Pre-release ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
181
+ echo "Created temporary tag: ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
182
+
183
+ - name: Build standalone macOS app
184
+ run: make build-standalone
185
+
186
+ - name: Ad-hoc sign the app
187
+ run: |
188
+ echo "Signing app with ad-hoc signature..."
189
+ codesign --force --deep --sign - dist/HBAT-GUI.app
190
+ codesign --verify --verbose dist/HBAT-GUI.app
191
+
192
+ - name: Remove HBAT-GUI folder
193
+ run: |
194
+ echo "Contents of dist directory:"
195
+ ls -la dist/
196
+ cd dist && rm -rf HBAT-GUI
197
+
198
+ - name: Create DMG installer
199
+ run: |
200
+ create-dmg \
201
+ --volname "HBAT Pre-release Installer" \
202
+ --window-pos 200 120 \
203
+ --window-size 800 400 \
204
+ --icon-size 100 \
205
+ --icon "HBAT-GUI.app" 200 190 \
206
+ --hide-extension "HBAT-GUI.app" \
207
+ --app-drop-link 600 185 \
208
+ "hbat-${{ needs.generate-prerelease-tag.outputs.version }}.dmg" \
209
+ "dist/"
210
+ mv hbat-${{ needs.generate-prerelease-tag.outputs.version }}.dmg dist/
211
+
212
+ - name: Upload macOS app artifact
213
+ uses: actions/upload-artifact@v4
214
+ with:
215
+ name: prerelease-macos-app-${{ needs.generate-prerelease-tag.outputs.pr_number }}
216
+ path: dist/hbat-${{ needs.generate-prerelease-tag.outputs.version }}.dmg
217
+ retention-days: 30
218
+
219
+ build-conda-prerelease:
220
+ needs: generate-prerelease-tag
221
+ runs-on: ubuntu-latest
222
+
223
+ steps:
224
+ - uses: actions/checkout@v4
225
+ with:
226
+ fetch-depth: 0
227
+
228
+ - name: Create pre-release tag (simulate conda-release.yml workflow)
229
+ run: |
230
+ git config user.name "GitHub Actions"
231
+ git config user.email "actions@github.com"
232
+ # Create tag to simulate the release process that conda build expects
233
+ git tag -a "${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}" -m "Pre-release ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
234
+ echo "Created tag for conda build: ${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}"
235
+
236
+ - name: Setup Miniconda
237
+ uses: conda-incubator/setup-miniconda@v3
238
+ with:
239
+ auto-update-conda: true
240
+ python-version: 3.11
241
+ channels: conda-forge,defaults
242
+ channel-priority: true
243
+
244
+ - name: Install conda-build and dependencies
245
+ shell: bash -l {0}
246
+ run: |
247
+ conda install -y conda-build conda-verify
248
+ # Disable automatic upload (simulate conda-release.yml process without uploading)
249
+ conda config --set anaconda_upload no
250
+
251
+ - name: Build conda package (simulate conda-release.yml workflow)
252
+ shell: bash -l {0}
253
+ run: |
254
+ # Export the pre-release tag (same as main conda-release workflow process)
255
+ export GIT_DESCRIBE_TAG=${{ needs.generate-prerelease-tag.outputs.prerelease_tag }}
256
+ echo "Building conda package with version: ${GIT_DESCRIBE_TAG}"
257
+ echo "Simulating conda-release.yml workflow without uploading to conda channels"
258
+
259
+ # Use same build command as conda-release workflow
260
+ conda build conda --output-folder conda-build-output
261
+
262
+ # List built packages
263
+ echo "Built conda packages:"
264
+ ls -la conda-build-output/noarch/
265
+
266
+ # Show package info for verification
267
+ PACKAGE_PATH=$(find conda-build-output -name "hbat-*.tar.bz2" -o -name "hbat-*.conda" | head -n 1)
268
+ if [ -n "$PACKAGE_PATH" ]; then
269
+ echo "Package details:"
270
+ echo "Package file: $PACKAGE_PATH"
271
+ echo "Package size: $(du -h "$PACKAGE_PATH" | cut -f1)"
272
+ echo "File type: $(file "$PACKAGE_PATH")"
273
+ else
274
+ echo "Warning: No package found!"
275
+ ls -la conda-build-output/
276
+ fi
277
+
278
+ - name: Upload conda package as artifact
279
+ uses: actions/upload-artifact@v4
280
+ with:
281
+ name: prerelease-conda-package-${{ needs.generate-prerelease-tag.outputs.pr_number }}
282
+ path: conda-build-output/noarch/hbat-*.*
283
+ retention-days: 30
284
+
285
+ update-prerelease:
286
+ needs: [generate-prerelease-tag, build-prerelease, build-macos-prerelease, build-conda-prerelease]
287
+ runs-on: ubuntu-latest
288
+ permissions:
289
+ contents: write
290
+
291
+ steps:
292
+ - name: Download build artifacts
293
+ uses: actions/download-artifact@v4
294
+ with:
295
+ name: prerelease-build-artifacts-${{ needs.generate-prerelease-tag.outputs.pr_number }}
296
+ path: dist/
297
+
298
+ - name: Download macOS app
299
+ uses: actions/download-artifact@v4
300
+ with:
301
+ name: prerelease-macos-app-${{ needs.generate-prerelease-tag.outputs.pr_number }}
302
+ path: dist/
303
+
304
+ - name: Download conda package
305
+ uses: actions/download-artifact@v4
306
+ with:
307
+ name: prerelease-conda-package-${{ needs.generate-prerelease-tag.outputs.pr_number }}
308
+ path: dist/
309
+
310
+ - name: List dist directory contents
311
+ run: |
312
+ echo "Contents of dist directory:"
313
+ ls -la dist/
314
+
315
+ - name: Update pre-release with all artifacts
316
+ uses: softprops/action-gh-release@v2
317
+ with:
318
+ token: ${{ secrets.GITHUB_TOKEN }}
319
+ files: |
320
+ dist/hbat-${{ needs.generate-prerelease-tag.outputs.version }}.dmg
321
+ dist/hbat-*.tar.bz2
322
+ dist/hbat-*.conda
323
+ tag_name: ${{ needs.generate-prerelease-tag.outputs.github_tag }}
324
+ prerelease: true
@@ -11,7 +11,7 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
13
  matrix:
14
- python-version: ["3.10", "3.11"]
14
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
15
15
 
16
16
  steps:
17
17
  - uses: actions/checkout@v4
@@ -186,6 +186,17 @@ build-standalone:
186
186
  @echo "Building standalone executables with PyInstaller..."
187
187
  python build_standalone.py
188
188
 
189
+ build-standalone-windows:
190
+ @echo "Building Windows standalone executables..."
191
+ python build_standalone_windows.py
192
+
193
+ build-standalone-linux:
194
+ @echo "Building Linux standalone executables..."
195
+ python build_standalone_linux.py
196
+
197
+ build-standalone-all: build-standalone build-standalone-windows build-standalone-linux
198
+ @echo "All standalone builds completed"
199
+
189
200
  # Package validation
190
201
  check:
191
202
  @echo "Checking package..."
@@ -193,6 +204,87 @@ check:
193
204
  @echo "Package structure:"
194
205
  @find dist/ -name "*.whl" -exec unzip -l {} \; 2>/dev/null | head -20
195
206
 
207
+ # Test built package
208
+ test-build:
209
+ @echo "Building and testing package in isolated environment..."
210
+ @# Clean up any existing environments
211
+ @if [ -d "hbat-build" ]; then rm -rf hbat-build; fi
212
+ @if [ -d "hbat-test-build" ]; then rm -rf hbat-test-build; fi
213
+
214
+ @# Create fresh build environment
215
+ @echo "Creating build environment..."
216
+ @python -m venv hbat-build
217
+ @echo "Host Python: $$(which python)"
218
+ @echo "Build environment: ./hbat-build"
219
+
220
+ @# Install build dependencies
221
+ @echo "Installing build dependencies..."
222
+ @if [ -f "./hbat-build/bin/pip" ]; then \
223
+ ./hbat-build/bin/pip install --upgrade pip && \
224
+ ./hbat-build/bin/pip install build setuptools wheel setuptools-scm; \
225
+ else \
226
+ ./hbat-build/Scripts/pip.exe install --upgrade pip && \
227
+ ./hbat-build/Scripts/pip.exe install build setuptools wheel setuptools-scm; \
228
+ fi
229
+
230
+ @# Build the package
231
+ @echo "Building package..."
232
+ @if [ -f "./hbat-build/bin/python" ]; then \
233
+ ./hbat-build/bin/python -m build; \
234
+ else \
235
+ ./hbat-build/Scripts/python.exe -m build; \
236
+ fi
237
+ @echo "✓ Package built successfully!"
238
+
239
+ @# Clean up build environment
240
+ @rm -rf hbat-build
241
+
242
+ @# Create fresh test environment
243
+ @echo "\nCreating test environment..."
244
+ @python -m venv hbat-test-build
245
+ @echo "Test environment: ./hbat-test-build"
246
+
247
+ @# Install the built package
248
+ @echo "Installing built package..."
249
+ @WHEEL_FILE=$$(ls -t dist/*.whl 2>/dev/null | head -1); \
250
+ if [ -z "$$WHEEL_FILE" ]; then \
251
+ echo "Error: No wheel file found in dist/."; \
252
+ exit 1; \
253
+ fi; \
254
+ echo "Installing $$WHEEL_FILE..."; \
255
+ if [ -f "./hbat-test-build/bin/pip" ]; then \
256
+ ./hbat-test-build/bin/pip install --upgrade pip && \
257
+ ./hbat-test-build/bin/pip install "$$WHEEL_FILE" && \
258
+ echo "Installing pdbfixer from Git..." && \
259
+ ./hbat-test-build/bin/pip install git+https://github.com/openmm/pdbfixer.git && \
260
+ HBAT_CMD="./hbat-test-build/bin/hbat"; \
261
+ else \
262
+ ./hbat-test-build/Scripts/pip.exe install --upgrade pip && \
263
+ ./hbat-test-build/Scripts/pip.exe install "$$WHEEL_FILE" && \
264
+ echo "Installing pdbfixer from Git..." && \
265
+ ./hbat-test-build/Scripts/pip.exe install git+https://github.com/openmm/pdbfixer.git && \
266
+ HBAT_CMD="./hbat-test-build/Scripts/hbat.exe"; \
267
+ fi; \
268
+ echo "\nTesting package imports..."; \
269
+ if [ -f "./hbat-test-build/bin/python" ]; then \
270
+ PYTHON_CMD="./hbat-test-build/bin/python"; \
271
+ else \
272
+ PYTHON_CMD="./hbat-test-build/Scripts/python.exe"; \
273
+ fi; \
274
+ $$PYTHON_CMD -c "import pdbreader; print('✓ pdbreader:', pdbreader)" && \
275
+ $$PYTHON_CMD -c "import openbabel; print('✓ openbabel:', openbabel)" && \
276
+ $$PYTHON_CMD -c "import pdbfixer; print('✓ pdbfixer:', pdbfixer)" && \
277
+ $$PYTHON_CMD -c "import mmcif; print('✓ mmcif:', mmcif)" && \
278
+ $$PYTHON_CMD -c "import mmcif; print(' mmcif version:', mmcif.__version__)" && \
279
+ $$PYTHON_CMD -c "import hbat; print('✓ hbat version:', hbat.__version__)" && \
280
+ echo "\nTesting hbat CLI with 6RSA.pdb..."; \
281
+ $$HBAT_CMD example_pdb_files/6RSA.pdb --summary-only
282
+
283
+ @echo "\n✓ Package build and installation test passed!"
284
+ @echo "Cleaning up test environment..."
285
+ @rm -rf hbat-test-build
286
+ @echo "Test completed successfully!"
287
+
196
288
  # Upload to test PyPI
197
289
  upload-test:
198
290
  @echo "Uploading to Test PyPI..."
@@ -1,55 +1,73 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hbat
3
- Version: 2.2.0
3
+ Version: 2.2.4
4
4
  Summary: Hydrogen Bond Analysis Tool for PDB structures
5
5
  Author-email: Abhishek Tiwari <abhishek_twr@yahoo.com>
6
- License: MIT
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
9
9
  Project-URL: Source, https://github.com/abhishektiwari/hbat
10
- Keywords: bioinformatics,chemistry,hydrogen bonds,protein structure
10
+ Keywords: bioinformatics,chemistry,hydrogen bonds,halogen bonds,protein structure,PDB,mmCIF
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Science/Research
13
13
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
14
14
  Classifier: Topic :: Scientific/Engineering :: Chemistry
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.8
17
17
  Classifier: Programming Language :: Python :: 3.9
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
20
22
  Classifier: Operating System :: OS Independent
21
- Requires-Python: >=3.7
23
+ Requires-Python: >=3.8
22
24
  Description-Content-Type: text/markdown
23
25
  License-File: LICENSE
24
26
  Requires-Dist: pdbreader>=0.1.0
27
+ Requires-Dist: numpy>=1.20.0
25
28
  Requires-Dist: networkx>=2.5.0
26
29
  Requires-Dist: matplotlib>=3.3.0
30
+ Requires-Dist: openbabel-wheel>=3.1.1.22
31
+ Requires-Dist: pybel>=0.15.5
32
+ Requires-Dist: mmcif-pdbx>=2.0.1
33
+ Requires-Dist: mmcif>=0.92.0
27
34
  Provides-Extra: dev
28
35
  Requires-Dist: pytest>=6.0.0; extra == "dev"
29
36
  Requires-Dist: pytest-cov>=2.8.0; extra == "dev"
30
37
  Requires-Dist: pytest-mock>=3.0.0; extra == "dev"
31
38
  Requires-Dist: black>=21.0.0; extra == "dev"
32
39
  Requires-Dist: flake8>=3.8.0; extra == "dev"
40
+ Requires-Dist: isort>=5.0.0; extra == "dev"
33
41
  Requires-Dist: mypy>=0.800; extra == "dev"
34
42
  Requires-Dist: pre-commit>=2.10.0; extra == "dev"
35
43
  Requires-Dist: coverage>=5.0.0; extra == "dev"
44
+ Requires-Dist: types-setuptools>=57.0.0; extra == "dev"
45
+ Requires-Dist: types-requests>=2.0.0; extra == "dev"
46
+ Requires-Dist: types-Pillow>=8.0.0; extra == "dev"
47
+ Requires-Dist: pandas-stubs>=1.0.0; extra == "dev"
36
48
  Provides-Extra: build
37
49
  Requires-Dist: build>=0.8.0; extra == "build"
38
50
  Requires-Dist: twine>=4.0.0; extra == "build"
39
51
  Requires-Dist: pyinstaller>=5.0.0; extra == "build"
40
52
  Requires-Dist: setuptools-scm>=6.2.0; extra == "build"
53
+ Provides-Extra: docs
54
+ Requires-Dist: sphinx>=3.0.0; extra == "docs"
55
+ Requires-Dist: sphinx-rtd-theme>=0.5.0; extra == "docs"
56
+ Requires-Dist: sphinx-toolbox>=4.0.0; extra == "docs"
57
+ Requires-Dist: sphinxcontrib-bibtex>=2.0.0; extra == "docs"
58
+ Requires-Dist: sphinx-sitemap>=2.7.2; extra == "docs"
59
+ Requires-Dist: sphinx-autodoc-typehints>=1.10.0; extra == "docs"
41
60
  Provides-Extra: gui
42
- Requires-Dist: tkinter; python_version >= "3.7" and extra == "gui"
61
+ Requires-Dist: tkinter; python_version >= "3.8" and extra == "gui"
43
62
  Provides-Extra: advanced-viz
44
63
  Requires-Dist: seaborn>=0.11.0; extra == "advanced-viz"
45
- Requires-Dist: numpy>=1.19.0; extra == "advanced-viz"
46
64
  Requires-Dist: plotly>=5.0.0; extra == "advanced-viz"
47
65
  Provides-Extra: export
48
66
  Requires-Dist: pandas>=1.1.0; extra == "export"
49
67
  Requires-Dist: openpyxl>=3.0.0; extra == "export"
50
68
  Requires-Dist: xlwt>=1.3.0; extra == "export"
51
69
  Provides-Extra: all
52
- Requires-Dist: hbat[advanced-viz,export,gui]; extra == "all"
70
+ Requires-Dist: hbat[advanced-viz,docs,export,gui]; extra == "all"
53
71
  Dynamic: license-file
54
72
 
55
73
  ![HBAT](https://github.com/abhishektiwari/hbat/raw/main/hbat.svg)
@@ -106,6 +124,12 @@ pip install hbat
106
124
 
107
125
  Run HBAT Command-Line Interface (CLI) using `hbat` or launch HBAT GUI using `hbat-gui`.
108
126
 
127
+ **Recommended**: For [fixing missing Hydrogen Atoms](https://hbat.abhishek-tiwari.com/pdbfixing), install PDBFixer (preferred over OpenBabel).
128
+
129
+ ```bash
130
+ pip install git+https://github.com/openmm/pdbfixer.git
131
+ ```
132
+
109
133
  ### Option 2: Install from Source
110
134
 
111
135
  ```bash
@@ -114,6 +138,12 @@ cd hbat
114
138
  pip install -e .
115
139
  ```
116
140
 
141
+ Alternatively,
142
+
143
+ ```bash
144
+ pip install git+https://github.com/abhishektiwari/hbat.git
145
+ ```
146
+
117
147
  Run HBAT Command-Line Interface (CLI) using `hbat` or launch HBAT GUI using `hbat-gui`.
118
148
 
119
149
  ### Option 3: Install from Conda
@@ -52,6 +52,12 @@ pip install hbat
52
52
 
53
53
  Run HBAT Command-Line Interface (CLI) using `hbat` or launch HBAT GUI using `hbat-gui`.
54
54
 
55
+ **Recommended**: For [fixing missing Hydrogen Atoms](https://hbat.abhishek-tiwari.com/pdbfixing), install PDBFixer (preferred over OpenBabel).
56
+
57
+ ```bash
58
+ pip install git+https://github.com/openmm/pdbfixer.git
59
+ ```
60
+
55
61
  ### Option 2: Install from Source
56
62
 
57
63
  ```bash
@@ -60,6 +66,12 @@ cd hbat
60
66
  pip install -e .
61
67
  ```
62
68
 
69
+ Alternatively,
70
+
71
+ ```bash
72
+ pip install git+https://github.com/abhishektiwari/hbat.git
73
+ ```
74
+
63
75
  Run HBAT Command-Line Interface (CLI) using `hbat` or launch HBAT GUI using `hbat-gui`.
64
76
 
65
77
  ### Option 3: Install from Conda