Skip to content

Commit

Permalink
Added addional option of having fixed number of items in array determ…
Browse files Browse the repository at this point in the history
…ined by the state or by an integer value
  • Loading branch information
ghandic committed Apr 14, 2021
1 parent 838ea9c commit 5aff2fe
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
12 changes: 11 additions & 1 deletion src/jsf/schema_types/_tuple.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,33 @@
import random
from dataclasses import dataclass
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Tuple, Union

from dataclasses_json import config, dataclass_json

from .base import BaseSchema, ProviderNotSetException


@dataclass_json
@dataclass
class Tuple(BaseSchema):
items: Optional[List[BaseSchema]] = None
additionalItems: Optional[Union[bool, BaseSchema]] = None # TODO: Random additional items to be appended
minItems: Optional[int] = 0
maxItems: Optional[int] = 5
uniqueItems: Optional[bool] = False
fixed: Optional[Union[str, int]] = field(default=None, metadata=config(field_name="$fixed"))

def generate(self, context: Dict[str, Any]) -> Optional[List[Tuple]]:
# TODO: Random drop out "It’s ok to not provide all of the items"
try:
return super().generate(context)
except ProviderNotSetException:

if isinstance(self.fixed, str):
self.minItems = self.maxItems = eval(self.fixed, context)()
elif isinstance(self.fixed, int):
self.minItems = self.maxItems = self.fixed

if self.uniqueItems:
output = []
for _ in range(random.randint(self.minItems, self.maxItems)):
Expand Down
13 changes: 11 additions & 2 deletions src/jsf/schema_types/array.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
import random
from dataclasses import dataclass
from typing import Any, Dict, List, Optional
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Union

from dataclasses_json import config, dataclass_json

from .base import BaseSchema, ProviderNotSetException


@dataclass_json
@dataclass
class Array(BaseSchema):
items: Optional[BaseSchema] = None
contains: Optional[BaseSchema] = None # NOTE: Validation only
minItems: Optional[int] = 0
maxItems: Optional[int] = 5
uniqueItems: Optional[bool] = False
fixed: Optional[Union[str, int]] = field(default=None, metadata=config(field_name="$fixed"))

def generate(self, context: Dict[str, Any]) -> Optional[List[Any]]:
try:
return super().generate(context)
except ProviderNotSetException:

if isinstance(self.fixed, str):
self.minItems = self.maxItems = eval(self.fixed, context)()
elif isinstance(self.fixed, int):
self.minItems = self.maxItems = self.fixed

output = [self.items.generate(context) for _ in range(random.randint(self.minItems, self.maxItems))]
if self.uniqueItems:
output = set(output)
Expand Down

0 comments on commit 5aff2fe

Please sign in to comment.