phasepred 1.0.1__tar.gz → 1.0.2__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 (152) hide show
  1. {phasepred-1.0.1 → phasepred-1.0.2}/CHANGELOG.md +14 -0
  2. {phasepred-1.0.1 → phasepred-1.0.2}/PKG-INFO +1 -1
  3. {phasepred-1.0.1 → phasepred-1.0.2}/README.md +1 -1
  4. {phasepred-1.0.1 → phasepred-1.0.2}/pyproject.toml +1 -1
  5. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/__init__.py +1 -1
  6. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/DeepCoil/README.md +7 -7
  7. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/DeepCoil/manifest.toml +1 -1
  8. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/README.md +4 -3
  9. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/manifest.toml +1 -1
  10. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/run +38 -1
  11. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/PKG-INFO +1 -1
  12. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_check_tools_table.py +6 -2
  13. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_tool_contract_drift.py +49 -0
  14. {phasepred-1.0.1 → phasepred-1.0.2}/LICENSE +0 -0
  15. {phasepred-1.0.1 → phasepred-1.0.2}/MANIFEST.in +0 -0
  16. {phasepred-1.0.1 → phasepred-1.0.2}/NOTICE +0 -0
  17. {phasepred-1.0.1 → phasepred-1.0.2}/README-pypi.md +0 -0
  18. {phasepred-1.0.1 → phasepred-1.0.2}/environment.yml +0 -0
  19. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/CHANGELOG.md +0 -0
  20. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/README.md +0 -0
  21. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/pyproject.toml +0 -0
  22. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/scripts/_s4_numeric.py +0 -0
  23. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/scripts/bootstrap_web_benchmark.py +0 -0
  24. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/scripts/eval_routes.py +0 -0
  25. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/scripts/reproduce_distilled.py +0 -0
  26. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/__init__.py +0 -0
  27. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/_distill.py +0 -0
  28. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/cli.py +0 -0
  29. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/scoring.py +0 -0
  30. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/surrogate.py +0 -0
  31. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/weights/catgranule_distilled_weights.json +0 -0
  32. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/weights/catgranule_paper_weights.json +0 -0
  33. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/weights/catgranule_v1_weights.json +0 -0
  34. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/weights/distilled_xgb_model.ubj +0 -0
  35. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/src/catgranule/weights.py +0 -0
  36. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/tests/fixtures/P35637.fasta +0 -0
  37. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/tests/fixtures/Q08211.fasta +0 -0
  38. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/tests/test_catgranule_cli.py +0 -0
  39. {phasepred-1.0.1 → phasepred-1.0.2}/packages/catgranule/tests/test_scoring.py +0 -0
  40. {phasepred-1.0.1 → phasepred-1.0.2}/scripts/check_no_proprietary.py +0 -0
  41. {phasepred-1.0.1 → phasepred-1.0.2}/scripts/train_phasepred.py +0 -0
  42. {phasepred-1.0.1 → phasepred-1.0.2}/scripts/validate_phasepred.py +0 -0
  43. {phasepred-1.0.1 → phasepred-1.0.2}/setup.cfg +0 -0
  44. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/cli.py +0 -0
  45. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/deepphase/LICENSE +0 -0
  46. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/deepphase/NOTICE +0 -0
  47. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/deepphase/deepphase_scores.tsv +0 -0
  48. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_0.joblib +0 -0
  49. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_1.joblib +0 -0
  50. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_2.joblib +0 -0
  51. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_3.joblib +0 -0
  52. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_4.joblib +0 -0
  53. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_5.joblib +0 -0
  54. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_6.joblib +0 -0
  55. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_7.joblib +0 -0
  56. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_8.joblib +0 -0
  57. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/8f_model_9.joblib +0 -0
  58. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/PdPS/manifest.json +0 -0
  59. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_0.joblib +0 -0
  60. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_1.joblib +0 -0
  61. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_2.joblib +0 -0
  62. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_3.joblib +0 -0
  63. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_4.joblib +0 -0
  64. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_5.joblib +0 -0
  65. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_6.joblib +0 -0
  66. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_7.joblib +0 -0
  67. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_8.joblib +0 -0
  68. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/8f_model_9.joblib +0 -0
  69. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/SaPS/manifest.json +0 -0
  70. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_0.joblib +0 -0
  71. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_1.joblib +0 -0
  72. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_2.joblib +0 -0
  73. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_3.joblib +0 -0
  74. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_4.joblib +0 -0
  75. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_5.joblib +0 -0
  76. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_6.joblib +0 -0
  77. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_7.joblib +0 -0
  78. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_8.joblib +0 -0
  79. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/8f_model_9.joblib +0 -0
  80. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hPdPS/manifest.json +0 -0
  81. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_0.joblib +0 -0
  82. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_1.joblib +0 -0
  83. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_2.joblib +0 -0
  84. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_3.joblib +0 -0
  85. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_4.joblib +0 -0
  86. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_5.joblib +0 -0
  87. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_6.joblib +0 -0
  88. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_7.joblib +0 -0
  89. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_8.joblib +0 -0
  90. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/8f_model_9.joblib +0 -0
  91. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/models/hSaPS/manifest.json +0 -0
  92. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/DeepCoil/install.sh +0 -0
  93. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/DeepCoil/run +0 -0
  94. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/ESpritz/README.md +0 -0
  95. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/ESpritz/install.sh +0 -0
  96. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/ESpritz/manifest.toml +0 -0
  97. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/ESpritz/run +0 -0
  98. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/LocalCIDER/README.md +0 -0
  99. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/LocalCIDER/install.sh +0 -0
  100. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/LocalCIDER/manifest.toml +0 -0
  101. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/LocalCIDER/run +0 -0
  102. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PLAAC/README.md +0 -0
  103. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PLAAC/install.sh +0 -0
  104. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PLAAC/manifest.toml +0 -0
  105. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PLAAC/plaac-master/web/bin/plaac.jar +0 -0
  106. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PLAAC/run +0 -0
  107. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/SourceCodeS2/README.txt +0 -0
  108. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/SourceCodeS2/elife_phase_separation_predictor.py +0 -0
  109. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/PScore/install.sh +0 -0
  110. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/README.md +0 -0
  111. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/SEG/README.md +0 -0
  112. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/SEG/install.sh +0 -0
  113. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/SEG/manifest.toml +0 -0
  114. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/SEG/run +0 -0
  115. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data/tools/SEG/seg +0 -0
  116. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/data.py +0 -0
  117. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/espritz.py +0 -0
  118. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/features.py +0 -0
  119. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/legacy_features.py +0 -0
  120. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/models.py +0 -0
  121. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/paper.py +0 -0
  122. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/predictor.py +0 -0
  123. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/sequences.py +0 -0
  124. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/tool_features.py +0 -0
  125. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/tool_paths.py +0 -0
  126. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/tools.py +0 -0
  127. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/training.py +0 -0
  128. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/training_data.py +0 -0
  129. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/updated_data.py +0 -0
  130. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred/validation.py +0 -0
  131. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/SOURCES.txt +0 -0
  132. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/dependency_links.txt +0 -0
  133. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/entry_points.txt +0 -0
  134. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/requires.txt +0 -0
  135. {phasepred-1.0.1 → phasepred-1.0.2}/src/phasepred.egg-info/top_level.txt +0 -0
  136. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_cli.py +0 -0
  137. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_cwd.py +0 -0
  138. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_data_resolution.py +0 -0
  139. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_demo_scripts.py +0 -0
  140. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_features.py +0 -0
  141. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_golden_fixtures.py +0 -0
  142. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_models.py +0 -0
  143. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_paper.py +0 -0
  144. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_sequences.py +0 -0
  145. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_train_phasepred.py +0 -0
  146. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_training.py +0 -0
  147. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_training_data.py +0 -0
  148. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_training_data_integrity.py +0 -0
  149. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_training_data_real.py +0 -0
  150. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_v2022.py +0 -0
  151. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_validation.py +0 -0
  152. {phasepred-1.0.1 → phasepred-1.0.2}/tests/test_version_consistency.py +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.2] - 2026-09-28
