pyjess 0.7.0a4__tar.gz → 0.7.0a6__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.

Potentially problematic release.


This version of pyjess might be problematic. Click here for more details.

Files changed (145) hide show
  1. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.github/workflows/test.yml +57 -99
  2. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/CHANGELOG.md +29 -1
  3. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/PKG-INFO +52 -12
  4. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/README.md +51 -11
  5. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/conf.py +4 -0
  6. pyjess-0.7.0a6/docs/guide/cli.rst +15 -0
  7. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/index.rst +1 -0
  8. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/install.rst +8 -1
  9. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/optimizations.rst +18 -1
  10. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/requirements.txt +2 -1
  11. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/TessAtom.c.patch +12 -2
  12. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/pyproject.toml +9 -3
  13. pyjess-0.7.0a6/src/pyjess/__main__.py +4 -0
  14. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/_jess.pyi +30 -3
  15. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/_jess.pyx +476 -70
  16. pyjess-0.7.0a6/src/pyjess/cli.py +281 -0
  17. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/__init__.py +2 -0
  18. pyjess-0.7.0a6/src/pyjess/tests/test_doctest.py +78 -0
  19. pyjess-0.7.0a6/src/pyjess/tests/test_hit.py +57 -0
  20. pyjess-0.7.0a6/src/pyjess/tests/test_molecule.py +287 -0
  21. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/test_template.py +1 -0
  22. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/scripts/cmake/CythonExtension.cmake +11 -2
  23. pyjess-0.7.0a4/src/pyjess/tests/test_hit.py +0 -33
  24. pyjess-0.7.0a4/src/pyjess/tests/test_molecule.py +0 -171
  25. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.github/workflows/package.yml +0 -0
  26. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.github/workflows/requirements.txt +0 -0
  27. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.gitignore +0 -0
  28. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.gitmodules +0 -0
  29. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/.readthedocs.yaml +0 -0
  30. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/CMakeLists.txt +0 -0
  31. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/CONTRIBUTING.md +0 -0
  32. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/COPYING +0 -0
  33. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/.gitignore +0 -0
  34. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/Makefile +0 -0
  35. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/_static/css/main.css +0 -0
  36. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/_static/js/custom-icon.js +0 -0
  37. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/_static/json/switcher.json +0 -0
  38. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/api/index.rst +0 -0
  39. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/api/jess.rst +0 -0
  40. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/api/molecule.rst +0 -0
  41. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/api/template.rst +0 -0
  42. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/changes.md +0 -0
  43. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/contributing.md +0 -0
  44. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/guide/copyright.rst +0 -0
  45. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/index.rst +0 -0
  46. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/docs/make.bat +0 -0
  47. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/__init__.pxd +0 -0
  48. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/annulus.pxd +0 -0
  49. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/atom.pxd +0 -0
  50. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/candidate_set.pxd +0 -0
  51. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/jess.pxd +0 -0
  52. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/join.pxd +0 -0
  53. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/kdtree.pxd +0 -0
  54. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/molecule.pxd +0 -0
  55. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/region.pxd +0 -0
  56. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/res_index.pxd +0 -0
  57. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/scanner.pxd +0 -0
  58. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/super.pxd +0 -0
  59. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/template.pxd +0 -0
  60. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/tess_atom.pxd +0 -0
  61. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/include/jess/tess_template.pxd +0 -0
  62. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Annulus.c.patch +0 -0
  63. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Annulus.h.patch +0 -0
  64. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Atom.c.patch +0 -0
  65. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Atom.h.patch +0 -0
  66. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Box.c.patch +0 -0
  67. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Box.h.patch +0 -0
  68. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/CMakeLists.txt.patch +0 -0
  69. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/CandidateSet.c.patch +0 -0
  70. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/CandidateSet.h.patch +0 -0
  71. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Jess.c.patch +0 -0
  72. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Jess.h.patch +0 -0
  73. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Join.c.patch +0 -0
  74. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Join.h.patch +0 -0
  75. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/KdTree.c.patch +0 -0
  76. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/KdTree.h.patch +0 -0
  77. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Main.c.patch +0 -0
  78. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Molecule.c.patch +0 -0
  79. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Molecule.h.patch +0 -0
  80. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/ResIndex.c.patch +0 -0
  81. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/ResIndex.h.patch +0 -0
  82. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Scanner.c.patch +0 -0
  83. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Scanner.h.patch +0 -0
  84. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Super.c.patch +0 -0
  85. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/Template.h.patch +0 -0
  86. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/TessAtom.h.patch +0 -0
  87. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/TessTemplate.c.patch +0 -0
  88. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/TessTemplate.h.patch +0 -0
  89. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/patches/qselect.h.patch +0 -0
  90. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/pkg/aur/PKGBUILD.in +0 -0
  91. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/CMakeLists.txt +0 -0
  92. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/jess/CMakeLists.txt +0 -0
  93. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/.gitignore +0 -0
  94. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/CMakeLists.txt +0 -0
  95. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/__init__.py +0 -0
  96. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/py.typed +0 -0
  97. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/1.3.3.tpl +0 -0
  98. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/1AMY+1.3.3.txt +0 -0
  99. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/1AMY.cif +0 -0
  100. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/1AMY.pdb +0 -0
  101. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/1sur.qry +0 -0
  102. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/4.1.2.tpl +0 -0
  103. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/5ayx.EF.pdb +0 -0
  104. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/__init__.py +0 -0
  105. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/pdb1lnb.pdb +0 -0
  106. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/template_01.qry +0 -0
  107. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/data/template_02.qry +0 -0
  108. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/test_atom.py +0 -0
  109. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/test_jess.py +0 -0
  110. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/test_template_atom.py +0 -0
  111. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/pyjess/tests/utils.py +0 -0
  112. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/scripts/apply_patch.py +0 -0
  113. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/scripts/cmake/pystate_patch.h +0 -0
  114. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/src/scripts/generate_patches.py +0 -0
  115. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/.gitignore +0 -0
  116. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/README.md +0 -0
  117. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/examples/template_01.qry +0 -0
  118. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/examples/template_02.qry +0 -0
  119. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/examples/test_pdbs/pdb1lnb.ent +0 -0
  120. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/filter_output.py +0 -0
  121. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Annulus.c +0 -0
  122. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Annulus.h +0 -0
  123. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Atom.c +0 -0
  124. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Atom.h +0 -0
  125. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Jess.c +0 -0
  126. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Jess.h +0 -0
  127. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Join.c +0 -0
  128. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Join.h +0 -0
  129. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/KdTree.c +0 -0
  130. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/KdTree.h +0 -0
  131. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Main.c +0 -0
  132. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Molecule.c +0 -0
  133. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Molecule.h +0 -0
  134. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Region.c +0 -0
  135. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Region.h +0 -0
  136. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Scanner.c +0 -0
  137. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Scanner.h +0 -0
  138. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Super.c +0 -0
  139. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Super.h +0 -0
  140. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/Template.h +0 -0
  141. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/TessAtom.c +0 -0
  142. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/TessAtom.h +0 -0
  143. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/TessTemplate.c +0 -0
  144. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/TessTemplate.h +0 -0
  145. {pyjess-0.7.0a4 → pyjess-0.7.0a6}/vendor/jess/src/jess +0 -0
