Metadata-Version: 2.4
Name: gruncellka-porto-features
Version: 0.4.0
Summary: Structured BDD contracts for Porto SDK — shared Gherkin scenarios, fixtures, and errors.json
Author: Oleksandr Tsyba
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/gruncellka/porto-features
Project-URL: Repository, https://github.com/gruncellka/porto-features
Project-URL: Issues, https://github.com/gruncellka/porto-features/issues
Project-URL: Changelog, https://github.com/gruncellka/porto-features/blob/main/CHANGELOG.md
Keywords: postal,post,shipping,logistics,deutsche post,ukrposhta,la poste,swiss post,pricing,postage,tariffs,zones,restrictions,validation,bdd,gherkin,cucumber,features,fixtures,contract tests,sdk,porto-features,porto-sdk
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Requires-Python: >=3.13
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: dev
Requires-Dist: bump2version>=1.0.0; extra == "dev"
Requires-Dist: gherkin-official<23.0.0,>=22.0.0; extra == "dev"
Requires-Dist: gherlint>=0.4.0; extra == "dev"
Requires-Dist: pre-commit>=3.5.0; extra == "dev"
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
Requires-Dist: pyyaml>=6.0.0; extra == "dev"
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
Requires-Dist: ruff>=0.15.5; extra == "dev"
Requires-Dist: mypy>=1.0.0; extra == "dev"
Dynamic: license-file

# Porto Features

[![validation](https://github.com/gruncellka/porto-features/actions/workflows/validation.yml/badge.svg)](https://github.com/gruncellka/porto-features/actions/workflows/validation.yml)
[![codecov](https://codecov.io/gh/gruncellka/porto-features/branch/main/graph/badge.svg)](https://codecov.io/gh/gruncellka/porto-features)

**Structured BDD contracts for Porto SDK** — shared Gherkin scenarios, address fixtures, and `errors.json` catalog.

---

## Install

**TypeScript / JavaScript (npm)**

```bash
npm install -D @gruncellka/porto-features
```

**Python (PyPI)**

```bash
pip install "gruncellka-porto-features[dev]"
```

Shipped paths: `porto_features/errors.json` · `porto_features/features/**/*.feature` · `porto_features/fixtures/**/*.json`


---

## Validate locally

```bash
make
make check
make quality
make test-cov
```

---

## Documentation

- **[docs/vocabulary.md](docs/vocabulary.md)** — canonical Gherkin steps (`porto_id` input)
- **[docs/scenario-policy.md](docs/scenario-policy.md)** — tag policy, paid adapter rules, fixtures
- **[docs/matrix.md](docs/matrix.md)** — pointer to Lab coverage index (`labs/matrix/`)

Catalog facts and mapping tables live in **porto-data** — not duplicated here.

---

## Feature layout

```text
porto_features/
├── errors.json                  # PORTO_* catalog (SDKs build language bindings)
├── features/
│   ├── sdk/
│   │   ├── core/                # @sdk @core — cross-operator policy, CLI, metadata
│   │   └── providers/{operator}/
│   └── adapters/{operator}/
│       └── {integration}/
│           ├── marks.feature
│           └── errors.feature
└── fixtures/addresses/
```

See [docs/scenario-policy.md](docs/scenario-policy.md) for tag and path rules.

🔳 gruncellka
