adanos-cli 1.27.2__tar.gz → 1.28.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/CHANGELOG.md +6 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/PKG-INFO +2 -2
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/README.md +1 -1
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/__init__.py +1 -1
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/endpoints.py +1 -6
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/main.py +0 -1
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/summaries.py +6 -6
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_agent_contract.py +2 -2
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_endpoint_coverage.py +16 -36
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_power_features.py +20 -27
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/ci.yml +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/cli-binaries.yml +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.github/workflows/publish-pypi.yml +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/.gitignore +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/LICENSE +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/install.ps1 +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/install.sh +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/pyproject.toml +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/build_cli_binary.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/generate_homebrew_formula.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/scripts/pyinstaller_entrypoint.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/__main__.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/activity_log.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/__init__.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/auth.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/config.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/commands/extensions.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/config.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/nlp.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/shell_history.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/tty.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/update_notifier.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/utils.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/src/adanos_cli/watchlists.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/__init__.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/conftest.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_account.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_activity_log.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_auth.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_config_runtime.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_diagnostics.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_distribution.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_extensions.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_logs.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_onboarding.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_shell.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_tty.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_update_notifier.py +0 -0
- {adanos_cli-1.27.2 → adanos_cli-1.28.0}/tests/test_watchlists.py +0 -0
|
@@ -5,6 +5,12 @@ All notable changes to `adanos-cli` will be documented in this file.
|
|
|
5
5
|
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
|
|
6
6
|
Versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
|
|
7
7
|
|
|
8
|
+
## [1.28.0] - 2026-05-25
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- Synced CLI endpoint coverage with Adanos Market Sentiment API `1.39.0`.
|
|
12
|
+
- Removed `--from`, `--to`, and `--days` from search endpoint calls and the top-level `adanos search` command; search endpoints now accept only `--limit` and use API-managed recent summary windows.
|
|
13
|
+
|
|
8
14
|
## [1.27.2] - 2026-05-21
|
|
9
15
|
|
|
10
16
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: adanos-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.28.0
|
|
4
4
|
Summary: CLI for the Adanos Market Sentiment API
|
|
5
5
|
Project-URL: Homepage, https://adanos.org
|
|
6
6
|
Project-URL: API_Docs, https://api.adanos.org/docs
|
|
@@ -206,7 +206,7 @@ adanos endpoint call x-stocks.stock.explain --ticker TSLA
|
|
|
206
206
|
|
|
207
207
|
Polymarket endpoint output includes both `market_count` for selected-window breadth and `current_market_count` for live-only active-market breadth.
|
|
208
208
|
|
|
209
|
-
Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`.
|
|
209
|
+
Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`. Search commands are the exception: they accept only `--limit` and use the API-managed recent summary window.
|
|
210
210
|
|
|
211
211
|
## AI / Automation
|
|
212
212
|
|
|
@@ -180,7 +180,7 @@ adanos endpoint call x-stocks.stock.explain --ticker TSLA
|
|
|
180
180
|
|
|
181
181
|
Polymarket endpoint output includes both `market_count` for selected-window breadth and `current_market_count` for live-only active-market breadth.
|
|
182
182
|
|
|
183
|
-
Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`.
|
|
183
|
+
Period-capable commands and endpoint calls accept `--from YYYY-MM-DD` and `--to YYYY-MM-DD` as inclusive UTC date windows. `--days N` remains available for v1 compatibility, but is legacy; combining `--from`, `--to` and `--days` returns API validation error `422`. Search commands are the exception: they accept only `--limit` and use the API-managed recent summary window.
|
|
184
184
|
|
|
185
185
|
## AI / Automation
|
|
186
186
|
|
|
@@ -25,7 +25,7 @@ class EndpointSpec:
|
|
|
25
25
|
PERIOD_PARAMS = ("from", "to", "days")
|
|
26
26
|
TRENDING_PARAMS = (*PERIOD_PARAMS, "limit", "offset")
|
|
27
27
|
TRENDING_TYPE_PARAMS = (*TRENDING_PARAMS, "type")
|
|
28
|
-
SEARCH_PARAMS = (
|
|
28
|
+
SEARCH_PARAMS = ("limit",)
|
|
29
29
|
RAW_MENTION_PARAMS = (*PERIOD_PARAMS, "limit", "offset")
|
|
30
30
|
|
|
31
31
|
|
|
@@ -134,7 +134,6 @@ def _reddit_stocks_explain(client: Any, args: Namespace) -> Any:
|
|
|
134
134
|
def _reddit_stocks_search(client: Any, args: Namespace) -> Any:
|
|
135
135
|
return client.reddit.search(
|
|
136
136
|
_require_str(args, "q", "query"),
|
|
137
|
-
**_period_kwargs(args, default_days=7),
|
|
138
137
|
limit=_with_default(args.limit, 20),
|
|
139
138
|
)
|
|
140
139
|
|
|
@@ -208,7 +207,6 @@ def _news_stocks_explain(client: Any, args: Namespace) -> Any:
|
|
|
208
207
|
def _news_stocks_search(client: Any, args: Namespace) -> Any:
|
|
209
208
|
return client.news.search(
|
|
210
209
|
_require_str(args, "q", "query"),
|
|
211
|
-
**_period_kwargs(args, default_days=7),
|
|
212
210
|
limit=_with_default(args.limit, 20),
|
|
213
211
|
)
|
|
214
212
|
|
|
@@ -259,7 +257,6 @@ def _reddit_crypto_mentions(client: Any, args: Namespace) -> Any:
|
|
|
259
257
|
def _reddit_crypto_search(client: Any, args: Namespace) -> Any:
|
|
260
258
|
return client.crypto.search(
|
|
261
259
|
_require_str(args, "q", "query"),
|
|
262
|
-
**_period_kwargs(args, default_days=7),
|
|
263
260
|
limit=_with_default(args.limit, 20),
|
|
264
261
|
)
|
|
265
262
|
|
|
@@ -327,7 +324,6 @@ def _x_stocks_explain(client: Any, args: Namespace) -> Any:
|
|
|
327
324
|
def _x_stocks_search(client: Any, args: Namespace) -> Any:
|
|
328
325
|
return client.x.search(
|
|
329
326
|
_require_str(args, "q", "query"),
|
|
330
|
-
**_period_kwargs(args, default_days=7),
|
|
331
327
|
limit=_with_default(args.limit, 20),
|
|
332
328
|
)
|
|
333
329
|
|
|
@@ -391,7 +387,6 @@ def _polymarket_stocks_mentions(client: Any, args: Namespace) -> Any:
|
|
|
391
387
|
def _polymarket_stocks_search(client: Any, args: Namespace) -> Any:
|
|
392
388
|
return client.polymarket.search(
|
|
393
389
|
_require_str(args, "q", "query"),
|
|
394
|
-
**_period_kwargs(args, default_days=7),
|
|
395
390
|
limit=_with_default(args.limit, 20),
|
|
396
391
|
)
|
|
397
392
|
|
|
@@ -2206,7 +2206,6 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
2206
2206
|
p_search = subs.add_parser("search", help="Search assets by platform")
|
|
2207
2207
|
p_search.add_argument("--platform", choices=["news-stocks", "reddit-stocks", "reddit-crypto", "x-stocks", "polymarket-stocks"], required=True)
|
|
2208
2208
|
p_search.add_argument("query")
|
|
2209
|
-
_add_period_args(p_search, default_days=7)
|
|
2210
2209
|
p_search.add_argument("--limit", type=int, default=20)
|
|
2211
2210
|
p_search.add_argument("--json", action="store_true")
|
|
2212
2211
|
p_search.set_defaults(_handler="search")
|
|
@@ -154,7 +154,7 @@ def build_crypto_report(client: Any, symbol: str, *, days: int | None, from_: st
|
|
|
154
154
|
"symbol": token,
|
|
155
155
|
**_period_metadata(days, from_, to),
|
|
156
156
|
"reddit_crypto": _call_safe(lambda: client.crypto.token(token, **period)),
|
|
157
|
-
"search": _call_safe(lambda: client.crypto.search(token
|
|
157
|
+
"search": _call_safe(lambda: client.crypto.search(token)),
|
|
158
158
|
"stats": _call_safe(lambda: client.crypto.stats()),
|
|
159
159
|
}
|
|
160
160
|
|
|
@@ -458,11 +458,11 @@ def build_search_fallback_report(client: Any, query: str) -> dict[str, Any]:
|
|
|
458
458
|
return {
|
|
459
459
|
"kind": "search_fallback",
|
|
460
460
|
"query": query,
|
|
461
|
-
"news_stocks": _call_safe(lambda: client.news.search(query,
|
|
462
|
-
"reddit_stocks": _call_safe(lambda: client.reddit.search(query,
|
|
463
|
-
"x_stocks": _call_safe(lambda: client.x.search(query,
|
|
464
|
-
"polymarket_stocks": _call_safe(lambda: client.polymarket.search(query,
|
|
465
|
-
"reddit_crypto": _call_safe(lambda: client.crypto.search(query,
|
|
461
|
+
"news_stocks": _call_safe(lambda: client.news.search(query, limit=10)),
|
|
462
|
+
"reddit_stocks": _call_safe(lambda: client.reddit.search(query, limit=10)),
|
|
463
|
+
"x_stocks": _call_safe(lambda: client.x.search(query, limit=10)),
|
|
464
|
+
"polymarket_stocks": _call_safe(lambda: client.polymarket.search(query, limit=10)),
|
|
465
|
+
"reddit_crypto": _call_safe(lambda: client.crypto.search(query, limit=10)),
|
|
466
466
|
}
|
|
467
467
|
|
|
468
468
|
|
|
@@ -224,7 +224,7 @@ class _SearchNamespace:
|
|
|
224
224
|
def __init__(self, rows: list[dict]):
|
|
225
225
|
self._rows = rows
|
|
226
226
|
|
|
227
|
-
def search(self, query: str, *,
|
|
227
|
+
def search(self, query: str, *, limit: int = 20):
|
|
228
228
|
query_upper = query.upper()
|
|
229
229
|
matched = []
|
|
230
230
|
for row in self._rows:
|
|
@@ -233,7 +233,7 @@ class _SearchNamespace:
|
|
|
233
233
|
ticker = str(row.get("ticker") or "").upper()
|
|
234
234
|
if query_upper in name or query_upper in ticker or any(query_upper in alias for alias in aliases):
|
|
235
235
|
matched.append(row)
|
|
236
|
-
return {"query": query, "count": len(matched), "period_days":
|
|
236
|
+
return {"query": query, "count": len(matched), "period_days": 7, "results": matched[:limit]}
|
|
237
237
|
|
|
238
238
|
|
|
239
239
|
class _AliasClient:
|
|
@@ -46,7 +46,7 @@ NEWS_ENDPOINT_IDS = {
|
|
|
46
46
|
"news-stocks.search": {
|
|
47
47
|
"path": "/news/stocks/v1/search",
|
|
48
48
|
"required": ("q",),
|
|
49
|
-
"optional": ("
|
|
49
|
+
"optional": ("limit",),
|
|
50
50
|
},
|
|
51
51
|
"news-stocks.compare": {
|
|
52
52
|
"path": "/news/stocks/v1/compare",
|
|
@@ -124,7 +124,7 @@ def test_raw_mention_endpoint_specs_support_offset() -> None:
|
|
|
124
124
|
|
|
125
125
|
def test_invoke_endpoint_rejects_unsupported_source() -> None:
|
|
126
126
|
class DummyNews:
|
|
127
|
-
def search(self, query: str, *,
|
|
127
|
+
def search(self, query: str, *, limit: int = 20) -> dict[str, str | int]:
|
|
128
128
|
return {"query": query}
|
|
129
129
|
|
|
130
130
|
class DummyClient:
|
|
@@ -134,13 +134,13 @@ def test_invoke_endpoint_rejects_unsupported_source() -> None:
|
|
|
134
134
|
invoke_endpoint(DummyClient(), "news-stocks.search", Namespace(q="Tesla", source="wsj"))
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
def
|
|
137
|
+
def test_invoke_endpoint_search_passes_limit_only() -> None:
|
|
138
138
|
class DummyNews:
|
|
139
139
|
def __init__(self) -> None:
|
|
140
|
-
self.calls: list[tuple[str, int
|
|
140
|
+
self.calls: list[tuple[str, int]] = []
|
|
141
141
|
|
|
142
|
-
def search(self, query: str, *,
|
|
143
|
-
self.calls.append((query,
|
|
142
|
+
def search(self, query: str, *, limit: int = 20) -> dict[str, int | str]:
|
|
143
|
+
self.calls.append((query, limit))
|
|
144
144
|
return {"query": query, "count": 1}
|
|
145
145
|
|
|
146
146
|
class DummyClient:
|
|
@@ -148,39 +148,19 @@ def test_invoke_endpoint_search_passes_days_and_limit() -> None:
|
|
|
148
148
|
self.news = DummyNews()
|
|
149
149
|
|
|
150
150
|
client = DummyClient()
|
|
151
|
-
invoke_endpoint(client, "news-stocks.search", Namespace(q="Tesla", days=14, limit=5, source=None))
|
|
152
|
-
assert client.news.calls == [("Tesla",
|
|
151
|
+
invoke_endpoint(client, "news-stocks.search", Namespace(q="Tesla", days=14, from_="2026-05-01", to="2026-05-07", limit=5, source=None))
|
|
152
|
+
assert client.news.calls == [("Tesla", 5)]
|
|
153
153
|
|
|
154
154
|
|
|
155
|
-
def
|
|
156
|
-
|
|
157
|
-
def __init__(self) -> None:
|
|
158
|
-
self.calls: list[tuple[str, str | None, str | None, int]] = []
|
|
159
|
-
|
|
160
|
-
def search(
|
|
161
|
-
self,
|
|
162
|
-
query: str,
|
|
163
|
-
*,
|
|
164
|
-
from_: str | None = None,
|
|
165
|
-
to: str | None = None,
|
|
166
|
-
days: int | None = None,
|
|
167
|
-
limit: int = 20,
|
|
168
|
-
) -> dict[str, int | str]:
|
|
169
|
-
assert days is None
|
|
170
|
-
self.calls.append((query, from_, to, limit))
|
|
171
|
-
return {"query": query, "count": 1}
|
|
172
|
-
|
|
173
|
-
class DummyClient:
|
|
174
|
-
def __init__(self) -> None:
|
|
175
|
-
self.news = DummyNews()
|
|
176
|
-
|
|
177
|
-
client = DummyClient()
|
|
178
|
-
invoke_endpoint(
|
|
179
|
-
client,
|
|
155
|
+
def test_search_endpoint_specs_accept_limit_only() -> None:
|
|
156
|
+
for endpoint_id in (
|
|
180
157
|
"news-stocks.search",
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
158
|
+
"reddit-stocks.search",
|
|
159
|
+
"reddit-crypto.search",
|
|
160
|
+
"x-stocks.search",
|
|
161
|
+
"polymarket-stocks.search",
|
|
162
|
+
):
|
|
163
|
+
assert ENDPOINTS[endpoint_id].optional_params == ("limit",)
|
|
184
164
|
|
|
185
165
|
|
|
186
166
|
def test_invoke_endpoint_rejects_days_with_full_date_window() -> None:
|
|
@@ -9,6 +9,7 @@ from pathlib import Path
|
|
|
9
9
|
|
|
10
10
|
import adanos_cli.config as cli_config
|
|
11
11
|
import adanos_cli.main as cli_main
|
|
12
|
+
from adanos_cli.summaries import build_crypto_report
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
def _isolate_config(tmp_path: Path, monkeypatch) -> None:
|
|
@@ -39,13 +40,11 @@ class _RedditNS:
|
|
|
39
40
|
def explain(self, ticker: str):
|
|
40
41
|
return {"ticker": ticker, "explanation": f"{ticker} explanation"}
|
|
41
42
|
|
|
42
|
-
def search(self, query: str, *,
|
|
43
|
+
def search(self, query: str, *, limit: int = 20):
|
|
43
44
|
return {
|
|
44
45
|
"query": query,
|
|
45
46
|
"count": 1,
|
|
46
|
-
"period_days":
|
|
47
|
-
"from": from_,
|
|
48
|
-
"to": to,
|
|
47
|
+
"period_days": 7,
|
|
49
48
|
"results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
|
|
50
49
|
}
|
|
51
50
|
|
|
@@ -72,13 +71,11 @@ class _NewsNS:
|
|
|
72
71
|
def explain(self, ticker: str):
|
|
73
72
|
return {"ticker": ticker, "explanation": f"{ticker} news backdrop"}
|
|
74
73
|
|
|
75
|
-
def search(self, query: str, *,
|
|
74
|
+
def search(self, query: str, *, limit: int = 20):
|
|
76
75
|
return {
|
|
77
76
|
"query": query,
|
|
78
77
|
"count": 1,
|
|
79
|
-
"period_days":
|
|
80
|
-
"from": from_,
|
|
81
|
-
"to": to,
|
|
78
|
+
"period_days": 7,
|
|
82
79
|
"results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
|
|
83
80
|
}
|
|
84
81
|
|
|
@@ -102,13 +99,11 @@ class _XNS:
|
|
|
102
99
|
def explain(self, ticker: str):
|
|
103
100
|
return {"ticker": ticker, "explanation": f"{ticker} X discussion"}
|
|
104
101
|
|
|
105
|
-
def search(self, query: str, *,
|
|
102
|
+
def search(self, query: str, *, limit: int = 20):
|
|
106
103
|
return {
|
|
107
104
|
"query": query,
|
|
108
105
|
"count": 1,
|
|
109
|
-
"period_days":
|
|
110
|
-
"from": from_,
|
|
111
|
-
"to": to,
|
|
106
|
+
"period_days": 7,
|
|
112
107
|
"results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
|
|
113
108
|
}
|
|
114
109
|
|
|
@@ -123,13 +118,11 @@ class _PolymarketNS:
|
|
|
123
118
|
def stock(self, ticker: str, *, days: int = 7):
|
|
124
119
|
return {"ticker": ticker, "found": True, "buzz_score": 79.0, "trend": "rising", "trade_count": 500, "sentiment_score": 0.2}
|
|
125
120
|
|
|
126
|
-
def search(self, query: str, *,
|
|
121
|
+
def search(self, query: str, *, limit: int = 20):
|
|
127
122
|
return {
|
|
128
123
|
"query": query,
|
|
129
124
|
"count": 1,
|
|
130
|
-
"period_days":
|
|
131
|
-
"from": from_,
|
|
132
|
-
"to": to,
|
|
125
|
+
"period_days": 7,
|
|
133
126
|
"results": [{"ticker": "MSFT", "name": "Microsoft Corporation"}][:limit],
|
|
134
127
|
}
|
|
135
128
|
|
|
@@ -144,13 +137,11 @@ class _CryptoNS:
|
|
|
144
137
|
def token(self, symbol: str, *, days: int = 7):
|
|
145
138
|
return {"symbol": symbol, "found": True, "buzz_score": 78.0, "mentions": 1000, "sentiment_score": 0.05}
|
|
146
139
|
|
|
147
|
-
def search(self, query: str, *,
|
|
140
|
+
def search(self, query: str, *, limit: int = 20):
|
|
148
141
|
return {
|
|
149
142
|
"query": query,
|
|
150
143
|
"count": 1,
|
|
151
|
-
"period_days":
|
|
152
|
-
"from": from_,
|
|
153
|
-
"to": to,
|
|
144
|
+
"period_days": 7,
|
|
154
145
|
"results": [{"symbol": "BTC", "name": "Bitcoin"}][:limit],
|
|
155
146
|
}
|
|
156
147
|
|
|
@@ -238,7 +229,7 @@ def test_scan_briefing_and_watchlist_report(tmp_path, monkeypatch, capsys) -> No
|
|
|
238
229
|
assert payload["crypto_focus"]["symbols"] == ["BTC", "ETH"]
|
|
239
230
|
|
|
240
231
|
|
|
241
|
-
def
|
|
232
|
+
def test_search_command_accepts_limit(tmp_path, monkeypatch, capsys) -> None:
|
|
242
233
|
_isolate_config(tmp_path, monkeypatch)
|
|
243
234
|
monkeypatch.setattr(cli_main, "_load_sdk_client_class", lambda: _FakeClient)
|
|
244
235
|
|
|
@@ -250,10 +241,6 @@ def test_search_command_accepts_period_and_limit(tmp_path, monkeypatch, capsys)
|
|
|
250
241
|
"--platform",
|
|
251
242
|
"news-stocks",
|
|
252
243
|
"Tesla",
|
|
253
|
-
"--from",
|
|
254
|
-
"2026-05-15",
|
|
255
|
-
"--to",
|
|
256
|
-
"2026-05-21",
|
|
257
244
|
"--limit",
|
|
258
245
|
"1",
|
|
259
246
|
"--json",
|
|
@@ -265,11 +252,17 @@ def test_search_command_accepts_period_and_limit(tmp_path, monkeypatch, capsys)
|
|
|
265
252
|
assert payload["kind"] == "endpoint_result"
|
|
266
253
|
assert payload["endpoint"] == "news-stocks.search"
|
|
267
254
|
assert payload["data"]["query"] == "Tesla"
|
|
268
|
-
assert payload["data"]["from"] == "2026-05-15"
|
|
269
|
-
assert payload["data"]["to"] == "2026-05-21"
|
|
270
255
|
assert payload["result_count"] == 1
|
|
271
256
|
|
|
272
257
|
|
|
258
|
+
def test_crypto_report_search_uses_api_managed_window() -> None:
|
|
259
|
+
report = build_crypto_report(_FakeClient("adanos_key_test", "https://api.adanos.org"), "BTC", days=7)
|
|
260
|
+
|
|
261
|
+
assert report["reddit_crypto"]["ok"] is True
|
|
262
|
+
assert report["search"]["ok"] is True
|
|
263
|
+
assert report["search"]["data"]["query"] == "BTC"
|
|
264
|
+
|
|
265
|
+
|
|
273
266
|
def test_ask_routes_scan_briefing_and_watchlist(tmp_path, monkeypatch, capsys) -> None:
|
|
274
267
|
_isolate_config(tmp_path, monkeypatch)
|
|
275
268
|
monkeypatch.setattr(cli_main, "_load_sdk_client_class", lambda: _FakeClient)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|