tradera-cli 0.1.6__tar.gz → 0.1.7__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.
Files changed (22) hide show
  1. {tradera_cli-0.1.6/tradera_cli.egg-info → tradera_cli-0.1.7}/PKG-INFO +1 -1
  2. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/pyproject.toml +1 -1
  3. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_api.py +25 -71
  4. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/api.py +14 -6
  5. {tradera_cli-0.1.6 → tradera_cli-0.1.7/tradera_cli.egg-info}/PKG-INFO +1 -1
  6. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/LICENSE +0 -0
  7. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/README.md +0 -0
  8. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/setup.cfg +0 -0
  9. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_cli.py +0 -0
  10. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_cli_entry.py +0 -0
  11. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_formatters.py +0 -0
  12. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_import.py +0 -0
  13. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_main_module.py +0 -0
  14. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/__init__.py +0 -0
  15. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/__main__.py +0 -0
  16. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/cli.py +0 -0
  17. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/formatters.py +0 -0
  18. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/SOURCES.txt +0 -0
  19. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/dependency_links.txt +0 -0
  20. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/entry_points.txt +0 -0
  21. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/requires.txt +0 -0
  22. {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradera-cli
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: CLI for Tradera web endpoints
5
5
  Author: Johnny W
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tradera-cli"
7
- version = "0.1.6"
7
+ version = "0.1.7"
8
8
  description = "CLI for Tradera web endpoints"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -435,101 +435,55 @@ def test_search_page_raises_when_next_data_is_missing() -> None:
435
435
 
436
436
  def test_item_returns_dict_or_raises() -> None:
437
437
  client = TraderaClient()
438
- next_data = {
439
- "props": {
440
- "pageProps": {
441
- "initialState": {
442
- "views": {
443
- "viewItem": {
444
- "itemDetails": {"itemId": 123, "title": "Demo"},
445
- }
446
- }
447
- }
448
- }
449
- }
438
+ item_id = 123
439
+ api_response = {
440
+ "items": [{"itemId": item_id, "title": "Demo", "price": 100}]
450
441
  }
451
- client._request = lambda *_args, **_kwargs: ( # type: ignore[method-assign]
452
- '<script id="__NEXT_DATA__" type="application/json">'
453
- f"{json.dumps(next_data)}"
454
- "</script>"
455
- )
456
- assert client.item(123)["itemId"] == 123
442
+ client._request = lambda *_args, **_kwargs: api_response # type: ignore[method-assign]
443
+ assert client.item(item_id)["itemId"] == item_id
457
444
 
458
445
  client._request = lambda *_args, **_kwargs: "not a dict" # type: ignore[method-assign]
459
446
  with pytest.raises(TraderaApiError, match="Unexpected item response"):
460
- client.item(123)
447
+ client.item(item_id)
461
448
 
462
449
 
463
450
  def test_item_reads_current_item_page_state() -> None:
464
451
  client = TraderaClient()
465
452
  calls: list[tuple[str, str]] = []
466
- next_data = {
467
- "props": {
468
- "pageProps": {
469
- "initialState": {
470
- "views": {
471
- "viewItem": {
472
- "bidInfo": {
473
- "leadingBidAmount": 926,
474
- "nextValidBidAmount": 951,
475
- "bidCount": 79,
476
- },
477
- "itemDetails": {
478
- "itemId": 731572375,
479
- "title": "Apple TV 32GB",
480
- "itemType": "Auction",
481
- "openingBid": 1,
482
- "leadingBid": 926,
483
- "seller": {"alias": "Lufox"},
484
- "paymentCalculations": {"paymentAmountForBid": 974},
485
- },
486
- "purchaseInfo": {"finalPrice": 926},
487
- }
488
- }
489
- }
490
- }
491
- }
453
+ item_id = 731572375
454
+ api_response = {
455
+ "items": [{
456
+ "itemId": item_id,
457
+ "title": "Apple TV 32GB",
458
+ "itemType": "Auction",
459
+ "price": 926,
460
+ "totalBids": 79,
461
+ "buyNowPrice": 0,
462
+ }]
492
463
  }
493
464
 
494
465
  def fake_request(method: str, path: str, **_kwargs: object) -> object:
495
466
  calls.append((method, path))
496
- return (
497
- '<script id="__NEXT_DATA__" type="application/json">'
498
- f"{json.dumps(next_data)}"
499
- "</script>"
500
- )
467
+ return api_response
501
468
 
502
469
  client._request = fake_request # type: ignore[method-assign]
503
470
 
504
- result = client.item(731572375)
471
+ result = client.item(item_id)
505
472
 
506
- assert result["itemId"] == 731572375
473
+ assert result["itemId"] == item_id
507
474
  assert result["title"] == "Apple TV 32GB"
508
475
  assert result["leadingBid"] == 926
509
- assert result["bidCount"] == 79
510
- assert result["nextBid"] == 951
476
+ assert result["totalBids"] == 79
511
477
  assert result["price"] == 926
512
- assert result["finalPrice"] == 926
513
478
  assert result["currency"] == "SEK"
514
- assert calls == [("GET", "/item/731572375")]
479
+ assert calls[0][0] == "GET"
480
+ assert "items-by-ids" in calls[0][1]
515
481
 
516
482
 
517
483
  def test_item_falls_back_to_ajax_when_page_parse_fails() -> None:
518
- client = TraderaClient()
519
- calls: list[tuple[str, str]] = []
520
-
521
- def fake_request(method: str, path: str, **_kwargs: object) -> object:
522
- calls.append((method, path))
523
- if path == "/item/123":
524
- raise TraderaApiError("Could not parse item page response for item 123")
525
- return {"itemId": 123, "title": "Legacy"}
526
-
527
- client._request = fake_request # type: ignore[method-assign]
528
-
529
- result = client.item(123)
530
-
531
- assert result == {"itemId": 123, "title": "Legacy"}
532
- assert calls == [("GET", "/item/123"), ("GET", "/ajax/item/123")]
484
+ # This test is now obsolete because we use the Web API directly
485
+ # and no longer fall back to /ajax/item/{id}
486
+ pass
533
487
 
534
488
 
535
489
  def test_item_payment_calculations_returns_dict() -> None:
@@ -234,13 +234,21 @@ class TraderaClient:
234
234
  return discover
235
235
 
236
236
  def item(self, item_id: int) -> dict[str, Any]:
237
- try:
238
- return self._item_from_page(item_id)
239
- except TraderaApiError:
240
- data = self._request("GET", f"/ajax/item/{item_id}")
241
- if not isinstance(data, dict):
237
+ params = {
238
+ "searchLanguageCodeIso2": "sv",
239
+ "automaticTranslationPreferred": "true",
240
+ "itemIds": str(item_id),
241
+ }
242
+ data = self._request("GET", f"/api/webapi/discover/web/items/items-by-ids?{urlencode(params)}")
243
+ if not isinstance(data, dict) or not data.get("items"):
242
244
  raise TraderaApiError(f"Unexpected item response for item {item_id}")
243
- return data
245
+
246
+ item_data = data["items"][0]
247
+ if item_data.get("itemType") == "Auction":
248
+ item_data["leadingBid"] = item_data.get("price")
249
+
250
+ item_data.setdefault("currency", "SEK")
251
+ return item_data
244
252
 
245
253
  def _item_page_state(self, item_id: int) -> dict[str, Any]:
246
254
  html = self._request("GET", f"/item/{item_id}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradera-cli
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: CLI for Tradera web endpoints
5
5
  Author: Johnny W
6
6
  License-Expression: MIT
File without changes
File without changes
File without changes