4
+
5
+ Patch release for the 1.0.1 installation feedback. Model artifacts and
6
+ training data are unchanged.
7
+
8
+ ### Fixed
9
+
10
+ - Use `python3` in the Ubuntu venv examples.
11
+ - Document DeepCoil's user-data installation path and show it in missing-tool
12
+ guidance; keep the legacy checkout environment as a fallback.
13
+ - Show the PScore install command when `check-tools` reports it missing.
14
+ - Let the checkout PScore runner find DBS in the installed user-data copy and
15
+ accept relative FASTA and output paths when invoked on its own.
16
+
3
17
  ## [1.0.1] - 2026-09-28
4
18
 
5
19
  Patch release based on installation and prediction feedback. Model artifacts
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phasepred
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Paper-faithful re-implementation of the PhaSePred phase-separation predictor (Chen et al. 2022, PNAS).
5
5
  Author: Tingting Li Lab, Department of Biochemistry and Molecular Biology, School of Basic Medical Sciences, Peking University
6
6
  License-Expression: MIT
@@ -52,7 +52,7 @@ pixi install
52
52
  ```bash
53
53
  uv venv --python 3.12 && uv pip install .
54
54
  conda env create -f environment.yml && conda activate phasepred
55
- python -m venv .venv && .venv/bin/pip install -e . -e packages/catgranule
55
+ python3 -m venv .venv && .venv/bin/pip install -e . -e packages/catgranule
56
56
  ```
