Skip to content

Commit fbb254a

Browse files
committed
Squashed commit of the following:
commit a61ae8b Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:29:40 2025 +0530 | syntax changed to Union for older python versions commit ac22f25 Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:25:50 2025 +0530 | syntax changed to Union for older python versions commit 27c6b55 Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:24:15 2025 +0530 isort applied commit a694400 Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:21:28 2025 +0530 StrEnum -> (str, Enum) for python < 3.11 commit bee32d7 Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:11:55 2025 +0530 Linted all new files commit 78b37e0 Author: Arnav Das <[email protected]> Date: Fri Aug 22 17:10:26 2025 +0530 Finallized working tests commit ded91e7 Author: Arnav Das <[email protected]> Date: Fri Aug 22 16:49:42 2025 +0530 Added skipped nkey tests commit eaaab20 Author: Arnav Das <[email protected]> Date: Thu Aug 14 13:41:23 2025 +0530 Cleaned files in contrib/ commit 1170592 Author: Arnav Das <[email protected]> Date: Thu Aug 14 13:38:44 2025 +0530 Changed directory for claims tests
1 parent 2713e22 commit fbb254a

25 files changed

+795
-489
lines changed

nats/contrib/accounts/__init__.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +0,0 @@
1-
# from nats.contrib.accounts.accounts import Account
2-
3-
# __all__ = [
4-
# "Account"
5-
# ]

nats/contrib/accounts/limits.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
from dataclasses import dataclass
32
from typing import Dict, Optional
43

@@ -11,15 +10,27 @@ class NatsLimits:
1110
payload: Optional[int] = None
1211
subs: Optional[int] = None
1312

13+
1414
class AccountLimits(FlatteningModel):
15-
imports: Optional[int] # `json:"imports,omitempty"` // Max number of imports
16-
exports: Optional[int] # `json:"exports,omitempty"` // Max number of exports
17-
wildcards: Optional[bool] # `json:"wildcards,omitempty"` // Are wildcards allowed in exports
18-
disallow_bearer: Optional[bool] # `json:"disallow_bearer,omitempty"` // User JWT can't be bearer token
19-
conn: Optional[int] # `json:"conn,omitempty"` // Max number of active connections
20-
leaf: Optional[int] # `json:"leaf,omitempty"` // Max number of active leaf node connections
15+
imports: Optional[
16+
int] # `json:"imports,omitempty"` // Max number of imports
17+
exports: Optional[
18+
int] # `json:"exports,omitempty"` // Max number of exports
19+
wildcards: Optional[
20+
bool
21+
] # `json:"wildcards,omitempty"` // Are wildcards allowed in exports
22+
disallow_bearer: Optional[
23+
bool
24+
] # `json:"disallow_bearer,omitempty"` // User JWT can't be bearer token
25+
conn: Optional[
26+
int
27+
] # `json:"conn,omitempty"` // Max number of active connections
28+
leaf: Optional[
29+
int
30+
] # `json:"leaf,omitempty"` // Max number of active leaf node connections
2131