@@ -14,40 +14,18 @@ jobs:
14
14
  strategy:
15
15
  fail-fast: false
16
16
  matrix:
17
- include:
18
- - python-version: 3.7
19
- python-release: v3.7
20
- python-impl: CPython
21
- - python-version: 3.8
22
- python-release: v3.8
23
- python-impl: CPython
24
- - python-version: 3.9
25
- python-release: v3.9
26
- python-impl: CPython
27
- - python-version: '3.10'
28
- python-release: v3.10
29
- python-impl: CPython
30
- - python-version: 3.11
31
- python-release: v3.11
32
- python-impl: CPython
33
- - python-version: 3.12
34
- python-release: v3.12
35
- python-impl: CPython
36
- - python-version: 3.13
37
- python-release: v3.13
38
- python-impl: CPython
39
- - python-version: pypy-3.7
40
- python-release: v3.7
41
- python-impl: PyPy
42
- - python-version: pypy-3.8
43
- python-release: v3.8
44
- python-impl: PyPy
45
- - python-version: pypy-3.9
46
- python-release: v3.9
47
- python-impl: PyPy
48
- - python-version: pypy-3.10
49
- python-release: v3.10
50
- python-impl: PyPy
17
+ python-version:
18
+ - "3.7"
19
+ - "3.8"
20
+ - "3.9"
21
+ - "3.10"
22
+ - "3.11"
23
+ - "3.12"
24
+ - "3.13"
25
+ - "pypy-3.7"
26
+ - "pypy-3.8"
27
+ - "pypy-3.9"
28
+ - "pypy-3.10"
51
29
  steps:
52
30
  - name: Checkout code
53
31
  uses: actions/checkout@v4
@@ -63,7 +41,13 @@ jobs:
63
41
  run: python -m pip install -r .github/workflows/requirements.txt
