python-getpaid-payu 3.0.0a4__tar.gz → 3.1.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.
Files changed (51) hide show
  1. python_getpaid_payu-3.1.0/.github/release-drafter.yml +31 -0
  2. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.github/workflows/ci.yml +3 -0
  3. python_getpaid_payu-3.1.0/.github/workflows/release.yml +60 -0
  4. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/PKG-INFO +5 -5
  5. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/README.md +1 -1
  6. python_getpaid_payu-3.1.0/docs/changelog.md +51 -0
  7. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/pyproject.toml +4 -3
  8. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/__init__.py +1 -1
  9. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/processor.py +3 -3
  10. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/plugin.py +1 -0
  11. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/routes.py +23 -8
  12. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/types.py +1 -6
  13. python_getpaid_payu-3.1.0/tests/test_public_api.py +18 -0
  14. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_simulator_plugin.py +4 -0
  15. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/uv.lock +4 -4
  16. python_getpaid_payu-3.0.0a4/docs/changelog.md +0 -22
  17. python_getpaid_payu-3.0.0a4/tests/test_public_api.py +0 -7
  18. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.gitignore +0 -0
  19. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.pre-commit-config.yaml +0 -0
  20. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.python-version +0 -0
  21. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.readthedocs.yml +0 -0
  22. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.sisyphus/evidence/task-26-readme-payu.txt +0 -0
  23. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/.sisyphus/evidence/task-5-baseline-payu.txt +0 -0
  24. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/CODE_OF_CONDUCT.md +0 -0
  25. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/CONTRIBUTING.md +0 -0
  26. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/LICENSE +0 -0
  27. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/codeofconduct.md +0 -0
  28. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/concepts.md +0 -0
  29. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/conf.py +0 -0
  30. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/configuration.md +0 -0
  31. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/contributing.md +0 -0
  32. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/getting-started.md +0 -0
  33. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/index.md +0 -0
  34. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/license.md +0 -0
  35. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/reference.md +0 -0
  36. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/docs/requirements.txt +0 -0
  37. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/sandbox_keys.txt +0 -0
  38. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/client.py +0 -0
  39. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/py.typed +0 -0
  40. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/__init__.py +0 -0
  41. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/signing.py +0 -0
  42. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/transitions.py +0 -0
  43. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/src/getpaid_payu/simulator/webhooks.py +0 -0
  44. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/__init__.py +0 -0
  45. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/conftest.py +0 -0
  46. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_callback.py +0 -0
  47. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_client.py +0 -0
  48. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_entry_points.py +0 -0
  49. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_processor.py +0 -0
  50. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_types.py +0 -0
  51. {python_getpaid_payu-3.0.0a4 → python_getpaid_payu-3.1.0}/tests/test_url_construction.py +0 -0
@@ -0,0 +1,31 @@
1
+ name-template: 'v$RESOLVED_VERSION'
2
+ tag-template: 'v$RESOLVED_VERSION'
3
+ categories:
4
+ - title: ':boom: Breaking Changes'
5
+ label: 'breaking'
6
+ - title: ':rocket: Features'
7
+ label: 'enhancement'
8
+ - title: ':fire: Removals and Deprecations'
9
+ label: 'removal'
10
+ - title: ':beetle: Fixes'
11
+ label: 'bug'
12
+ - title: ':racehorse: Performance'
13
+ label: 'performance'
14
+ - title: ':rotating_light: Testing'
15
+ label: 'testing'
16
+ - title: ':construction_worker: Continuous Integration'
17
+ label: 'ci'
18
+ - title: ':books: Documentation'
19
+ label: 'documentation'
20
+ - title: ':hammer: Refactoring'
21
+ label: 'refactoring'
22
+ - title: ':lipstick: Style'
23
+ label: 'style'
24
+ - title: ':package: Dependencies'
25
+ labels:
26
+ - 'dependencies'
27
+ - 'build'
28
+ template: |
29
+ ## Changes
30
+
31
+ $CHANGES
@@ -29,5 +29,8 @@ jobs:
29
29
  - name: Lint with ruff
30
30
  run: uv run ruff check .
31
31
 
32
+ - name: Audit dependencies
33
+ run: uv run pip-audit --strict
34
+
32
35
  - name: Run tests
33
36
  run: uv run pytest --tb=short
