9 Commits
v0.1.3 ... main

Author SHA1 Message Date
32e99dacf7 Merge pull request 'dev' (#5) from dev into main
All checks were successful
CI / lint (push) Successful in 25s
CI / test (3.10) (push) Successful in 27s
CI / test (3.11) (push) Successful in 40s
CI / test (3.12) (push) Successful in 37s
CI / test (3.13) (push) Successful in 37s
CI / ci-success (push) Successful in 2s
Reviewed-on: #5
2026-07-23 13:11:50 +03:00
IluaAir
ae1e69d5fd Refactor dump_json method to use model_dump_json
All checks were successful
CI / lint (pull_request) Successful in 1m0s
CI / test (3.10) (pull_request) Successful in 27s
CI / test (3.11) (pull_request) Successful in 35s
CI / test (3.12) (pull_request) Successful in 36s
CI / test (3.13) (pull_request) Successful in 37s
CI / ci-success (pull_request) Successful in 2s
- Fix the `dump_json` method in the `ModelView` class to call `model_dump_json` instead of `model_dump`, ensuring consistency in JSON serialization.
- Added a new test case in `TestListModelView` to verify the functionality of `dump_json` and check for correct IP address serialization.
2026-07-23 11:15:10 +03:00
IluaAir
260c02f81d Add type hints and docstrings for VLANs, Interfaces, and System properties in NodeConfig
- Enhanced the `vlans`, `interfaces`, and `system` properties with type hints for better clarity and type checking.
- Added detailed docstrings to each property, describing the return types and structure of the associated configurations.
2026-07-23 10:24:51 +03:00
sttarsky
6bc47f1b4f Merge branch 'main' into dev 2026-07-19 10:28:04 +03:00
sttarsky
472508d51d Merge pull request #4 from sttarsky/sttarsky-patch-1
Bump version from 0.1.1 to 0.1.2
2026-07-15 16:02:05 +03:00
sttarsky
663cbad352 Bump version from 0.1.1 to 0.1.2 2026-07-15 16:01:21 +03:00
sttarsky
79dbb99186 Merge pull request #3 from sttarsky/dev
Dev v0.1.2
2026-07-15 15:58:14 +03:00
sttarsky
721d4b27ca Merge pull request #2 from sttarsky/dev
Dev
2026-07-15 00:54:46 +03:00
sttarsky
62530980aa Merge dev into main: initial oxipy release
Oxidized API client with TTP-based, multi-vendor config parsing into
Pydantic models.
- Core API: OxiAPI, Node, NodeView, NodeConfig, ModelView
- HTTP layer with retries/timeout and OxiAPIError (NodeNotFound -> 404)
- Vendor parsers: Keenetic, MikroTik, Qtech, Huawei, Eltex, H3C, Quasar
- Shared utils: VLAN range expansion, UTF-8 decoding
- Test suite: golden fixtures per vendor + unit/network/view tests
- Tooling: Ruff lint/format config, CI for GitHub and Gitea
- Docs: README + extending-models and templates guides
2026-06-12 20:41:34 +03:00
3 changed files with 42 additions and 5 deletions

View File

@@ -10,6 +10,9 @@ from .interfaces import BaseDevice, device_registry
if TYPE_CHECKING:
from requests import Session
from oxi.interfaces.contract import Interfaces, System, Vlans
TModel = TypeVar("TModel", bound=BaseModel)
@@ -20,7 +23,7 @@ class ModelView(Generic[TModel]):
def dump_json(self) -> str:
if isinstance(self._model, list):
return json.dumps(
[item.model_dump(by_alias=True) for item in self._model],
[item.model_dump_json(by_alias=True) for item in self._model],
ensure_ascii=False,
)
return self._model.model_dump_json(by_alias=True)
@@ -83,13 +86,42 @@ class NodeConfig:
return self.text
@property
def vlans(self):
def vlans(self) -> list["Vlans"]:
"""
Returns the list of VLAN configurations for the node.
:return: List of Vlans associated with the device.
vlan_id: int
name: str | None = Field(default=None, alias="description")
:rtype: list[oxi.interfaces.contract.Vlans]
"""
return ModelView(self._parsed_data.vlans)
return ModelView(self._parsed_data.vlans)
@property
def interfaces(self):
def interfaces(self) -> list["Interfaces"]:
"""
Returns the list of Interfaces configurations for the node.
:return: List of Interfaces associated with the device.
name: str = Field(alias="interface")
ip_address: IPv4Address | None = None
mask: int | None = None
description: str | None = None
shutdown: bool = False
:rtype: list[oxi.interfaces.contract.Interfaces]
"""
return ModelView(self._parsed_data.interfaces)
@property
def system(self):
def system(self) -> "System":
"""
Returns the Systems configurations for the node.
:return: System associated with the device.
model: str
serial_number: str
version: str
:rtype: oxi.interfaces.contract.System
"""
return ModelView(self._parsed_data.system)

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "oxipy"
version = "0.1.3"
version = "0.1.4"
description = "Python client for Oxidized API with TTP-based config parsing"
readme = "README.md"
license = "Apache-2.0"

View File

@@ -1,4 +1,5 @@
import json
from ipaddress import IPv4Address
import pytest
@@ -66,6 +67,10 @@ class TestListModelView:
def test_dump_uses_aliases(self, interfaces_view):
dumped = interfaces_view.dump()
assert dumped[0]["interface"] == "eth0"
assert dumped[0]["ip_address"] == IPv4Address("192.168.1.1")
def test_dump_json(self, interfaces_view):
assert interfaces_view.dump_json()
def test_dump_json_keeps_unicode(self):
view = ModelView([Interfaces(interface="eth0", description="Дом")])