22-
def __init__(self,
32+
def __init__(
33+
self,
2334
imports: Optional[int] = None,
2435
exports: Optional[int] = None,
2536
wildcards: Optional[bool] = None,
@@ -34,6 +45,7 @@ def __init__(self,
3445
self.conn = conn
3546
self.leaf = leaf
3647

48+
3749
class JetStreamLimits(FlatteningModel):
3850
mem_storage: Optional[int] = None
3951
disk_storage: Optional[int] = None
@@ -44,7 +56,8 @@ class JetStreamLimits(FlatteningModel):
4456
max_bytes_required: Optional[bool] = None
4557
max_ack_pending: Optional[int] = None
4658

47-
def __init__(self,
59+
def __init__(
60+
self,
4861
mem_storage: Optional[int] = None,
4962
disk_storage: Optional[int] = None,
5063
streams: Optional[int] = None,
@@ -66,16 +79,19 @@ def __init__(self,
6679

6780
JetStreamTieredLimits = Dict[str, JetStreamLimits]
6881

82+
6983
class OperatorLimits(FlatteningModel):
7084
nats_limits: NatsLimits
7185
account_limits: AccountLimits
72-
jetstream_limits: JetStreamLimits
73-
tiered_limits: Optional[JetStreamTieredLimits] # `json:"tiered_limits,omitempty"`
74-
75-
def __init__(self,
86+
jetstream_limits: Optional[JetStreamLimits]
87+
tiered_limits: Optional[JetStreamTieredLimits
88+
] # `json:"tiered_limits,omitempty"`
89+
90+
def __init__(
91+
self,
7692
nats_limits: NatsLimits,
7793
account_limits: AccountLimits,
78-
jetstream_limits: JetStreamLimits,
94+
jetstream_limits: Optional[JetStreamLimits] = None,
7995
tiered_limits: Optional[JetStreamTieredLimits] = None,
8096
):
8197
self.nats_limits = nats_limits
@@ -84,4 +100,4 @@ def __init__(self,
84100
self.tiered_limits = tiered_limits
85101

86102
class META:
87-
unflattened_fields = [('tiered_limits', 'tiered_limits')]
103+
unflattened_fields = [('tiered_limits', 'tiered_limits')]

nats/contrib/accounts/models.py

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
from typing import Union, Optional, List, Dict
21
from dataclasses import dataclass, field, fields
2+
from typing import Dict, List, Optional, Union
33

4+
from nats.contrib.accounts.limits import OperatorLimits
5+
from nats.contrib.claims.generic import GenericFields
6+
from nats.contrib.exports import Exports
7+
from nats.contrib.flatten_model import FlatteningModel
8+
from nats.contrib.imports import Imports
49
from nats.contrib.signingkeys import SigningKeys
510
from nats.contrib.types import Info, Permissions, Types
6-
from nats.contrib.flatten_model import FlatteningModel
711

8-
from nats.contrib.claims.generic import GenericFields
9-
from nats.contrib.imports import Imports
10-
from nats.contrib.exports import Exports
11-
from nats.contrib.accounts.limits import OperatorLimits
1212

1313
@dataclass
1414
class WeightedMapping:
1515
subject: str
16-
weight: Optional[int] = None # uint8 is mapped to int, with Optional for omitempty
16+
weight: Optional[
17+
int] = None # uint8 is mapped to int, with Optional for omitempty
1718
cluster: Optional[str] = None
1819

1920

@@ -23,49 +24,54 @@ class ExternalAuthorization:
2324
allowed_accounts: Optional[List[str]]
2425
xkey: Optional[str]
2526

27+
2628
@dataclass
2729
class MsgTrace:
2830
# Destination is the subject the server will send message traces to
2931
# if the inbound message contains the "traceparent" header and has
3032
# its sampled field indicating that the trace should be triggered.
31-
dest: Optional[str] # `json:"dest,omitempty"`
33+
dest: Optional[str] # `json:"dest,omitempty"`
3234

3335
# Sampling is used to set the probability sampling, that is, the
3436
# server will get a random number between 1 and 100 and trigger
3537
# the trace if the number is lower than this Sampling value.
3638
# The valid range is [1..100]. If the value is not set Validate()
3739
# will set the value to 100.
38-
sampling: Optional[int] # `json:"sampling,omitempty"`
40+
sampling: Optional[int] # `json:"sampling,omitempty"`
3941

4042

4143
class Account(FlatteningModel):
42-
imports: Optional[Imports] # `json:"imports,omitempty"`
43-
exports: Optional[Exports] # `json:"exports,omitempty"`
44-
limits: Optional[OperatorLimits] # `json:"limits,omitempty"`
45-
signing_keys: Optional[SigningKeys] # `json:"signing_keys,omitempty"`
46-
revocations: Optional[Dict[str, int]] # `json:"revocations,omitempty"`
47-
default_permissions: Optional[Permissions] # `json:"default_permissions,omitempty"`
48-
mappings: Optional[Dict[str, WeightedMapping]] # `json:"mappings,omitempty"`
49-
authorization: Optional[ExternalAuthorization] # `json:"authorization,omitempty"`
50-
trace: Optional[MsgTrace] # `json:"trace,omitempty"`
51-
cluster_traffic: Optional[str] # `json:"cluster_traffic,omitempty"`
44+
imports: Optional[Imports] # `json:"imports,omitempty"`
45+
exports: Optional[Exports] # `json:"exports,omitempty"`
46+
limits: Optional[OperatorLimits] # `json:"limits,omitempty"`
47+
signing_keys: Optional[SigningKeys] # `json:"signing_keys,omitempty"`
48+
revocations: Optional[Dict[str, int]] # `json:"revocations,omitempty"`
49+
default_permissions: Optional[Permissions
50+
] # `json:"default_permissions,omitempty"`
51+
mappings: Optional[Dict[str,
52+
WeightedMapping]] # `json:"mappings,omitempty"`
53+
authorization: Optional[ExternalAuthorization
54+
] # `json:"authorization,omitempty"`
55+
trace: Optional[MsgTrace] # `json:"trace,omitempty"`
56+
cluster_traffic: Optional[str] # `json:"cluster_traffic,omitempty"`
5257

5358
info: Info = field(default_factory=Info)
5459
generic_fields: GenericFields = field(default_factory=GenericFields)
5560

56-
def __init__(self,
57-
imports: Optional[Imports] = None,
58-
exports: Optional[Exports] = None,
59-
limits: Optional[OperatorLimits] = None,
60-
signing_keys: Optional[SigningKeys] = None,
61-
revocations: Optional[Dict[str, int]] = None,
62-
default_permissions: Optional[Permissions] = None,
63-
mappings: Optional[Dict[str, WeightedMapping]] = None,
64-
authorization: Optional[ExternalAuthorization] = None,
65-
trace: Optional[MsgTrace] = None,
66-
cluster_traffic: Optional[str] = None,
67-
info: Info = None,
68-
generic_fields: GenericFields = None
61+
def __init__(
62+
self,
63+
imports: Optional[Imports] = None,
64+
exports: Optional[Exports] = None,
65+
limits: Optional[OperatorLimits] = None,
66+
signing_keys: Optional[SigningKeys] = None,
67+
revocations: Optional[Dict[str, int]] = None,
68+
default_permissions: Optional[Permissions] = None,
69+
mappings: Optional[Dict[str, WeightedMapping]] = None,
70+
authorization: Optional[ExternalAuthorization] = None,
71+
trace: Optional[MsgTrace] = None,
72+
cluster_traffic: Optional[str] = None,
73+
info: Optional[Info] = None,
74+
generic_fields: Optional[GenericFields] = None
6975
):
7076
self.imports = imports
7177
self.exports = exports
@@ -79,13 +85,20 @@ def __init__(self,
7985
self.cluster_traffic = cluster_traffic
8086

8187
self.info = info if info else Info()
82-
self.generic_fields = generic_fields if generic_fields else GenericFields()
88+
self.generic_fields = generic_fields if generic_fields else GenericFields(
89+
type=Types.Account, version=2
90+
)
8391

8492
class Meta:
85-
unflatten_fields = [
86-
("imports", "imports"), ("exports", "exports"), ("limits", "limits"),
87-
("signing_keys", "signing_keys"), ("revocations", "revocations"),
93+
unflatten_fields = [
94+
("imports", "imports"),
95+
("exports", "exports"),
96+
("limits", "limits"),
97+
("signing_keys", "signing_keys"),
98+
("revocations", "revocations"),
8899
("default_permissions", "default_permissions"),
89-
("mappings", "mappings"), ("authorization", "authorization"),
90-
("trace", "trace"), ("cluster_traffic", "cluster_traffic"),
100+
("mappings", "mappings"),
101+
("authorization", "authorization"),
102+
("trace", "trace"),
103+
("cluster_traffic", "cluster_traffic"),
91104
]

nats/contrib/claims/generic.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
21
from typing import List, Optional
2+
33
from nats.contrib.flatten_model import FlatteningModel
44
from nats.contrib.types import Types
55

@@ -9,11 +9,12 @@ class GenericFields(FlatteningModel):
99
type: Optional[Types]
1010
version: Optional[int]
1111

12-
def __init__(self,
12+
def __init__(
13+
self,
1314
tags: Optional[List[str]] = None,
1415
type: Optional[Types] = None,
1516
version: Optional[int] = None,
1617
):
1718
self.tags = tags
1819
self.type = type
19-
self.version = version
20+
self.version = version

nats/contrib/claims/models.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
from typing import List, Optional, Union
22

3-
from nats.contrib.users.models import User
43
from nats.contrib.accounts.models import Account
4+
from nats.contrib.flatten_model import FlatteningModel
55
from nats.contrib.operator.models import Operator
6-
76
from nats.contrib.types import Types
8-
from nats.contrib.flatten_model import FlatteningModel
7+
from nats.contrib.users.models import User
8+
99

1010
class Claims(FlatteningModel):
1111
# Claims Data
1212
exp: Optional[int] # Expires int64 `json:"exp,omitempty"`
1313
jti: Optional[str] # ID string `json:"jti,omitempty"`
1414
iat: Optional[int] # IssuedAt int64 `json:"iat,omitempty"`
1515
iss: Optional[str] # Issuer string `json:"iss,omitempty"`
16-
name: Optional[str] # Name string `json:"name,omitempty"`
16+
name: Optional[str] # Name string `json:"name,omitempty"`
1717
nbf: Optional[int] # NotBefore int64 `json:"nbf,omitempty"`
1818
sub: Optional[str] # Subject string `json:"sub,omitempty"`
19-
19+
2020
# Nats Data
2121
nats: Optional[Union[User, Account, Operator]]
22-
issuer_account: Optional[str | bytes]
22+
issuer_account: Optional[Union[str, bytes]]
2323

24-
def __init__(self,
24+
def __init__(
25+
self,
2526
exp: Optional[int] = None,
2627
jti: Optional[str] = None,
2728
iat: Optional[int] = None,
@@ -30,7 +31,7 @@ def __init__(self,
3031
nbf: Optional[int] = None,
3132
sub: Optional[str] = None,
3233
nats: Optional[Union[User, Account, Operator]] = None,
33-
issuer_account: Optional[str | bytes] = None,
34+
issuer_account: Optional[Union[str, bytes]] = None,
3435
):
3536
self.exp: Optional[int] = exp
3637
self.jti: Optional[str] = jti
@@ -56,4 +57,4 @@ class AccountClaims(Claims):
5657

5758

5859
class OperatorClaims(Claims):
59-
pass
60+
pass

0 commit comments

Comments
 (0)