release: v0.19.2

This commit is contained in:
vladkens
2026-07-22 00:16:42 +03:00
parent 8ce44e44e0
commit e51d9ad043
8 changed files with 25 additions and 16 deletions
+1 -1
View File
@@ -56,7 +56,7 @@ jobs:
- name: Extract changelog entry
run: |
VERSION="${{ github.ref_name }}"
NOTES=$(awk "/^## ${VERSION}/{found=1; next} /^## /{found=0} found" changelog.md)
NOTES=$(awk "/^## ${VERSION}/{found=1; next} /^## /{found=0} found && !/^---$/" changelog.md)
if [ -z "$NOTES" ]; then
echo "Error: no changelog entry found for ${VERSION}"
exit 1
+17
View File
@@ -1,3 +1,20 @@
## v0.19.2 – 2026-07-21
### Features
- Added `wait_timeout` and `wait_interval` options to bound and tune account wait polling (#317, by @Flaburgan)
### Fixes
- Fixed X client transaction ID generation to use each account's effective proxy (#319, by @kn1l)
- Fixed X client transaction ID asset requests to use account cookies (#321, by @jonsuh)
- Fixed X client transaction ID failures incorrectly disabling valid accounts
### Maintenance
- Updated GraphQL operation IDs for current X API compatibility
**Full Changelog**: https://github.com/vladkens/twscrape/compare/v0.19.1...v0.19.2
---
## v0.19.1 – 2026-06-26
### Maintenance
+2 -2
View File
@@ -1,6 +1,6 @@
[project]
name = "twscrape"
version = "0.19.1"
version = "0.19.2"
authors = [{ name = "vladkens", email = "[email protected]" }]
description = "Twitter GraphQL and Search API implementation with SNScrape data models"
readme = "readme.md"
@@ -63,7 +63,7 @@ filterwarnings = ["ignore::DeprecationWarning"]
exclude-newer = "7 days"
[tool.ruff]
line-length = 99
line-length = 100
target-version = "py310"
[tool.ruff.lint]
+1 -3
View File
@@ -166,9 +166,7 @@ def print_table(meta: dict[str, MetaEntry], ops: dict[str, str], ttl_days: int):
stale_reasons = {"op": "op changed", "hash": "file changed"}
if state in stale_reasons:
updated_at = (
datetime.fromtimestamp(item[0]).strftime("%Y-%m-%d %H:%M") if item else "—"
)
updated_at = datetime.fromtimestamp(item[0]).strftime("%Y-%m-%d %H:%M") if item else "—"
print(f"{name:<28} {updated_at:>16} {stale_reasons[state]:>12} stale")
continue
+1 -3
View File
@@ -255,9 +255,7 @@ async def test_get_for_queue_or_wait_raises_via_env(pool_mock: AccountsPool, mon
await pool_mock.get_for_queue_or_wait("TestQueue")
async def test_get_for_queue_or_wait_waits_for_locked_account(
pool_mock: AccountsPool, monkeypatch
):
async def test_get_for_queue_or_wait_waits_for_locked_account(pool_mock: AccountsPool, monkeypatch):
queue = "TestQueue"
pool = AccountsPool(pool_mock._db_file, wait_timeout=1, wait_interval=0.1)
await pool.add_account("user1", "pass1", "email1", "ep1")
+1 -3
View File
@@ -672,9 +672,7 @@ class API:
yield x
async def community_moderators(self, community_id: int, limit=-1, kv: KV = None):
async with aclosing(
self.community_moderators_raw(community_id, limit=limit, kv=kv)
) as gen:
async with aclosing(self.community_moderators_raw(community_id, limit=limit, kv=kv)) as gen:
async for rep in gen:
for x in parse_users(rep, limit):
yield x
+1 -3
View File
@@ -346,9 +346,7 @@ async def load_keys(soup: bs4.BeautifulSoup, clt: HttpClient) -> tuple[list[int]
class XClIdGen:
@staticmethod
async def create(
proxy: str | None = None, cookies: dict[str, str] | None = None
) -> "XClIdGen":
async def create(proxy: str | None = None, cookies: dict[str, str] | None = None) -> "XClIdGen":
# X serves a different/legacy web build to authenticated vs anonymous
# sessions. Only authenticated sessions reliably contain the indices
# this parser depends on (see INDICES_FILE_RE).
Generated
+1 -1
View File
@@ -644,7 +644,7 @@ wheels = [
[[package]]
name = "twscrape"
version = "0.19.1"
version = "0.19.2"
source = { editable = "." }
dependencies = [
{ name = "aiosqlite" },