@@ -0,0 +1,60 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+
9
+ jobs:
10
+ release:
11
+ name: Release
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Check out the repository
15
+ uses: actions/checkout@v4
16
+ with:
17
+ fetch-depth: 0 # Full history needed for version detection
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install uv
25
+ run: pip install uv
26
+
27
+ # Version is read from __init__.py (dynamic via hatch)
28
+ - name: Detect version from __init__.py
29
+ id: get-version
30
+ run: |
31
+ init_py=$(grep -A2 '\[tool\.hatch\.version\]' pyproject.toml | grep '^path\s*=' | head -1 | sed -E "s/path\s*=\s*['\"]([^'\"]+)['\"].*/\1/")
32
+ version=$(grep '__version__' "$init_py" | head -1 | sed -E "s/.*= ['\"]([^'\"]+)['\"].*/\1/")
33
+ echo "version=$version" >> "$GITHUB_OUTPUT"
34
+
35
+ - name: Check if tag already exists
36
+ id: check-tag
37
+ run: |
38
+ tag="v${{ steps.get-version.outputs.version }}"
39
+ if git rev-parse "$tag" >/dev/null 2>&1; then
40
+ echo "already_tagged=true" >> "$GITHUB_OUTPUT"
41
+ else
42
+ echo "already_tagged=false" >> "$GITHUB_OUTPUT"
43
+ fi
44
+
45
+ - name: Tag new version
46
+ if: steps.check-tag.outputs.already_tagged == 'false'
47
+ run: |
48
+ tag="v${{ steps.get-version.outputs.version }}"
49
+ git config user.name "github-actions[bot]"
50
+ git config user.email "github-actions[bot]@users.noreply.github.com"
51
+ git tag -a "$tag" -m "Release $tag"
52
+ git push origin "$tag"
53
+
54
+ - name: Build package
55
+ run: uv build
56
+
57
+ - name: Publish package on PyPI
58
+ uses: pypa/gh-action-pypi-publish@release/v1
59
+ with:
60
+ password: ${{ secrets.PYPI_TOKEN }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-getpaid-payu
3
- Version: 3.0.0a4
3
+ Version: 3.1.0
4
4
  Summary: PayU payment gateway integration for python-getpaid ecosystem.
5
5
  Project-URL: Homepage, https://github.com/django-getpaid/python-getpaid-payu
6
6
  Project-URL: Repository, https://github.com/django-getpaid/python-getpaid-payu
@@ -9,7 +9,7 @@ Project-URL: Changelog, https://github.com/django-getpaid/python-getpaid-payu/re
9
9
  Author-email: Dominik Kozaczko <dominik@kozaczko.info>
10
10
  License: MIT
11
11
  License-File: LICENSE
12
- Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Programming Language :: Python :: 3.12
@@ -19,10 +19,10 @@ Classifier: Topic :: Office/Business :: Financial :: Point-Of-Sale
19
19
  Classifier: Typing :: Typed
20
20
  Requires-Python: >=3.12
21
21
  Requires-Dist: httpx>=0.27.0
22
- Requires-Dist: python-getpaid-core>=3.0.0a3
22
+ Requires-Dist: python-getpaid-core>=3.0.0
23
23
  Provides-Extra: simulator
24
24
  Requires-Dist: litestar>=2.0; extra == 'simulator'
25
- Requires-Dist: python-getpaid-simulator>=3.0.0a3; extra == 'simulator'
25
+ Requires-Dist: python-getpaid-simulator>=3.0.0; extra == 'simulator'
26
26
  Description-Content-Type: text/markdown
27
27
 
28
28
  # python-getpaid-payu
@@ -134,7 +134,7 @@ PayU provides a sandbox environment for testing. You can use the example keys pr
134
134
  ## Requirements
135
135
 
136
136
  - Python 3.12+
137
- - `python-getpaid-core >= 3.0.0a3`
137
+ - `python-getpaid-core >= 3.0.0`
138
138
  - `httpx >= 0.27.0`
139
139
 
140
140
  ## License
@@ -107,7 +107,7 @@ PayU provides a sandbox environment for testing. You can use the example keys pr
107
107
  ## Requirements
108
108
 
109
109
  - Python 3.12+
110
- - `python-getpaid-core >= 3.0.0a3`
110
+ - `python-getpaid-core >= 3.0.0`
111
111
  - `httpx >= 0.27.0`
112
112
 
113
113
  ## License
@@ -0,0 +1,51 @@
1
+ # Changelog
2
+
3
+ ## v3.0.0 (2026-06-04)
4
+
5
+ Major stable release — PayU payment gateway integration for the python-getpaid ecosystem.
6
+
7
+ ### Breaking Changes
8
+
9
+ - Complete rewrite as a framework-agnostic plugin for `python-getpaid-core` v3
10
+ - Requires Python 3.12+
11
+ - Now depends on `python-getpaid-core>=3.0.0` instead of standalone django-getpaid
12
+
13
+ ### Features
14
+
15
+ - Full PayU REST API v2.1 coverage
16
+ - Async HTTP client (`PayUClient`) with OAuth2 token management
17
+ - Payment processor (`PayUProcessor`) implementing `BaseProcessor`
18
+ - All order operations: create, cancel, capture, retrieve
19
+ - Refund operations: create, retrieve single/all
20
+ - Payment methods retrieval
21
+ - Transaction details retrieval
22
+ - Shop info and payout operations
23
+ - Token deletion
24
+ - Automatic amount centification/normalization
25
+ - Signature verification (MD5 and SHA-256)
26
+ - PUSH callback handling with semantic payment updates
27
+ - PULL status polling
28
+ - Full pre-authorization support (lock, charge, release)
29
+
30
+ ---
31
+
32
+ ## v0.1.0 (2026-02-14)
33
+
34
+ Initial release.
35
+
36
+ ### Features
37
+
38
+ - Full PayU REST API v2.1 coverage
39
+ - Async HTTP client (`PayUClient`) with OAuth2 token management
40
+ - Payment processor (`PayUProcessor`) implementing `BaseProcessor`
41
+ - All order operations: create, cancel, capture, retrieve
42
+ - Refund operations: create, retrieve single/all
43
+ - Payment methods retrieval
44
+ - Transaction details retrieval
45
+ - Shop info and payout operations
46
+ - Token deletion
47
+ - Automatic amount centification/normalization
48
+ - Signature verification (MD5 and SHA-256)
49
+ - PUSH callback handling with semantic payment updates
50
+ - PULL status polling
51
+ - Full pre-authorization support (lock, charge, release)
@@ -9,7 +9,7 @@ authors = [
9
9
  ]
10
10
  requires-python = '>=3.12'
11
11
  classifiers = [
12
- 'Development Status :: 3 - Alpha',
12
+ 'Development Status :: 5 - Production/Stable',
13
13
  'Intended Audience :: Developers',
14
14
  'License :: OSI Approved :: MIT License',
15
15
  'Programming Language :: Python :: 3.12',
@@ -19,13 +19,13 @@ classifiers = [
19
19
  'Typing :: Typed',
20
20
  ]
21
21
  dependencies = [
22
- 'python-getpaid-core>=3.0.0a3',
22
+ 'python-getpaid-core>=3.0.0',
23
23
  'httpx>=0.27.0',
24
24
  ]
25
25
 
26
26
  [project.optional-dependencies]
27
27
  simulator = [
28
- 'python-getpaid-simulator>=3.0.0a3',
28
+ 'python-getpaid-simulator>=3.0.0',
29
29
  'litestar>=2.0',
30
30
  ]
31
31
 
@@ -38,6 +38,7 @@ dev = [
38
38
  'ruff>=0.9.0',
39
39
  'pre-commit>=4.0',
40
40
  'ty>=0.0.16',
41
+ 'pip-audit>=2.7.0',
41
42
  ]
42
43
  docs = [
43
44
  'furo>=2024.8.6',
@@ -9,4 +9,4 @@ __all__ = [
9
9
  "PayUProcessor",
10
10
  ]
11
11
 
12
- __version__ = "3.0.0a4"
12
+ __version__ = "3.1.0"
@@ -11,7 +11,7 @@ from typing import ClassVar
11
11
  from getpaid_core.enums import PaymentEvent
12
12
  from getpaid_core.exceptions import InvalidCallbackError
13
13
  from getpaid_core.processor import BaseProcessor
14
- from getpaid_core.types import ChargeResponse as CoreChargeResponse
14
+ from getpaid_core.types import ChargeResult as CoreChargeResult
15
15
  from getpaid_core.types import PaymentUpdate
16
16
  from getpaid_core.types import RefundResult
17
17
  from getpaid_core.types import TransactionResult
@@ -291,7 +291,7 @@ class PayUProcessor(BaseProcessor):
291
291
 
292
292
  async def charge(
293
293
  self, amount: Decimal | None = None, **kwargs
294
- ) -> CoreChargeResponse:
294
+ ) -> CoreChargeResult:
295
295
  """Charge a pre-authorized (locked) payment."""
296
296
  client = self._get_client()
297
297
  response = await client.capture(self.payment.external_id)
@@ -299,7 +299,7 @@ class PayUProcessor(BaseProcessor):
299
299
  response.get("status", {}).get("statusCode")
300
300
  == ResponseStatus.SUCCESS
301
301
  )
302
- return CoreChargeResponse(
302
+ return CoreChargeResult(
303
303
  amount_charged=amount or self.payment.amount_locked,
304
304
  success=success,
305
305
  async_call=False,
@@ -30,6 +30,7 @@ def load_provider_config(
30
30
  ) -> dict[str, Any]:
31
31
  environment = env or os.environ
32
32
  return {
33
+ "amount_minor_unit_places": 2,
33
34
  "second_key": environment.get(
34
35
  "SIMULATOR_PAYU_SECOND_KEY",
35
36
  "b6ca15b0d1020e8094d9b5f8d163db54",
@@ -4,6 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  from datetime import UTC
6
6
  from datetime import datetime
7
+ from decimal import Decimal
8
+ from decimal import InvalidOperation
7
9
  from inspect import isawaitable
8
10
  from typing import Any
9
11
  from urllib.parse import parse_qsl
@@ -31,6 +33,23 @@ def _provider_config(request: Request[Any, Any, Any]) -> dict[str, Any]:
31
33
  return dict(request.app.state.provider_configs["payu"])
32
34
 
33
35
 
36
+ def _format_amount_for_display(
37
+ order: dict[str, Any],
38
+ provider_config: dict[str, Any],
39
+ ) -> str:
40
+ amount_raw = order.get("totalAmount", 0)
41
+ try:
42
+ amount_value = Decimal(str(amount_raw))
43
+ except (InvalidOperation, TypeError, ValueError):
44
+ return str(amount_raw)
45
+
46
+ minor_unit_places = int(provider_config.get("amount_minor_unit_places", 2))
47
+ if minor_unit_places >= 0:
48
+ amount_value /= Decimal(10) ** minor_unit_places
49
+
50
+ return f"{amount_value:.2f} {order.get('currencyCode', 'PLN')}"
51
+
52
+
34
53
  def _unauthorized_response() -> Response[dict[str, dict[str, str]]]:
35
54
  return Response(
36
55
  content={
@@ -329,14 +348,10 @@ async def payu_authorize_get(
329
348
  if order.get("status") in ("COMPLETED", "CANCELED"):
330
349
  raise HTTPException(status_code=400, detail="Payment already processed")
331
350
 
332
- amount_raw = order.get("totalAmount", 0)
333
- try:
334
- amount_value = float(amount_raw) / 100
335
- formatted_amount = (
336
- f"{amount_value:.2f} {order.get('currencyCode', 'PLN')}"
337
- )
338
- except (ValueError, TypeError):
339
- formatted_amount = str(amount_raw)
351
+ formatted_amount = _format_amount_for_display(
352
+ order,
353
+ _provider_config(request),
354
+ )
340
355
 
341
356
  return Template(
342
357
  template_name="authorize.html",
@@ -1,15 +1,10 @@
1
1
  from datetime import datetime
2
- from enum import StrEnum
3
2
  from enum import auto
4
3
  from enum import unique
5
4
  from typing import Any
6
5
  from typing import TypedDict
7
6
 
8
-
9
- class AutoName(StrEnum):
10
- @staticmethod
11
- def _generate_next_value_(name, start, count, last_values):
12
- return name.strip("_")
7
+ from getpaid_core import AutoName
13
8
 
14
9
 
15
10
  @unique
@@ -0,0 +1,18 @@
1
+ """Tests for the public package API."""
2
+
3
+ import tomllib
4
+ from pathlib import Path
5
+
6
+ import getpaid_payu
7
+
8
+
9
+ def test_version() -> None:
10
+ assert getpaid_payu.__version__ == "3.0.0"
11
+
12
+
13
+ def test_core_dependency_floor() -> None:
14
+ pyproject_data = tomllib.loads(Path("pyproject.toml").read_text())
15
+ assert (
16
+ "python-getpaid-core>=3.0.0"
17
+ in pyproject_data["project"]["dependencies"]
18
+ )
@@ -94,6 +94,10 @@ def test_load_provider_config_reads_env_override(
94
94
  assert load_provider_config()["second_key"] == "override-second-key"
95
95
 
96
96
 
97
+ def test_load_provider_config_includes_amount_minor_unit_places() -> None:
98
+ assert load_provider_config()["amount_minor_unit_places"] == 2
99
+
100
+
97
101
  @pytest.mark.asyncio
98
102
  async def test_trigger_payu_webhook_signs_and_delivers_payload() -> None:
99
103
  storage = FakeStorage(
@@ -829,16 +829,16 @@ wheels = [
829
829
 
830
830
  [[package]]
831
831
  name = "python-getpaid-core"
832
- version = "3.0.0a3"
832
+ version = "3.0.0a4"
833
833
  source = { registry = "https://pypi.org/simple" }
834
834
  dependencies = [
835
835
  { name = "anyio" },
836
836
  { name = "httpx" },
837
837
  { name = "transitions" },
838
838
  ]
839
- sdist = { url = "https://files.pythonhosted.org/packages/d6/0a/e0fd72ed27879c7d6fe7282a4a160479c5dabcd1c1a20b89b213d370e42f/python_getpaid_core-3.0.0a3.tar.gz", hash = "sha256:dc98dcfe1bd581500b6ab96db28653b384cc2b24eb30b30824e7ac5b6703f2cb", size = 52540, upload-time = "2026-03-21T00:00:46.313Z" }
839
+ sdist = { url = "https://files.pythonhosted.org/packages/5c/22/c7a3d249398b609022179299f1cde51207db8e4e9556d4cfe7112f276422/python_getpaid_core-3.0.0a4.tar.gz", hash = "sha256:7784ce418391efe3ec1b6c7fddbfe4d8e1741991a9d0ca3a00ada7807ecb8230", size = 52993, upload-time = "2026-03-25T19:06:56.261Z" }
840
840
  wheels = [
841
- { url = "https://files.pythonhosted.org/packages/ba/c6/cb0ef9e36d6fa91723eff288733d47deb5c338476944d007aaa7db855547/python_getpaid_core-3.0.0a3-py3-none-any.whl", hash = "sha256:d45b5e0b2b5cb867f9f4357ce7b8abd047759a4cc1ff5624b68ce1bfdcb56e96", size = 14748, upload-time = "2026-03-21T00:00:44.719Z" },
841
+ { url = "https://files.pythonhosted.org/packages/9e/42/e52551b13b91474e02bcda4517adc2ea21bbb4920f7daae292a5ef795279/python_getpaid_core-3.0.0a4-py3-none-any.whl", hash = "sha256:322afe2a3a777958c1956d1c6ce576f42c93c0cf6ecd1a260bae189a9fa6a97f", size = 15077, upload-time = "2026-03-25T19:06:57.081Z" },
842
842
  ]
843
843
 
844
844
  [[package]]
@@ -875,7 +875,7 @@ docs = [
875
875
  requires-dist = [
876
876
  { name = "httpx", specifier = ">=0.27.0" },
877
877
  { name = "litestar", marker = "extra == 'simulator'", specifier = ">=2.0" },
878
- { name = "python-getpaid-core", specifier = ">=3.0.0a3" },
878
+ { name = "python-getpaid-core", specifier = ">=3.0.0a4" },
879
879
  { name = "python-getpaid-simulator", marker = "extra == 'simulator'", specifier = ">=3.0.0a3" },
880
880
  ]
881
881
  provides-extras = ["simulator"]
@@ -1,22 +0,0 @@
1
- # Changelog
2
-
3
- ## v0.1.0 (2026-02-14)
4
-
5
- Initial release.
6
-
7
- ### Features
8
-
9
- - Full PayU REST API v2.1 coverage
10
- - Async HTTP client (`PayUClient`) with OAuth2 token management
11
- - Payment processor (`PayUProcessor`) implementing `BaseProcessor`
12
- - All order operations: create, cancel, capture, retrieve
13
- - Refund operations: create, retrieve single/all
14
- - Payment methods retrieval
15
- - Transaction details retrieval
16
- - Shop info and payout operations
17
- - Token deletion
18
- - Automatic amount centification/normalization
19
- - Signature verification (MD5 and SHA-256)
20
- - PUSH callback handling with semantic payment updates
21
- - PULL status polling
22
- - Full pre-authorization support (lock, charge, release)
@@ -1,7 +0,0 @@
1
- """Tests for the public package API."""
2
-
3
- import getpaid_payu
4
-
5
-
6
- def test_version() -> None:
7
- assert getpaid_payu.__version__ == "3.0.0a4"