pheval 0.3.3__py3-none-any.whl → 0.3.4__py3-none-any.whl
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 pheval might be problematic. Click here for more details.
- pheval/cli.py +2 -0
- pheval/cli_pheval_utils.py +104 -0
- pheval/prepare/prepare_corpus.py +67 -0
- pheval/prepare/update_phenopacket.py +1 -2
- pheval/utils/phenopacket_utils.py +66 -6
- {pheval-0.3.3.dist-info → pheval-0.3.4.dist-info}/METADATA +1 -1
- {pheval-0.3.3.dist-info → pheval-0.3.4.dist-info}/RECORD +10 -9
- {pheval-0.3.3.dist-info → pheval-0.3.4.dist-info}/LICENSE +0 -0
- {pheval-0.3.3.dist-info → pheval-0.3.4.dist-info}/WHEEL +0 -0
- {pheval-0.3.3.dist-info → pheval-0.3.4.dist-info}/entry_points.txt +0 -0
pheval/cli.py
CHANGED
|
@@ -10,6 +10,7 @@ from .cli_pheval_utils import (
|
|
|
10
10
|
benchmark_comparison,
|
|
11
11
|
create_spiked_vcfs_command,
|
|
12
12
|
generate_stats_plot,
|
|
13
|
+
prepare_corpus_command,
|
|
13
14
|
scramble_phenopackets_command,
|
|
14
15
|
semsim_scramble_command,
|
|
15
16
|
semsim_to_exomiserdb_command,
|
|
@@ -60,6 +61,7 @@ pheval_utils.add_command(benchmark)
|
|
|
60
61
|
pheval_utils.add_command(benchmark_comparison)
|
|
61
62
|
pheval_utils.add_command(semsim_to_exomiserdb_command)
|
|
62
63
|
pheval_utils.add_command(generate_stats_plot)
|
|
64
|
+
pheval_utils.add_command(prepare_corpus_command)
|
|
63
65
|
|
|
64
66
|
if __name__ == "__main__":
|
|
65
67
|
main()
|
pheval/cli_pheval_utils.py
CHANGED
|
@@ -15,6 +15,7 @@ from pheval.analyse.run_data_parser import parse_run_data_text_file
|
|
|
15
15
|
from pheval.prepare.create_noisy_phenopackets import scramble_phenopackets
|
|
16
16
|
from pheval.prepare.create_spiked_vcf import spike_vcfs
|
|
17
17
|
from pheval.prepare.custom_exceptions import InputError, MutuallyExclusiveOptionError
|
|
18
|
+
from pheval.prepare.prepare_corpus import prepare_corpus
|
|
18
19
|
from pheval.prepare.update_phenopacket import update_phenopackets
|
|
19
20
|
from pheval.utils.exomiser import semsim_to_exomiserdb
|
|
20
21
|
from pheval.utils.semsim_utils import percentage_diff, semsim_heatmap_plot
|
|
@@ -606,3 +607,106 @@ def generate_stats_plot(
|
|
|
606
607
|
generate_plots_from_benchmark_summary_tsv(
|
|
607
608
|
benchmarking_tsv, gene_analysis, variant_analysis, disease_analysis, plot_type, title
|
|
608
609
|
)
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
@click.command("prepare-corpus")
|
|
613
|
+
@click.option(
|
|
614
|
+
"--phenopacket-dir",
|
|
615
|
+
"-p",
|
|
616
|
+
required=True,
|
|
617
|
+
metavar="PATH",
|
|
618
|
+
help="Path to phenopacket corpus directory..",
|
|
619
|
+
type=Path,
|
|
620
|
+
)
|
|
621
|
+
@click.option(
|
|
622
|
+
"--variant-analysis/--no-variant-analysis",
|
|
623
|
+
default=False,
|
|
624
|
+
required=False,
|
|
625
|
+
type=bool,
|
|
626
|
+
show_default=True,
|
|
627
|
+
help="Specify whether to check for complete variant records in the phenopackets.",
|
|
628
|
+
)
|
|
629
|
+
@click.option(
|
|
630
|
+
"--gene-analysis/--no-gene-analysis",
|
|
631
|
+
default=False,
|
|
632
|
+
required=False,
|
|
633
|
+
type=bool,
|
|
634
|
+
show_default=True,
|
|
635
|
+
help="Specify whether to check for complete gene records in the phenopackets.",
|
|
636
|
+
)
|
|
637
|
+
@click.option(
|
|
638
|
+
"--disease-analysis/--no-disease-analysis",
|
|
639
|
+
default=False,
|
|
640
|
+
required=False,
|
|
641
|
+
type=bool,
|
|
642
|
+
show_default=True,
|
|
643
|
+
help="Specify whether to check for complete disease records in the phenopackets.",
|
|
644
|
+
)
|
|
645
|
+
@click.option(
|
|
646
|
+
"--gene-identifier",
|
|
647
|
+
"-g",
|
|
648
|
+
required=False,
|
|
649
|
+
help="Gene identifier to update in phenopacket",
|
|
650
|
+
type=click.Choice(["ensembl_id", "entrez_id", "hgnc_id"]),
|
|
651
|
+
)
|
|
652
|
+
@click.option(
|
|
653
|
+
"--hg19-template-vcf",
|
|
654
|
+
"-hg19",
|
|
655
|
+
metavar="PATH",
|
|
656
|
+
required=False,
|
|
657
|
+
help="Template hg19 VCF file",
|
|
658
|
+
type=Path,
|
|
659
|
+
)
|
|
660
|
+
@click.option(
|
|
661
|
+
"--hg38-template-vcf",
|
|
662
|
+
"-hg38",
|
|
663
|
+
metavar="PATH",
|
|
664
|
+
required=False,
|
|
665
|
+
help="Template hg38 VCF file",
|
|
666
|
+
type=Path,
|
|
667
|
+
)
|
|
668
|
+
@click.option(
|
|
669
|
+
"--output-dir",
|
|
670
|
+
"-o",
|
|
671
|
+
metavar="PATH",
|
|
672
|
+
required=True,
|
|
673
|
+
help="Path to output prepared corpus.",
|
|
674
|
+
default="prepared_corpus",
|
|
675
|
+
type=Path,
|
|
676
|
+
)
|
|
677
|
+
def prepare_corpus_command(
|
|
678
|
+
phenopacket_dir: Path,
|
|
679
|
+
variant_analysis: bool,
|
|
680
|
+
gene_analysis: bool,
|
|
681
|
+
disease_analysis: bool,
|
|
682
|
+
gene_identifier: str,
|
|
683
|
+
hg19_template_vcf: Path,
|
|
684
|
+
hg38_template_vcf: Path,
|
|
685
|
+
output_dir: Path,
|
|
686
|
+
):
|
|
687
|
+
"""
|
|
688
|
+
Prepare a corpus of Phenopackets for analysis, optionally checking for complete variant records and updating
|
|
689
|
+
gene identifiers.
|
|
690
|
+
|
|
691
|
+
Args:
|
|
692
|
+
phenopacket_dir (Path): The path to the directory containing Phenopackets.
|
|
693
|
+
variant_analysis (bool): If True, check for complete variant records in the Phenopackets.
|
|
694
|
+
gene_analysis (bool): If True, check for complete gene records in the Phenopackets.
|
|
695
|
+
disease_analysis (bool): If True, check for complete disease records in the Phenopackets.
|
|
696
|
+
gene_identifier (str): Identifier for updating gene identifiers, if applicable.
|
|
697
|
+
hg19_template_vcf (Path): Path to the hg19 template VCF file (optional), to spike variants into
|
|
698
|
+
VCFs for variant-based analysis at least one of hg19_template_vcf or hg38_template_vcf is required.
|
|
699
|
+
hg38_template_vcf (Path): Path to the hg38 template VCF file (optional), to spike variants into
|
|
700
|
+
VCFs for variant-based analysis at least one of hg19_template_vcf or hg38_template_vcf is required.
|
|
701
|
+
output_dir (Path): The directory to save the prepared Phenopackets and, optionally, VCF files.
|
|
702
|
+
"""
|
|
703
|
+
prepare_corpus(
|
|
704
|
+
phenopacket_dir,
|
|
705
|
+
variant_analysis,
|
|
706
|
+
gene_analysis,
|
|
707
|
+
disease_analysis,
|
|
708
|
+
gene_identifier,
|
|
709
|
+
hg19_template_vcf,
|
|
710
|
+
hg38_template_vcf,
|
|
711
|
+
output_dir,
|
|
712
|
+
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from pheval.prepare.create_spiked_vcf import create_spiked_vcf
|
|
5
|
+
from pheval.prepare.update_phenopacket import create_updated_phenopacket
|
|
6
|
+
from pheval.utils.file_utils import all_files
|
|
7
|
+
from pheval.utils.phenopacket_utils import PhenopacketUtil, phenopacket_reader
|
|
8
|
+
|
|
9
|
+
info_log = logging.getLogger("info")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def prepare_corpus(
|
|
13
|
+
phenopacket_dir: Path,
|
|
14
|
+
variant_analysis: bool,
|
|
15
|
+
gene_analysis: bool,
|
|
16
|
+
disease_analysis: bool,
|
|
17
|
+
gene_identifier: str,
|
|
18
|
+
hg19_template_vcf: Path,
|
|
19
|
+
hg38_template_vcf: Path,
|
|
20
|
+
output_dir: Path,
|
|
21
|
+
) -> None:
|
|
22
|
+
"""
|
|
23
|
+
Prepare a corpus of Phenopackets for analysis, optionally checking for complete variant records and updating
|
|
24
|
+
gene identifiers.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
phenopacket_dir (Path): The path to the directory containing Phenopackets.
|
|
28
|
+
variant_analysis (bool): If True, check for complete variant records in the Phenopackets.
|
|
29
|
+
gene_analysis (bool): If True, check for complete gene records in the Phenopackets.
|
|
30
|
+
disease_analysis (bool): If True, check for complete disease records in the Phenopackets.
|
|
31
|
+
gene_identifier (str): Identifier for updating gene identifiers, if applicable.
|
|
32
|
+
hg19_template_vcf (Path): Path to the hg19 template VCF file (optional), to spike variants into
|
|
33
|
+
VCFs for variant-based analysis at least one of hg19_template_vcf or hg38_template_vcf is required.
|
|
34
|
+
hg38_template_vcf (Path): Path to the hg38 template VCF file (optional), to spike variants into
|
|
35
|
+
VCFs for variant-based analysis at least one of hg19_template_vcf or hg38_template_vcf is required.
|
|
36
|
+
output_dir (Path): The directory to save the prepared Phenopackets and, optionally, VCF files.
|
|
37
|
+
"""
|
|
38
|
+
output_dir.joinpath("phenopackets").mkdir(exist_ok=True, parents=True)
|
|
39
|
+
for phenopacket_path in all_files(phenopacket_dir):
|
|
40
|
+
phenopacket_util = PhenopacketUtil(phenopacket_reader(phenopacket_path))
|
|
41
|
+
if variant_analysis:
|
|
42
|
+
if phenopacket_util.check_incomplete_variant_record():
|
|
43
|
+
info_log.warning(
|
|
44
|
+
f"Removed {phenopacket_path.name} from the corpus due to missing variant fields."
|
|
45
|
+
)
|
|
46
|
+
continue
|
|
47
|
+
if gene_analysis:
|
|
48
|
+
if phenopacket_util.check_incomplete_gene_record():
|
|
49
|
+
info_log.warning(
|
|
50
|
+
f"Removed {phenopacket_path.name} from the corpus due to missing gene fields."
|
|
51
|
+
)
|
|
52
|
+
continue
|
|
53
|
+
if disease_analysis:
|
|
54
|
+
if phenopacket_util.check_incomplete_disease_record():
|
|
55
|
+
info_log.warning(
|
|
56
|
+
f"Removed {phenopacket_path.name} from the corpus due to missing disease fields."
|
|
57
|
+
)
|
|
58
|
+
continue
|
|
59
|
+
if gene_identifier:
|
|
60
|
+
create_updated_phenopacket(
|
|
61
|
+
gene_identifier, phenopacket_path, output_dir.joinpath("phenopackets")
|
|
62
|
+
)
|
|
63
|
+
if hg19_template_vcf or hg38_template_vcf:
|
|
64
|
+
output_dir.joinpath("vcf").mkdir(exist_ok=True)
|
|
65
|
+
create_spiked_vcf(
|
|
66
|
+
output_dir.joinpath("vcf"), phenopacket_path, hg19_template_vcf, hg38_template_vcf
|
|
67
|
+
)
|
|
@@ -38,8 +38,7 @@ def update_outdated_gene_context(
|
|
|
38
38
|
interpretations = PhenopacketUtil(phenopacket).interpretations()
|
|
39
39
|
updated_interpretations = GeneIdentifierUpdater(
|
|
40
40
|
hgnc_data=hgnc_data, gene_identifier=gene_identifier
|
|
41
|
-
).update_genomic_interpretations_gene_identifier(interpretations)
|
|
42
|
-
|
|
41
|
+
).update_genomic_interpretations_gene_identifier(interpretations, phenopacket_path)
|
|
43
42
|
return PhenopacketRebuilder(phenopacket).update_interpretations(updated_interpretations)
|
|
44
43
|
|
|
45
44
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
-
|
|
3
|
-
# import logging
|
|
2
|
+
import logging
|
|
4
3
|
import os
|
|
5
4
|
from collections import defaultdict
|
|
6
5
|
from copy import copy
|
|
@@ -22,6 +21,8 @@ from phenopackets import (
|
|
|
22
21
|
|
|
23
22
|
from pheval.prepare.custom_exceptions import IncorrectFileFormatError
|
|
24
23
|
|
|
24
|
+
info_log = logging.getLogger("info")
|
|
25
|
+
|
|
25
26
|
|
|
26
27
|
class IncompatibleGenomeAssemblyError(Exception):
|
|
27
28
|
"""Exception raised for incompatible genome assembly."""
|
|
@@ -477,6 +478,59 @@ class PhenopacketUtil:
|
|
|
477
478
|
variants.append(variant)
|
|
478
479
|
return variants
|
|
479
480
|
|
|
481
|
+
def check_incomplete_variant_record(self) -> bool:
|
|
482
|
+
"""
|
|
483
|
+
Check if any variant record in the phenopacket has incomplete information.
|
|
484
|
+
|
|
485
|
+
This method iterates through the diagnosed variant records and checks if any of them
|
|
486
|
+
have missing or incomplete information such as empty chromosome, position, reference,
|
|
487
|
+
or alternate allele.
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
bool: True if any variant record is incomplete, False otherwise.
|
|
491
|
+
"""
|
|
492
|
+
variants = self.diagnosed_variants()
|
|
493
|
+
for variant in variants:
|
|
494
|
+
if (
|
|
495
|
+
variant.chrom == ""
|
|
496
|
+
or variant.pos == 0
|
|
497
|
+
or variant.pos == ""
|
|
498
|
+
or variant.ref == ""
|
|
499
|
+
or variant.alt == ""
|
|
500
|
+
):
|
|
501
|
+
return True
|
|
502
|
+
return False
|
|
503
|
+
|
|
504
|
+
def check_incomplete_gene_record(self) -> bool:
|
|
505
|
+
"""
|
|
506
|
+
Check if any gene record in the phenopacket has incomplete information.
|
|
507
|
+
|
|
508
|
+
This method iterates through the diagnosed gene records and checks if any of them
|
|
509
|
+
have missing or incomplete information such as gene name, or gene identifier.
|
|
510
|
+
|
|
511
|
+
Returns:
|
|
512
|
+
bool: True if any gene record is incomplete, False otherwise.
|
|
513
|
+
"""
|
|
514
|
+
genes = self.diagnosed_genes()
|
|
515
|
+
for gene in genes:
|
|
516
|
+
if gene.gene_symbol == "" or gene.gene_identifier == "":
|
|
517
|
+
return True
|
|
518
|
+
return False
|
|
519
|
+
|
|
520
|
+
def check_incomplete_disease_record(self) -> bool:
|
|
521
|
+
"""
|
|
522
|
+
Check if any disease record in the phenopacket has incomplete information.
|
|
523
|
+
|
|
524
|
+
This method iterates through the diagnosed disease records and checks if any of them
|
|
525
|
+
have missing or incomplete information such as empty disease name, or disease identifier.
|
|
526
|
+
|
|
527
|
+
Returns:
|
|
528
|
+
bool: True if any disease record is incomplete, False otherwise.
|
|
529
|
+
"""
|
|
530
|
+
if len(self.diagnoses()) == 0:
|
|
531
|
+
return True
|
|
532
|
+
return False
|
|
533
|
+
|
|
480
534
|
|
|
481
535
|
class PhenopacketRebuilder:
|
|
482
536
|
"""Class for rebuilding a Phenopacket"""
|
|
@@ -655,7 +709,7 @@ class GeneIdentifierUpdater:
|
|
|
655
709
|
]
|
|
656
710
|
|
|
657
711
|
def update_genomic_interpretations_gene_identifier(
|
|
658
|
-
self, interpretations: List[Interpretation]
|
|
712
|
+
self, interpretations: List[Interpretation], phenopacket_path: Path
|
|
659
713
|
) -> List[Interpretation]:
|
|
660
714
|
"""
|
|
661
715
|
Update the genomic interpretations of a Phenopacket.
|
|
@@ -669,10 +723,16 @@ class GeneIdentifierUpdater:
|
|
|
669
723
|
updated_interpretations = copy(list(interpretations))
|
|
670
724
|
for updated_interpretation in updated_interpretations:
|
|
671
725
|
for g in updated_interpretation.diagnosis.genomic_interpretations:
|
|
726
|
+
updated_gene_identifier = self.find_identifier(
|
|
727
|
+
g.variant_interpretation.variation_descriptor.gene_context.symbol
|
|
728
|
+
)
|
|
729
|
+
info_log.info(
|
|
730
|
+
f"Updating gene identifier in {phenopacket_path} from "
|
|
731
|
+
f"{g.variant_interpretation.variation_descriptor.gene_context.value_id}"
|
|
732
|
+
f"to {updated_gene_identifier}"
|
|
733
|
+
)
|
|
672
734
|
g.variant_interpretation.variation_descriptor.gene_context.value_id = (
|
|
673
|
-
|
|
674
|
-
g.variant_interpretation.variation_descriptor.gene_context.symbol
|
|
675
|
-
)
|
|
735
|
+
updated_gene_identifier
|
|
676
736
|
)
|
|
677
737
|
del g.variant_interpretation.variation_descriptor.gene_context.alternate_ids[:]
|
|
678
738
|
g.variant_interpretation.variation_descriptor.gene_context.alternate_ids.extend(
|
|
@@ -15,9 +15,9 @@ pheval/analyse/prioritisation_result_types.py,sha256=qJoB6O-lFYmzAMcTQeDJZQNLJ6h
|
|
|
15
15
|
pheval/analyse/rank_stats.py,sha256=knj1tsKrly17QgtOUVpqA14UjbO99N3ydkWN4xU6c2k,15785
|
|
16
16
|
pheval/analyse/run_data_parser.py,sha256=HzBKsJL2skjmrRZdrF3VYzswtKNgbX6U5qhY_kqq9mA,1552
|
|
17
17
|
pheval/analyse/variant_prioritisation_analysis.py,sha256=ApmUeTW0cl_BPh7LusbApxtgjEXEkhuNFyh0DxKKpgU,12384
|
|
18
|
-
pheval/cli.py,sha256=
|
|
18
|
+
pheval/cli.py,sha256=X4tDi7e3VB3v2RawkqIbfv4SFPCBuQwMXMnYCPTGtIo,1570
|
|
19
19
|
pheval/cli_pheval.py,sha256=fWbKUcPTZZSa1EJEtH_lNn1XE6qRApRHihqUZS5owrA,2424
|
|
20
|
-
pheval/cli_pheval_utils.py,sha256=
|
|
20
|
+
pheval/cli_pheval_utils.py,sha256=kySsSa7NyewwVwYBMu93y8l5_qSJaVkdXklGchcXExU,20504
|
|
21
21
|
pheval/config_parser.py,sha256=lh-Dy_FflXJUnRC3HYaEdSvPAsNZWQZlEr1hHQigrTM,1227
|
|
22
22
|
pheval/constants.py,sha256=TWBgWOc05FGXFu63fs-hEHS2IJkLLAPHtMppiWBfBOg,349
|
|
23
23
|
pheval/implementations/__init__.py,sha256=BMUTotjTdgy5j5xubWCIQgRXrSQ1ZIcjooer7r299Zo,1228
|
|
@@ -29,7 +29,8 @@ pheval/prepare/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
29
29
|
pheval/prepare/create_noisy_phenopackets.py,sha256=UbBRWDD95BFHPv03VYx04v35AGwJ9ynLltYKqQJHbZ0,11236
|
|
30
30
|
pheval/prepare/create_spiked_vcf.py,sha256=KZIyjtDDTqJj3hxL3u4YP6P0toA4RN1oPeDrzLMB2z4,20235
|
|
31
31
|
pheval/prepare/custom_exceptions.py,sha256=_G3_95dPtHIs1SviYBV1j7cYc-hxlhuw8hhnYdzByYY,1719
|
|
32
|
-
pheval/prepare/
|
|
32
|
+
pheval/prepare/prepare_corpus.py,sha256=q9sCTfpzEHeJpzo0nNc8WhdZPeXq_bm_udQaLCAbAJI,3187
|
|
33
|
+
pheval/prepare/update_phenopacket.py,sha256=21fzUPbwKN6Ey5TSh9PFzjT2x86U19RAE6WmkjG8u28,4770
|
|
33
34
|
pheval/resources/alternate_ouputs/CADA_results.txt,sha256=Rinn2TtfwFNsx0aEWegKJOkjKnBm-Mf54gdaT3bWP0k,547
|
|
34
35
|
pheval/resources/alternate_ouputs/DeepPVP_results.txt,sha256=MF9MZJYa4r4PEvFzALpi-lNGLxjENOnq_YgrgFMn-oQ,1508
|
|
35
36
|
pheval/resources/alternate_ouputs/OVA_results.txt,sha256=_5XFCR4W04D-W7DObpALLsa0-693g2kiIUB_uo79aHk,9845
|
|
@@ -46,11 +47,11 @@ pheval/utils/docs_gen.py,sha256=6FGtHicBC0rZKi0tdL3Epsg8d4osE44I9f1Ga0j4JLA,3193
|
|
|
46
47
|
pheval/utils/docs_gen.sh,sha256=LyKLKjaZuf4UJ962CWfM-XqkxtvM8O2N9wHZS5mcb9A,477
|
|
47
48
|
pheval/utils/exomiser.py,sha256=m2u0PH2z9lFPaB3LVkZCmPmH5e55q1NoTzNl46zRRP8,683
|
|
48
49
|
pheval/utils/file_utils.py,sha256=9HoCmtF73D3wY6bBhFLefMBI5uhvCe_meZeHXQzF_ts,4640
|
|
49
|
-
pheval/utils/phenopacket_utils.py,sha256=
|
|
50
|
+
pheval/utils/phenopacket_utils.py,sha256=4inrnhZ4UjYgO0Y85ls_Nxq6voAIIXQV57_fMeIX-24,26792
|
|
50
51
|
pheval/utils/semsim_utils.py,sha256=s7ZCR2VfPYnOh7ApX6rv66eGoVSm9QJaVYOWBEhlXpo,6151
|
|
51
52
|
pheval/utils/utils.py,sha256=9V6vCT8l1g4O2-ZATYqsVyd7AYZdWGd-Ksy7_oIC3eE,2343
|
|
52
|
-
pheval-0.3.
|
|
53
|
-
pheval-0.3.
|
|
54
|
-
pheval-0.3.
|
|
55
|
-
pheval-0.3.
|
|
56
|
-
pheval-0.3.
|
|
53
|
+
pheval-0.3.4.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
54
|
+
pheval-0.3.4.dist-info/METADATA,sha256=pG569TPPJkj7dQ6C-SmMXRBRN-B2aw7hWSoMoa5k-0E,1810
|
|
55
|
+
pheval-0.3.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
56
|
+
pheval-0.3.4.dist-info/entry_points.txt,sha256=o9gSwDkvT4-lqKy4mlsftd1nzP9WUOXQCfnbqycURd0,81
|
|
57
|
+
pheval-0.3.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|