From b1d67d690364b29d0012d485dc4143bcbd5a590b Mon Sep 17 00:00:00 2001 From: Sandro Loch Date: Fri, 9 Feb 2024 15:46:37 -0300 Subject: [PATCH] feat: Improve docker services (#2) --- .makim.yaml | 8 + containers/compose.yaml | 28 +- ...st_Elasticsearch_4_BiorXiv_2024_JSON.ipynb | 1068 +++++++++++++++++ poetry.lock | 703 +++++++++-- pyproject.toml | 1 + 5 files changed, 1711 insertions(+), 97 deletions(-) create mode 100644 docs/notebooks/Test_Elasticsearch_4_BiorXiv_2024_JSON.ipynb diff --git a/.makim.yaml b/.makim.yaml index e65b4e5..9817f72 100644 --- a/.makim.yaml +++ b/.makim.yaml @@ -1,5 +1,13 @@ version: 1.0 groups: + develop: + targets: + gen-certs: + help: Generate and copy certs + run: | + mkdir -p containers/esconfig/certs + docker cp es:/usr/share/elasticsearch/config/certs/http_ca.crt ./containers/esconfig/certs/ + curl --cacert ./containers/esconfig/certs/http_ca.crt -u elastic:worksfine https://es:9200/ clean: targets: all: diff --git a/containers/compose.yaml b/containers/compose.yaml index bdd851a..253ded2 100644 --- a/containers/compose.yaml +++ b/containers/compose.yaml @@ -1,10 +1,30 @@ -version: '3' +version: "3.9" + services: es: hostname: es + container_name: es image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0 + user: "1000:1000" # Set the UID:GID to run the container environment: - discovery.type=single-node + - node.name=es + - ELASTIC_PASSWORD=worksfine + - bootstrap.memory_lock=true + # - xpack.security.enabled=true + # - xpack.security.http.ssl.enabled=true + # - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/es/elastic-certificates.key + # - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/es/elastic-certificates.crt + # - xpack.security.http.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt + ports: + - 9200:9200 + expose: + - 9200 + networks: + - elastic + healthcheck: + test: ["CMD-SHELL", "curl -s -k https://localhost:9200 | grep -q 'missing authentication credentials'"] + app: build: context: .. @@ -13,3 +33,9 @@ services: - "5000:5000" depends_on: - es + networks: + - elastic + +networks: + elastic: + driver: bridge diff --git a/docs/notebooks/Test_Elasticsearch_4_BiorXiv_2024_JSON.ipynb b/docs/notebooks/Test_Elasticsearch_4_BiorXiv_2024_JSON.ipynb new file mode 100644 index 0000000..55615c0 --- /dev/null +++ b/docs/notebooks/Test_Elasticsearch_4_BiorXiv_2024_JSON.ipynb @@ -0,0 +1,1068 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7bc4bad6-861f-45cd-b532-e33c7ec59c42", + "metadata": {}, + "source": [ + "# Advanced Querying Techniques in Elasticsearch for BiorXiv Data Analysis" + ] + }, + { + "cell_type": "markdown", + "id": "ca714fcb-2565-4dc6-8ad4-b6dac4bec88a", + "metadata": {}, + "source": [ + "Elasticsearch, renowned for its speed and scalability, is an indispensable tool for data scientists and researchers working with large datasets like those from BiorXiv. BiorXiv provides a rich corpus of preprint publications in the life sciences, offering a wealth of data for analysis. In this guide, we delve into sophisticated querying techniques to extract meaningful insights from BiorXiv data using Elasticsearch. We'll explore everything from basic keyword searches to complex aggregations and filters." + ] + }, + { + "cell_type": "markdown", + "id": "57942729-500c-4e45-8d13-ef610eaf1dbf", + "metadata": {}, + "source": [ + "### Establishing a Secure Connection to Elasticsearch" + ] + }, + { + "cell_type": "markdown", + "id": "c5567d6f-2f83-4c25-99e0-0846966dc69b", + "metadata": {}, + "source": [ + "\n", + "Establishing a secure connection to your Elasticsearch cluster is paramount. This ensures that your data interactions are encrypted and protected. Here’s a brief refresher on setting up a secure connection:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a76637ec-6312-45e7-aee5-e89be9a4b18e", + "metadata": {}, + "outputs": [], + "source": [ + "import ssl\n", + "import json\n", + "from elasticsearch import Elasticsearch\n", + "from typing import List, Dict, Any\n", + " \n", + "\n", + "# Path to the CA certificate\n", + "ca_cert_path = '/workspace/repos/osl/rxiv-restapi/containers/esconfig/certs/http_ca.crt'\n", + "# Create an SSL context\n", + "ssl_context = ssl.create_default_context(cafile=ca_cert_path)\n", + "# Create a connection to Elasticsearch with authentication and SSL context\n", + "es = Elasticsearch(\n", + " [\"https://es:9200\"],\n", + " basic_auth=(\"elastic\", \"worksfine\"),\n", + " ssl_context=ssl_context\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d3e9203a-5988-409b-ae62-8c1c8d3f6e6a", + "metadata": {}, + "source": [ + "### Index JSON Data into Elasticsearch\n", + "**Before we can search, you must have the data indexed in Elasticsearch.** \n", + "**Here's a simplified function to read the JSON file and index its contents.** \n", + "**This example assumes that your JSON data is an array of objects, each representing a document to be indexed.**" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5e6d3258-5682-41e7-b3b6-c406bb9bd8d0", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def index_json_data(es: Elasticsearch, file_path: str, index_name: str) -> None:\n", + " \"\"\"\n", + " Reads data from a JSON file and indexes it into Elasticsearch.\n", + "\n", + " Parameters:\n", + " es (Elasticsearch): An Elasticsearch client instance.\n", + " file_path (str): The path to the JSON file.\n", + " index_name (str): The name of the Elasticsearch index where data will be stored.\n", + " \"\"\"\n", + " # Load JSON data from the file\n", + " with open(file_path, 'r', encoding='utf-8') as file:\n", + " data = json.load(file)\n", + "\n", + " # Assuming `data` is a list of documents\n", + " for doc in data:\n", + " # Index each document\n", + " res = es.index(index=index_name, document=doc)\n", + " # print(res['result'])\n" + ] + }, + { + "cell_type": "markdown", + "id": "46318043-4de4-4dc2-9edd-21f93c56e11f", + "metadata": {}, + "source": [ + "### Indexing Data into Elasticsearch" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bec3e056-e980-44b1-9533-eda980b86747", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 3min 41s, sys: 19.1 s, total: 4min\n", + "Wall time: 25min 48s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "# Assuming index_json_data is a previously defined function that indexes data from a JSON file to Elasticsearch\n", + "# Path to the JSON file containing data to be indexed\n", + "file_path = '/workspace/repos/osl/rxiv-restapi/docs/notebooks/data/biorxiv_2022-01-01_2024-01-11.json'\n", + "# Name of the Elasticsearch index\n", + "index_name = 'biorxiv'\n", + "# Index data from the specified JSON file into Elasticsearch\n", + "index_json_data(es, file_path, index_name)" + ] + }, + { + "cell_type": "markdown", + "id": "6ca8104d-2a52-4e2b-b7b5-36961a09b2f5", + "metadata": {}, + "source": [ + "## Querying Analyses for BiorXiv Data\n" + ] + }, + { + "cell_type": "markdown", + "id": "438f5163-489c-4ea3-92db-a8e82889ebdb", + "metadata": {}, + "source": [ + "### Create a Search Function\n", + "\n", + "**After indexing the data, we can create a function to perform searches using the Elasticsearch client.**" + ] + }, + { + "cell_type": "markdown", + "id": "a45112e1-8c6b-483b-9a1b-b5124c6cb082", + "metadata": {}, + "source": [ + "**Note**: This function, search_data, retrieves all documents matching the query using **Elasticsearch's Scroll API**, which is suitable for retrieving large sets of results. The function returns a list of all documents" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "1cf28c07-5567-4cb6-b2e8-1f540cf23f1e", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def search_data(es: Elasticsearch, index_name: str, query: Dict[str, Any], page_size: int = 9999) -> List[Dict[str, Any]]:\n", + " \"\"\"\n", + " Performs a search query in an Elasticsearch index and returns all documents matching the query.\n", + "\n", + " Parameters:\n", + " - es (Elasticsearch): An Elasticsearch client instance.\n", + " - index_name (str): The name of the Elasticsearch index to search in.\n", + " - query (dict): The search query in Elasticsearch Query DSL format.\n", + " - page_size (int): The number of results to return per page.\n", + "\n", + " Returns:\n", + " - List[Dict[str, Any]]: A list of all documents from the search results.\n", + " \"\"\"\n", + " documents = []\n", + "\n", + " # Include 'from' and 'size' within the query body\n", + " body = query\n", + " # body['from'] = from_param\n", + " body['size'] = page_size\n", + "\n", + " # Initialize the scroll\n", + " response = es.search(index=index_name, body=query, scroll='2m')\n", + " scroll_id = response['_scroll_id']\n", + " hits = response['hits']['hits']\n", + "\n", + " # Start scrolling\n", + " while hits:\n", + " documents.extend(hits)\n", + " response = es.scroll(scroll_id=scroll_id, scroll='2m')\n", + " scroll_id = response['_scroll_id']\n", + " hits = response['hits']['hits']\n", + "\n", + " return documents\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "73b9e1c0-bc4f-4923-9674-9760725b8880", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 12470 \n", + "\n", + "First result: {'doi': '10.1101/2024.01.05.574328', 'title': 'CRISPR-repressed toxin-antitoxin provides population-level immunity against diverse anti-CRISPR elements', 'authors': 'Li, M.; Shu, X.; Wang, R.; Li, Z.; Xue, Q.; Liu, C.; Cheng, F.; Zhao, H.; Wang, J.; Liu, J.; Hu, C.; Li, J.; Ouyang, S.', 'author_corresponding': 'Ming Li', 'author_corresponding_institution': 'Institute of Microbiology, CAS', 'date': '2024-01-05', 'version': '1', 'license': 'cc_no', 'category': 'Microbiology', 'jatsxml': 'https://www.biorxiv.org/content/early/2024/01/05/2024.01.05.574328.source.xml', 'abstract': 'Prokaryotic CRISPR-Cas systems are highly vulnerable to phage-encoded anti-CRISPR (Acr) factors. How CRISPR-Cas systems protect themselves remains unclear. Here, we uncovered a broad-spectrum anti-anti-CRISPR strategy involving a phage-derived toxic protein. Transcription of this toxin is normally reppressed by the CRISPR-Cas effector, but is activated to halt cell division when the effector is inhibited by any anti-CRISPR proteins or RNAs. We showed that this abortive infection-like effect efficiently expels Acr elements from bacterial population. Furthermore, we exploited this anti-anti-CRISPR mechanism to develop a screening method for specific Acr candidates for a CRISPR-Cas system, and successfully identified two distinct Acr proteins that enhance the binding of CRISPR effector to non-target DNA. Our data highlight the broad-spectrum role of CRISPR-repressed toxins in counteracting various types of Acr factors, which illuminates that the regulatory function of CRISPR-Cas confers host cells herd immunity against Acr-encoding genetic invaders, no matter they are CRISPR-targeted or not.', 'node': 103416, 'link_page': 'https://www.biorxiv.org/content/10.1101/2024.01.05.574328v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2024.01.05.574328v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 137 ms, sys: 16.8 ms, total: 154 ms\n", + "Wall time: 574 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"match\": {\n", + " \"abstract\": \"CRISPR\"\n", + " }\n", + " }\n", + "}\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "8fddfd1d-9bc8-4962-b268-c196aa8b1805", + "metadata": {}, + "source": [ + "### Keyword Searches: The Basics\n", + "#### Search for documents with a specific title.\n" + ] + }, + { + "cell_type": "markdown", + "id": "c79806b0-e503-4bfa-95c3-6ea93d397720", + "metadata": {}, + "source": [ + "These query examples illustrate the flexibility of Elasticsearch's Query DSL to retrieve specific data based on various search criteria.\n", + "\n", + "Creating a variety of Elasticsearch query combinations involves using different aspects of the Elasticsearch Query DSL (Domain Specific Language) to retrieve specific documents based on your criteria. Below are several examples of query combinations that can be used to retrieve keys and values from the JSON data provided\n", + "\n", + "Each of these queries can be passed to the `search_data` function you've defined to retrieve documents from Elasticsearch based on the specified criteria. Remember to replace `index_name` with the name of your index when calling the function:" + ] + }, + { + "cell_type": "markdown", + "id": "ea001516-8b65-4ac9-aac6-92631c0538b7", + "metadata": {}, + "source": [ + "### Match Query\n" + ] + }, + { + "cell_type": "markdown", + "id": "58875093-badd-4145-a82a-e7e80b7973ce", + "metadata": {}, + "source": [ + "Keyword searches are the foundation of data retrieval in Elasticsearch. For instance, finding all BiorXiv papers related to CRISPR:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "8b132847-794d-49e7-bf68-492372dbed01", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 12470 \n", + "\n", + "First result: {'doi': '10.1101/2024.01.05.574328', 'title': 'CRISPR-repressed toxin-antitoxin provides population-level immunity against diverse anti-CRISPR elements', 'authors': 'Li, M.; Shu, X.; Wang, R.; Li, Z.; Xue, Q.; Liu, C.; Cheng, F.; Zhao, H.; Wang, J.; Liu, J.; Hu, C.; Li, J.; Ouyang, S.', 'author_corresponding': 'Ming Li', 'author_corresponding_institution': 'Institute of Microbiology, CAS', 'date': '2024-01-05', 'version': '1', 'license': 'cc_no', 'category': 'Microbiology', 'jatsxml': 'https://www.biorxiv.org/content/early/2024/01/05/2024.01.05.574328.source.xml', 'abstract': 'Prokaryotic CRISPR-Cas systems are highly vulnerable to phage-encoded anti-CRISPR (Acr) factors. How CRISPR-Cas systems protect themselves remains unclear. Here, we uncovered a broad-spectrum anti-anti-CRISPR strategy involving a phage-derived toxic protein. Transcription of this toxin is normally reppressed by the CRISPR-Cas effector, but is activated to halt cell division when the effector is inhibited by any anti-CRISPR proteins or RNAs. We showed that this abortive infection-like effect efficiently expels Acr elements from bacterial population. Furthermore, we exploited this anti-anti-CRISPR mechanism to develop a screening method for specific Acr candidates for a CRISPR-Cas system, and successfully identified two distinct Acr proteins that enhance the binding of CRISPR effector to non-target DNA. Our data highlight the broad-spectrum role of CRISPR-repressed toxins in counteracting various types of Acr factors, which illuminates that the regulatory function of CRISPR-Cas confers host cells herd immunity against Acr-encoding genetic invaders, no matter they are CRISPR-targeted or not.', 'node': 103416, 'link_page': 'https://www.biorxiv.org/content/10.1101/2024.01.05.574328v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2024.01.05.574328v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 178 ms, sys: 12.2 ms, total: 190 ms\n", + "Wall time: 659 ms\n" + ] + } + ], + "source": [ + "%%time \n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"match\": {\n", + " \"abstract\": \"CRISPR\"\n", + " } \n", + " } \n", + "}\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "23f16e76-5927-4760-b131-35e0a4ca47a7", + "metadata": {}, + "source": [ + "### Term Query\n", + "Retrieve documents where the `license` field exactly matches the specified value.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "92d8b26c-3c7c-49ee-984f-fa6eb4b90a18", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 195728 \n", + "\n", + "First result: {'doi': '10.1101/2023.09.21.558920', 'title': 'Automated customization of large-scale spiking network models to neuronal population activity', 'authors': 'Wu, S.; Huang, C.; Snyder, A.; Smith, M. A.; Doiron, B.; Yu, B.', 'author_corresponding': 'Shenghao Wu', 'author_corresponding_institution': 'Carnegie Mellon University', 'date': '2023-09-22', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Neuroscience', 'jatsxml': 'https://www.biorxiv.org/content/early/2023/09/22/2023.09.21.558920.source.xml', 'abstract': 'Understanding brain function is facilitated by constructing computational models that accurately reproduce aspects of brain activity. Networks of spiking neurons capture the underlying biophysics of neuronal circuits, yet the dependence of their activity on model parameters is notoriously complex. As a result, heuristic methods have been used to configure spiking network models, which can lead to an inability to discover activity regimes complex enough to match large-scale neuronal recordings. Here we propose an automatic procedure, Spiking Network Optimization using Population Statistics (SNOPS), to customize spiking network models that reproduce the population-wide covariability of large-scale neuronal recordings. We first confirmed that SNOPS accurately recovers simulated neural activity statistics. Then, we applied SNOPS to recordings in macaque visual and prefrontal cortices and discovered previously unknown limitations of spiking network models. Taken together, SNOPS can guide the development of network models and thereby enable deeper insight into how networks of neurons give rise to brain function.', 'published': 'NA', 'node': 90091, 'link_page': 'https://www.biorxiv.org/content/10.1101/2023.09.21.558920v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2023.09.21.558920v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 2.33 s, sys: 327 ms, total: 2.66 s\n", + "Wall time: 8.55 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"term\": {\n", + " \"license\": {\n", + " \"value\": \"cc_by_nc_nd\"\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "46450067-4af5-443b-947c-4ab35a1dccce", + "metadata": {}, + "source": [ + "### Range Query\n", + "Find documents published within a specific date range.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "3f09bdab-55c6-4e56-bfab-e63fa89e3724", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 20035 \n", + "\n", + "First result: {'doi': '10.1101/2021.04.27.441649', 'title': 'Developmental diversity and unique sensitivity to injury of lung endothelial subtypes during a period of rapid postnatal growth', 'authors': 'Zanini, F.; Che, X.; Knutsen, C.; Liu, M.; Suresh, N. E.; Domingo-Gonzalez, R.; Dou, S. H.; Pryhuber, G. S.; Jones, R. C.; Quake, S. R.; Cornfield, D. N.; Alvira, C. M.', 'author_corresponding': 'Cristina M. Alvira', 'author_corresponding_institution': 'Division of Critical Care Medicine, Department of Pediatrics, Stanford University School of Medicine', 'date': '2022-12-21', 'version': '2', 'license': 'cc_by_nc_nd', 'category': 'Developmental Biology', 'jatsxml': 'https://www.biorxiv.org/content/early/2022/12/21/2021.04.27.441649.source.xml', 'abstract': 'At birth, the lung is still immature, heightening susceptibility to injury but enhancing regenerative capacity. Angiogenesis drives postnatal lung development. Therefore, we profiled the transcriptional ontogeny and sensitivity to injury of pulmonary endothelial cells (EC) during early postnatal life. Although subtype speciation was evident at birth, immature lung EC exhibited transcriptomes distinct from mature counterparts, which progressed dynamically over time. Gradual, temporal changes in aerocyte capillary EC (CAP2), contrasted with more marked alterations in general capillary EC (CAP1) phenotype, including distinct CAP1 present only in the early alveolar lung expressing Peg3, a paternally imprinted transcription factor. Hyperoxia, an injury which impairs angiogenesis, induced both common and unique endothelial gene signatures, dysregulated capillary EC cross-talk, and suppressed CAP1 proliferation while stimulating venous EC proliferation. These data highlight the diversity, transcriptomic evolution, and pleiotropic responses to injury of immature lung EC, possessing broad implications for lung development and injury across the lifespan.', 'published': 'NA', 'node': 2159, 'link_page': 'https://www.biorxiv.org/content/10.1101/2021.04.27.441649v2?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2021.04.27.441649v2.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 569 ms, sys: 85.4 ms, total: 654 ms\n", + "Wall time: 1.63 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"range\": {\n", + " \"date\": {\n", + " \"gte\": \"2022-12-01\",\n", + " \"lte\": \"2022-12-31\"\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "all_results = search_data(es, index_name, query, page_size=100)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "ef58edd1-0433-4e3f-ad0d-904f629f79b5", + "metadata": {}, + "source": [ + "\n", + "### Bool Query\n", + "Combine multiple search criteria. For example, search for documents by authors in a specific category and with a specific license.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "f5d24f63-dfd0-4491-85c5-5592c6818adc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 40 \n", + "\n", + "First result: {'doi': '10.1101/2022.10.06.511167', 'title': 'High selectivity of frequency induced transcriptional responses', 'authors': 'Givre, A.; Colman-Lerner, A.; Ponce-Dawson, S.', 'author_corresponding': 'Silvina Ponce-Dawson', 'author_corresponding_institution': 'School of Natural and Exact Sciences, University of Buenos Aires', 'date': '2022-10-07', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Systems Biology', 'jatsxml': 'https://www.biorxiv.org/content/early/2022/10/07/2022.10.06.511167.source.xml', 'abstract': 'Cells continuously interact with their environment, detect its changes and generate responses accordingly. This requires interpreting the variations and, in many occasions, producing changes in gene expression. In this paper we use information theory and a simple transcription model to analyze the extent to which the resulting gene expression is able to identify and assess the intensity of extracellular stimuli when they are encoded in the amplitude, duration or frequency of a transcription factors nuclear concentration. We find that the maximal information transmission is, for the three codifications, ~ 1.5 - 1.8 bits, i.e., approximately 3 ranges of input strengths can be distinguished in all cases. The types of promoters that yield maximum transmission for the three modes are all similarly fast and have a high activation threshold. The three input modulation modes differ, however, in the sensitivity to changes in the parameters that characterize the promoters, with frequency modulation being the most sensitive and duration modulation, the least. This turns out to be key for signal identification. Namely, we show that, because of this sensitivity difference, it is possible to find promoter parameters that yield an information transmission within 90% of its maximum value for duration or amplitude modulation and less than 1 bit for frequency modulation. The reverse situation cannot be found within the framework of a single promoter transcription model. This means that pulses of transcription factors in the nucleus can selectively activate the promoter that is tuned to respond to frequency modulations while prolonged nuclear accumulation would activate several promoters at the same time. Thus, frequency modulation is better suited than the other encoding modes to allow the identification of external stimuli without requiring other mediators of the transduction.', 'published': 'NA', 'node': 43301, 'link_page': 'https://www.biorxiv.org/content/10.1101/2022.10.06.511167v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2022.10.06.511167v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 19.6 ms, sys: 7.59 ms, total: 27.2 ms\n", + "Wall time: 32.7 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"bool\": {\n", + " \"must\": [\n", + " {\"match\": {\"authors\": \"Colman-Lerner\"}},\n", + " {\"match\": {\"category\": \"Systems Biology\"}},\n", + " {\"term\": {\"license\": \"cc_by_nc_nd\"}}\n", + " ]\n", + " }\n", + " } \n", + "}\n", + "\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "960c8f80-af34-4ab7-8099-0d59a81af22d", + "metadata": {}, + "source": [ + "### Match phrase Query\n", + "Use a match_phrase to search for documents with titles that contain specific patterns.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "439127cf-21d8-49a0-a802-c950ff038d6f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 15 \n", + "\n", + "First result: {'doi': '10.1101/2022.10.03.510647', 'title': 'Carm1 regulates the speed of C/EBPa-induced transdifferentiation by a cofactor stealing mechanism', 'authors': 'Garcia, G. T.; Kowenz-Leutz, E.; Tian, T. V.; Klonizakis, A.; Lerner, J.; De Andres-Aguayo, L.; Berenguer, C.; Carmona, M. P.; Casadesus, M. V.; Bulteau, R.; Francesconi, M.; Leutz, A.; Zaret, K. S.; Zaret, K. S.; Peiro, S.', 'author_corresponding': 'Achim Leutz', 'author_corresponding_institution': 'MDC, Berlin', 'date': '2022-10-04', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Cell Biology', 'jatsxml': 'https://www.biorxiv.org/content/early/2022/10/04/2022.10.03.510647.source.xml', 'abstract': 'Cell fate decisions are driven by lineage-restricted transcription factors but how they are regulated is incompletely understood. The C/EBP-induced B cell to macrophage transdifferentiation (BMT) is a powerful system to address this question. Here we describe that C/EBP with a single arginine mutation (C/EBPR35A) induces a dramatically accelerated BMT in mouse and human cells. Changes in the expression of lineage-restricted genes occur as early as within 1 hour compared to 18 hours with the wild type. Mechanistically C/EBPR35A exhibits an increased affinity for PU.1, a bi-lineage transcription factor required for C/EBP-induced BMT. The complex induces more rapid chromatin accessibility changes and an enhanced relocation (stealing) of PU.1 from B cell to myeloid gene regulatory elements. Arginine 35 is methylated by Carm1 and inhibition of the enzyme accelerates BMT, similar to the mutant. Our data suggest that the relative proportions of methylated and unmethylated C/EBP in a bipotent progenitor can determine the velocity of cell fate choice and lineage directionality.', 'published': '10.7554/elife.83951', 'node': 42509, 'link_page': 'https://www.biorxiv.org/content/10.1101/2022.10.03.510647v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2022.10.03.510647v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 3.99 ms, sys: 360 µs, total: 4.35 ms\n", + "Wall time: 8.59 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"match_phrase\": {\n", + " \"title\": \"Carm1 regulates the speed of\"\n", + " }\n", + " }\n", + "}\n", + "\n", + "all_results = search_data(es, index_name, query, page_size=100)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "9f79a7a8-0a57-4839-9506-6e7cff75f0d5", + "metadata": {}, + "source": [ + "\n", + "### Multi-Match Query\n", + "Search for a text across multiple fields.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "112d1a8a-3e4a-4246-9b71-81496ede2263", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 34881 \n", + "\n", + "First result: {'doi': '10.1101/2022.11.21.517317', 'title': 'Targeted disruption of transcription bodies causes widespread activation of transcription', 'authors': 'Ugolini, M.; Kuznetsova, K.; Oda, H.; Kimura, H.; Vastenhouw, N. L.', 'author_corresponding': 'Nadine L. Vastenhouw', 'author_corresponding_institution': 'MPI-CBG, UNIL', 'date': '2022-11-21', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Cell Biology', 'jatsxml': 'https://www.biorxiv.org/content/early/2022/11/21/2022.11.21.517317.source.xml', 'abstract': 'The localization of transcriptional activity in specialized transcription bodies is a hallmark of gene expression in eukaryotic cells. It remains unclear, however, if and how they affect gene expression. Here, we disrupted the formation of two prominent endogenous transcription bodies that mark the onset of zygotic transcription in zebrafish embryos and analysed the effect on gene expression using enriched SLAM-Seq and live-cell imaging. We find that the disruption of transcription bodies results in downregulation of hundreds of genes, providing experimental support for a model in which transcription bodies increase the efficiency of transcription. We also find that a significant number of genes are upregulated, counter to the suggested stimulatory effect of transcription bodies. These upregulated genes have accessible chromatin and are poised to be transcribed in the presence of the two transcription bodies, but they do not go into elongation. Live-cell imaging shows that the disruption of the two large transcription bodies enables these poised genes to be transcribed in ectopic transcription bodies, suggesting that the large transcription bodies sequester a pause release factor. Supporting this hypothesis, we find that CDK9, the kinase that releases paused polymerase II, is highly enriched in the two large transcription bodies. Importantly, overexpression of CDK9 in wild type embryos results in the formation of ectopic transcription bodies and thus phenocopies the removal of the two large transcription bodies. Taken together, our results show that transcription bodies regulate transcription genome-wide: the accumulation of transcriptional machinery creates a favourable environment for transcription locally, while depriving genes elsewhere in the nucleus from the same machinery.', 'published': 'NA', 'node': 49272, 'link_page': 'https://www.biorxiv.org/content/10.1101/2022.11.21.517317v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2022.11.21.517317v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 419 ms, sys: 30.4 ms, total: 450 ms\n", + "Wall time: 1.6 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"multi_match\": {\n", + " \"query\": \"transcription\",\n", + " \"fields\": [\"title\", \"abstract\"]\n", + " }\n", + " }\n", + " }\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "1189211e-fd75-4f5d-91a0-31f5224e7c5f", + "metadata": {}, + "source": [ + "### Advanced Filtering: Beyond Keywords" + ] + }, + { + "cell_type": "markdown", + "id": "a62554d3-fd0f-4dff-bb59-98a63c2e711e", + "metadata": {}, + "source": [ + "Filtering allows for more refined searches, such as retrieving documents within a specific date range or by particular authors, enhancing the precision of your data analysis.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "6f3125f7-3853-439a-b003-b5e939b5e809", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total results: 10198 \n", + "\n", + "First result: {'doi': '10.1101/2023.05.24.542151', 'title': 'POMBOX: a fission yeast toolkit for molecular and synthetic biology', 'authors': 'Hebra, T.; Smrckova, H.; Elkatmis, B.; Prevorovsky, M.; Pluskal, T.', 'author_corresponding': 'Tomas Pluskal', 'author_corresponding_institution': 'Institute of Organic Chemistry and Biochemistry of the Czech Academy of Sciences, Praha, Czech Republic', 'date': '2023-05-24', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Synthetic Biology', 'jatsxml': 'https://www.biorxiv.org/content/early/2023/05/24/2023.05.24.542151.source.xml', 'abstract': 'Schizosaccharomyces pombe is a popular model organism in molecular biology and cell physiology. With its ease of genetic manipulation and growth, supported by in-depth functional annotation in the PomBase database and genome-wide metabolic models, S. pombe is an attractive option for synthetic biology applications. However, S. pombe currently lacks modular tools for generating genetic circuits with more than one transcriptional unit. We have developed a toolkit to address this issue. Adapted from the MoClo- YTK plasmid kit for Saccharomyces cerevisiae and using the same Golden Gate grammar, our POMBOX toolkit is designed to facilitate the fast, efficient and modular construction of genetic circuits in S. pombe. It allows for interoperability when working with DNA sequences that are functional in both S. cerevisiae and S. pombe (e.g. protein tag, antibiotic resistance cassette, coding sequences). Moreover, POMBOX enables the modular assembly of multi-gene pathways and increases possible pathway length from 6 to 12 transcriptional units. We also adapted the stable integration vector homology arms to Golden Gate assembly and tested the genomic integration success rate depending on different sequence sizes, from four to twenty-four kilobases. We included fourteen S. pombe promoters that we characterized for two fluorescent proteins, in both minimal defined media (EMM2) and complex media (YES). Then we tested six S. cerevisiae and six synthetic terminators in S. pombe. Finally, we used the POMBOX kit for a synthetic biology application in metabolic engineering and expressed plant enzymes in S. pombe to produce specialized metabolite precursors, namely methylxanthine, amorpha-4,11-diene and cinnamic acid from the purine, mevalonate and amino acid pathways.', 'published': 'NA', 'node': 74136, 'link_page': 'https://www.biorxiv.org/content/10.1101/2023.05.24.542151v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2023.05.24.542151v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 164 ms, sys: 7.65 ms, total: 172 ms\n", + "Wall time: 523 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "query = {\n", + " \"query\": {\n", + " \"bool\": {\n", + " \"must\": {\n", + " \"match\": {\"title\": \"Molecular Biology\"}\n", + " },\n", + " \"filter\": {\n", + " \"range\": {\n", + " # publish_date\n", + " \"date\": {\n", + " \"gte\": \"2022-01-01\",\n", + " \"lte\": \"2023-12-31\"\n", + " }\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "all_results = search_data(es, index_name, query)\n", + "\n", + "print(\"Total results:\", len(all_results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", all_results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "8afdd444-5566-454f-9ce2-9f156712d3bd", + "metadata": {}, + "source": [ + "### Aggregation Query\n" + ] + }, + { + "cell_type": "markdown", + "id": "7be4b39d-4796-4e98-935b-640fb87afb87", + "metadata": {}, + "source": [ + "Aggregations are pivotal for summarizing data, enabling the analysis of trends across thousands of documents. For example, an aggregation query to count publications by category:" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "cd0c444b-fd09-4c7d-bcab-cf1b02057e61", + "metadata": {}, + "outputs": [], + "source": [ + "def search_data_with_aggregation(es: Elasticsearch, index_name: str, query: Dict[str, Any]) -> List[Dict[str, Any]]:\n", + " try:\n", + " response = es.search(index=index_name, body=query)\n", + " if 'aggregations' in response:\n", + " # Safely access the 'categories' aggregation results\n", + " categories_agg = response.get('aggregations', {}).get('categories', {}).get('buckets', [])\n", + " return categories_agg # Directly return the categories aggregation results\n", + " else:\n", + " print(\"No aggregations found in the response.\")\n", + " return []\n", + " except Exception as e:\n", + " print(f\"Search failed: {e}\")\n", + " return []" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "da813399-4710-40b2-8f17-b4dcdb001e84", + "metadata": {}, + "outputs": [], + "source": [ + "query = {\n", + " \"size\": 0, # No hits, only aggregations\n", + " \"query\": {\n", + " \"match_all\": {} # Or adjust to your specific matching needs\n", + " },\n", + " \"aggs\": {\n", + " \"categories\": {\n", + " \"terms\": {\n", + " \"field\": \"category.keyword\", # Adjust field name as needed\n", + " \"size\": 10000 # Increase this to accommodate all expected buckets\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + }, + { + "cell_type": "markdown", + "id": "0f2dc134-dc58-4322-9296-29a3bf220ae9", + "metadata": {}, + "source": [ + "#### Aggregate data, such as counting documents by category." + ] + }, + { + "cell_type": "markdown", + "id": "905b54ee-bdfa-49c7-8260-2812758f0731", + "metadata": {}, + "source": [ + "Checks if the response contains an 'aggregations' key and processes the results accordingly. For aggregation queries, it returns the aggregation results directly. " + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "ff4b7ffa-760f-4d54-9747-5c6ab81594d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Category: Neuroscience, Count: 98616\n", + "Category: Microbiology, Count: 45626\n", + "Category: Bioinformatics, Count: 44355\n", + "Category: Cell Biology, Count: 30761\n", + "Category: Biophysics, Count: 25587\n", + "Category: Evolutionary Biology, Count: 25552\n", + "Category: Biochemistry, Count: 21820\n", + "Category: Immunology, Count: 21693\n", + "Category: Cancer Biology, Count: 21634\n", + "Category: Ecology, Count: 21539\n", + "Category: Genomics, Count: 21376\n", + "Category: Molecular Biology, Count: 20221\n", + "Category: Plant Biology, Count: 17687\n", + "Category: Bioengineering, Count: 16946\n", + "Category: Developmental Biology, Count: 15226\n", + "Category: Genetics, Count: 14602\n", + "Category: Systems Biology, Count: 10545\n", + "Category: Physiology, Count: 8716\n", + "Category: Animal Behavior And Cognition, Count: 8459\n", + "Category: Pharmacology And Toxicology, Count: 5535\n", + "Category: Synthetic Biology, Count: 4922\n", + "Category: Pathology, Count: 3186\n", + "Category: Zoology, Count: 2734\n", + "Category: Scientific Communication And Education, Count: 2195\n", + "Category: Paleontology, Count: 767\n", + "CPU times: user 8.48 ms, sys: 405 µs, total: 8.89 ms\n", + "Wall time: 11.7 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "# Assuming 'es', 'index_name', and 'query' are properly defined\n", + "results = search_data_with_aggregation(es, index_name, query)\n", + "\n", + "# Display the aggregation results\n", + "if results:\n", + " for category in results:\n", + " print(f\"Category: {category['key']}, Count: {category['doc_count']}\")\n", + "else:\n", + " print(\"No results found.\")" + ] + }, + { + "cell_type": "markdown", + "id": "a916a837-b9cb-4f29-b87b-1e7a7608aee4", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "17b894ad-54ad-4dbc-a6d4-496b2efc09dc", + "metadata": {}, + "source": [ + "### Generating and Executing an Elasticsearch Query" + ] + }, + { + "cell_type": "markdown", + "id": "492d798f-9c09-492f-a0b4-903010018fdd", + "metadata": {}, + "source": [ + "#### Create a function that generates Elasticsearch queries according to specified logic operators and a date range:" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "035ffc02-aaa7-4aeb-a63a-1ae713a8b349", + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Union, Dict, Any\n", + "\n", + "def generate_es_queries(logic_operators: List[Union[str, List[str]]], start_date: str, end_date: str, abstract_field: str = \"abstract\", date_field: str = \"date\") -> Dict[str, Any]:\n", + " \"\"\"\n", + " Generates an Elasticsearch query based on logic operators and a date range.\n", + "\n", + " Parameters:\n", + " - logic_operators (List[Union[str, List[str]]]): A list of strings and/or lists representing the logic operators.\n", + " Nested lists represent OR conditions within AND conditions.\n", + " - start_date (str): The start date in 'YYYY-MM-DD' format.\n", + " - end_date (str): The end date in 'YYYY-MM-DD' format.\n", + " - abstract_field (str): The document field to search for abstract text.\n", + " - date_field (str): The document field that contains the date.\n", + "\n", + " Returns:\n", + " - Dict[str, Any]: An Elasticsearch query in DSL format.\n", + " \"\"\"\n", + " must_conditions = [] # To store AND conditions\n", + " for operator in logic_operators:\n", + " if isinstance(operator, list): # Handle OR conditions\n", + " should_conditions = [{\"match\": {abstract_field: term}} for term in operator]\n", + " must_conditions.append({\n", + " \"bool\": {\"should\": should_conditions, \"minimum_should_match\": 1}\n", + " })\n", + " else: # Handle AND conditions\n", + " must_conditions.append({\"match\": {abstract_field: operator}})\n", + " \n", + " # Add date range filter\n", + " must_conditions.append({\n", + " \"range\": {\n", + " date_field: { # Use the provided date field name\n", + " \"gte\": start_date,\n", + " \"lte\": end_date,\n", + " \"format\": \"yyyy-MM-dd\"\n", + " }\n", + " }\n", + " })\n", + " \n", + " # Construct the final query\n", + " es_query = {\n", + " \"query\": {\n", + " \"bool\": {\n", + " \"must\": must_conditions\n", + " }\n", + " }\n", + " }\n", + " \n", + " return es_query\n" + ] + }, + { + "cell_type": "markdown", + "id": "c092d0e1-0220-49ab-8dff-1bcecc2b7b2b", + "metadata": {}, + "source": [ + "#### Construct an Elasticsearch query using a predefined function generate_es_queries, based on logic operators and a specified date range. It then pretty prints the generated query, executes it to fetch results with pagination, and displays the results.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "1fee201c-aee3-400d-b372-e2723301eaf9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"query\": {\n", + " \"bool\": {\n", + " \"must\": [\n", + " {\n", + " \"match\": {\n", + " \"abstract\": \"COVID-19\"\n", + " }\n", + " },\n", + " {\n", + " \"match\": {\n", + " \"abstract\": \"coronavirus\"\n", + " }\n", + " },\n", + " {\n", + " \"match\": {\n", + " \"abstract\": \"vaccine\"\n", + " }\n", + " },\n", + " {\n", + " \"range\": {\n", + " \"date\": {\n", + " \"gte\": \"2020-01-01\",\n", + " \"lte\": \"2024-12-31\",\n", + " \"format\": \"yyyy-MM-dd\"\n", + " }\n", + " }\n", + " }\n", + " ]\n", + " }\n", + " }\n", + "}\n", + "Total results: 394 \n", + "\n", + "First result: {'doi': '10.1101/2023.05.24.541850', 'title': 'Cross-Protection Induced by Highly Conserved Human B, CD4+, and CD8+ T Cell Epitopes-Based Coronavirus Vaccine Against Severe Infection, Disease, and Death Caused by Multiple SARS-CoV-2 Variants of Concern', 'authors': 'Prakash, S. F.; Dhanushkodi, N. R.; Zayou, L.; Ibraim, I. C.; Quadiri, A.; Coulon, P. G.; Tifrea, D. F.; Suzler, B.; Amin, M.; Chilukuri, A.; Edwards, R. A.; Vahed, H.; Nesburn, A. B.; Kuppermann, B. D.; Ulmer, J. B.; Gil, D.; Jones, T. M.; Benmohamed, L.', 'author_corresponding': 'Lbachir Benmohamed', 'author_corresponding_institution': 'GHEI/UCI School of Medecine', 'date': '2023-05-24', 'version': '1', 'license': 'cc_by_nc_nd', 'category': 'Immunology', 'jatsxml': 'https://www.biorxiv.org/content/early/2023/05/24/2023.05.24.541850.source.xml', 'abstract': 'BackgroundThe Coronavirus disease 2019 (COVID-19) pandemic has created one of the largest global health crises in almost a century. Although the current rate of SARS-CoV-2 infections has decreased significantly; the long-term outlook of COVID-19 remains a serious cause of high death worldwide; with the mortality rate still surpassing even the worst mortality rates recorded for the influenza viruses. The continuous emergence of SARS-CoV-2 variants of concern (VOCs), including multiple heavily mutated Omicron sub-variants, have prolonged the COVID-19 pandemic and outlines the urgent need for a next-generation vaccine that will protect from multiple SARS-CoV-2 VOCs.\\n\\nMethodsIn the present study, we designed a multi-epitope-based Coronavirus vaccine that incorporated B, CD4+, and CD8+ T cell epitopes conserved among all known SARS-CoV-2 VOCs and selectively recognized by CD8+ and CD4+ T-cells from asymptomatic COVID-19 patients irrespective of VOC infection. The safety, immunogenicity, and cross-protective immunity of this pan-Coronavirus vaccine were studied against six VOCs using an innovative triple transgenic h-ACE-2-HLA-A2/DR mouse model.\\n\\nResultsThe Pan-Coronavirus vaccine: (i) is safe; (ii) induces high frequencies of lung-resident functional CD8+ and CD4+ TEM and TRM cells; and (iii) provides robust protection against virus replication and COVID-19-related lung pathology and death caused by six SARS-CoV-2 VOCs: Alpha (B.1.1.7), Beta (B.1.351), Gamma or P1 (B.1.1.28.1), Delta (lineage B.1.617.2) and Omicron (B.1.1.529). Conclusions: A multi-epitope pan-Coronavirus vaccine bearing conserved human B and T cell epitopes from structural and non-structural SARS-CoV-2 antigens induced cross-protective immunity that cleared the virus, and reduced COVID-19-related lung pathology and death caused by multiple SARS-CoV-2 VOCs.', 'published': 'NA', 'node': 74123, 'link_page': 'https://www.biorxiv.org/content/10.1101/2023.05.24.541850v1?versioned=TRUE', 'link_pdf': 'https://www.biorxiv.org/content/10.1101/2023.05.24.541850v1.full.pdf'}\n", + "-------------------------\n", + "CPU times: user 16.3 ms, sys: 0 ns, total: 16.3 ms\n", + "Wall time: 43.5 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "logic_operators = ['COVID-19', 'coronavirus', 'vaccine']\n", + "\n", + "start_date = '2020-01-01'\n", + "end_date = '2024-12-31'\n", + "es_query = generate_es_queries(logic_operators, start_date, end_date)\n", + "\n", + "# Pretty print the Elasticsearch query object\n", + "pretty_es_query = json.dumps(es_query, indent=4)\n", + "print(pretty_es_query)\n", + "\n", + "page_size = 9999\n", + "\n", + "results = search_data(es, index_name, es_query, page_size)\n", + "\n", + "print(\"Total results:\", len(results), \"\\n\")\n", + "if all_results:\n", + " print(\"First result:\", results[0]['_source'])\n", + "else:\n", + " print(\"No results found.\")\n", + "\n", + "print(\"-\" * 25)" + ] + }, + { + "cell_type": "markdown", + "id": "5be298a0-6a0d-429a-b756-2c3e72005121", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "ba2e35c1-9250-46b5-888f-3efa2886e4c9", + "metadata": {}, + "source": [ + "### The biorxiv database was downloaded from the medrxivr library" + ] + }, + { + "cell_type": "markdown", + "id": "d8e65391-684c-446c-a765-3964c73dc294", + "metadata": {}, + "source": [ + "The json file used is structure as a list of dictionaries downloaded by MedrdR from a specific date range from 2022 to 2024 and contain 000 papers of data" + ] + }, + { + "cell_type": "markdown", + "id": "13b8ef33-e433-45ca-8a4b-2af5c05d8ac5", + "metadata": {}, + "source": [ + "```python\n", + "[\n", + " {\n", + " \"doi\": \"10.1101/043794\",\n", + " \"title\": \"Modeling methyl-sensitive transcription factor motifs with an expanded epigenetic alphabet\",\n", + " \"authors\": \"Viner, C.; Ishak, C. A.; Johnson, J.; Walker, N. J.; Shi, H.; Sjöberg-Herrera, M. K.; Shen, S. Y.; Lardo, S. M.; Adams, D. J.; Ferguson-Smith, A. C.; De Carvalho, D. D.; Hainer, S. J.; Bailey, T. L.; Hoffman, M. M.\",\n", + " \"author_corresponding\": \"Michael M. Hoffman\",\n", + " \"author_corresponding_institution\": \"Princess Margaret Cancer Centre, Toronto, ON, Canada\",\n", + " \"date\": \"2022-07-29\",\n", + " \"version\": \"2\",\n", + " \"license\": \"cc_by_nc_nd\",\n", + " \"category\": \"Bioinformatics\",\n", + " \"jatsxml\": \"https://www.biorxiv.org/content/early/2022/07/29/043794.source.xml\",\n", + " \"abstract\": \"Transcription factors bind DNA in specific sequence contexts. In addition to distinguishing one nucleobase from another, some transcription factors can distinguish between unmodified and modified bases. Current models of transcription factor binding tend not take DNA modifications into account, while the recent few that do often have limitations. This makes a comprehensive and accurate profiling of transcription factor affinities difficult.\\n\\nHere, we developed methods to identify transcription factor binding sites in modified DNA. Our models expand the standard A/C/G/T DNA alphabet to include cytosine modifications. We developed Cytomod to create modified genomic sequences and enhanced the Multiple EM for Motif Elicitation (MEME) Suite by adding the capacity to handle custom alphabets. We adapted the well-established position weight matrix (PWM) model of transcription factor binding affinity to this expanded DNA alphabet.\\n\\nUsing these methods, we identified modification-sensitive transcription factor binding motifs. We confirmed established binding preferences, such as the preference of ZFP57 and C/EBP{beta} for methylated motifs and the preference of c-Myc for unmethylated E-box motifs. Using known binding preferences to tune model parameters, we discovered novel modified motifs for a wide array of transcription factors. Finally, we validated predicted binding preferences of OCT4 using cleavage under targets and release using nuclease (CUT&RUN) experiments across conventional, methylation-, and hydroxymethylation-enriched sequences. Our approach readily extends to other DNA modifications. As more genome-wide single-base resolution modification data becomes available, we expect that our method will yield insights into altered transcription factor binding affinities across many different modifications.\",\n", + " \"published\": \"NA\",\n", + " \"node\": 2,\n", + " \"link_page\": \"https://www.biorxiv.org/content/10.1101/043794v2?versioned=TRUE\",\n", + " \"link_pdf\": \"https://www.biorxiv.org/content/10.1101/043794v2.full.pdf\"\n", + " },\n", + "]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "f3a80cb2-e7b0-4f7c-a189-59dba5fc68e7", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "5dbdcbd7-e19d-4c21-9474-1a30e4921d55", + "metadata": {}, + "source": [ + "### Final Note: The Impact of Advanced Querying on Research\n" + ] + }, + { + "cell_type": "markdown", + "id": "cff06250-b16f-4f7c-941b-e3d390eaa559", + "metadata": {}, + "source": [ + "Advanced querying techniques in Elasticsearch empower researchers to navigate and analyze the vast repository of BiorXiv data with unprecedented depth and precision. From basic keyword searches to sophisticated aggregations and scripted calculations, Elasticsearch facilitates a comprehensive understanding of the life sciences landscape. By harnessing these querying capabilities, researchers can accelerate discovery, foster innovation, and contribute to the advancement of science.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "715f4043-82d1-4e8a-98c5-451b478c3e6a", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "953bc8ee-098c-450c-88ab-4533a0778dae", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/poetry.lock b/poetry.lock index f996046..9dccec7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,27 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. +[[package]] +name = "anyio" +version = "4.2.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + [[package]] name = "appnope" version = "0.1.3" @@ -11,6 +33,96 @@ files = [ {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, ] +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + [[package]] name = "attrs" version = "23.2.0" @@ -179,13 +291,13 @@ files = [ [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -663,6 +775,17 @@ Werkzeug = ">=3.0.0" async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + [[package]] name = "fuzzywuzzy" version = "0.18.0" @@ -850,6 +973,20 @@ parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["ipykernel", "nbformat", "nose (>=0.10.1)", "numpy (>=1.17)", "pygments", "requests", "testpath"] +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + [[package]] name = "itsdangerous" version = "2.1.2" @@ -897,6 +1034,31 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "json5" +version = "0.9.14" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + [[package]] name = "jsonschema" version = "4.21.1" @@ -910,11 +1072,19 @@ files = [ [package.dependencies] attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} jsonschema-specifications = ">=2023.03.6" pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] @@ -978,6 +1148,134 @@ traitlets = ">=5.3" docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +[[package]] +name = "jupyter-events" +version = "0.9.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.2" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, + {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.12.5" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.12.5-py3-none-any.whl", hash = "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923"}, + {file = "jupyter_server-2.12.5.tar.gz", hash = "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = "*" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = "*" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = "*" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.2" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.2-py3-none-any.whl", hash = "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80"}, + {file = "jupyter_server_terminals-0.5.2.tar.gz", hash = "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.0.12" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.0.12-py3-none-any.whl", hash = "sha256:53f132480e5f6564f4e20d1b5ed4e8b7945952a2decd5bdfa43760b1b536c99d"}, + {file = "jupyterlab-4.0.12.tar.gz", hash = "sha256:965d92efa82a538ed70ccb3968d9aabba788840da882e13d7b061780cdedc3b7"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} +ipykernel = "*" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.19.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] + [[package]] name = "jupyterlab-pygments" version = "0.3.0" @@ -989,6 +1287,32 @@ files = [ {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] +[[package]] +name = "jupyterlab-server" +version = "2.25.2" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"}, + {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + [[package]] name = "jupytext" version = "1.16.1" @@ -1186,71 +1510,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -1693,6 +2017,34 @@ files = [ [package.dependencies] setuptools = "*" +[[package]] +name = "notebook-shim" +version = "0.2.3" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, + {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + [[package]] name = "packaging" version = "23.2" @@ -1846,6 +2198,20 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "prometheus-client" +version = "0.19.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, + {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, +] + +[package.extras] +twisted = ["twisted"] + [[package]] name = "prompt-toolkit" version = "3.0.43" @@ -2011,6 +2377,17 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + [[package]] name = "python-levenshtein" version = "0.24.0" @@ -2027,13 +2404,13 @@ Levenshtein = "0.24.0" [[package]] name = "pytz" -version = "2023.4" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.4-py2.py3-none-any.whl", hash = "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a"}, - {file = "pytz-2023.4.tar.gz", hash = "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -2059,6 +2436,21 @@ files = [ {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] +[[package]] +name = "pywinpty" +version = "2.0.12" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, +] + [[package]] name = "pyyaml" version = "6.0.1" @@ -2071,7 +2463,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2079,15 +2470,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2104,7 +2488,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2112,7 +2495,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2477,6 +2859,31 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + [[package]] name = "rich" version = "13.7.0" @@ -2606,30 +3013,46 @@ files = [ [[package]] name = "ruff" -version = "0.1.15" +version = "0.2.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:638ea3294f800d18bae84a492cb5a245c8d29c90d19a91d8e338937a4c27fca0"}, + {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff35433fcf4dff6d610738712152df6b7d92351a1bde8e00bd405b08b3d5759"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9faafbdcf4f53917019f2c230766da437d4fd5caecd12ddb68bb6a17d74399"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8153a3e4128ed770871c47545f1ae7b055023e0c222ff72a759f5a341ee06483"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a75a98ae989a27090e9c51f763990ad5bbc92d20626d54e9701c7fe597f399"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:87057dd2fdde297130ff99553be8549ca38a2965871462a97394c22ed2dfc19d"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d232f99d3ab00094ebaf88e0fb7a8ccacaa54cc7fa3b8993d9627a11e6aed7a"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3c641f95f435fc6754b05591774a17df41648f0daf3de0d75ad3d9f099ab92"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3826fb34c144ef1e171b323ed6ae9146ab76d109960addca730756dc19dc7b22"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eceab7d85d09321b4de18b62d38710cf296cb49e98979960a59c6b9307c18cfe"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:30ad74687e1f4a9ff8e513b20b82ccadb6bd796fe5697f1e417189c5cde6be3e"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7e3818698f8460bd0f8d4322bbe99db8327e9bc2c93c789d3159f5b335f47da"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:edf23041242c48b0d8295214783ef543847ef29e8226d9f69bf96592dba82a83"}, + {file = "ruff-0.2.0-py3-none-win32.whl", hash = "sha256:e155147199c2714ff52385b760fe242bb99ea64b240a9ffbd6a5918eb1268843"}, + {file = "ruff-0.2.0-py3-none-win_amd64.whl", hash = "sha256:ba918e01cdd21e81b07555564f40d307b0caafa9a7a65742e98ff244f5035c59"}, + {file = "ruff-0.2.0-py3-none-win_arm64.whl", hash = "sha256:3fbaff1ba9564a2c5943f8f38bc221f04bac687cc7485e45237579fee7ccda79"}, + {file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"}, +] + +[[package]] +name = "send2trash" +version = "1.8.2" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, + {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, ] +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + [[package]] name = "setuptools" version = "69.0.3" @@ -2668,6 +3091,17 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + [[package]] name = "soupsieve" version = "2.5" @@ -2707,6 +3141,27 @@ files = [ [package.extras] tests = ["pytest", "pytest-cov"] +[[package]] +name = "terminado" +version = "0.18.0" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + [[package]] name = "tinycss2" version = "1.2.1" @@ -2803,6 +3258,17 @@ dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2 doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +[[package]] +name = "types-python-dateutil" +version = "2.8.19.20240106" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, + {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, +] + [[package]] name = "typing-extensions" version = "4.9.0" @@ -2814,6 +3280,20 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + [[package]] name = "urllib3" version = "2.2.0" @@ -2915,6 +3395,21 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] +[[package]] +name = "webcolors" +version = "1.13" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, + {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["pytest", "pytest-cov"] + [[package]] name = "webencodings" version = "0.5.1" @@ -2926,6 +3421,22 @@ files = [ {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] +[[package]] +name = "websocket-client" +version = "1.7.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + [[package]] name = "werkzeug" version = "3.0.1" @@ -2987,4 +3498,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4" -content-hash = "2376ddc44e76e0cc9a1c9488917d205a7126d5fba7b7ec95727c4115de5192bc" +content-hash = "773e70ff71f9f13b2671e718bc4a8c6d5f2a8af13ac736c14db8c6071567bbff" diff --git a/pyproject.toml b/pyproject.toml index 3d0f661..76416dd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,7 @@ mkdocstrings = ">=0.21.2" mkdocstrings-python = ">=1.1.2" makim =">=1.12.0" containers-sugar = "1.10.0" +jupyterlab = "^4.0.12" [tool.pytest.ini_options] testpaths = [