Skip to content

Commit c524257

Browse files
committed
Add identity model
1 parent f099c01 commit c524257

5 files changed

Lines changed: 53 additions & 0 deletions

File tree

pyproject.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ classifiers = [
4545

4646
dependencies = [
4747
"stellar-sdk",
48+
"pydantic",
49+
"pydantic-settings",
4850
]
4951

5052
[project.optional-dependencies]

src/soroban/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from soroban.models import *

src/soroban/models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from pydantic import model_validator
2+
from pydantic_settings import BaseSettings, SettingsConfigDict
3+
from stellar_sdk import Keypair
4+
5+
__all__ = ["Identity"]
6+
7+
8+
class Identity(BaseSettings):
9+
secret_key: str | None = None
10+
public_key: str | None = None
11+
keypair: Keypair | None = None
12+
13+
model_config = SettingsConfigDict(env_file="identity.toml")
14+
15+
@model_validator(mode='after')
16+
def load_keys(self) -> 'UserModel':
17+
if self.keypair is None and self.secret_key is None:
18+
raise ValueError("Either provide a secret key or a Keypair object.")
19+
if self.keypair is not None:
20+
self.secret_key = self.keypair.secret
21+
else:
22+
self.keypair = Keypair.from_secret(self.secret_key)
23+
self.public_key = self.keypair.public_key
24+
return self

tests/alice.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
secret_key = "SDTZV5HD6WBU2LZKVUGFCUUR3JTOJHDHEXO2TSYVITMSH6RCY433HEYB"

tests/test_models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import pathlib
2+
3+
import pytest
4+
import soroban
5+
from stellar_sdk import Keypair
6+
7+
8+
class TestIdentity:
9+
10+
def test_file(self):
11+
alice_fname = pathlib.Path(__file__).parent
12+
soroban.Identity(_env_file=alice_fname / "alice.toml")
13+
14+
def test_from_pk(self):
15+
keypair = Keypair.random()
16+
soroban.Identity(secret_key=keypair.secret)
17+
soroban.Identity(keypair=keypair)
18+
19+
def test_raises(self):
20+
with pytest.raises(ValueError, match="provide a secret key or a Keypair"):
21+
soroban.Identity()
22+
23+
keypair = Keypair.random()
24+
with pytest.raises(ValueError, match="provide a secret key or a Keypair"):
25+
soroban.Identity(public_key=keypair.public_key)

0 commit comments

Comments
 (0)