57
57
 
58
58
  Then install the external feature tools. Each installer is idempotent and puts
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "phasepred"
3
- version = "1.0.1"
3
+ version = "1.0.2"
4
4
  description = "Paper-faithful re-implementation of the PhaSePred phase-separation predictor (Chen et al. 2022, PNAS)."
5
5
  readme = { file = "README-pypi.md", content-type = "text/markdown" }
6
6
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """PhaSePred reconstruction package."""
2
2
 
3
- __version__ = "1.0.1"
3
+ __version__ = "1.0.2"
@@ -27,8 +27,10 @@ tools/DeepCoil/
27
27
  └── README.md this file
28
28
  ```
29
29
 
30
- No entity is vendored — the tool lives in an isolated Python 3.8 conda env
31
- at `.external_envs/deepcoil` (gitignored).
30
+ No entity is vendored — the tool lives in an isolated Python 3.8 conda env.
31
+ New installations use `~/.local/share/phasepred/envs/deepcoil` by default,
32
+ or `$XDG_DATA_HOME/phasepred/envs/deepcoil` / `$PHASEPRED_DATA_ROOT/envs/deepcoil`
33
+ when set. Existing `.external_envs/deepcoil` environments remain supported.
32
34
 
33
35
  ## Install
34
36
 
@@ -38,14 +40,12 @@ bash tools/DeepCoil/install.sh --check # verify env/bin/deepcoil present
38
40
  ```
39
41
 
40
42
  Overrides: `DEEPCOIL_ENV_PREFIX=/path/to/env DEEPCOIL_PYTHON_VERSION=3.8
41
- DEEPCOIL_VERSION=2.0.2`. The env prefix declared in
42
- `manifest.toml` `[runtime]` is `.external_envs/deepcoil`; the manifest
43
- `env_prefix` and the wrapper's `DEEPCOIL_ENV_PREFIX` override agree.
43
+ DEEPCOIL_VERSION=2.0.2`. The `manifest.toml` `[runtime]` prefix names the
44
+ legacy checkout fallback; the installer and runner prefer the user data root.
44
45
 
45
46
  ## Usage
46
47
 
47
48
  ```bash
48
- DEEPCOIL_ENV_PREFIX="$PWD/.external_envs/deepcoil" \
49
49
  tools/DeepCoil/run -i in.fasta -out_path /tmp/dc_out -n_cpu 4
50
50
  tools/DeepCoil/run --check
51
51
  ```
@@ -58,4 +58,4 @@ DeepCoil sanitizes output filenames (alnum + `_`). Writes
58
58
  ## Attribution
59
59
 
60
60
  Reference the DeepCoil meta-server page / Ludwiczak et al. (2019) when
61
- publishing scores produced by this tool.
61
+ publishing scores produced by this tool.
@@ -15,4 +15,4 @@ description = "Writes per-accession '<safe_id>.out' tab-separated files (aa, cc,
15
15
 
16
16
  [install]
17
17
  command = "bash tools/DeepCoil/install.sh"
18
- hint = "DeepCoil has no upstream license (not redistributable). Build the isolated Python 3.8 conda env with deepcoil==2.0.2: bash tools/DeepCoil/install.sh (env at .external_envs/deepcoil; override with DEEPCOIL_ENV_PREFIX)."
18
+ hint = "DeepCoil has no upstream license (not redistributable). Install the isolated Python 3.8 env with deepcoil==2.0.2: bash tools/DeepCoil/install.sh (default: ~/.local/share/phasepred/envs/deepcoil; override with DEEPCOIL_ENV_PREFIX)."
@@ -43,8 +43,9 @@ bash tools/PScore/install.sh --check # verify predictor + DBS present
43
43
 
44
44
  ## Usage
45
45
 
46
- Run from anywhere; the wrapper `cd`s into `SourceCodeS2/` because the
47
- predictor reads `DBS/` relative to its own location:
46
+ Run from anywhere with relative or absolute FASTA and output paths. The wrapper
47
+ uses the installed user-data `SourceCodeS2/DBS/` when the checkout has no DBS,
48
+ then changes into `SourceCodeS2/` as required by the predictor:
48
49
 
49
50
  ```bash