64
42
  - name: Build C extension in debug mode
65
43
  run: python -m pip install -e . -vv --no-build-isolation
66
- - name: Test package
44
+ - name: Test package without optional dependencies
45
+ run: python -m unittest pyjess.tests -vv
46
+ - name: Install Python requirements
47
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
48
+ run: python -m pip install gemmi biopython biotite
49
+ - name: Test package with optional dependencies
50
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
67
51
  run: python -m unittest pyjess.tests -vv
68
52
  # - name: Upload to Codecov
69
53
  # if: matrix.python-impl == 'CPython'
@@ -82,34 +66,18 @@ jobs:
82
66
  strategy:
83
67
  fail-fast: false
84
68
  matrix:
85
- include:
86
- - python-version: 3.8
87
- python-release: v3.8
88
- python-impl: CPython
89
- - python-version: 3.9
90
- python-release: v3.9
91
- python-impl: CPython
92
- - python-version: '3.10'
93
- python-release: v3.10
94
- python-impl: CPython
95
- - python-version: '3.11'
96
- python-release: v3.11
97
- python-impl: CPython
98
- - python-version: '3.12'
99
- python-release: v3.12
100
- python-impl: CPython
101
- - python-version: 3.13
102
- python-release: v3.13
103
- python-impl: CPython
104
- - python-version: pypy-3.8
105
- python-release: v3.8
106
- python-impl: PyPy
107
- - python-version: pypy-3.9
108
- python-release: v3.9
109
- python-impl: PyPy
110
- - python-version: pypy-3.10
111
- python-release: v3.10
112
- python-impl: PyPy
69
+ python-version:
70
+ - "3.7"
71
+ - "3.8"
72
+ - "3.9"
73
+ - "3.10"
74
+ - "3.11"
75
+ - "3.12"
76
+ - "3.13"
77
+ - "pypy-3.7"
78
+ - "pypy-3.8"
79
+ - "pypy-3.9"
80
+ - "pypy-3.10"
113
81
  steps:
114
82
  - name: Checkout code
115
83
  uses: actions/checkout@v4
@@ -129,7 +97,13 @@ jobs:
129
97
  run: python -m pip install -r .github/workflows/requirements.txt
130
98
  - name: Build C extension in debug mode
131
99
  run: python -m pip install -e . -vv --no-build-isolation
132
- - name: Test package
100
+ - name: Test package without optional dependencies
101
+ run: python -m unittest pyjess.tests -vv
102
+ - name: Install Python requirements
103
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
104
+ run: python -m pip install gemmi biopython biotite
105
+ - name: Test package with optional dependencies
106
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
133
107
  run: python -m unittest pyjess.tests -vv
134
108
  # - name: Upload to Codecov
135
109
  # if: matrix.python-impl == 'CPython'
@@ -148,40 +122,18 @@ jobs:
148
122
  strategy:
149
123
  fail-fast: false
150
124
  matrix:
151
- include:
152
- - python-version: 3.7
153
- python-release: v3.7
154
- python-impl: CPython
155
- - python-version: 3.8
156
- python-release: v3.8
157
- python-impl: CPython
158
- - python-version: 3.9
159
- python-release: v3.9
160
- python-impl: CPython
161
- - python-version: '3.10'
162
- python-release: v3.10
163
- python-impl: CPython
164
- - python-version: '3.11'
165
- python-release: v3.11
166
- python-impl: CPython
167
- - python-version: '3.12'
168
- python-release: v3.12
169
- python-impl: CPython
170
- - python-version: 3.13
171
- python-release: v3.13
172
- python-impl: CPython
173
- - python-version: pypy-3.7
174
- python-release: v3.7
175
- python-impl: PyPy
176
- - python-version: pypy-3.8
177
- python-release: v3.8
178
- python-impl: PyPy
179
- - python-version: pypy-3.9
180
- python-release: v3.9
181
- python-impl: PyPy
182
- - python-version: pypy-3.10
183
- python-release: v3.10
184
- python-impl: PyPy
125
+ python-version:
126
+ - "3.7"
127
+ - "3.8"
128
+ - "3.9"
129
+ - "3.10"
130
+ - "3.11"
131
+ - "3.12"
132
+ - "3.13"
133
+ - "pypy-3.7"
134
+ - "pypy-3.8"
135
+ - "pypy-3.9"
136
+ - "pypy-3.10"
185
137
  steps:
186
138
  - name: Checkout code
187
139
  uses: actions/checkout@v4
@@ -198,5 +150,11 @@ jobs:
198
150
  run: python -m pip install -r .github/workflows/requirements.txt
