diff --git a/docs/extras/integrations/document_loaders/example_data/sample_rss_feeds.opml b/docs/extras/integrations/document_loaders/example_data/sample_rss_feeds.opml
new file mode 100644
index 00000000000..290b2c5db2e
--- /dev/null
+++ b/docs/extras/integrations/document_loaders/example_data/sample_rss_feeds.opml
@@ -0,0 +1,13 @@
+
+
+
+
+ Sample RSS feed subscriptions
+
+
+
+
+
+
+
+
diff --git a/docs/extras/integrations/document_loaders/rss.ipynb b/docs/extras/integrations/document_loaders/rss.ipynb
new file mode 100644
index 00000000000..78304799e02
--- /dev/null
+++ b/docs/extras/integrations/document_loaders/rss.ipynb
@@ -0,0 +1,170 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "2dfc4698",
+ "metadata": {},
+ "source": [
+ "# RSS Feeds\n",
+ "\n",
+ "This covers how to load HTML news articles from a list of RSS feed URLs into a document format that we can use downstream."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "16c3699e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from langchain.document_loaders import RSSFeedLoader"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "836fbac1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "urls = [\"https://www.engadget.com/rss.xml\"]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "33089aba-ff74-4d00-8f40-9449c29587cc",
+ "metadata": {},
+ "source": [
+ "Pass in urls to load them into Documents"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "00f46fda",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "loader = RSSFeedLoader(urls=urls)\n",
+ "data = loader.load()\n",
+ "print(len(data))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [
+ "data[0]"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "b447468cc42266d0"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "You can pass arguments to the NewsURLLoader which it uses to load articles."
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "c36d3b0d329faf2a"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [
+ "loader = RSSFeedLoader(urls=urls, nlp=True)\n",
+ "data = loader.load()\n",
+ "print(len(data))"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "5fdada62470d3019"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [
+ "data[0].metadata['keywords']"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "11d71963f7735c1d"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [
+ "data[0].metadata['summary']"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "9fb64ba0e8780966"
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "You can also use an OPML file such as a Feedly export. Pass in either a URL or the OPML contents."
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "98ac26c488315bff"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8b6f07ae526a897c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(\"example_data/sample_rss_feeds.opml\", \"r\") as f:\n",
+ " loader = RSSFeedLoader(opml=f.read())\n",
+ "data = loader.load()\n",
+ "print(len(data))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [
+ "data[0]"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "b68a26b3"
+ }
+ ],
+ "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.10.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/libs/langchain/langchain/document_loaders/__init__.py b/libs/langchain/langchain/document_loaders/__init__.py
index 596c7c5cc5e..af974bc4089 100644
--- a/libs/langchain/langchain/document_loaders/__init__.py
+++ b/libs/langchain/langchain/document_loaders/__init__.py
@@ -128,6 +128,7 @@ from langchain.document_loaders.recursive_url_loader import RecursiveUrlLoader
from langchain.document_loaders.reddit import RedditPostsLoader
from langchain.document_loaders.roam import RoamLoader
from langchain.document_loaders.rocksetdb import RocksetLoader
+from langchain.document_loaders.rss import RSSFeedLoader
from langchain.document_loaders.rst import UnstructuredRSTLoader
from langchain.document_loaders.rtf import UnstructuredRTFLoader
from langchain.document_loaders.s3_directory import S3DirectoryLoader
@@ -280,6 +281,7 @@ __all__ = [
"RedditPostsLoader",
"RoamLoader",
"RocksetLoader",
+ "RSSFeedLoader",
"S3DirectoryLoader",
"S3FileLoader",
"SRTLoader",
diff --git a/libs/langchain/langchain/document_loaders/rss.py b/libs/langchain/langchain/document_loaders/rss.py
new file mode 100644
index 00000000000..870849d0ffc
--- /dev/null
+++ b/libs/langchain/langchain/document_loaders/rss.py
@@ -0,0 +1,133 @@
+"""Loader that uses unstructured to load HTML files."""
+import logging
+from typing import Any, Iterator, List, Optional, Sequence
+
+from langchain.docstore.document import Document
+from langchain.document_loaders.base import BaseLoader
+from langchain.document_loaders.news import NewsURLLoader
+
+logger = logging.getLogger(__name__)
+
+
+class RSSFeedLoader(BaseLoader):
+ """Loader that uses newspaper to load news articles from RSS feeds.
+
+ Args:
+ urls: URLs for RSS feeds to load. Each articles in the feed is loaded into its own document.
+ opml: OPML file to load feed urls from. Only one of urls or opml should be provided. The value
+ can be a URL string, or OPML markup contents as byte or string.
+ continue_on_failure: If True, continue loading documents even if
+ loading fails for a particular URL.
+ show_progress_bar: If True, use tqdm to show a loading progress bar. Requires
+ tqdm to be installed, ``pip install tqdm``.
+ **newsloader_kwargs: Any additional named arguments to pass to
+ NewsURLLoader.
+
+ Example:
+ .. code-block:: python
+
+ from langchain.document_loaders import RSSFeedLoader
+
+ loader = RSSFeedLoader(
+ urls=["", ""],
+ )
+ docs = loader.load()
+
+ The loader uses feedparser to parse RSS feeds. The feedparser library is not installed by default so you should
+ install it if using this loader:
+ https://pythonhosted.org/feedparser/
+
+ If you use OPML, you should also install listparser:
+ https://pythonhosted.org/listparser/
+
+ Finally, newspaper is used to process each article:
+ https://newspaper.readthedocs.io/en/latest/
+ """ # noqa: E501
+
+ def __init__(
+ self,
+ urls: Optional[Sequence[str]] = None,
+ opml: Optional[str] = None,
+ continue_on_failure: bool = True,
+ show_progress_bar: bool = False,
+ **newsloader_kwargs: Any,
+ ) -> None:
+ """Initialize with urls or OPML."""
+ if (urls is None) == (
+ opml is None
+ ): # This is True if both are None or neither is None
+ raise ValueError(
+ "Provide either the urls or the opml argument, but not both."
+ )
+ self.urls = urls
+ self.opml = opml
+ self.continue_on_failure = continue_on_failure
+ self.show_progress_bar = show_progress_bar
+ self.newsloader_kwargs = newsloader_kwargs
+
+ def load(self) -> List[Document]:
+ iter = self.lazy_load()
+ if self.show_progress_bar:
+ try:
+ from tqdm import tqdm
+ except ImportError as e:
+ raise ImportError(
+ "Package tqdm must be installed if show_progress_bar=True. "
+ "Please install with 'pip install tqdm' or set "
+ "show_progress_bar=False."
+ ) from e
+ iter = tqdm(iter)
+ return list(iter)
+
+ @property
+ def _get_urls(self) -> Sequence[str]:
+ if self.urls:
+ return self.urls
+ try:
+ import listparser
+ except ImportError as e:
+ raise ImportError(
+ "Package listparser must be installed if the opml arg is used. "
+ "Please install with 'pip install listparser' or use the "
+ "urls arg instead."
+ ) from e
+ rss = listparser.parse(self.opml)
+ return [feed.url for feed in rss.feeds]
+
+ def lazy_load(self) -> Iterator[Document]:
+ try:
+ import feedparser # noqa:F401
+ except ImportError:
+ raise ImportError(
+ "feedparser package not found, please install it with "
+ "`pip install feedparser`"
+ )
+
+ for url in self._get_urls:
+ try:
+ feed = feedparser.parse(url)
+ if getattr(feed, "bozo", False):
+ raise ValueError(
+ f"Error fetching {url}, exception: {feed.bozo_exception}"
+ )
+ except Exception as e:
+ if self.continue_on_failure:
+ logger.error(f"Error fetching {url}, exception: {e}")
+ continue
+ else:
+ raise e
+ try:
+ for entry in feed.entries:
+ loader = NewsURLLoader(
+ urls=[entry.link],
+ **self.newsloader_kwargs,
+ )
+ article = loader.load()[0]
+ article.metadata["feed"] = url
+ yield article
+ except Exception as e:
+ if self.continue_on_failure:
+ logger.error(f"Error processing entry {entry.link}, exception: {e}")
+ continue
+ else:
+ raise e
diff --git a/libs/langchain/poetry.lock b/libs/langchain/poetry.lock
index 11fb37248c5..8673a60e3ff 100644
--- a/libs/langchain/poetry.lock
+++ b/libs/langchain/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
[[package]]
name = "absl-py"
@@ -2158,6 +2158,18 @@ ssh = ["bcrypt (>=3.1.5)"]
test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
test-randomorder = ["pytest-randomly"]
+[[package]]
+name = "cssselect"
+version = "1.2.0"
+description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0"
+category = "main"
+optional = true
+python-versions = ">=3.7"
+files = [
+ {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"},
+ {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"},
+]
+
[[package]]
name = "cycler"
version = "0.11.0"
@@ -2838,6 +2850,22 @@ files = [
[package.extras]
devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"]
+[[package]]
+name = "feedfinder2"
+version = "0.0.4"
+description = "Find the feed URLs for a website."
+category = "main"
+optional = true
+python-versions = "*"
+files = [
+ {file = "feedfinder2-0.0.4.tar.gz", hash = "sha256:3701ee01a6c85f8b865a049c30ba0b4608858c803fe8e30d1d289fdbe89d0efe"},
+]
+
+[package.dependencies]
+beautifulsoup4 = "*"
+requests = "*"
+six = "*"
+
[[package]]
name = "feedparser"
version = "6.0.10"
@@ -4378,6 +4406,17 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab
qa = ["flake8 (==3.8.3)", "mypy (==0.782)"]
testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
+[[package]]
+name = "jieba3k"
+version = "0.35.1"
+description = "Chinese Words Segementation Utilities"
+category = "main"
+optional = true
+python-versions = "*"
+files = [
+ {file = "jieba3k-0.35.1.zip", hash = "sha256:980a4f2636b778d312518066be90c7697d410dd5a472385f5afced71a2db1c10"},
+]
+
[[package]]
name = "jina"
version = "3.14.1"
@@ -6472,6 +6511,33 @@ doc = ["nb2plots (>=0.6)", "numpydoc (>=1.5)", "pillow (>=9.2)", "pydata-sphinx-
extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.9)", "sympy (>=1.10)"]
test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"]
+[[package]]
+name = "newspaper3k"
+version = "0.2.8"
+description = "Simplified python article discovery & extraction."
+category = "main"
+optional = true
+python-versions = "*"
+files = [
+ {file = "newspaper3k-0.2.8-py3-none-any.whl", hash = "sha256:44a864222633d3081113d1030615991c3dbba87239f6bbf59d91240f71a22e3e"},
+ {file = "newspaper3k-0.2.8.tar.gz", hash = "sha256:9f1bd3e1fb48f400c715abf875cc7b0a67b7ddcd87f50c9aeeb8fcbbbd9004fb"},
+]
+
+[package.dependencies]
+beautifulsoup4 = ">=4.4.1"
+cssselect = ">=0.9.2"
+feedfinder2 = ">=0.0.4"
+feedparser = ">=5.2.1"
+jieba3k = ">=0.35.1"
+lxml = ">=3.6.0"
+nltk = ">=3.2.1"
+Pillow = ">=3.3.0"
+python-dateutil = ">=2.5.3"
+PyYAML = ">=3.11"
+requests = ">=2.10.0"
+tinysegmenter = "0.3"
+tldextract = ">=2.0.1"
+
[[package]]
name = "nlpcloud"
version = "1.0.42"
@@ -10001,6 +10067,22 @@ urllib3 = ">=1.21.1,<1.27"
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+[[package]]
+name = "requests-file"
+version = "1.5.1"
+description = "File transport adapter for Requests"
+category = "main"
+optional = true
+python-versions = "*"
+files = [
+ {file = "requests-file-1.5.1.tar.gz", hash = "sha256:07d74208d3389d01c38ab89ef403af0cfec63957d53a0081d8eca738d0247d8e"},
+ {file = "requests_file-1.5.1-py2.py3-none-any.whl", hash = "sha256:dfe5dae75c12481f68ba353183c53a65e6044c923e64c24b2209f6c7570ca953"},
+]
+
+[package.dependencies]
+requests = ">=1.0.0"
+six = "*"
+
[[package]]
name = "requests-oauthlib"
version = "1.3.1"
@@ -11708,6 +11790,35 @@ webencodings = ">=0.4"
doc = ["sphinx", "sphinx_rtd_theme"]
test = ["flake8", "isort", "pytest"]
+[[package]]
+name = "tinysegmenter"
+version = "0.3"
+description = "Very compact Japanese tokenizer"
+category = "main"
+optional = true
+python-versions = "*"
+files = [
+ {file = "tinysegmenter-0.3.tar.gz", hash = "sha256:ed1f6d2e806a4758a73be589754384cbadadc7e1a414c81a166fc9adf2d40c6d"},
+]
+
+[[package]]
+name = "tldextract"
+version = "3.4.4"
+description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well."
+category = "main"
+optional = true
+python-versions = ">=3.7"
+files = [
+ {file = "tldextract-3.4.4-py3-none-any.whl", hash = "sha256:581e7dbefc90e7bb857bb6f768d25c811a3c5f0892ed56a9a2999ddb7b1b70c2"},
+ {file = "tldextract-3.4.4.tar.gz", hash = "sha256:5fe3210c577463545191d45ad522d3d5e78d55218ce97215e82004dcae1e1234"},
+]
+
+[package.dependencies]
+filelock = ">=3.0.8"
+idna = "*"
+requests = ">=2.1.0"
+requests-file = ">=1.4"
+
[[package]]
name = "tokenizers"
version = "0.13.3"
@@ -11950,7 +12061,7 @@ files = [
]
[package.dependencies]
-accelerate = {version = ">=0.20.2", optional = true, markers = "extra == \"accelerate\""}
+accelerate = {version = ">=0.20.2", optional = true, markers = "extra == \"accelerate\" or extra == \"torch\""}
filelock = "*"
huggingface-hub = ">=0.14.1,<1.0"
numpy = ">=1.17"
@@ -13422,15 +13533,15 @@ cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\
cffi = ["cffi (>=1.11)"]
[extras]
-all = ["anthropic", "clarifai", "cohere", "openai", "nlpcloud", "huggingface_hub", "jina", "manifest-ml", "elasticsearch", "opensearch-py", "google-search-results", "faiss-cpu", "sentence-transformers", "transformers", "spacy", "nltk", "wikipedia", "beautifulsoup4", "tiktoken", "torch", "jinja2", "pinecone-client", "pinecone-text", "marqo", "pymongo", "weaviate-client", "redis", "google-api-python-client", "google-auth", "wolframalpha", "qdrant-client", "tensorflow-text", "pypdf", "networkx", "nomic", "aleph-alpha-client", "deeplake", "libdeeplake", "pgvector", "psycopg2-binary", "pyowm", "pytesseract", "html2text", "atlassian-python-api", "gptcache", "duckduckgo-search", "arxiv", "azure-identity", "clickhouse-connect", "azure-cosmos", "lancedb", "langkit", "lark", "pexpect", "pyvespa", "O365", "jq", "docarray", "steamship", "pdfminer-six", "lxml", "requests-toolbelt", "neo4j", "openlm", "azure-ai-formrecognizer", "azure-ai-vision", "azure-cognitiveservices-speech", "momento", "singlestoredb", "tigrisdb", "nebula3-python", "awadb", "esprima", "octoai-sdk", "rdflib", "amadeus", "xinference", "librosa", "python-arango"]
-azure = ["azure-identity", "azure-cosmos", "openai", "azure-core", "azure-ai-formrecognizer", "azure-ai-vision", "azure-cognitiveservices-speech", "azure-search-documents"]
+all = ["O365", "aleph-alpha-client", "amadeus", "anthropic", "arxiv", "atlassian-python-api", "awadb", "azure-ai-formrecognizer", "azure-ai-vision", "azure-cognitiveservices-speech", "azure-cosmos", "azure-identity", "beautifulsoup4", "clarifai", "clickhouse-connect", "cohere", "deeplake", "docarray", "duckduckgo-search", "elasticsearch", "esprima", "faiss-cpu", "google-api-python-client", "google-auth", "google-search-results", "gptcache", "html2text", "huggingface_hub", "jina", "jinja2", "jq", "lancedb", "langkit", "lark", "libdeeplake", "librosa", "lxml", "manifest-ml", "marqo", "momento", "nebula3-python", "neo4j", "networkx", "nlpcloud", "nltk", "nomic", "octoai-sdk", "openai", "openlm", "opensearch-py", "pdfminer-six", "pexpect", "pgvector", "pinecone-client", "pinecone-text", "psycopg2-binary", "pymongo", "pyowm", "pypdf", "pytesseract", "python-arango", "pyvespa", "qdrant-client", "rdflib", "redis", "requests-toolbelt", "sentence-transformers", "singlestoredb", "spacy", "steamship", "tensorflow-text", "tigrisdb", "tiktoken", "torch", "transformers", "weaviate-client", "wikipedia", "wolframalpha", "xinference"]
+azure = ["azure-ai-formrecognizer", "azure-ai-vision", "azure-cognitiveservices-speech", "azure-core", "azure-cosmos", "azure-identity", "azure-search-documents", "openai"]
clarifai = ["clarifai"]
cohere = ["cohere"]
docarray = ["docarray"]
embeddings = ["sentence-transformers"]
-extended-testing = ["beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "jq", "pdfminer-six", "pgvector", "pypdf", "pymupdf", "pypdfium2", "tqdm", "lxml", "atlassian-python-api", "mwparserfromhell", "mwxml", "pandas", "telethon", "psychicapi", "zep-python", "gql", "requests-toolbelt", "html2text", "py-trello", "scikit-learn", "streamlit", "pyspark", "openai", "sympy", "rapidfuzz", "openai", "rank-bm25", "geopandas", "jinja2", "xinference", "gitpython"]
+extended-testing = ["atlassian-python-api", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "esprima", "feedparser", "geopandas", "gitpython", "gql", "html2text", "jinja2", "jq", "lxml", "mwparserfromhell", "mwxml", "newspaper3k", "openai", "openai", "pandas", "pdfminer-six", "pgvector", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "requests-toolbelt", "scikit-learn", "streamlit", "sympy", "telethon", "tqdm", "xinference", "zep-python"]
javascript = ["esprima"]
-llms = ["anthropic", "clarifai", "cohere", "openai", "openllm", "openlm", "nlpcloud", "huggingface_hub", "manifest-ml", "torch", "transformers", "xinference"]
+llms = ["anthropic", "clarifai", "cohere", "huggingface_hub", "manifest-ml", "nlpcloud", "openai", "openllm", "openlm", "torch", "transformers", "xinference"]
openai = ["openai", "tiktoken"]
qdrant = ["qdrant-client"]
text-helpers = ["chardet"]
@@ -13438,4 +13549,4 @@ text-helpers = ["chardet"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.8.1,<4.0"
-content-hash = "84ededcf21a742653863c033dd31e1b24af7562d479c179cd58ba22b2a9805e9"
+content-hash = "0708c3b45f59eea36919ff9ff99fa6eddc81bccb654cce183641ef8396ea5290"
diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml
index b04283f095f..1c1b10915aa 100644
--- a/libs/langchain/pyproject.toml
+++ b/libs/langchain/pyproject.toml
@@ -128,6 +128,8 @@ xinference = {version = "^0.0.6", optional = true}
python-arango = {version = "^7.5.9", optional = true}
gitpython = {version = "^3.1.32", optional = true}
librosa = {version="^0.10.0.post2", optional = true }
+feedparser = {version = "^6.0.10", optional = true}
+newspaper3k = {version = "^0.2.8", optional = true}
[tool.poetry.group.test.dependencies]
# The only dependencies that should be added are
@@ -363,6 +365,8 @@ extended_testing = [
"jinja2",
"xinference",
"gitpython",
+ "newspaper3k",
+ "feedparser",
]
[tool.ruff]
diff --git a/libs/langchain/tests/integration_tests/document_loaders/test_rss.py b/libs/langchain/tests/integration_tests/document_loaders/test_rss.py
new file mode 100644
index 00000000000..093a38ffb44
--- /dev/null
+++ b/libs/langchain/tests/integration_tests/document_loaders/test_rss.py
@@ -0,0 +1,42 @@
+from pathlib import Path
+
+from langchain.document_loaders.rss import RSSFeedLoader
+
+
+def test_rss_loader() -> None:
+ loader = RSSFeedLoader(urls=["https://www.engadget.com/rss.xml"])
+ docs = loader.load()
+
+ assert docs[0] is not None
+ assert hasattr(docs[0], "page_content")
+ assert hasattr(docs[0], "metadata")
+
+ metadata = docs[0].metadata
+ assert "feed" in metadata
+ assert "title" in metadata
+ assert "link" in metadata
+ assert "authors" in metadata
+ assert "language" in metadata
+ assert "description" in metadata
+ assert "publish_date" in metadata
+
+
+def test_rss_loader_with_opml() -> None:
+ file_path = Path(__file__).parent.parent / "examples"
+ with open(file_path.joinpath("sample_rss_feeds.opml"), "r") as f:
+ loader = RSSFeedLoader(opml=f.read())
+
+ docs = loader.load()
+
+ assert docs[0] is not None
+ assert hasattr(docs[0], "page_content")
+ assert hasattr(docs[0], "metadata")
+
+ metadata = docs[0].metadata
+ assert "feed" in metadata
+ assert "title" in metadata
+ assert "link" in metadata
+ assert "authors" in metadata
+ assert "language" in metadata
+ assert "description" in metadata
+ assert "publish_date" in metadata
diff --git a/libs/langchain/tests/integration_tests/examples/sample_rss_feeds.opml b/libs/langchain/tests/integration_tests/examples/sample_rss_feeds.opml
new file mode 100644
index 00000000000..290b2c5db2e
--- /dev/null
+++ b/libs/langchain/tests/integration_tests/examples/sample_rss_feeds.opml
@@ -0,0 +1,13 @@
+
+
+
+
+ Sample RSS feed subscriptions
+
+
+
+
+
+
+
+
diff --git a/libs/langchain/tests/unit_tests/document_loaders/test_rss.py b/libs/langchain/tests/unit_tests/document_loaders/test_rss.py
new file mode 100644
index 00000000000..2d216049991
--- /dev/null
+++ b/libs/langchain/tests/unit_tests/document_loaders/test_rss.py
@@ -0,0 +1,18 @@
+import pytest
+
+from langchain.document_loaders import RSSFeedLoader
+
+
+@pytest.mark.requires("feedparser", "newspaper")
+def test_continue_on_failure_true() -> None:
+ """Test exception is not raised when continue_on_failure=True."""
+ loader = RSSFeedLoader(["badurl.foobar"])
+ loader.load()
+
+
+@pytest.mark.requires("feedparser", "newspaper")
+def test_continue_on_failure_false() -> None:
+ """Test exception is raised when continue_on_failure=False."""
+ loader = RSSFeedLoader(["badurl.foobar"], continue_on_failure=False)
+ with pytest.raises(Exception):
+ loader.load()
diff --git a/poetry.lock b/poetry.lock
index d0255f9113e..be71e6b2562 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,9 +1,10 @@
-# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand.
[[package]]
name = "aiohttp"
version = "3.8.5"
description = "Async http client/server framework (asyncio)"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -112,6 +113,7 @@ speedups = ["Brotli", "aiodns", "cchardet"]
name = "aiosignal"
version = "1.3.1"
description = "aiosignal: a list of registered asynchronous callbacks"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -126,6 +128,7 @@ frozenlist = ">=1.1.0"
name = "alabaster"
version = "0.7.13"
description = "A configurable sidebar-enabled Sphinx theme"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -137,6 +140,7 @@ files = [
name = "anyio"
version = "3.7.1"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -158,6 +162,7 @@ trio = ["trio (<0.22)"]
name = "appnope"
version = "0.1.3"
description = "Disable App Nap on macOS >= 10.9"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -169,6 +174,7 @@ files = [
name = "argon2-cffi"
version = "21.3.0"
description = "The secure Argon2 password hashing algorithm."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -188,6 +194,7 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"]
name = "argon2-cffi-bindings"
version = "21.2.0"
description = "Low-level CFFI bindings for Argon2"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -225,6 +232,7 @@ tests = ["pytest"]
name = "arrow"
version = "1.2.3"
description = "Better dates & times for Python"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -239,6 +247,7 @@ python-dateutil = ">=2.7.0"
name = "asttokens"
version = "2.2.1"
description = "Annotate AST trees with source code positions"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -256,6 +265,7 @@ test = ["astroid", "pytest"]
name = "async-lru"
version = "2.0.3"
description = "Simple LRU cache for asyncio"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -270,6 +280,7 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""}
name = "async-timeout"
version = "4.0.2"
description = "Timeout context manager for asyncio programs"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -281,6 +292,7 @@ files = [
name = "attrs"
version = "23.1.0"
description = "Classes Without Boilerplate"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -299,6 +311,7 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
name = "autodoc-pydantic"
version = "1.9.0"
description = "Seamlessly integrate pydantic models in your Sphinx documentation."
+category = "dev"
optional = false
python-versions = ">=3.7.1,<4.0.0"
files = [
@@ -320,6 +333,7 @@ test = ["coverage (>=7,<8)", "pytest (>=7,<8)"]
name = "babel"
version = "2.12.1"
description = "Internationalization utilities"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -334,6 +348,7 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""}
name = "backcall"
version = "0.2.0"
description = "Specifications for callback functions passed in to an API"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -345,6 +360,7 @@ files = [
name = "beautifulsoup4"
version = "4.12.2"
description = "Screen-scraping library"
+category = "dev"
optional = false
python-versions = ">=3.6.0"
files = [
@@ -363,6 +379,7 @@ lxml = ["lxml"]
name = "black"
version = "23.7.0"
description = "The uncompromising code formatter."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -411,6 +428,7 @@ uvloop = ["uvloop (>=0.15.2)"]
name = "bleach"
version = "6.0.0"
description = "An easy safelist-based HTML-sanitizing tool."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -429,6 +447,7 @@ css = ["tinycss2 (>=1.1.0,<1.2)"]
name = "certifi"
version = "2023.5.7"
description = "Python package for providing Mozilla's CA Bundle."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -440,6 +459,7 @@ files = [
name = "cffi"
version = "1.15.1"
description = "Foreign Function Interface for Python calling C code."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -516,6 +536,7 @@ pycparser = "*"
name = "charset-normalizer"
version = "3.2.0"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "dev"
optional = false
python-versions = ">=3.7.0"
files = [
@@ -600,6 +621,7 @@ files = [
name = "click"
version = "8.1.6"
description = "Composable command line interface toolkit"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -614,6 +636,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
name = "codespell"
version = "2.2.5"
description = "Codespell"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -631,6 +654,7 @@ types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
+category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
files = [
@@ -642,6 +666,7 @@ files = [
name = "comm"
version = "0.1.3"
description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -661,6 +686,7 @@ typing = ["mypy (>=0.990)"]
name = "dataclasses-json"
version = "0.5.9"
description = "Easily serialize dataclasses to and from JSON"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -680,6 +706,7 @@ dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (
name = "debugpy"
version = "1.6.7"
description = "An implementation of the Debug Adapter Protocol for Python"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -707,6 +734,7 @@ files = [
name = "decorator"
version = "5.1.1"
description = "Decorators for Humans"
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -718,6 +746,7 @@ files = [
name = "defusedxml"
version = "0.7.1"
description = "XML bomb protection for Python stdlib modules"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -729,6 +758,7 @@ files = [
name = "dnspython"
version = "2.4.0"
description = "DNS toolkit"
+category = "dev"
optional = false
python-versions = ">=3.8,<4.0"
files = [
@@ -752,6 +782,7 @@ wmi = ["wmi (>=1.5.1,<2.0.0)"]
name = "docutils"
version = "0.17.1"
description = "Docutils -- Python Documentation Utilities"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -763,6 +794,7 @@ files = [
name = "entrypoints"
version = "0.4"
description = "Discover and load entry points from installed packages."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -774,6 +806,7 @@ files = [
name = "exceptiongroup"
version = "1.1.2"
description = "Backport of PEP 654 (exception groups)"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -788,6 +821,7 @@ test = ["pytest (>=6)"]
name = "executing"
version = "1.2.0"
description = "Get the currently executing AST node of a frame, and other information"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -802,6 +836,7 @@ tests = ["asttokens", "littleutils", "pytest", "rich"]
name = "fastcore"
version = "1.4.2"
description = "Python supercharged for fastai development"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -820,6 +855,7 @@ dev = ["matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"]
name = "fastjsonschema"
version = "2.17.1"
description = "Fastest Python implementation of JSON schema"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -834,6 +870,7 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
name = "fastrelease"
version = "0.1.17"
description = "Simplified releases using GitHub Issues"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -852,6 +889,7 @@ pyyaml = "*"
name = "fqdn"
version = "1.5.1"
description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4"
files = [
@@ -863,6 +901,7 @@ files = [
name = "frozenlist"
version = "1.4.0"
description = "A list-like structure which implements collections.abc.MutableSequence"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -933,6 +972,7 @@ files = [
name = "ghapi"
version = "0.1.22"
description = "A python client for the GitHub API"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -952,6 +992,7 @@ dev = ["jsonref"]
name = "greenlet"
version = "2.0.2"
description = "Lightweight in-process concurrent programming"
+category = "dev"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
files = [
@@ -1025,6 +1066,7 @@ test = ["objgraph", "psutil"]
name = "h11"
version = "0.14.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1036,6 +1078,7 @@ files = [
name = "httpcore"
version = "0.17.3"
description = "A minimal low-level HTTP client."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1047,16 +1090,17 @@ files = [
anyio = ">=3.0,<5.0"
certifi = "*"
h11 = ">=0.13,<0.15"
-sniffio = "==1.*"
+sniffio = ">=1.0.0,<2.0.0"
[package.extras]
http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (==1.*)"]
+socks = ["socksio (>=1.0.0,<2.0.0)"]
[[package]]
name = "idna"
version = "3.4"
description = "Internationalized Domain Names in Applications (IDNA)"
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -1068,6 +1112,7 @@ files = [
name = "imagesize"
version = "1.4.1"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -1079,6 +1124,7 @@ files = [
name = "importlib-metadata"
version = "6.8.0"
description = "Read metadata from Python packages"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1098,6 +1144,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs
name = "importlib-resources"
version = "6.0.0"
description = "Read resources from Python packages"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1116,6 +1163,7 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)",
name = "ipykernel"
version = "6.24.0"
description = "IPython Kernel for Jupyter"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1129,7 +1177,7 @@ comm = ">=0.1.1"
debugpy = ">=1.6.5"
ipython = ">=7.23.1"
jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
matplotlib-inline = ">=0.1"
nest-asyncio = "*"
packaging = "*"
@@ -1149,6 +1197,7 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio"
name = "ipython"
version = "8.12.2"
description = "IPython: Productive Interactive Computing"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1188,6 +1237,7 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa
name = "ipython-genutils"
version = "0.2.0"
description = "Vestigial utilities from IPython"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1199,6 +1249,7 @@ files = [
name = "ipywidgets"
version = "8.0.7"
description = "Jupyter interactive widgets"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1220,6 +1271,7 @@ test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"]
name = "isoduration"
version = "20.11.0"
description = "Operations with ISO 8601 durations"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1234,6 +1286,7 @@ arrow = ">=0.15.0"
name = "jedi"
version = "0.18.2"
description = "An autocompletion tool for Python that can be used for text editors."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -1253,6 +1306,7 @@ testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
name = "jinja2"
version = "3.1.2"
description = "A very fast and expressive template engine."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1270,6 +1324,7 @@ i18n = ["Babel (>=2.7)"]
name = "json5"
version = "0.9.14"
description = "A Python implementation of the JSON5 data format."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1284,17 +1339,18 @@ dev = ["hypothesis"]
name = "jsonpointer"
version = "2.4"
description = "Identify specific nodes in a JSON document (RFC 6901)"
+category = "dev"
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.18.4"
description = "An implementation of JSON Schema validation for Python"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1326,6 +1382,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-
name = "jsonschema-specifications"
version = "2023.7.1"
description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1341,6 +1398,7 @@ referencing = ">=0.28.0"
name = "jupyter"
version = "1.0.0"
description = "Jupyter metapackage. Install all the Jupyter components in one go."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1361,6 +1419,7 @@ qtconsole = "*"
name = "jupyter-cache"
version = "0.6.1"
description = "A defined interface for working with a cache of jupyter notebooks."
+category = "dev"
optional = false
python-versions = "~=3.8"
files = [
@@ -1388,6 +1447,7 @@ testing = ["coverage", "ipykernel", "jupytext", "matplotlib", "nbdime", "nbforma
name = "jupyter-client"
version = "7.4.9"
description = "Jupyter protocol implementation and client libraries"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1412,6 +1472,7 @@ test = ["codecov", "coverage", "ipykernel (>=6.12)", "ipython", "mypy", "pre-com
name = "jupyter-console"
version = "6.6.3"
description = "Jupyter terminal console"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1423,7 +1484,7 @@ files = [
ipykernel = ">=6.14"
ipython = "*"
jupyter-client = ">=7.0.0"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
prompt-toolkit = ">=3.0.30"
pygments = "*"
pyzmq = ">=17"
@@ -1436,6 +1497,7 @@ test = ["flaky", "pexpect", "pytest"]
name = "jupyter-core"
version = "5.3.1"
description = "Jupyter core package. A base package on which Jupyter projects rely."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1456,6 +1518,7 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"]
name = "jupyter-events"
version = "0.6.3"
description = "Jupyter Event System library"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1480,6 +1543,7 @@ test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=
name = "jupyter-lsp"
version = "2.2.0"
description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1495,6 +1559,7 @@ jupyter-server = ">=1.1.2"
name = "jupyter-server"
version = "2.7.0"
description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1507,7 +1572,7 @@ anyio = ">=3.1.0"
argon2-cffi = "*"
jinja2 = "*"
jupyter-client = ">=7.4.4"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
jupyter-events = ">=0.6.0"
jupyter-server-terminals = "*"
nbconvert = ">=6.4.4"
@@ -1531,6 +1596,7 @@ test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-sc
name = "jupyter-server-terminals"
version = "0.4.4"
description = "A Jupyter Server Extension Providing Terminals."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1550,6 +1616,7 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov",
name = "jupyterlab"
version = "4.0.3"
description = "JupyterLab computational environment"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1583,6 +1650,7 @@ test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-cons
name = "jupyterlab-pygments"
version = "0.2.2"
description = "Pygments theme using JupyterLab CSS variables"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1594,6 +1662,7 @@ files = [
name = "jupyterlab-server"
version = "2.23.0"
description = "A set of server components for JupyterLab and JupyterLab like applications."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1620,6 +1689,7 @@ test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-valida
name = "jupyterlab-widgets"
version = "3.0.8"
description = "Jupyter interactive widgets for JupyterLab"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1629,8 +1699,9 @@ files = [
[[package]]
name = "langchain"
-version = "0.0.244"
+version = "0.0.251"
description = "Building applications with LLMs through composability"
+category = "dev"
optional = false
python-versions = ">=3.8.1,<4.0"
files = []
@@ -1645,19 +1716,19 @@ numexpr = "^2.8.4"
numpy = "^1"
openapi-schema-pydantic = "^1.2"
pydantic = "^1"
-PyYAML = ">=5.4.1"
+PyYAML = ">=5.3"
requests = "^2"
SQLAlchemy = ">=1.4,<3"
tenacity = "^8.1.0"
[package.extras]
-all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "amadeus (>=8.1.0)", "anthropic (>=0.3,<0.4)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.3,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (>=9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=4,<5)", "deeplake (>=3.6.8,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.6,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "libdeeplake (>=0.0.60,<0.0.61)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "marqo (>=0.11.0,<0.12.0)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "octoai-sdk (>=0.1.1,<0.2.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "python-arango (>=7.5.9,<8.0.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.3.1,<2.0.0)", "rdflib (>=6.3.2,<7.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)", "xinference (>=0.0.6,<0.0.7)"]
+all = ["O365 (>=2.0.26,<3.0.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "amadeus (>=8.1.0)", "anthropic (>=0.3,<0.4)", "arxiv (>=1.4,<2.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "awadb (>=0.3.9,<0.4.0)", "azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "beautifulsoup4 (>=4,<5)", "clarifai (>=9.1.0)", "clickhouse-connect (>=0.5.14,<0.6.0)", "cohere (>=4,<5)", "deeplake (>=3.6.8,<4.0.0)", "docarray[hnswlib] (>=0.32.0,<0.33.0)", "duckduckgo-search (>=3.8.3,<4.0.0)", "elasticsearch (>=8,<9)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "google-api-python-client (==2.70.0)", "google-auth (>=2.18.1,<3.0.0)", "google-search-results (>=2,<3)", "gptcache (>=0.1.7)", "html2text (>=2020.1.16,<2021.0.0)", "huggingface_hub (>=0,<1)", "jina (>=3.14,<4.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lancedb (>=0.1,<0.2)", "langkit (>=0.0.6,<0.1.0)", "lark (>=1.1.5,<2.0.0)", "libdeeplake (>=0.0.60,<0.0.61)", "librosa (>=0.10.0.post2,<0.11.0)", "lxml (>=4.9.2,<5.0.0)", "manifest-ml (>=0.0.1,<0.0.2)", "marqo (>=0.11.0,<0.12.0)", "momento (>=1.5.0,<2.0.0)", "nebula3-python (>=3.4.0,<4.0.0)", "neo4j (>=5.8.1,<6.0.0)", "networkx (>=2.6.3,<3.0.0)", "nlpcloud (>=1,<2)", "nltk (>=3,<4)", "nomic (>=1.0.43,<2.0.0)", "octoai-sdk (>=0.1.1,<0.2.0)", "openai (>=0,<1)", "openlm (>=0.0.5,<0.0.6)", "opensearch-py (>=2.0.0,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pexpect (>=4.8.0,<5.0.0)", "pgvector (>=0.1.6,<0.2.0)", "pinecone-client (>=2,<3)", "pinecone-text (>=0.4.2,<0.5.0)", "psycopg2-binary (>=2.9.5,<3.0.0)", "pymongo (>=4.3.3,<5.0.0)", "pyowm (>=3.3.0,<4.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pytesseract (>=0.3.10,<0.4.0)", "python-arango (>=7.5.9,<8.0.0)", "pyvespa (>=0.33.0,<0.34.0)", "qdrant-client (>=1.3.1,<2.0.0)", "rdflib (>=6.3.2,<7.0.0)", "redis (>=4,<5)", "requests-toolbelt (>=1.0.0,<2.0.0)", "sentence-transformers (>=2,<3)", "singlestoredb (>=0.7.1,<0.8.0)", "spacy (>=3,<4)", "steamship (>=2.16.9,<3.0.0)", "tensorflow-text (>=2.11.0,<3.0.0)", "tigrisdb (>=1.0.0b6,<2.0.0)", "tiktoken (>=0.3.2,<0.4.0)", "torch (>=1,<3)", "transformers (>=4,<5)", "weaviate-client (>=3,<4)", "wikipedia (>=1,<2)", "wolframalpha (==5.0.0)", "xinference (>=0.0.6,<0.0.7)"]
azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-vision (>=0.11.1b1,<0.12.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b6)", "openai (>=0,<1)"]
clarifai = ["clarifai (>=9.1.0)"]
cohere = ["cohere (>=4,<5)"]
docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"]
embeddings = ["sentence-transformers (>=2,<3)"]
-extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.0.7,<0.0.8)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "openai (>=0,<1)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "xinference (>=0.0.6,<0.0.7)", "zep-python (>=0.32)"]
+extended-testing = ["atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.0.7,<0.0.8)", "chardet (>=5.1.0,<6.0.0)", "esprima (>=4.0.1,<5.0.0)", "feedparser (>=6.0.10,<7.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "gql (>=3.4.1,<4.0.0)", "html2text (>=2020.1.16,<2021.0.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "lxml (>=4.9.2,<5.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "openai (>=0,<1)", "openai (>=0,<1)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tqdm (>=4.48.0)", "xinference (>=0.0.6,<0.0.7)", "zep-python (>=0.32)"]
javascript = ["esprima (>=4.0.1,<5.0.0)"]
llms = ["anthropic (>=0.3,<0.4)", "clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (>=0,<1)", "openllm (>=0.1.19)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)", "xinference (>=0.0.6,<0.0.7)"]
openai = ["openai (>=0,<1)", "tiktoken (>=0.3.2,<0.4.0)"]
@@ -1672,6 +1743,7 @@ url = "libs/langchain"
name = "langsmith"
version = "0.0.12"
description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
+category = "dev"
optional = false
python-versions = ">=3.8.1,<4.0"
files = [
@@ -1687,6 +1759,7 @@ requests = ">=2,<3"
name = "linkchecker"
version = "10.2.1"
description = "check links in web documents or full websites"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1703,6 +1776,7 @@ requests = ">=2.20"
name = "livereload"
version = "2.6.3"
description = "Python LiveReload is an awesome tool for web developers"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1718,6 +1792,7 @@ tornado = {version = "*", markers = "python_version > \"2.7\""}
name = "markdown-it-py"
version = "2.2.0"
description = "Python port of markdown-it. Markdown parsing, done right!"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1742,6 +1817,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
name = "markupsafe"
version = "2.1.3"
description = "Safely add untrusted strings to HTML/XML markup."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1801,6 +1877,7 @@ files = [
name = "marshmallow"
version = "3.20.1"
description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -1821,6 +1898,7 @@ tests = ["pytest", "pytz", "simplejson"]
name = "marshmallow-enum"
version = "1.5.1"
description = "Enum field for Marshmallow"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -1835,6 +1913,7 @@ marshmallow = ">=2.0.0"
name = "matplotlib-inline"
version = "0.1.6"
description = "Inline Matplotlib backend for Jupyter"
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -1849,6 +1928,7 @@ traitlets = "*"
name = "mdit-py-plugins"
version = "0.3.5"
description = "Collection of plugins for markdown-it-py"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1868,6 +1948,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
name = "mdurl"
version = "0.1.2"
description = "Markdown URL utilities"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1879,6 +1960,7 @@ files = [
name = "mistune"
version = "3.0.1"
description = "A sane and fast Markdown parser with useful plugins and renderers"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1890,6 +1972,7 @@ files = [
name = "multidict"
version = "6.0.4"
description = "multidict implementation"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -1973,6 +2056,7 @@ files = [
name = "mypy-extensions"
version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -1984,6 +2068,7 @@ files = [
name = "myst-nb"
version = "0.17.2"
description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2012,6 +2097,7 @@ testing = ["beautifulsoup4", "coverage (>=6.4,<8.0)", "ipykernel (>=5.5,<6.0)",
name = "myst-parser"
version = "0.18.1"
description = "An extended commonmark compliant parser, with bridges to docutils & sphinx."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2038,6 +2124,7 @@ testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=6,<7)", "pytest-cov",
name = "nbclient"
version = "0.7.4"
description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor."
+category = "dev"
optional = false
python-versions = ">=3.7.0"
files = [
@@ -2047,7 +2134,7 @@ files = [
[package.dependencies]
jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
+jupyter-core = ">=4.12,<5.0.0 || >=5.1.0"
nbformat = ">=5.1"
traitlets = ">=5.3"
@@ -2060,6 +2147,7 @@ test = ["flaky", "ipykernel", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "p
name = "nbconvert"
version = "7.7.2"
description = "Converting Jupyter Notebooks"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2098,6 +2186,7 @@ webpdf = ["playwright"]
name = "nbdev"
version = "1.2.0"
description = "Writing a library entirely in notebooks"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2122,6 +2211,7 @@ pyyaml = "*"
name = "nbdoc"
version = "0.0.82"
description = "Generate beautiful, testable documentation with Jupyter Notebooks"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2142,6 +2232,7 @@ pip = "*"
name = "nbformat"
version = "5.9.1"
description = "The Jupyter Notebook format"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2163,6 +2254,7 @@ test = ["pep440", "pre-commit", "pytest", "testpath"]
name = "nbsphinx"
version = "0.8.12"
description = "Jupyter Notebook Tools for Sphinx"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2182,6 +2274,7 @@ traitlets = ">=5"
name = "nest-asyncio"
version = "1.5.6"
description = "Patch asyncio to allow nested event loops"
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -2193,6 +2286,7 @@ files = [
name = "notebook"
version = "7.0.0"
description = "Jupyter Notebook - A web-based notebook environment for interactive computing"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2217,6 +2311,7 @@ test = ["ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[tes
name = "notebook-shim"
version = "0.2.3"
description = "A shim layer for notebook traits and config"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2234,6 +2329,7 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"
name = "numexpr"
version = "2.8.4"
description = "Fast numerical expression evaluator for NumPy"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2276,6 +2372,7 @@ numpy = ">=1.13.3"
name = "numpy"
version = "1.24.4"
description = "Fundamental package for array computing in Python"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2313,6 +2410,7 @@ files = [
name = "numpydoc"
version = "1.2"
description = "Sphinx extension to support docstrings in Numpy format"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2331,6 +2429,7 @@ testing = ["matplotlib", "pytest", "pytest-cov"]
name = "openapi-schema-pydantic"
version = "1.2.4"
description = "OpenAPI (v3) specification schema as pydantic class"
+category = "dev"
optional = false
python-versions = ">=3.6.1"
files = [
@@ -2345,6 +2444,7 @@ pydantic = ">=1.8.2"
name = "overrides"
version = "7.3.1"
description = "A decorator to automatically detect mismatch when overriding a method."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2356,6 +2456,7 @@ files = [
name = "packaging"
version = "23.1"
description = "Core utilities for Python packages"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2367,6 +2468,7 @@ files = [
name = "pandocfilters"
version = "1.5.0"
description = "Utilities for writing pandoc filters in python"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2378,6 +2480,7 @@ files = [
name = "parso"
version = "0.8.3"
description = "A Python Parser"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2393,6 +2496,7 @@ testing = ["docopt", "pytest (<6.0.0)"]
name = "pathspec"
version = "0.11.1"
description = "Utility library for gitignore style pattern matching of file paths."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2404,6 +2508,7 @@ files = [
name = "pexpect"
version = "4.8.0"
description = "Pexpect allows easy control of interactive console applications."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2418,6 +2523,7 @@ ptyprocess = ">=0.5"
name = "pickleshare"
version = "0.7.5"
description = "Tiny 'shelve'-like database with concurrency support"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2429,6 +2535,7 @@ files = [
name = "pip"
version = "23.2"
description = "The PyPA recommended tool for installing Python packages."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2440,6 +2547,7 @@ files = [
name = "pkgutil-resolve-name"
version = "1.3.10"
description = "Resolve a name to an object."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2451,6 +2559,7 @@ files = [
name = "platformdirs"
version = "3.9.1"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2466,6 +2575,7 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-
name = "prometheus-client"
version = "0.17.1"
description = "Python client for the Prometheus monitoring system."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2480,6 +2590,7 @@ twisted = ["twisted"]
name = "prompt-toolkit"
version = "3.0.39"
description = "Library for building powerful interactive command lines in Python"
+category = "dev"
optional = false
python-versions = ">=3.7.0"
files = [
@@ -2494,6 +2605,7 @@ wcwidth = "*"
name = "psutil"
version = "5.9.5"
description = "Cross-platform lib for process and system monitoring in Python."
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2520,6 +2632,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
name = "ptyprocess"
version = "0.7.0"
description = "Run a subprocess in a pseudo terminal"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2531,6 +2644,7 @@ files = [
name = "pure-eval"
version = "0.2.2"
description = "Safely evaluate AST nodes without side effects"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2545,6 +2659,7 @@ tests = ["pytest"]
name = "pycparser"
version = "2.21"
description = "C parser in Python"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
files = [
@@ -2556,6 +2671,7 @@ files = [
name = "pydantic"
version = "1.10.11"
description = "Data validation and settings management using python type hints"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2608,6 +2724,7 @@ email = ["email-validator (>=1.0.3)"]
name = "pydata-sphinx-theme"
version = "0.8.1"
description = "Bootstrap-based Sphinx theme from the PyData community"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2631,6 +2748,7 @@ test = ["pydata-sphinx-theme[doc]", "pytest"]
name = "pygments"
version = "2.15.1"
description = "Pygments is a syntax highlighting package written in Python."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2645,6 +2763,7 @@ plugins = ["importlib-metadata"]
name = "python-dateutil"
version = "2.8.2"
description = "Extensions to the standard Python datetime module"
+category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
files = [
@@ -2659,6 +2778,7 @@ six = ">=1.5"
name = "python-json-logger"
version = "2.0.7"
description = "A python library adding a json log formatter"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2670,6 +2790,7 @@ files = [
name = "pytz"
version = "2023.3"
description = "World timezone definitions, modern and historical"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2681,6 +2802,7 @@ files = [
name = "pywin32"
version = "306"
description = "Python for Window Extensions"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -2704,6 +2826,7 @@ files = [
name = "pywinpty"
version = "2.0.11"
description = "Pseudo terminal support for Windows from Python."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2718,6 +2841,7 @@ files = [
name = "pyyaml"
version = "6.0.1"
description = "YAML parser and emitter for Python"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2767,6 +2891,7 @@ files = [
name = "pyzmq"
version = "25.1.0"
description = "Python bindings for 0MQ"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -2856,6 +2981,7 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""}
name = "qtconsole"
version = "5.4.3"
description = "Jupyter Qt console"
+category = "dev"
optional = false
python-versions = ">= 3.7"
files = [
@@ -2882,6 +3008,7 @@ test = ["flaky", "pytest", "pytest-qt"]
name = "qtpy"
version = "2.3.1"
description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2899,6 +3026,7 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"]
name = "referencing"
version = "0.30.0"
description = "JSON Referencing + Python"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -2914,6 +3042,7 @@ rpds-py = ">=0.7.0"
name = "requests"
version = "2.31.0"
description = "Python HTTP for Humans."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -2935,6 +3064,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
name = "rfc3339-validator"
version = "0.1.4"
description = "A pure python RFC3339 validator"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -2949,6 +3079,7 @@ six = "*"
name = "rfc3986-validator"
version = "0.1.1"
description = "Pure python rfc3986 validator"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
files = [
@@ -2960,6 +3091,7 @@ files = [
name = "rpds-py"
version = "0.9.2"
description = "Python bindings to Rust's persistent data structures (rpds)"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -3066,6 +3198,7 @@ files = [
name = "send2trash"
version = "1.8.2"
description = "Send file to trash natively under Mac OS X, Windows and Linux"
+category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
files = [
@@ -3082,6 +3215,7 @@ win32 = ["pywin32"]
name = "six"
version = "1.16.0"
description = "Python 2 and 3 compatibility utilities"
+category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
@@ -3093,6 +3227,7 @@ files = [
name = "sniffio"
version = "1.3.0"
description = "Sniff out which async library your code is running under"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3104,6 +3239,7 @@ files = [
name = "snowballstemmer"
version = "2.2.0"
description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3115,6 +3251,7 @@ files = [
name = "soupsieve"
version = "2.4.1"
description = "A modern CSS selector implementation for Beautiful Soup."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3126,6 +3263,7 @@ files = [
name = "sphinx"
version = "4.5.0"
description = "Python documentation generator"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -3161,6 +3299,7 @@ test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"]
name = "sphinx-autobuild"
version = "2021.3.14"
description = "Rebuild Sphinx documentation on changes, with live-reload in the browser."
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -3180,6 +3319,7 @@ test = ["pytest", "pytest-cov"]
name = "sphinx-book-theme"
version = "0.3.3"
description = "A clean book theme for scientific explanations and documentation with Sphinx"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3201,6 +3341,7 @@ test = ["beautifulsoup4 (>=4.6.1,<5)", "coverage", "myst-nb (>=0.13.2,<0.14.0)",
name = "sphinx-copybutton"
version = "0.5.2"
description = "Add a copy button to each of your code cells."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3219,6 +3360,7 @@ rtd = ["ipython", "myst-nb", "sphinx", "sphinx-book-theme", "sphinx-examples"]
name = "sphinx-panels"
version = "0.6.0"
description = "A sphinx extension for creating panels in a grid layout."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3240,6 +3382,7 @@ themes = ["myst-parser (>=0.12.9,<0.13.0)", "pydata-sphinx-theme (>=0.4.0,<0.5.0
name = "sphinx-rtd-theme"
version = "1.2.2"
description = "Read the Docs theme for Sphinx"
+category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
files = [
@@ -3259,6 +3402,7 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"]
name = "sphinx-typlog-theme"
version = "0.8.0"
description = "A typlog Sphinx theme"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3273,6 +3417,7 @@ dev = ["livereload", "sphinx"]
name = "sphinxcontrib-applehelp"
version = "1.0.4"
description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -3288,6 +3433,7 @@ test = ["pytest"]
name = "sphinxcontrib-devhelp"
version = "1.0.2"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -3303,6 +3449,7 @@ test = ["pytest"]
name = "sphinxcontrib-htmlhelp"
version = "2.0.1"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -3318,6 +3465,7 @@ test = ["html5lib", "pytest"]
name = "sphinxcontrib-jquery"
version = "4.1"
description = "Extension to include jQuery on newer Sphinx releases"
+category = "dev"
optional = false
python-versions = ">=2.7"
files = [
@@ -3332,6 +3480,7 @@ Sphinx = ">=1.8"
name = "sphinxcontrib-jsmath"
version = "1.0.1"
description = "A sphinx extension which renders display math in HTML via JavaScript"
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -3346,6 +3495,7 @@ test = ["flake8", "mypy", "pytest"]
name = "sphinxcontrib-qthelp"
version = "1.0.3"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -3361,6 +3511,7 @@ test = ["pytest"]
name = "sphinxcontrib-serializinghtml"
version = "1.1.5"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
+category = "dev"
optional = false
python-versions = ">=3.5"
files = [
@@ -3376,6 +3527,7 @@ test = ["pytest"]
name = "sqlalchemy"
version = "2.0.19"
description = "Database Abstraction Library"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3423,7 +3575,7 @@ files = [
]
[package.dependencies]
-greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""}
+greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""}
typing-extensions = ">=4.2.0"
[package.extras]
@@ -3454,6 +3606,7 @@ sqlcipher = ["sqlcipher3-binary"]
name = "stack-data"
version = "0.6.2"
description = "Extract data from python stack frames and tracebacks for informative displays"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3473,6 +3626,7 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
name = "tabulate"
version = "0.9.0"
description = "Pretty-print tabular data"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3487,6 +3641,7 @@ widechars = ["wcwidth"]
name = "tenacity"
version = "8.2.2"
description = "Retry code until it succeeds"
+category = "dev"
optional = false
python-versions = ">=3.6"
files = [
@@ -3501,6 +3656,7 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"]
name = "terminado"
version = "0.17.1"
description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3521,6 +3677,7 @@ test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"]
name = "tinycss2"
version = "1.2.1"
description = "A tiny CSS parser"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3539,6 +3696,7 @@ test = ["flake8", "isort", "pytest"]
name = "tokenize-rt"
version = "5.1.0"
description = "A wrapper around the stdlib `tokenize` which roundtrips."
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [
@@ -3550,6 +3708,7 @@ files = [
name = "toml"
version = "0.10.2"
description = "Python Library for Tom's Obvious, Minimal Language"
+category = "dev"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
@@ -3561,6 +3720,7 @@ files = [
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3572,6 +3732,7 @@ files = [
name = "tornado"
version = "6.3.2"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
+category = "dev"
optional = false
python-versions = ">= 3.8"
files = [
@@ -3592,6 +3753,7 @@ files = [
name = "traitlets"
version = "5.9.0"
description = "Traitlets Python configuration system"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3607,6 +3769,7 @@ test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"]
name = "typing-extensions"
version = "4.7.1"
description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3618,6 +3781,7 @@ files = [
name = "typing-inspect"
version = "0.9.0"
description = "Runtime inspection utilities for typing module."
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3633,6 +3797,7 @@ typing-extensions = ">=3.7.4"
name = "uri-template"
version = "1.3.0"
description = "RFC 6570 URI Template Processor"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3647,6 +3812,7 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake
name = "urllib3"
version = "2.0.4"
description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3664,6 +3830,7 @@ zstd = ["zstandard (>=0.18.0)"]
name = "wcwidth"
version = "0.2.6"
description = "Measures the displayed width of unicode strings in a terminal"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3675,6 +3842,7 @@ files = [
name = "webcolors"
version = "1.13"
description = "A library for working with the color formats defined by HTML and CSS."
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3690,6 +3858,7 @@ tests = ["pytest", "pytest-cov"]
name = "webencodings"
version = "0.5.1"
description = "Character encoding aliases for legacy web content"
+category = "dev"
optional = false
python-versions = "*"
files = [
@@ -3701,6 +3870,7 @@ files = [
name = "websocket-client"
version = "1.6.1"
description = "WebSocket client for Python with low level API options"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3717,6 +3887,7 @@ test = ["websockets"]
name = "widgetsnbextension"
version = "4.0.8"
description = "Jupyter interactive widgets for Jupyter Notebook"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3728,6 +3899,7 @@ files = [
name = "yarl"
version = "1.9.2"
description = "Yet another URL library"
+category = "dev"
optional = false
python-versions = ">=3.7"
files = [
@@ -3815,6 +3987,7 @@ multidict = ">=4.0"
name = "zipp"
version = "3.16.2"
description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "dev"
optional = false
python-versions = ">=3.8"
files = [