50
51
  tools/PScore/run input.fasta -output pscore.tsv -overwrite -mute
@@ -62,4 +63,4 @@ Standard output: one `PScore: <value> >ACC` line per scored accession
62
63
 
63
64
  Carry the reference above and the CC-BY 4.0 notice. The archived
64
65
  `SourceCodeS2/README.txt` documents the original authors. Data derived from
65
- the upstream `DBS/` must be attributed to Vernon et al. (2018).
66
+ the upstream `DBS/` must be attributed to Vernon et al. (2018).
@@ -28,4 +28,4 @@ description = "One 'PScore: <value> >ACC' line per scored accession (via stdou
28
28
 
29
29
  [install]
30
30
  command = "bash tools/PScore/install.sh"
31
- hint = "PScore code is vendored (CC-BY 4.0, eLife 31486). Data (DBS) is gitignored: bash tools/PScore/install.sh --check verifies script + DBS."
31
+ hint = "PScore is unavailable. Install its code and DBS with: bash tools/PScore/install.sh (then verify: bash tools/PScore/install.sh --check)."
@@ -12,6 +12,27 @@ pkg_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
12
  src_dir="$pkg_dir/SourceCodeS2"
13
13
  script="$src_dir/elife_phase_separation_predictor.py"
14
14
 
15
+ # The installer writes DBS into the user data root, not the checkout. A
16
+ # checkout runner can use that complete installation when its local DBS is
17
+ # absent. An installed runner continues to use its adjacent SourceCodeS2.
18
+ if [[ ! -d "$src_dir/DBS" ]]; then
19
+ data_root=""
20
+ if [[ -n "${PHASEPRED_DATA_ROOT:-}" ]]; then
21
+ data_root="$PHASEPRED_DATA_ROOT"
22
+ elif [[ -n "${XDG_DATA_HOME:-}" ]]; then
23
+ data_root="$XDG_DATA_HOME/phasepred"
24
+ elif [[ -n "${HOME:-}" ]]; then
25
+ data_root="$HOME/.local/share/phasepred"
26
+ fi
27
+ if [[ -n "$data_root" ]]; then
28
+ installed_src="$data_root/pscore/SourceCodeS2"
29
+ if [[ -f "$installed_src/elife_phase_separation_predictor.py" && -d "$installed_src/DBS" ]]; then
30
+ src_dir="$(cd "$installed_src" && pwd -P)"
31
+ script="$src_dir/elife_phase_separation_predictor.py"
32
+ fi
33
+ fi
34
+ fi
35
+
15
36
  if [[ "${1:-}" == "--check" ]]; then
16
37
  if [[ ! -f "$script" ]]; then
17
38
  echo "PScore predictor script missing: $script" >&2
@@ -38,6 +59,10 @@ if [[ ! -f "$script" ]]; then
38
59
  echo "PScore predictor script missing: $script" >&2
39
60
  exit 1
40
61
  fi
62
+ if [[ ! -d "$src_dir/DBS" ]]; then
63
+ echo "PScore DBS data missing: $src_dir/DBS (gitignored). Install with: bash $pkg_dir/install.sh" >&2
64
+ exit 1
65
+ fi
41
66
 
42
67
  python_cmd=""
43
68
  for cand in "${PHASEPRED_PYTHON:-}" python3 python; do
@@ -52,5 +77,17 @@ if [[ -z "$python_cmd" ]]; then
52
77
  exit 1
53
78
  fi
54
79
 
