Diomedes Git
commited on
Commit
·
d6affd2
1
Parent(s):
00f3683
adding in some non-mock tools: news api, duckduckgo search via serp, trends via pytrends and TrendReq; websearch and news search endpoints, keeping mocks for fails (may get a better solve for that when less pressed for time), uv added all the relevant libraries, but also added stuff to requirements.txt foredundacny and hf space;
Browse files- pyproject.toml +4 -0
- requirements.txt +6 -0
- src/cluas_mcp/news/news_api_search.py +48 -0
- src/cluas_mcp/news/news_search_entrypoint.py +51 -1
- src/cluas_mcp/observation/weather.py +80 -0
- src/cluas_mcp/web/trending.py +34 -0
- src/cluas_mcp/web/web_search_entrypoint.py +38 -0
- uv.lock +156 -3
pyproject.toml
CHANGED
|
@@ -5,13 +5,17 @@ description = "a dialectic deliberation engine"
|
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
|
|
|
| 8 |
"fastmcp>=2.13.1",
|
| 9 |
"feedparser>=6.0.12",
|
| 10 |
"gradio[mcp,oauth]==6.0.0",
|
| 11 |
"groq>=0.36.0",
|
| 12 |
"mcp>=1.20.0",
|
|
|
|
| 13 |
"python-dotenv>=1.2.1",
|
|
|
|
| 14 |
"requests>=2.32.5",
|
|
|
|
| 15 |
"tenacity>=9.1.2",
|
| 16 |
]
|
| 17 |
|
|
|
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.12"
|
| 7 |
dependencies = [
|
| 8 |
+
"duckduckgo-search>=8.1.1",
|
| 9 |
"fastmcp>=2.13.1",
|
| 10 |
"feedparser>=6.0.12",
|
| 11 |
"gradio[mcp,oauth]==6.0.0",
|
| 12 |
"groq>=0.36.0",
|
| 13 |
"mcp>=1.20.0",
|
| 14 |
+
"newsapi>=0.1.1",
|
| 15 |
"python-dotenv>=1.2.1",
|
| 16 |
+
"pytrends>=4.9.2",
|
| 17 |
"requests>=2.32.5",
|
| 18 |
+
"serpapi>=0.1.5",
|
| 19 |
"tenacity>=9.1.2",
|
| 20 |
]
|
| 21 |
|
requirements.txt
CHANGED
|
@@ -5,3 +5,9 @@ mcp>=1.20.0
|
|
| 5 |
python-dotenv>=1.2.1
|
| 6 |
requests>=2.32.5
|
| 7 |
tenacity>=9.1.2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
python-dotenv>=1.2.1
|
| 6 |
requests>=2.32.5
|
| 7 |
tenacity>=9.1.2
|
| 8 |
+
serpapi==0.1.5
|
| 9 |
+
newsapi==0.1.1
|
| 10 |
+
duckduckgo-search==8.1.1
|
| 11 |
+
lxml==6.0.2
|
| 12 |
+
primp==0.15.0
|
| 13 |
+
pytrends==4.9.2
|
src/cluas_mcp/news/news_api_search.py
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import logging
|
| 3 |
+
from newsapi import NewsApiClient
|
| 4 |
+
|
| 5 |
+
logger = logging.getLogger(__name__)
|
| 6 |
+
|
| 7 |
+
def search_news_newsapi(query: str, max_results: int = 5) -> dict:
|
| 8 |
+
"""
|
| 9 |
+
Search news using NewsAPI.
|
| 10 |
+
Free tier: 100 requests/day
|
| 11 |
+
"""
|
| 12 |
+
api_key = os.getenv("NEWS_API_KEY")
|
| 13 |
+
|
| 14 |
+
if not api_key:
|
| 15 |
+
raise ValueError("NEWS_API_KEY not found")
|
| 16 |
+
|
| 17 |
+
try:
|
| 18 |
+
newsapi = NewsApiClient(api_key=api_key)
|
| 19 |
+
|
| 20 |
+
# use everything endpoint for search
|
| 21 |
+
response = newsapi.get_everything(
|
| 22 |
+
q=query,
|
| 23 |
+
language='en',
|
| 24 |
+
sort_by='publishedAt',
|
| 25 |
+
page_size=max_results
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
articles = []
|
| 29 |
+
for item in response.get('articles', [])[:max_results]:
|
| 30 |
+
articles.append({
|
| 31 |
+
"title": item.get('title', 'No title'),
|
| 32 |
+
"url": item.get('url', ''),
|
| 33 |
+
"summary": item.get('description') or item.get('content', '')[:200],
|
| 34 |
+
"source": item.get('source', {}).get('name', 'Unknown'),
|
| 35 |
+
"published_date": item.get('publishedAt', '')[:10],
|
| 36 |
+
"author": item.get('author') or 'Unknown'
|
| 37 |
+
})
|
| 38 |
+
|
| 39 |
+
return {
|
| 40 |
+
"articles": articles,
|
| 41 |
+
"query": query,
|
| 42 |
+
"total_results": len(articles),
|
| 43 |
+
"source": "newsapi"
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
except Exception as e:
|
| 47 |
+
logger.error(f"NewsAPI error: {e}")
|
| 48 |
+
raise
|
src/cluas_mcp/news/news_search_entrypoint.py
CHANGED
|
@@ -1,8 +1,58 @@
|
|
|
|
|
| 1 |
import logging
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
logger = logging.getLogger(__name__)
|
| 4 |
|
| 5 |
def search_news(query: str, max_results: int = 5) -> dict:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
"""
|
| 7 |
Search for current news articles.
|
| 8 |
|
|
@@ -17,7 +67,7 @@ def search_news(query: str, max_results: int = 5) -> dict:
|
|
| 17 |
"""
|
| 18 |
logger.info("Starting news search for query: %s", query)
|
| 19 |
|
| 20 |
-
#
|
| 21 |
return {
|
| 22 |
"articles": [
|
| 23 |
{
|
|
|
|
| 1 |
+
import os
|
| 2 |
import logging
|
| 3 |
+
from serpapi import GoogleSearch
|
| 4 |
+
|
| 5 |
+
logger = logging.getLogger(__name__)
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
|
| 10 |
|
| 11 |
logger = logging.getLogger(__name__)
|
| 12 |
|
| 13 |
def search_news(query: str, max_results: int = 5) -> dict:
|
| 14 |
+
"""
|
| 15 |
+
Search news using SerpAPI's DuckDuckGo News engine.
|
| 16 |
+
Free tier: 100 searches/month
|
| 17 |
+
"""
|
| 18 |
+
api_key = os.getenv("SERPAPI_KEY")
|
| 19 |
+
|
| 20 |
+
if not api_key:
|
| 21 |
+
logger.warning("SERPAPI_KEY not found, using mock data")
|
| 22 |
+
return _mock_news(query, max_results)
|
| 23 |
+
|
| 24 |
+
try:
|
| 25 |
+
search = GoogleSearch({
|
| 26 |
+
"engine": "duckduckgo_news",
|
| 27 |
+
"q": query,
|
| 28 |
+
"api_key": api_key
|
| 29 |
+
})
|
| 30 |
+
|
| 31 |
+
data = search.get_dict()
|
| 32 |
+
articles = []
|
| 33 |
+
|
| 34 |
+
for item in data.get("news_results", [])[:max_results]:
|
| 35 |
+
articles.append({
|
| 36 |
+
"title": item.get("title", "No title"),
|
| 37 |
+
"url": item.get("link", ""),
|
| 38 |
+
"summary": item.get("snippet", ""),
|
| 39 |
+
"source": item.get("source", "Unknown"),
|
| 40 |
+
"published_date": item.get("date", "Unknown"),
|
| 41 |
+
"author": "Unknown" # DDG News doesn't provide author
|
| 42 |
+
})
|
| 43 |
+
|
| 44 |
+
return {
|
| 45 |
+
"articles": articles,
|
| 46 |
+
"query": query,
|
| 47 |
+
"total_results": len(articles),
|
| 48 |
+
"source": "duckduckgo_news_via_serpapi"
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
except Exception as e:
|
| 52 |
+
logger.error(f"News search error: {e}")
|
| 53 |
+
return _mock_news_search(query, max_results)
|
| 54 |
+
|
| 55 |
+
def _mock_news_search(query: str, max_results: int = 5) -> dict:
|
| 56 |
"""
|
| 57 |
Search for current news articles.
|
| 58 |
|
|
|
|
| 67 |
"""
|
| 68 |
logger.info("Starting news search for query: %s", query)
|
| 69 |
|
| 70 |
+
# mock structured data matching expected real response format
|
| 71 |
return {
|
| 72 |
"articles": [
|
| 73 |
{
|
src/cluas_mcp/observation/weather.py
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import logging
|
| 3 |
+
import requests
|
| 4 |
+
|
| 5 |
+
logger = logging.getLogger(__name__)
|
| 6 |
+
|
| 7 |
+
LOCATION_COORDS = {
|
| 8 |
+
"glasgow": {"lat": 55.8642, "lon": -4.2518},
|
| 9 |
+
"brooklyn": {"lat": 40.6782, "lon": -73.9442},
|
| 10 |
+
"seattle": {"lat": 47.6062, "lon": -122.3321},
|
| 11 |
+
"tokyo": {"lat": 35.6762, "lon": 139.6503}
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
def get_weather_patterns(location: str = "global", timeframe: str = "recent") -> dict:
|
| 15 |
+
"""
|
| 16 |
+
Get weather using OpenWeatherMap API.
|
| 17 |
+
Free tier: 1,000 calls/day, 60 calls/minute
|
| 18 |
+
"""
|
| 19 |
+
api_key = os.getenv("OPENWEATHER_KEY")
|
| 20 |
+
|
| 21 |
+
if not api_key:
|
| 22 |
+
logger.warning("OPENWEATHER_KEY not found, using mock data")
|
| 23 |
+
return _mock_weather(location, timeframe)
|
| 24 |
+
|
| 25 |
+
try:
|
| 26 |
+
# Try to match location to character locations first
|
| 27 |
+
location_lower = location.lower().split(",")[0].strip()
|
| 28 |
+
coords = LOCATION_COORDS.get(location_lower)
|
| 29 |
+
|
| 30 |
+
if coords:
|
| 31 |
+
# Use coordinates for more accurate results
|
| 32 |
+
params = {
|
| 33 |
+
"lat": coords["lat"],
|
| 34 |
+
"lon": coords["lon"],
|
| 35 |
+
"appid": api_key,
|
| 36 |
+
"units": "metric"
|
| 37 |
+
}
|
| 38 |
+
else:
|
| 39 |
+
# Fall back to city name
|
| 40 |
+
params = {
|
| 41 |
+
"q": location,
|
| 42 |
+
"appid": api_key,
|
| 43 |
+
"units": "metric"
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
response = requests.get(
|
| 47 |
+
"https://api.openweathermap.org/data/2.5/weather",
|
| 48 |
+
params=params,
|
| 49 |
+
timeout=10
|
| 50 |
+
)
|
| 51 |
+
response.raise_for_status()
|
| 52 |
+
data = response.json()
|
| 53 |
+
|
| 54 |
+
return {
|
| 55 |
+
"location": location,
|
| 56 |
+
"timeframe": timeframe,
|
| 57 |
+
"patterns": {
|
| 58 |
+
"average_temperature": data["main"]["temp"],
|
| 59 |
+
"temperature_unit": "celsius",
|
| 60 |
+
"feels_like": data["main"]["feels_like"],
|
| 61 |
+
"precipitation": 0, # Current weather doesn't include this
|
| 62 |
+
"precipitation_unit": "mm",
|
| 63 |
+
"humidity": data["main"]["humidity"],
|
| 64 |
+
"pressure": data["main"]["pressure"],
|
| 65 |
+
"wind_speed": data["wind"]["speed"],
|
| 66 |
+
"wind_unit": "m/s",
|
| 67 |
+
"conditions": data["weather"][0]["description"],
|
| 68 |
+
"description": f"Current weather in {location}: {data['weather'][0]['description']}, {data['main']['temp']}°C (feels like {data['main']['feels_like']}°C), humidity {data['main']['humidity']}%"
|
| 69 |
+
},
|
| 70 |
+
"source": "openweathermap"
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
except Exception as e:
|
| 74 |
+
logger.error(f"Weather API error: {e}")
|
| 75 |
+
return _mock_weather(location, timeframe)
|
| 76 |
+
|
| 77 |
+
def _mock_weather(location: str, timeframe: str) -> dict:
|
| 78 |
+
"""Fallback mock"""
|
| 79 |
+
return "Weather is the same as always."
|
| 80 |
+
|
src/cluas_mcp/web/trending.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pytrends.request import TrendReq
|
| 2 |
+
import logging
|
| 3 |
+
|
| 4 |
+
logger = logging.getLogger(__name__)
|
| 5 |
+
|
| 6 |
+
def find_trending_topics(category: str = "general") -> dict:
|
| 7 |
+
"""
|
| 8 |
+
Get trending topics using Google Trends (via pytrends).
|
| 9 |
+
No API key required!
|
| 10 |
+
"""
|
| 11 |
+
try:
|
| 12 |
+
pytrends = TrendReq(hl='en-US', tz=0)
|
| 13 |
+
|
| 14 |
+
# Get trending searches
|
| 15 |
+
trending = pytrends.trending_searches(pn='united_states')
|
| 16 |
+
|
| 17 |
+
topics = []
|
| 18 |
+
for i, topic in enumerate(trending[0][:10], 1):
|
| 19 |
+
topics.append({
|
| 20 |
+
"topic": topic,
|
| 21 |
+
"category": category,
|
| 22 |
+
"trend_score": 100 - (i * 5), # Simple scoring
|
| 23 |
+
"description": f"Currently trending: {topic}"
|
| 24 |
+
})
|
| 25 |
+
|
| 26 |
+
return {
|
| 27 |
+
"trending_topics": topics,
|
| 28 |
+
"category": category,
|
| 29 |
+
"source": "google_trends"
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
except Exception as e:
|
| 33 |
+
logger.error(f"Trends error: {e}")
|
| 34 |
+
return _mock_trending(category)
|
src/cluas_mcp/web/web_search_entrypoint.py
CHANGED
|
@@ -1,8 +1,46 @@
|
|
| 1 |
import logging
|
|
|
|
| 2 |
|
| 3 |
logger = logging.getLogger(__name__)
|
| 4 |
|
| 5 |
def search_web(query: str) -> dict:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
"""
|
| 7 |
Search the web for current information.
|
| 8 |
|
|
|
|
| 1 |
import logging
|
| 2 |
+
from duckduckgo_search import DDGS
|
| 3 |
|
| 4 |
logger = logging.getLogger(__name__)
|
| 5 |
|
| 6 |
def search_web(query: str) -> dict:
|
| 7 |
+
"""
|
| 8 |
+
Search web using DuckDuckGo.
|
| 9 |
+
No API key needed, no rate limits.
|
| 10 |
+
"""
|
| 11 |
+
logger.info(f"Web search for: {query}")
|
| 12 |
+
|
| 13 |
+
try:
|
| 14 |
+
with DDGS() as ddgs:
|
| 15 |
+
results_raw = list(ddgs.text(query, max_results=5))
|
| 16 |
+
|
| 17 |
+
results = []
|
| 18 |
+
for item in results_raw:
|
| 19 |
+
results.append({
|
| 20 |
+
"title": item.get("title", "No title"),
|
| 21 |
+
"url": item.get("href", ""),
|
| 22 |
+
"snippet": item.get("body", ""),
|
| 23 |
+
"source": _extract_domain(item.get("href", ""))
|
| 24 |
+
})
|
| 25 |
+
|
| 26 |
+
return {
|
| 27 |
+
"results": results,
|
| 28 |
+
"query": query,
|
| 29 |
+
"total_results": len(results)
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
except Exception as e:
|
| 33 |
+
logger.error(f"Web search error: {e}")
|
| 34 |
+
return _mock_search_web(query)
|
| 35 |
+
|
| 36 |
+
def _extract_domain(url: str) -> str:
|
| 37 |
+
try:
|
| 38 |
+
from urllib.parse import urlparse
|
| 39 |
+
return urlparse(url).netloc or "unknown"
|
| 40 |
+
except:
|
| 41 |
+
return "unknown"
|
| 42 |
+
|
| 43 |
+
def _mock_search_web(query: str) -> dict:
|
| 44 |
"""
|
| 45 |
Search the web for current information.
|
| 46 |
|
uv.lock
CHANGED
|
@@ -6,9 +6,6 @@ resolution-markers = [
|
|
| 6 |
"python_full_version < '3.13'",
|
| 7 |
]
|
| 8 |
|
| 9 |
-
[options]
|
| 10 |
-
prerelease-mode = "allow"
|
| 11 |
-
|
| 12 |
[[package]]
|
| 13 |
name = "aiofiles"
|
| 14 |
version = "24.1.0"
|
|
@@ -323,13 +320,17 @@ name = "cluas"
|
|
| 323 |
version = "0.1.0"
|
| 324 |
source = { virtual = "." }
|
| 325 |
dependencies = [
|
|
|
|
| 326 |
{ name = "fastmcp" },
|
| 327 |
{ name = "feedparser" },
|
| 328 |
{ name = "gradio", extra = ["mcp", "oauth"] },
|
| 329 |
{ name = "groq" },
|
| 330 |
{ name = "mcp" },
|
|
|
|
| 331 |
{ name = "python-dotenv" },
|
|
|
|
| 332 |
{ name = "requests" },
|
|
|
|
| 333 |
{ name = "tenacity" },
|
| 334 |
]
|
| 335 |
|
|
@@ -340,13 +341,17 @@ dev = [
|
|
| 340 |
|
| 341 |
[package.metadata]
|
| 342 |
requires-dist = [
|
|
|
|
| 343 |
{ name = "fastmcp", specifier = ">=2.13.1" },
|
| 344 |
{ name = "feedparser", specifier = ">=6.0.12" },
|
| 345 |
{ name = "gradio", extras = ["mcp", "oauth"], specifier = "==6.0.0" },
|
| 346 |
{ name = "groq", specifier = ">=0.36.0" },
|
| 347 |
{ name = "mcp", specifier = ">=1.20.0" },
|
|
|
|
| 348 |
{ name = "python-dotenv", specifier = ">=1.2.1" },
|
|
|
|
| 349 |
{ name = "requests", specifier = ">=2.32.5" },
|
|
|
|
| 350 |
{ name = "tenacity", specifier = ">=9.1.2" },
|
| 351 |
]
|
| 352 |
|
|
@@ -468,6 +473,20 @@ wheels = [
|
|
| 468 |
{ url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" },
|
| 469 |
]
|
| 470 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 471 |
[[package]]
|
| 472 |
name = "email-validator"
|
| 473 |
version = "2.3.0"
|
|
@@ -900,6 +919,86 @@ wheels = [
|
|
| 900 |
{ url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" },
|
| 901 |
]
|
| 902 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 903 |
[[package]]
|
| 904 |
name = "markdown-it-py"
|
| 905 |
version = "4.0.0"
|
|
@@ -1018,6 +1117,18 @@ wheels = [
|
|
| 1018 |
{ url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" },
|
| 1019 |
]
|
| 1020 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1021 |
[[package]]
|
| 1022 |
name = "numpy"
|
| 1023 |
version = "2.3.5"
|
|
@@ -1307,6 +1418,22 @@ wheels = [
|
|
| 1307 |
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
| 1308 |
]
|
| 1309 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1310 |
[[package]]
|
| 1311 |
name = "py-key-value-aio"
|
| 1312 |
version = "0.2.8"
|
|
@@ -1561,6 +1688,20 @@ wheels = [
|
|
| 1561 |
{ url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" },
|
| 1562 |
]
|
| 1563 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1564 |
[[package]]
|
| 1565 |
name = "pytz"
|
| 1566 |
version = "2025.2"
|
|
@@ -1798,6 +1939,18 @@ wheels = [
|
|
| 1798 |
{ url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
|
| 1799 |
]
|
| 1800 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1801 |
[[package]]
|
| 1802 |
name = "sgmllib3k"
|
| 1803 |
version = "1.0.0"
|
|
|
|
| 6 |
"python_full_version < '3.13'",
|
| 7 |
]
|
| 8 |
|
|
|
|
|
|
|
|
|
|
| 9 |
[[package]]
|
| 10 |
name = "aiofiles"
|
| 11 |
version = "24.1.0"
|
|
|
|
| 320 |
version = "0.1.0"
|
| 321 |
source = { virtual = "." }
|
| 322 |
dependencies = [
|
| 323 |
+
{ name = "duckduckgo-search" },
|
| 324 |
{ name = "fastmcp" },
|
| 325 |
{ name = "feedparser" },
|
| 326 |
{ name = "gradio", extra = ["mcp", "oauth"] },
|
| 327 |
{ name = "groq" },
|
| 328 |
{ name = "mcp" },
|
| 329 |
+
{ name = "newsapi" },
|
| 330 |
{ name = "python-dotenv" },
|
| 331 |
+
{ name = "pytrends" },
|
| 332 |
{ name = "requests" },
|
| 333 |
+
{ name = "serpapi" },
|
| 334 |
{ name = "tenacity" },
|
| 335 |
]
|
| 336 |
|
|
|
|
| 341 |
|
| 342 |
[package.metadata]
|
| 343 |
requires-dist = [
|
| 344 |
+
{ name = "duckduckgo-search", specifier = ">=8.1.1" },
|
| 345 |
{ name = "fastmcp", specifier = ">=2.13.1" },
|
| 346 |
{ name = "feedparser", specifier = ">=6.0.12" },
|
| 347 |
{ name = "gradio", extras = ["mcp", "oauth"], specifier = "==6.0.0" },
|
| 348 |
{ name = "groq", specifier = ">=0.36.0" },
|
| 349 |
{ name = "mcp", specifier = ">=1.20.0" },
|
| 350 |
+
{ name = "newsapi", specifier = ">=0.1.1" },
|
| 351 |
{ name = "python-dotenv", specifier = ">=1.2.1" },
|
| 352 |
+
{ name = "pytrends", specifier = ">=4.9.2" },
|
| 353 |
{ name = "requests", specifier = ">=2.32.5" },
|
| 354 |
+
{ name = "serpapi", specifier = ">=0.1.5" },
|
| 355 |
{ name = "tenacity", specifier = ">=9.1.2" },
|
| 356 |
]
|
| 357 |
|
|
|
|
| 473 |
{ url = "https://files.pythonhosted.org/packages/55/e2/2537ebcff11c1ee1ff17d8d0b6f4db75873e3b0fb32c2d4a2ee31ecb310a/docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708", size = 36896, upload-time = "2025-07-21T07:35:00.684Z" },
|
| 474 |
]
|
| 475 |
|
| 476 |
+
[[package]]
|
| 477 |
+
name = "duckduckgo-search"
|
| 478 |
+
version = "8.1.1"
|
| 479 |
+
source = { registry = "https://pypi.org/simple" }
|
| 480 |
+
dependencies = [
|
| 481 |
+
{ name = "click" },
|
| 482 |
+
{ name = "lxml" },
|
| 483 |
+
{ name = "primp" },
|
| 484 |
+
]
|
| 485 |
+
sdist = { url = "https://files.pythonhosted.org/packages/10/ef/07791a05751e6cc9de1dd49fb12730259ee109b18e6d097e25e6c32d5617/duckduckgo_search-8.1.1.tar.gz", hash = "sha256:9da91c9eb26a17e016ea1da26235d40404b46b0565ea86d75a9f78cc9441f935", size = 22868, upload-time = "2025-07-06T15:30:59.73Z" }
|
| 486 |
+
wheels = [
|
| 487 |
+
{ url = "https://files.pythonhosted.org/packages/db/72/c027b3b488b1010cf71670032fcf7e681d44b81829d484bb04e31a949a8d/duckduckgo_search-8.1.1-py3-none-any.whl", hash = "sha256:f48adbb06626ee05918f7e0cef3a45639e9939805c4fc179e68c48a12f1b5062", size = 18932, upload-time = "2025-07-06T15:30:58.339Z" },
|
| 488 |
+
]
|
| 489 |
+
|
| 490 |
[[package]]
|
| 491 |
name = "email-validator"
|
| 492 |
version = "2.3.0"
|
|
|
|
| 919 |
{ url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" },
|
| 920 |
]
|
| 921 |
|
| 922 |
+
[[package]]
|
| 923 |
+
name = "lxml"
|
| 924 |
+
version = "6.0.2"
|
| 925 |
+
source = { registry = "https://pypi.org/simple" }
|
| 926 |
+
sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" }
|
| 927 |
+
wheels = [
|
| 928 |
+
{ url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" },
|
| 929 |
+
{ url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" },
|
| 930 |
+
{ url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" },
|
| 931 |
+
{ url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" },
|
| 932 |
+
{ url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" },
|
| 933 |
+
{ url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" },
|
| 934 |
+
{ url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" },
|
| 935 |
+
{ url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" },
|
| 936 |
+
{ url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" },
|
| 937 |
+
{ url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" },
|
| 938 |
+
{ url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" },
|
| 939 |
+
{ url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" },
|
| 940 |
+
{ url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" },
|
| 941 |
+
{ url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" },
|
| 942 |
+
{ url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" },
|
| 943 |
+
{ url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" },
|
| 944 |
+
{ url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" },
|
| 945 |
+
{ url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" },
|
| 946 |
+
{ url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" },
|
| 947 |
+
{ url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" },
|
| 948 |
+
{ url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" },
|
| 949 |
+
{ url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" },
|
| 950 |
+
{ url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" },
|
| 951 |
+
{ url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" },
|
| 952 |
+
{ url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" },
|
| 953 |
+
{ url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" },
|
| 954 |
+
{ url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" },
|
| 955 |
+
{ url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" },
|
| 956 |
+
{ url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" },
|
| 957 |
+
{ url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" },
|
| 958 |
+
{ url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" },
|
| 959 |
+
{ url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" },
|
| 960 |
+
{ url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" },
|
| 961 |
+
{ url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" },
|
| 962 |
+
{ url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" },
|
| 963 |
+
{ url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" },
|
| 964 |
+
{ url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" },
|
| 965 |
+
{ url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" },
|
| 966 |
+
{ url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" },
|
| 967 |
+
{ url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" },
|
| 968 |
+
{ url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" },
|
| 969 |
+
{ url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" },
|
| 970 |
+
{ url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" },
|
| 971 |
+
{ url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" },
|
| 972 |
+
{ url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" },
|
| 973 |
+
{ url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" },
|
| 974 |
+
{ url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" },
|
| 975 |
+
{ url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" },
|
| 976 |
+
{ url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" },
|
| 977 |
+
{ url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" },
|
| 978 |
+
{ url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" },
|
| 979 |
+
{ url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" },
|
| 980 |
+
{ url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" },
|
| 981 |
+
{ url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" },
|
| 982 |
+
{ url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" },
|
| 983 |
+
{ url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" },
|
| 984 |
+
{ url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" },
|
| 985 |
+
{ url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" },
|
| 986 |
+
{ url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" },
|
| 987 |
+
{ url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" },
|
| 988 |
+
{ url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" },
|
| 989 |
+
{ url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" },
|
| 990 |
+
{ url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" },
|
| 991 |
+
{ url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" },
|
| 992 |
+
{ url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" },
|
| 993 |
+
{ url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" },
|
| 994 |
+
{ url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" },
|
| 995 |
+
{ url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" },
|
| 996 |
+
{ url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" },
|
| 997 |
+
{ url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" },
|
| 998 |
+
{ url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" },
|
| 999 |
+
{ url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" },
|
| 1000 |
+
]
|
| 1001 |
+
|
| 1002 |
[[package]]
|
| 1003 |
name = "markdown-it-py"
|
| 1004 |
version = "4.0.0"
|
|
|
|
| 1117 |
{ url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" },
|
| 1118 |
]
|
| 1119 |
|
| 1120 |
+
[[package]]
|
| 1121 |
+
name = "newsapi"
|
| 1122 |
+
version = "0.1.1"
|
| 1123 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1124 |
+
dependencies = [
|
| 1125 |
+
{ name = "requests" },
|
| 1126 |
+
]
|
| 1127 |
+
sdist = { url = "https://files.pythonhosted.org/packages/07/23/5f829dbb4e74fa9e8674f9ecaad520ca81b067e05a14ab4403751f42d1c0/newsapi-0.1.1.tar.gz", hash = "sha256:ba6eae31d66f8a804134779c4f4a984fea90ef77be20dba40c2808c75042a69a", size = 7194, upload-time = "2017-03-28T22:10:14.679Z" }
|
| 1128 |
+
wheels = [
|
| 1129 |
+
{ url = "https://files.pythonhosted.org/packages/56/70/df0dd31067f03703d06f66b6c3f324915bd43bc8a597ee1a7eef27c9e622/newsapi-0.1.1-py2.py3-none-any.whl", hash = "sha256:baef702f6e29fc2736932858528d94f18b2baaef9d330018ba78369e005e1df4", size = 4127, upload-time = "2017-03-28T22:10:12.306Z" },
|
| 1130 |
+
]
|
| 1131 |
+
|
| 1132 |
[[package]]
|
| 1133 |
name = "numpy"
|
| 1134 |
version = "2.3.5"
|
|
|
|
| 1418 |
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
| 1419 |
]
|
| 1420 |
|
| 1421 |
+
[[package]]
|
| 1422 |
+
name = "primp"
|
| 1423 |
+
version = "0.15.0"
|
| 1424 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1425 |
+
sdist = { url = "https://files.pythonhosted.org/packages/56/0b/a87556189da4de1fc6360ca1aa05e8335509633f836cdd06dd17f0743300/primp-0.15.0.tar.gz", hash = "sha256:1af8ea4b15f57571ff7fc5e282a82c5eb69bc695e19b8ddeeda324397965b30a", size = 113022, upload-time = "2025-04-17T11:41:05.315Z" }
|
| 1426 |
+
wheels = [
|
| 1427 |
+
{ url = "https://files.pythonhosted.org/packages/f5/5a/146ac964b99ea7657ad67eb66f770be6577dfe9200cb28f9a95baffd6c3f/primp-0.15.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1b281f4ca41a0c6612d4c6e68b96e28acfe786d226a427cd944baa8d7acd644f", size = 3178914, upload-time = "2025-04-17T11:40:59.558Z" },
|
| 1428 |
+
{ url = "https://files.pythonhosted.org/packages/bc/8a/cc2321e32db3ce64d6e32950d5bcbea01861db97bfb20b5394affc45b387/primp-0.15.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:489cbab55cd793ceb8f90bb7423c6ea64ebb53208ffcf7a044138e3c66d77299", size = 2955079, upload-time = "2025-04-17T11:40:57.398Z" },
|
| 1429 |
+
{ url = "https://files.pythonhosted.org/packages/c3/7b/cbd5d999a07ff2a21465975d4eb477ae6f69765e8fe8c9087dab250180d8/primp-0.15.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b45c23f94016215f62d2334552224236217aaeb716871ce0e4dcfa08eb161", size = 3281018, upload-time = "2025-04-17T11:40:55.308Z" },
|
| 1430 |
+
{ url = "https://files.pythonhosted.org/packages/1b/6e/a6221c612e61303aec2bcac3f0a02e8b67aee8c0db7bdc174aeb8010f975/primp-0.15.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e985a9cba2e3f96a323722e5440aa9eccaac3178e74b884778e926b5249df080", size = 3255229, upload-time = "2025-04-17T11:40:47.811Z" },
|
| 1431 |
+
{ url = "https://files.pythonhosted.org/packages/3b/54/bfeef5aca613dc660a69d0760a26c6b8747d8fdb5a7f20cb2cee53c9862f/primp-0.15.0-cp38-abi3-manylinux_2_34_armv7l.whl", hash = "sha256:6b84a6ffa083e34668ff0037221d399c24d939b5629cd38223af860de9e17a83", size = 3014522, upload-time = "2025-04-17T11:40:50.191Z" },
|
| 1432 |
+
{ url = "https://files.pythonhosted.org/packages/ac/96/84078e09f16a1dad208f2fe0f8a81be2cf36e024675b0f9eec0c2f6e2182/primp-0.15.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:592f6079646bdf5abbbfc3b0a28dac8de943f8907a250ce09398cda5eaebd260", size = 3418567, upload-time = "2025-04-17T11:41:01.595Z" },
|
| 1433 |
+
{ url = "https://files.pythonhosted.org/packages/6c/80/8a7a9587d3eb85be3d0b64319f2f690c90eb7953e3f73a9ddd9e46c8dc42/primp-0.15.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5a728e5a05f37db6189eb413d22c78bd143fa59dd6a8a26dacd43332b3971fe8", size = 3606279, upload-time = "2025-04-17T11:41:03.61Z" },
|
| 1434 |
+
{ url = "https://files.pythonhosted.org/packages/0c/dd/f0183ed0145e58cf9d286c1b2c14f63ccee987a4ff79ac85acc31b5d86bd/primp-0.15.0-cp38-abi3-win_amd64.whl", hash = "sha256:aeb6bd20b06dfc92cfe4436939c18de88a58c640752cf7f30d9e4ae893cdec32", size = 3149967, upload-time = "2025-04-17T11:41:07.067Z" },
|
| 1435 |
+
]
|
| 1436 |
+
|
| 1437 |
[[package]]
|
| 1438 |
name = "py-key-value-aio"
|
| 1439 |
version = "0.2.8"
|
|
|
|
| 1688 |
{ url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload-time = "2024-12-16T19:45:44.423Z" },
|
| 1689 |
]
|
| 1690 |
|
| 1691 |
+
[[package]]
|
| 1692 |
+
name = "pytrends"
|
| 1693 |
+
version = "4.9.2"
|
| 1694 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1695 |
+
dependencies = [
|
| 1696 |
+
{ name = "lxml" },
|
| 1697 |
+
{ name = "pandas" },
|
| 1698 |
+
{ name = "requests" },
|
| 1699 |
+
]
|
| 1700 |
+
sdist = { url = "https://files.pythonhosted.org/packages/e9/65/a242fd8fbe98c11bd51f0b57d4752905396a99c42c91c3213c3f44e741c8/pytrends-4.9.2.tar.gz", hash = "sha256:691c6e36b1aeaa4754f3692bdbad0dff446e528ffb052eee2e7f139aaa2c6989", size = 247162, upload-time = "2023-04-13T23:17:21.313Z" }
|
| 1701 |
+
wheels = [
|
| 1702 |
+
{ url = "https://files.pythonhosted.org/packages/68/ba/7a24a3723c790000faf880505ff1cc46f4d29f46dd353037938a070c4d23/pytrends-4.9.2-py3-none-any.whl", hash = "sha256:d7d0ee956be2f6e3e9fc09376c4615efb9347039d6d1f46e6f4326a5b7a14f67", size = 15352, upload-time = "2023-04-13T23:17:18.88Z" },
|
| 1703 |
+
]
|
| 1704 |
+
|
| 1705 |
[[package]]
|
| 1706 |
name = "pytz"
|
| 1707 |
version = "2025.2"
|
|
|
|
| 1939 |
{ url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" },
|
| 1940 |
]
|
| 1941 |
|
| 1942 |
+
[[package]]
|
| 1943 |
+
name = "serpapi"
|
| 1944 |
+
version = "0.1.5"
|
| 1945 |
+
source = { registry = "https://pypi.org/simple" }
|
| 1946 |
+
dependencies = [
|
| 1947 |
+
{ name = "requests" },
|
| 1948 |
+
]
|
| 1949 |
+
sdist = { url = "https://files.pythonhosted.org/packages/f0/fa/3fd8809287f3977a3e752bb88610e918d49cb1038b14f4bc51e13e594197/serpapi-0.1.5.tar.gz", hash = "sha256:b9707ed54750fdd2f62dc3a17c6a3fb7fa421dc37902fd65b2263c0ac765a1a5", size = 14191, upload-time = "2023-11-01T14:00:43.602Z" }
|
| 1950 |
+
wheels = [
|
| 1951 |
+
{ url = "https://files.pythonhosted.org/packages/df/6a/21deade04100d64844e494353a5d65e7971fbdfddf78eb1f248423593ad0/serpapi-0.1.5-py2.py3-none-any.whl", hash = "sha256:6467b6adec1231059f754ccaa952b229efeaa8b9cae6e71f879703ec9e5bb3d1", size = 10966, upload-time = "2023-11-01T14:00:38.885Z" },
|
| 1952 |
+
]
|
| 1953 |
+
|
| 1954 |
[[package]]
|
| 1955 |
name = "sgmllib3k"
|
| 1956 |
version = "1.0.0"
|