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.
- hbat-2.2.6/.github/workflows/release.yml +480 -0
- {hbat-2.2.4 → hbat-2.2.6}/.github/workflows/test.yml +13 -5
- {hbat-2.2.4 → hbat-2.2.6}/Makefile +39 -14
- {hbat-2.2.4 → hbat-2.2.6}/PKG-INFO +4 -4
- {hbat-2.2.4 → hbat-2.2.6}/README.md +2 -2
- {hbat-2.2.4 → hbat-2.2.6}/build_standalone_linux.py +88 -24
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/conf.py +36 -2
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/index.rst +40 -16
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/installation.rst +17 -14
- {hbat-2.2.4 → hbat-2.2.6}/hbat/_version.py +2 -2
- {hbat-2.2.4 → hbat-2.2.6}/hbat/cli/main.py +96 -1
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/pdb_constants.py +104 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/app_config.py +14 -14
- hbat-2.2.6/hbat/core/atom_classifier.py +123 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/interactions.py +178 -12
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/np_analyzer.py +209 -118
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/np_vector.py +16 -16
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/pdb_parser.py +18 -9
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/structure.py +15 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/main_window.py +163 -59
- {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/results_panel.py +67 -30
- {hbat-2.2.4 → hbat-2.2.6}/hbat.egg-info/SOURCES.txt +20 -12
- {hbat-2.2.4 → hbat-2.2.6}/pyproject.toml +1 -1
- {hbat-2.2.4 → hbat-2.2.6}/pytest.ini +6 -1
- {hbat-2.2.4 → hbat-2.2.6}/requirements-dev.txt +7 -1
- {hbat-2.2.4 → hbat-2.2.6}/requirements.txt +4 -1
- {hbat-2.2.4 → hbat-2.2.6}/tests/cli/test_cli_main.py +4 -218
- {hbat-2.2.4 → hbat-2.2.6}/tests/conftest.py +158 -0
- hbat-2.2.6/tests/e2e/__init__.py +0 -0
- hbat-2.2.6/tests/e2e/test_cli_workflows.py +458 -0
- hbat-2.2.6/tests/e2e/test_complete_workflows.py +357 -0
- hbat-2.2.6/tests/e2e/test_gui_workflows.py +540 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/gui/test_gui_components.py +445 -464
- hbat-2.2.6/tests/integration/__init__.py +0 -0
- hbat-2.2.6/tests/integration/test_analyzer_components.py +484 -0
- hbat-2.2.6/tests/integration/test_cli_integration.py +506 -0
- hbat-2.2.6/tests/integration/test_molecular_validation.py +209 -0
- hbat-2.2.6/tests/integration/test_pdb_parsing.py +837 -0
- hbat-2.2.6/tests/performance/__init__.py +6 -0
- hbat-2.2.6/tests/performance/test_performance_workflows.py +558 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/run_tests.py +44 -20
- hbat-2.2.6/tests/unit/__init__.py +0 -0
- hbat-2.2.6/tests/unit/test_cli_parsing.py +341 -0
- hbat-2.2.6/tests/unit/test_gui_components.py +406 -0
- {hbat-2.2.4/tests/core → hbat-2.2.6/tests/unit}/test_interactions.py +290 -304
- hbat-2.2.6/tests/unit/test_parameters.py +446 -0
- hbat-2.2.6/tests/unit/test_structures.py +471 -0
- hbat-2.2.6/tests/unit/test_vector_math.py +454 -0
- hbat-2.2.4/.github/workflows/conda-release.yml +0 -81
- hbat-2.2.4/.github/workflows/pr-prerelease.yml +0 -324
- hbat-2.2.4/.github/workflows/release.yml +0 -171
- hbat-2.2.4/tests/core/__init__.py +0 -5
- hbat-2.2.4/tests/core/test_analyzer.py +0 -631
- hbat-2.2.4/tests/core/test_np_vector.py +0 -156
- hbat-2.2.4/tests/core/test_pdb_fixer.py +0 -366
- hbat-2.2.4/tests/core/test_pdb_parser.py +0 -582
- hbat-2.2.4/tests/gui/test_numpy_integration.py +0 -103
- hbat-2.2.4/tests/test_np_analyzer.py +0 -310
- hbat-2.2.4/tests/test_np_vector.py +0 -293
- {hbat-2.2.4 → hbat-2.2.6}/.github/workflows/cleanup-prereleases.yml +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/CITATION.cff +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/CLAUDE.md +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/CODE_OF_CONDUCT.md +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/CONTRIBUTING.md +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/LICENSE +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/MANIFEST.in +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/build_standalone.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/build_standalone_windows.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/conda/meta.yaml +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/Makefile +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/requirements.txt +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/_static/custom.css +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/_static/light-theme.css +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/ccd_analyzer.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/constants_generator.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/generate_ccd_constants.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/ccd/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/cli/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/app.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/atomic_data.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/misc.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/parameters.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/constants/pdb_constants.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/interactions.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/np_analyzer.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/np_vector.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/pdb_fixer.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/pdb_parser.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/core/structure.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/examples/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/gui/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/utilities/atom_utils.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/api/utilities/index.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/cli.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/development.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/license.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/logic.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/parameters.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/pdbfixing.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/docs/source/quickstart.rst +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1bhl.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1gai.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/1ubi.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/2izf.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4jsv.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4laz.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4ub7.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/4x21.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_pdb_files/6rsa.pdb +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/drug_design_strict.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/high_resolution.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/low_resolution.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/membrane_proteins.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/nmr_structures.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/standard_resolution.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/strong_interactions_only.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/example_presets/weak_interactions_permissive.hbat +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/ccd_analyzer.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/constants_generator.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/ccd/generate_ccd_constants.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/cli/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/app.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/atomic_data.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/misc.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/parameters.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/constants/residue_bonds.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/analysis.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/analyzer.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/core/pdb_fixer.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/chain_visualization.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/gui/parameter_panel.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/utilities/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat/utilities/atom_utils.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat.icns +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat.ico +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat.png +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat.svg +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat_cli.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/hbat_gui.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/setup.cfg +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/README.md +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/cli/__init__.py +0 -0
- {hbat-2.2.4 → hbat-2.2.6}/tests/gui/__init__.py +0 -0
- {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.
|
|
41
|
+
if: matrix.python-version == '3.10'
|
|
42
42
|
|
|
43
43
|
- name: Upload coverage to Codecov
|
|
44
|
-
uses: codecov/codecov-action@
|
|
45
|
-
if: matrix.python-version == '3.
|
|
44
|
+
uses: codecov/codecov-action@v5
|
|
45
|
+
if: matrix.python-version == '3.10'
|
|
46
46
|
with:
|
|
47
|
-
|
|
48
|
-
|
|
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-
|
|
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 (
|
|
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-
|
|
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
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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/
|
|
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.
|
|
3
|
+
Version: 2.2.6
|
|
4
4
|
Summary: Hydrogen Bond Analysis Tool for PDB structures
|
|
5
|
-
Author-email: Abhishek Tiwari <
|
|
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
|

|
|
88
88
|

|
|
89
89
|

|
|
90
|
-
|
|
91
|
-
|
|
90
|
+

|
|
91
|
+
[](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
|

|
|
16
16
|

|
|
17
17
|

|
|
18
|
-
|
|
19
|
-
|
|
18
|
+

|
|
19
|
+
[](https://codecov.io/gh/abhishektiwari/hbat)
|
|
20
20
|
|
|
21
21
|
## Background
|
|
22
22
|
|