80
+ # The predictor must run from SourceCodeS2 so its relative DBS path works.
81
+ # Resolve the caller's relative FASTA and -output paths before changing cwd.
82
+ args=("$@")
83
+ if [[ "${args[0]}" != /* ]]; then
84
+ args[0]="$PWD/${args[0]}"
85
+ fi
86
+ for ((i = 1; i < ${#args[@]} - 1; i++)); do
87
+ if [[ "${args[i]}" == "-output" && "${args[i+1]}" != /* ]]; then
88
+ args[i+1]="$PWD/${args[i+1]}"
89
+ fi
90
+ done
91
+
55
92
  cd "$src_dir"
56
- exec "$python_cmd" "$script" "$@"
93
+ exec "$python_cmd" "$script" "${args[@]}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phasepred
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Paper-faithful re-implementation of the PhaSePred phase-separation predictor (Chen et al. 2022, PNAS).
5
5
  Author: Tingting Li Lab, Department of Biochemistry and Molecular Biology, School of Basic Medical Sciences, Peking University
6
6
  License-Expression: MIT
@@ -22,7 +22,10 @@ from phasepred.tool_paths import ToolStatus, format_status_table
22
22
 
23
23
  pytestmark = pytest.mark.toolfree
24
24
 
25
- TOOLS_HINT = "Data (DBS) is gitignored: bash tools/PScore/install.sh --check verifies script + DBS."
25
+ TOOLS_HINT = (
26
+ "PScore is unavailable. Install its code and DBS with: bash tools/PScore/install.sh "
27
+ "(then verify: bash tools/PScore/install.sh --check)."
28
+ )
26
29
  PACKAGE_HINT = "Bundled with the phasepred wheel (deepphase_scores.tsv)."
27
30
 
28
31
 
@@ -57,6 +60,7 @@ def test_table_prints_install_hint_for_missing_rows_only() -> None:
57
60
 
58
61
  assert "Install hints:" in table
59
62
  assert "PScore: " + TOOLS_HINT in table
63
+ assert "bash tools/PScore/install.sh" in table
60
64
  # Reverse proof: an OK row's hint is not a remedy and must not be printed;
61
65
  # if the renderer dumped every hint (or the whole ToolStatus repr) this fails.
62
66
  assert "Build the vendored SEG binary." not in table
@@ -107,4 +111,4 @@ def test_table_has_no_hint_block_when_every_row_is_ok() -> None:
107
111
  table = format_status_table([_ok("Build the vendored SEG binary.")])
108
112
 
109
113
  assert "Install hints:" not in table
110
- assert "ships only in the GitHub repository" not in table
114
+ assert "ships only in the GitHub repository" not in table
@@ -21,9 +21,11 @@ from __future__ import annotations
21
21
 
22
22
  import hashlib
23
23
  import importlib
24
+ import json
24
25
  import os
25
26
  import shutil
26
27
  import subprocess
28
+ import sys
27
29
  import tomllib
28
30
  from pathlib import Path
29
31
 
@@ -184,3 +186,50 @@ def test_pscore_install_check_uses_installed_data_root(tmp_path: Path) -> None:
184
186
  assert result.returncode == 0, result.stdout + result.stderr
185
187
  assert f"PScore: ok ({target})" in result.stdout
186
188
  assert "DBS data missing" not in result.stderr
189
+
190
+
191
+ def test_checkout_pscore_run_uses_installed_dbs_and_caller_paths(tmp_path: Path) -> None:
192
+ pkg = tmp_path / "PScore"
193
+ pkg.mkdir()
194
+ shutil.copy2(TOOLS_ROOT / "PScore" / "run", pkg / "run")
195
+
196
+ root = tmp_path / "user-data"
197
+ source = root / "pscore" / "SourceCodeS2"
198
+ (source / "DBS").mkdir(parents=True)
199
+ (source / "elife_phase_separation_predictor.py").write_text(
200
+ "import json, os, sys\n"
201
+ "print(json.dumps({'cwd': os.getcwd(), 'args': sys.argv[1:], "
202
+ "'dbs': os.path.isdir('DBS')}))\n",
203
+ encoding="utf-8",
204
+ )
205
+ input_file = tmp_path / "input.fasta"
206
+ input_file.write_text(">test\nACDEFGHIKLMNPQRSTVWY\n", encoding="utf-8")
207
+
208
+ env = os.environ.copy()
209
+ env["PHASEPRED_DATA_ROOT"] = str(root)
210
+ env["PHASEPRED_PYTHON"] = sys.executable
211
+ check = subprocess.run(
212
+ [str(pkg / "run"), "--check"],
213
+ cwd=tmp_path, capture_output=True, text=True, timeout=60, env=env,
214
+ )
215
+ assert check.returncode == 0, check.stderr
216
+
217
+ result = subprocess.run(
218
+ [str(pkg / "run"), "input.fasta", "-output", "output.tsv", "-mute"],
219
+ cwd=tmp_path, capture_output=True, text=True, timeout=60, env=env,
220
+ )
221
+ assert result.returncode == 0, result.stderr
222
+ data = json.loads(result.stdout)
223
+ assert data == {
224
+ "cwd": str(source),
225
+ "args": [str(input_file), "-output", str(tmp_path / "output.tsv"), "-mute"],
226
+ "dbs": True,
227
+ }
228
+
229
+ env["PHASEPRED_DATA_ROOT"] = "user-data"
230
+ relative_root = subprocess.run(
231
+ [str(pkg / "run"), "input.fasta"],
232
+ cwd=tmp_path, capture_output=True, text=True, timeout=60, env=env,
233
+ )
234
+ assert relative_root.returncode == 0, relative_root.stderr
235
+ assert json.loads(relative_root.stdout)["args"] == [str(input_file)]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes