biocypher 0.5.28__tar.gz → 0.5.31__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 biocypher might be problematic. Click here for more details.

Files changed (25) hide show
  1. {biocypher-0.5.28 → biocypher-0.5.31}/PKG-INFO +1 -1
  2. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/biocypher_config.yaml +8 -8
  3. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_core.py +1 -1
  4. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_logger.py +25 -17
  5. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_mapping.py +1 -1
  6. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_metadata.py +1 -1
  7. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_ontology.py +18 -12
  8. {biocypher-0.5.28 → biocypher-0.5.31}/pyproject.toml +1 -1
  9. biocypher-0.5.28/setup.py +0 -40
  10. {biocypher-0.5.28 → biocypher-0.5.31}/LICENSE +0 -0
  11. {biocypher-0.5.28 → biocypher-0.5.31}/README.md +0 -0
  12. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/__init__.py +0 -0
  13. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/__init__.py +0 -0
  14. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/test_config.yaml +0 -0
  15. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/test_schema_config.yaml +0 -0
  16. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/test_schema_config_disconnected.yaml +0 -0
  17. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_config/test_schema_config_extended.yaml +0 -0
  18. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_connect.py +0 -0
  19. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_create.py +0 -0
  20. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_deduplicate.py +0 -0
  21. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_get.py +0 -0
  22. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_misc.py +0 -0
  23. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_pandas.py +0 -0
  24. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_translate.py +0 -0
  25. {biocypher-0.5.28 → biocypher-0.5.31}/biocypher/_write.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: biocypher
3
- Version: 0.5.28
3
+ Version: 0.5.31
4
4
  Summary: A unifying framework for biomedical research knowledge graphs
5
5
  Home-page: https://github.com/biocypher/biocypher
6
6
  License: MIT
@@ -30,21 +30,21 @@ biocypher:
30
30
  root_node: entity
31
31
 
32
32
  ### Optional parameters ###
33
- ## Logging granularity
34
- ## Set debug to true if more granular logging is desired
35
33
 
36
- debug: true
34
+ ## Logging
35
+ # Write log to disk
36
+ log_to_disk: true
37
37
 
38
- ## Set to change the log directory
38
+ # Activate more granular logging
39
+ debug: true
39
40
 
41
+ # Change the log directory
40
42
  # log_directory: biocypher-log
41
43
 
42
- ## Set to change the output directory
43
-
44
+ ## Data output directory
44
45
  # output_directory: biocypher-out
45
46
 
46
- ## Set to change the cache directory
47
-
47
+ ## Resource cache directory
48
48
  # cache_directory: .cache
49
49
 
50
50
  ## Optional tail ontologies
@@ -181,7 +181,7 @@ class BioCypher:
181
181
  """
182
182
 
183
183
  if not self._schema_config_path:
184
- return None
184
+ self._ontology_mapping = OntologyMapping()
185
185
 
186
186
  if not self._ontology_mapping:
187
187
  self._ontology_mapping = OntologyMapping(
@@ -60,11 +60,27 @@ def get_logger(name: str = "biocypher") -> logging.Logger:
60
60
  now = datetime.now()
61
61
  date_time = now.strftime("%Y%m%d-%H%M%S")
62
62
 
63
- logdir = (
64
- _config.config("biocypher").get("log_directory") or "biocypher-log"
65
- )
66
- os.makedirs(logdir, exist_ok=True)
67
- logfile = os.path.join(logdir, f"biocypher-{date_time}.log")
63
+ log_to_disk = _config.config("biocypher").get("log_to_disk")
64
+
65
+ if log_to_disk:
66
+ logdir = (
67
+ _config.config("biocypher").get("log_directory")
68
+ or "biocypher-log"
69
+ )
70
+ os.makedirs(logdir, exist_ok=True)
71
+ logfile = os.path.join(logdir, f"biocypher-{date_time}.log")
72
+
73
+ # file handler
74
+ file_handler = logging.FileHandler(logfile)
75
+
76
+ if _config.config("biocypher").get("debug"):
77
+ file_handler.setLevel(logging.DEBUG)
78
+ else:
79
+ file_handler.setLevel(logging.INFO)
80
+
81
+ file_handler.setFormatter(file_formatter)
82
+
83
+ logger.addHandler(file_handler)
68
84
 
69
85
  # handlers
70
86
  # stream handler
@@ -72,23 +88,15 @@ def get_logger(name: str = "biocypher") -> logging.Logger:
72
88
  stdout_handler.setLevel(logging.INFO)
73
89
  stdout_handler.setFormatter(stdout_formatter)
74
90
 
75
- # file handler
76
- file_handler = logging.FileHandler(logfile)
77
-
78
- if _config.config("biocypher").get("debug"):
79
- file_handler.setLevel(logging.DEBUG)
80
- else:
81
- file_handler.setLevel(logging.INFO)
82
-
83
- file_handler.setFormatter(file_formatter)
84
-
85
91
  # add handlers
86
- logger.addHandler(file_handler)
87
92
  logger.addHandler(stdout_handler)
88
93
 
89
94
  # startup message
90
95
  logger.info(f"This is BioCypher v{__version__}.")
91
- logger.info(f"Logging into `{logfile}`.")
96
+ if log_to_disk:
97
+ logger.info(f"Logging into `{logfile}`.")
98
+ else:
99
+ logger.info("Logging into stdout.")
92
100
 
93
101
  return logging.getLogger(name)
94
102
 
@@ -40,7 +40,7 @@ class OntologyMapping:
40
40
  Read the configuration file and store the ontology mapping and extensions.
41
41
  """
42
42
  if config_file is None:
43
- schema_config = _config.module_data("schema_config")
43
+ schema_config = {}
44
44
 
45
45
  # load yaml file from web
46
46
  elif config_file.startswith("http"):
@@ -19,7 +19,7 @@ import importlib.metadata
19
19
 
20
20
  import toml
21
21
 
22
- _VERSION = "0.5.28"
22
+ _VERSION = "0.5.31"
23
23
 
24
24
 
25
25
  def get_metadata():
@@ -96,16 +96,7 @@ class OntologyAdapter:
96
96
  )
97
97
 
98
98
  def _rdf_to_nx(self, g, root_label, switch_id_and_label=True):
99
- # Loop through all labels in the ontology
100
- for s, _, o in g.triples((None, rdflib.RDFS.label, None)):
101
- # If the label is the root label, set the root node to the subject of the label
102
- if o.eq(root_label):
103
- root = s
104
- break
105
- else:
106
- raise ValueError(
107
- f"Could not find root node with label {root_label}"
108
- )
99
+ root = self._find_root_label(g, root_label)
109
100
 
110
101
  # Create a directed graph to represent the ontology as a tree
111
102
  G = nx.DiGraph()
@@ -177,6 +168,21 @@ class OntologyAdapter:
177
168
 
178
169
  return G
179
170
 
171
+ def _find_root_label(self, g, root_label):
172
+ # Loop through all labels in the ontology
173
+ for label_subject, _, label_in_ontology in g.triples(
174
+ (None, rdflib.RDFS.label, None)
175
+ ):
176
+ # If the label is the root label, set the root node to the label's subject
177
+ if str(label_in_ontology) == root_label:
178
+ root = label_subject
179
+ break
180
+ else:
181
+ raise ValueError(
182
+ f"Could not find root node with label {root_label}"
183
+ )
184
+ return root
185
+
180
186
  def _remove_prefix(self, uri: str) -> str:
181
187
  """
182
188
  Remove the prefix of a URI. URIs can contain either "#" or "/" as a
@@ -565,7 +571,7 @@ class Ontology:
565
571
  else:
566
572
  msg = f"Showing ontology structure based on {len(self._tail_ontology_meta)+1} ontologies: "
567
573
 
568
- print(msg)
574
+ logger.info(msg)
569
575
 
570
576
  if not full:
571
577
  # set of leaves and their intermediate parents up to the root
@@ -594,7 +600,7 @@ class Ontology:
594
600
  f"{self.mapping.extended_schema[node].get('synonym_for')}"
595
601
  )
596
602
 
597
- tree.show()
603
+ logger.info(f"\n{tree}")
598
604
 
599
605
  return tree
600
606
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "biocypher"
3
- version = "0.5.28"
3
+ version = "0.5.31"
4
4
  description = "A unifying framework for biomedical research knowledge graphs"
5
5
  authors = [
6
6
  "Sebastian Lobentanzer <sebastian.lobentanzer@gmail.com>",
biocypher-0.5.28/setup.py DELETED
@@ -1,40 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- from setuptools import setup
3
-
4
- packages = \
5
- ['biocypher', 'biocypher._config']
6
-
7
- package_data = \
8
- {'': ['*']}
9
-
10
- install_requires = \
11
- ['PyYAML>=5.0',
12
- 'appdirs',
13
- 'more_itertools',
14
- 'neo4j-utils==0.0.7',
15
- 'networkx>=3.0,<4.0',
16
- 'pandas>=2.0.1,<3.0.0',
17
- 'pooch>=1.7.0,<2.0.0',
18
- 'rdflib>=6.2.0,<7.0.0',
19
- 'stringcase>=1.2.0,<2.0.0',
20
- 'tqdm>=4.65.0,<5.0.0',
21
- 'treelib==1.6.4']
22
-
23
- setup_kwargs = {
24
- 'name': 'biocypher',
25
- 'version': '0.5.28',
26
- 'description': 'A unifying framework for biomedical research knowledge graphs',
27
- 'long_description': '# BioCypher\n\n| | | | |\n| --- | --- | --- | --- |\n| __License__ | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) | __Python__ | [![Python](https://img.shields.io/pypi/pyversions/biocypher)](https://www.python.org) |\n| __Package__ | [![PyPI version](https://img.shields.io/pypi/v/biocypher)](https://pypi.org/project/biocypher/) [![Downloads](https://static.pepy.tech/badge/biocypher)](https://pepy.tech/project/biocypher) | __Build status__ | [![CI](https://github.com/biocypher/biocypher/actions/workflows/tests_and_code_quality.yaml/badge.svg)](https://github.com/biocypher/biocypher/actions/workflows/tests_and_code_quality.yaml) [![Docs build](https://github.com/biocypher/biocypher/actions/workflows/docs.yaml/badge.svg)](https://github.com/biocypher/biocypher/actions/workflows/docs.yaml) |\n| __Tests__ | [![Coverage](https://raw.githubusercontent.com/biocypher/biocypher/coverage/coverage.svg)](https://github.com/biocypher/biocypher/actions/workflows/tests_and_code_quality.yaml) | __Docker__ | [![Latest image](https://img.shields.io/docker/v/biocypher/base)](https://hub.docker.com/repository/docker/biocypher/base/general) [![Image size](https://img.shields.io/docker/image-size/biocypher/base/latest)](https://hub.docker.com/repository/docker/biocypher/base/general) |\n| __Development__ | [![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit) [![Code style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://black.readthedocs.io/en/stable/) | __Contributions__ | [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CONTRIBUTING.md) [![Powered by the Bioregistry](https://img.shields.io/static/v1?label=Powered%20by&message=Bioregistry&color=BA274A&style=flat&logo=image/png;base64,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)](https://github.com/biopragmatics/bioregistry) |\n\n\n\n\n## ❓ Description\nKnowledge graphs (KGs) are an [approach to knowledge\nrepresentation](https://en.wikipedia.org/wiki/Knowledge_graph) that uses graph\nstructure to facilitate exploration and analysis of complex data, often\nleveraging semantic information. They are popular in many research areas,\nincluding the life sciences, due to their versatile use, for instance in data\nstorage, integration, reasoning, and more recently in artificial intelligence.\nThe creation of KGs is a complex task; BioCypher helps you in creating and\nmaintaining your own KG. For more overview, usage notes, and a tutorial, read\nthe docs [here](https://biocypher.org).\n\n<img\n style="display: block;\n margin-left: auto;\n margin-right: auto;\n width: 70%;"\n src="docs/graphical_abstract.png"\n alt="Graphical Abstract">\n</img>\n\n## 📖 Documentation\nTutorial and developer docs at https://biocypher.org. For a quickstart into your\nown pipeline, you can refer to our [project\ntemplate](https://github.com/biocypher/project-template), and for an overview of\nexisting and planned adapters for resources and outputs, as well as other\nfeatures, visit our [GitHub Project\nBoard](https://github.com/orgs/biocypher/projects/3/views/2).\n\n## ⚙️ Installation / Usage\nInstall the package from PyPI using `pip install biocypher`. More comprehensive\ninstallation and configuration instructions can be found\n[here](https://biocypher.org/installation.html).\n\nExemplary usage of BioCypher to build a graph database is shown in our tutorial\nand the various pipelines we have created. You can find these on the [Components\nProject Board](https://github.com/orgs/biocypher/projects/3/views/2).\n\n## 🤝 Getting involved\nWe are very happy about contributions from the community, large and small!\nIf you would like to contribute to BioCypher development, please refer to\nour [contribution guidelines](CONTRIBUTING.md). :)\n\nIf you want to ask informal questions, talk about dev things, or just chat,\nplease join our community at https://biocypher.zulipchat.com!\n\n> **Imposter syndrome disclaimer:** We want your help. No, really. There may be a little voice inside your head that is telling you that you\'re not ready, that you aren\'t skilled enough to contribute. We assure you that the little voice in your head is wrong. Most importantly, there are many valuable ways to contribute besides writing code.\n>\n> This disclaimer was adapted from the [Pooch](https://github.com/fatiando/pooch) project.\n\n## ✍️ Citation\nThe BioCypher paper has been peer-reviewed in\n[Nature Biotechnology](https://www.nature.com/articles/s41587-023-01848-y).\nBefore, it was available as a preprint at https://arxiv.org/abs/2212.13543.\n\n## Acknowledgements\nThis project has received funding from the European Union’s Horizon 2020\nresearch and innovation programme under grant agreement No 965193 for DECIDER\nand No 116030 for TransQST.\n',
28
- 'author': 'Sebastian Lobentanzer',
29
- 'author_email': 'sebastian.lobentanzer@gmail.com',
30
- 'maintainer': 'None',
31
- 'maintainer_email': 'None',
32
- 'url': 'https://github.com/biocypher/biocypher',
33
- 'packages': packages,
34
- 'package_data': package_data,
35
- 'install_requires': install_requires,
36
- 'python_requires': '>=3.9,<4.0',
37
- }
38
-
39
-
40
- setup(**setup_kwargs)
File without changes
File without changes
File without changes