199
151
  - name: Build C extension
200
152
  run: python -m pip install . -vv --no-build-isolation
201
- - name: Test without coverage
153
+ - name: Test package without optional dependencies
154
+ run: python -m unittest pyjess.tests -vv
155
+ - name: Install Python requirements
156
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
157
+ run: python -m pip install gemmi biopython biotite
158
+ - name: Test package with optional dependencies
159
+ if: ${{ !startsWith(matrix.python-version, 'pypy') }}
202
160
  run: python -m unittest pyjess.tests -vv
@@ -6,7 +6,35 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
6
6
 
7
7
 
8
8
  ## [Unreleased]
9
- [Unreleased]: https://github.com/althonos/pyjess/compare/v0.7.0-alpha.4...HEAD
9
+ [Unreleased]: https://github.com/althonos/pyjess/compare/v0.7.0-alpha.6...HEAD
10
+
11
+
12
+ ## [v0.7.0-alpha.6] - 2025-09-12
13
+ [v0.7.0-alpha.6]: https://github.com/althonos/pyjess/compare/v0.7.0-alpha.5...v0.7.0-alpha.6
14
+
15
+ ### Added
16
+ - Command Line Interface with the same features as the Jess CLI.
17
+ - `Molecule.from_biopython`, `Molecule.from_biotite` and `Molecule.from_gemmi` to create a `Molecule` with objects from other libraries.
18
+ - `Hit.dump` and `Hit.dumps` methods to write a hit to PDB format.
19
+ - `Molecule.load` option to skip parsing of `HETATM` from PDB files.
20
+
21
+ ### Fixed
22
+ - Issue with alignment of atom names in `TemplateAtom`.
23
+ - Validate data in PDB parser to ensure it is not parsing a mmCIF file.
24
+ - Parsing of mmCIF files with atoms missing occupancy values.
25
+ - Incorrect alignment of `TemplateAtom` names for names of less than 4 characters.
26
+
27
+ ### Changed
28
+ - Setup deployment of Limited API wheels for CPython 3.8 onwards.
29
+ - Implement format detection between PDB and mmCIF in `Molecule.load`.
30
+ - Implement `Template.copy` and `TemplateAtom.copy` using C-level API rather than Python copy.
31
+
32
+
33
+ ## [v0.7.0-alpha.5] - 2025-09-03
34
+ [v0.7.0-alpha.5]: https://github.com/althonos/pyjess/compare/v0.7.0-alpha.4...v0.7.0-alpha.5
35
+
36
+ ### Fixed
37
+ - Issue with new residue support introduced in `v0.7.0-alpha.4`.
10
38
 
11
39
 
12
40
  ## [v0.7.0-alpha.4] - 2025-09-03
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pyjess
3
- Version: 0.7.0a4
3
+ Version: 0.7.0a6
4
4
  Summary: Cython bindings and Python interface to JESS, a 3D template matching software.
5
5
  Keywords: bioinformatics,structure,template,matching
6
6
  Author-Email: Martin Larralde <martin.larralde@embl.de>
@@ -131,7 +131,9 @@ Jess if you are using it in an academic work, for instance as:
131
131
 
132
132
  ## 💡 Example
133
133
 
134
- Load [`Template`](https://pyjess.readthedocs.io/en/latest/api/template.html#pyjess.Template)
134
+ #### Prepare templates
135
+
136
+ Load [`Template`](https://pyjess.readthedocs.io/en/latest/api/template.html#pyjess.Template)
135
137
  objects to be used as references from different template files:
136
138
 
137
139
  ```python
@@ -143,15 +145,46 @@ for path in sorted(pathlib.Path("vendor/jess/examples").glob("template_*.qry")):
143
145
  templates.append(pyjess.Template.load(path, id=path.stem))
144
146
  ```
145
147
 
146
- Create a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess) instance and use it to query a [`Molecule`](https://pyjess.readthedocs.io/en/latest/api/molecule.html#pyjess.Molecule) (a PDB structure)
147
- against the stored templates:
148
+ #### Prepare query structures
149
+
150
+ Load a [`Molecule`](https://pyjess.readthedocs.io/en/latest/api/molecule.html#pyjess.Molecule)
151
+ (a PDB structure) from a PDB file, create one with the Python API, or
152
+ convert it from a [`Bio.Model`](https://biopython.org/docs/1.76/api/Bio.PDB.Model.html),
153
+ [`gemmi.Model`](https://gemmi.readthedocs.io/en/latest/mol.html#model),
154
+ or [`biotite.structure.AtomArray`](https://www.biotite-python.org/latest/apidoc/biotite.structure.AtomArray.html)
155
+ object:
148
156
 
149
157
  ```python
150
- jess = pyjess.Jess(templates)
158
+ # load from PDB file or mmCIF file
151
159
  mol = pyjess.Molecule.load("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
160
+
161
+ # load with BioPython
162
+ parser = Bio.PDB.PDBParser()
163
+ structure = parser.get_structure('pdb1a0p', "vendor/jess/examples/test_pdbs/pdb1a0p.ent")
164
+ mol = Molecule.from_biopython(structure, id="1a0p")
165
+
166
+ # load with Gemmi
167
+ structure = gemmi.read_pdb_string("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
168
+ mol = Molecule.from_gemmi(structure[0], id="1a0p")
169
+
170
+ # load with Biotite
171
+ pdb_file = biotite.structure.io.pdb.PDBFile.read(f)
172
+ structure = pdb_file.get_structure(altloc="all", extra_fields=["atom_id", "b_factor", "occupancy", "charge"])
173
+ mol = Molecule.from_biotite(structure[0])
174
+ ```
175
+
176
+ ### Match templates
177
+
178
+ Create a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
179
+ instance and use it to query a against the stored templates:
180
+
181
+ ```python
182
+ jess = pyjess.Jess(templates)
152
183
  query = jess.query(mol, rmsd_threshold=2.0, distance_cutoff=3.0, max_dynamic_distance=3.0)
153
184
  ```
154
185
 
186
+ ### Process hits
187
+
155
188
  The hits are computed iteratively, and the different output statistics are
156
189
  computed on-the-fly when requested:
157
190
 
@@ -162,13 +195,19 @@ for hit in query:
162
195
  print(atom.name, atom.x, atom.y, atom.z)
163
196
  ```
164
197
 
198
+ Hits can also be rendered in PDB format like in the original Jess output,
199
+ either by writing to a file directly, or to a Python string:
200
+ ```python
201
+ for hit in query:
202
+ hit.dump(sys.stdout, format="pdb")
203
+ ```
165
204
 
166
205
  ## 🧶 Thread-safety
167
206
 
168
- Once a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
207
+ Once a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
169
208
  instance has been created, the templates cannot be edited anymore,
170
- making the [`Jess.query`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess.query) method re-entrant and thread-safe. This allows querying
171
- several molecules against the same templates in parallel using e.g a
209
+ making the [`Jess.query`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess.query) method re-entrant and thread-safe. This allows querying
210
+ several molecules against the same templates in parallel using e.g a
172
211
  [`ThreadPool`](https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.ThreadPool):
173
212
 
174
213
  ```python
@@ -185,8 +224,8 @@ If running Jess in parallel, make sure to use `v0.2.1` or later to use the code
185
224
 
186
225
  ## ⏱️ Benchmarks
187
226
 
188
- The following table reports the runtime of PyJess to match N=132 protein
189
- structures to the M=7607 templates of
227
+ The following table reports the runtime of PyJess to match N=132 protein
228
+ structures to the M=7607 templates of
190
229
  [EnzyMM](https://github.com/RayHackett/enzymm), using J=12 threads to parallelize.
191
230
 
192
231
  | Version | Runtime (s) | Match Speed (N * M / s * J) | Speedup |
@@ -198,7 +237,7 @@ structures to the M=7607 templates of
198
237
  | ``v0.6.0`` | 54.5 | 1535.4 | x11.34 |
199
238
  | ``v0.7.0`` | 52.4 | 1597.5 | **x11.80** |
200
239
 
201
- *Benchmarks were run on a quiet [i7-1255U](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html)
240
+ *Benchmarks were run on a quiet [i7-1255U](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html)
202
241
  CPU running @4.70GHz with 10 physical cores / 12 logical cores.*
203
242
 
204
243
  ## 💭 Feedback
@@ -227,7 +266,8 @@ in the [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format.
227
266
 
228
267
  ## ⚖️ License
229
268
 
230
- This library is provided under the [MIT License](https://choosealicense.com/licenses/mit/). The JESS code is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) as well.
269
+ This library is provided under the [MIT License](https://choosealicense.com/licenses/mit/).
270
+ The JESS code is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) as well.
231
271
 
232
272
  *This project is in no way not affiliated, sponsored, or otherwise endorsed
233
273
  by the JESS authors. It was developed
@@ -69,7 +69,9 @@ Jess if you are using it in an academic work, for instance as:
69
69
 
70
70
  ## 💡 Example
71
71
 
72
- Load [`Template`](https://pyjess.readthedocs.io/en/latest/api/template.html#pyjess.Template)
72
+ #### Prepare templates
73
+
74
+ Load [`Template`](https://pyjess.readthedocs.io/en/latest/api/template.html#pyjess.Template)
73
75
  objects to be used as references from different template files:
74
76
 
75
77
  ```python
@@ -81,15 +83,46 @@ for path in sorted(pathlib.Path("vendor/jess/examples").glob("template_*.qry")):
81
83
  templates.append(pyjess.Template.load(path, id=path.stem))
82
84
  ```
83
85
 
84
- Create a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess) instance and use it to query a [`Molecule`](https://pyjess.readthedocs.io/en/latest/api/molecule.html#pyjess.Molecule) (a PDB structure)
85
- against the stored templates:
86
+ #### Prepare query structures
87
+
88
+ Load a [`Molecule`](https://pyjess.readthedocs.io/en/latest/api/molecule.html#pyjess.Molecule)
89
+ (a PDB structure) from a PDB file, create one with the Python API, or
90
+ convert it from a [`Bio.Model`](https://biopython.org/docs/1.76/api/Bio.PDB.Model.html),
91
+ [`gemmi.Model`](https://gemmi.readthedocs.io/en/latest/mol.html#model),
92
+ or [`biotite.structure.AtomArray`](https://www.biotite-python.org/latest/apidoc/biotite.structure.AtomArray.html)
93
+ object:
86
94
 
87
95
  ```python
88
- jess = pyjess.Jess(templates)
96
+ # load from PDB file or mmCIF file
89
97
  mol = pyjess.Molecule.load("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
98
+
99
+ # load with BioPython
100
+ parser = Bio.PDB.PDBParser()
101
+ structure = parser.get_structure('pdb1a0p', "vendor/jess/examples/test_pdbs/pdb1a0p.ent")
102
+ mol = Molecule.from_biopython(structure, id="1a0p")
103
+
104
+ # load with Gemmi
105
+ structure = gemmi.read_pdb_string("vendor/jess/examples/test_pdbs/pdb1a0p.ent")
106
+ mol = Molecule.from_gemmi(structure[0], id="1a0p")
107
+
108
+ # load with Biotite
109
+ pdb_file = biotite.structure.io.pdb.PDBFile.read(f)
110
+ structure = pdb_file.get_structure(altloc="all", extra_fields=["atom_id", "b_factor", "occupancy", "charge"])
111
+ mol = Molecule.from_biotite(structure[0])
112
+ ```
113
+
114
+ ### Match templates
115
+
116
+ Create a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
117
+ instance and use it to query a against the stored templates:
118
+
119
+ ```python
120
+ jess = pyjess.Jess(templates)
90
121
  query = jess.query(mol, rmsd_threshold=2.0, distance_cutoff=3.0, max_dynamic_distance=3.0)
91
122
  ```
92
123
 
124
+ ### Process hits
125
+
93
126
  The hits are computed iteratively, and the different output statistics are
94
127
  computed on-the-fly when requested:
95
128
 
@@ -100,13 +133,19 @@ for hit in query:
100
133
  print(atom.name, atom.x, atom.y, atom.z)
101
134
  ```
102
135
 
136
+ Hits can also be rendered in PDB format like in the original Jess output,
137
+ either by writing to a file directly, or to a Python string:
138
+ ```python
139
+ for hit in query:
140
+ hit.dump(sys.stdout, format="pdb")
141
+ ```
103
142
 
104
143
  ## 🧶 Thread-safety
105
144
 
106
- Once a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
145
+ Once a [`Jess`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess)
107
146
  instance has been created, the templates cannot be edited anymore,
108
- making the [`Jess.query`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess.query) method re-entrant and thread-safe. This allows querying
109
- several molecules against the same templates in parallel using e.g a
147
+ making the [`Jess.query`](https://pyjess.readthedocs.io/en/latest/api/jess.html#pyjess.Jess.query) method re-entrant and thread-safe. This allows querying
148
+ several molecules against the same templates in parallel using e.g a
110
149
  [`ThreadPool`](https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.ThreadPool):
111
150
 
112
151
  ```python
@@ -123,8 +162,8 @@ If running Jess in parallel, make sure to use `v0.2.1` or later to use the code
123
162
 
124
163
  ## ⏱️ Benchmarks
125
164
 
126
- The following table reports the runtime of PyJess to match N=132 protein
127
- structures to the M=7607 templates of
165
+ The following table reports the runtime of PyJess to match N=132 protein
166
+ structures to the M=7607 templates of
128
167
  [EnzyMM](https://github.com/RayHackett/enzymm), using J=12 threads to parallelize.
129
168
 
130
169
  | Version | Runtime (s) | Match Speed (N * M / s * J) | Speedup |
@@ -136,7 +175,7 @@ structures to the M=7607 templates of
136
175
  | ``v0.6.0`` | 54.5 | 1535.4 | x11.34 |
137
176
  | ``v0.7.0`` | 52.4 | 1597.5 | **x11.80** |
138
177
 
139
- *Benchmarks were run on a quiet [i7-1255U](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html)
178
+ *Benchmarks were run on a quiet [i7-1255U](https://www.intel.com/content/www/us/en/products/sku/226259/intel-core-i71255u-processor-12m-cache-up-to-4-70-ghz/specifications.html)
140
179
  CPU running @4.70GHz with 10 physical cores / 12 logical cores.*
141
180
 
142
181
  ## 💭 Feedback
@@ -165,7 +204,8 @@ in the [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format.
165
204
 
166
205
  ## ⚖️ License
167
206
 
168
- This library is provided under the [MIT License](https://choosealicense.com/licenses/mit/). The JESS code is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) as well.
207
+ This library is provided under the [MIT License](https://choosealicense.com/licenses/mit/).
208
+ The JESS code is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) as well.
169
209
 
170
210
  *This project is in no way not affiliated, sponsored, or otherwise endorsed
171
211
  by the JESS authors. It was developed
@@ -74,6 +74,7 @@ extensions = [
74
74
  "sphinx.ext.extlinks",
75
75
  "sphinx_design",
76
76
  "sphinxcontrib.jquery",
77
+ "sphinxarg.ext",
77
78
  "nbsphinx",
78
79
  "recommonmark",
79
80
  "IPython.sphinxext.ipython_console_highlighting",
@@ -190,6 +191,9 @@ autosummary_generate = []
190
191
  # Example configuration for intersphinx: refer to the Python standard library.
191
192
  intersphinx_mapping = {
192
193
  "python": ("https://docs.python.org/3/", None),
194
+ "biopython": ("https://biopython.org/docs/latest/", None),
195
+ "biotite": ("https://www.biotite-python.org/latest/", None),
196
+ "gemmi": ("https://gemmi.readthedocs.io/en/latest/", None),
193
197
  }
194
198
 
195
199
  # -- Options for recommonmark extension --------------------------------------
@@ -0,0 +1,15 @@
1
+ Command Line Interface
2
+ ======================
3
+
4
+ Starting from ``v0.7.0``, PyJess features a command-line interface that is
5
+ automatically installed with the package. It features the same options as
6
+ the Jess command-line, as well as some options specific to PyJess.
7
+
8
+ .. rubric:: Usage
9
+
10
+ .. argparse::
11
+ :module: pyjess.cli
12
+ :func: argument_parser
13
+ :prog: pyjess
14
+ :nodescription:
15
+ :noepilog:
@@ -8,6 +8,7 @@ This section contains guides and documents about PyJess usage.
8
8
  :caption: Getting Started
9
9
 
10
10
  Installation <install>
11
+ Command Line Interface <cli>
11
12
 
12
13
  .. toctree::
13
14
  :maxdepth: 1
@@ -15,12 +15,19 @@ PyPi
15
15
  PyJess is hosted on GitHub, but the easiest way to install it is to download
16
16
  the latest release from its `PyPi repository <https://pypi.python.org/pypi/pyjess>`_.
17
17
  It will install all dependencies then install ``pyjess`` either from a wheel if
18
- one is available, or from source after compiling the Rust code :
18
+ one is available, or from source after compiling the C source code from Jess :
19
19
 
20
20
  .. code:: console
21
21
 
22
22
  $ pip install --user pyjess
23
23
 
24
+ To install additional dependencies required for parsing mmCIF files in
25
+ addition to PDB files, run instead:
26
+
27
+ .. code:: console
28
+
29
+ $ pip install --user pyjess[cif]
30
+
24
31
 
25
32
  Conda
26
33
  ^^^^^
@@ -4,7 +4,7 @@ Optimizations
4
4
  .. currentmodule:: pyjess
5
5
 
6
6
  While PyJess started as a Cython wrapper of Jess, it also
7
- contains several optimizations to make the code write better
7
+ contains several optimizations to make the software perform better
8
8
  while maintaining consistency with the original Jess code.
9
9
  Some of these optimizations are described below, as well as
10
10
  the version where they were introduced.
@@ -256,3 +256,20 @@ as it creates a new `Scanner` which allocates memory for each `Template` / `Mole
256
256
  pair to match. Effectively, most of these buffers can actually be reused
257
257
  across `Templates` for a given `Molecule`, provided sufficient bookkeeping. Our
258
258
  implementation keeps allocation to a minimum across an entire `Query`.
259
+
260
+
261
+ Manual case-insensitive string comparison
262
+ -----------------------------------------
263
+
264
+ .. versionadded:: 0.7.0
265
+
266
+ The original Jess code uses the ``strcasecmp`` function to compare atom names,
267
+ an operation that is perfomed on most match modes. This function is optimized
268
+ for long strings: for instance, the GNU libc contains an AVX2 implementation
269
+ of the equality code. In Jess, however, this function is usually called with
270
+ very short strings (3 or 4 characters).
271
+
272
+ To reduce overhead due to calling an external function, and encourage the
273
+ compiler to unroll the equality comparison loop, we implement name
274
+ comparison in an inline function defined in the ``TessAtom.h`` header. On
275
+ a single template, this saved around 5% of the CPU cycles.
@@ -12,4 +12,5 @@ pygments ~=2.4
12
12
  nbsphinx ~=0.8
13
13
  sphinxcontrib-jquery ~=4.1
14
14
  sphinx-design
15
- pydata-sphinx-theme
15
+ pydata-sphinx-theme
16
+ sphinx-argparse
@@ -1,5 +1,5 @@
1
1
  diff --git a/src/TessAtom.c b/src/TessAtom.c
2
- index e1cce1a..eecf682 100644
2
+ index e1cce1a..3f06daa 100644
3
3
  --- a/src/TessAtom.c
4
4
  +++ b/src/TessAtom.c
5
5
  @@ -7,40 +7,13 @@
@@ -54,7 +54,7 @@ index e1cce1a..eecf682 100644
54
54
  {
55
55
  { 'A',"ALA" },
56
56
  { 'C',"CYS" },
57
- @@ -66,10 +39,12 @@ static const char *TessAtom_convertResidue(char p)
57
+ @@ -66,18 +39,20 @@ static const char *TessAtom_convertResidue(char p)
58
58
  { 'M',"MET" },
59
59
  { 'N',"ASN" },
60
60
  { 'P',"PRO" },
@@ -67,6 +67,16 @@ index e1cce1a..eecf682 100644
67
67
  { 'V',"VAL" },
68
68
  { 'W',"TRP" },
69
69
  { 'Y',"TYR" },
70
+ { 'X',"XXX" }
71
+ };
72
+
73
+ - for(k=0; k<21 && p!=table[k].one; k++);
74
+ - return k<21 ? table[k].three:NULL;
75
+ + for(k=0; k<23 && p!=table[k].one; k++);
76
+ + return k<23 ? table[k].three:NULL;
77
+ }
78
+
79
+ TessAtom *TessAtom_create(const char *s)
70
80
  @@ -91,7 +66,7 @@ TessAtom *TessAtom_create(const char *s)
71
81
  int rq;
72
82
  const char *q;
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "pyjess"
7
- version = "0.7.0-alpha.4"
7
+ version = "0.7.0-alpha.6"
8
8
  description = "Cython bindings and Python interface to JESS, a 3D template matching software."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.7"
@@ -49,8 +49,15 @@ classifiers = [
49
49
  test = ["importlib-resources ; python_version < '3.9'"]
50
50
  cif = ["gemmi ~=0.7.0"]
51
51
 
52
+ [project.scripts]
53
+ pyjess = "pyjess.cli:main"
54
+
55
+ [project.entry-points.console_scripts]
56
+ pyjess = "pyjess.cli:main"
57
+
52
58
  [tool.scikit-build]
53
59
  build-dir = "build/{build_type}"
60
+ wheel.py-api = "cp38"
54
61
  editable.rebuild = true
55
62
  editable.verbose = false
56
63
  sdist.exclude = ["vendor/jess/examples"]
@@ -74,8 +81,7 @@ if.env.MOLD = true
74
81
  cmake.define.CMAKE_LINKER_TYPE = "mold"
75
82
 
76
83
  [tool.cibuildwheel]
77
- before-build = "pip install scikit-build-core cython"
78
- build-frontend = { name = "pip", args = ["--no-build-isolation"] }
84
+ build-frontend = { name = "pip" }
79
85
  build-verbosity = 1
80
86
  free-threaded-support = false
81
87
  test-command = "python -m unittest pyjess.tests -v"
@@ -0,0 +1,4 @@
1
+ import sys
2
+ from .cli import main
3
+
4
+ sys.exit(main())