feat: add default inference behavior for basic types #13
4 changed files with 17 additions and 9 deletions
|
@ -62,20 +62,22 @@ class Annotator(Walk): # pylint: disable=R0903
|
||||||
variable: dict,
|
variable: dict,
|
||||||
) -> None:
|
) -> None:
|
||||||
multi = self.objectspace.multis.get(variable.path, False)
|
multi = self.objectspace.multis.get(variable.path, False)
|
||||||
# variable's type inference from a default value with :term:`basic types`
|
|
||||||
|
# default type inference from a default value with :term:`basic types`
|
||||||
basic_types = {str: "string", int: "number", bool: "boolean", float: "float"}
|
basic_types = {str: "string", int: "number", bool: "boolean", float: "float"}
|
||||||
if variable.version == "1.0":
|
if variable.version == "1.0":
|
||||||
# - version: 1.0, the default value is of type "string" by default
|
# - version: 1.0, the default value is of type "string" by default
|
||||||
|
|||||||
if variable.type is None:
|
if variable.type is None:
|
||||||
variable.type = "string"
|
variable.type = "string"
|
||||||
egarette
commented
Not only 1.1, should be "else:" Not only 1.1, should be "else:"
|
|||||||
elif variable.version == "1.1":
|
else: #if variable.version != "1.0":
|
||||||
# - version: 1.1, the default value has no type by default
|
# - version: 1.1, the default value has no type by default
|
||||||
if multi is False and variable.type is None:
|
if multi is False and variable.type is None:
|
||||||
if type(variable.default) in basic_types:
|
if type(variable.default) in basic_types:
|
||||||
variable.type = basic_types[type(variable.default)]
|
variable.type = basic_types[type(variable.default)]
|
||||||
else:
|
else:
|
||||||
# XXX FIXME strange. weird. not good
|
if variable.type is None:
|
||||||
egarette
commented
If variable.type is "number" it will override by "string". Multi value should be supported too (raise if type are different in this case). If variable.type is "number" it will override by "string".
Multi value should be supported too (raise if type are different in this case).
|
|||||||
variable.type = "string"
|
variable.type = "string"
|
||||||
|
|
||||||
# a boolean must have value, the default value is "True"
|
# a boolean must have value, the default value is "True"
|
||||||
if variable.type == "boolean" and multi is False and variable.default is None:
|
if variable.type == "boolean" and multi is False and variable.default is None:
|
||||||
variable.default = True
|
variable.default = True
|
||||||
|
|
|
@ -79,6 +79,11 @@ class Annotator(Walk): # pylint: disable=R0903
|
||||||
for variable in self.get_variables():
|
for variable in self.get_variables():
|
||||||
if variable.type == "symlink":
|
if variable.type == "symlink":
|
||||||
continue
|
continue
|
||||||
|
# choice type inference from the `choices` attribute
|
||||||
|
if variable.version != "1.0":
|
||||||
|
if variable.choices is not None:
|
||||||
|
if variable.type is None:
|
||||||
|
variable.type = "choice"
|
||||||
self._convert_variable(variable)
|
self._convert_variable(variable)
|
||||||
|
|
||||||
def _convert_variable(
|
def _convert_variable(
|
||||||
|
|
|
@ -56,7 +56,7 @@ from .object_model import (
|
||||||
Family,
|
Family,
|
||||||
Dynamic,
|
Dynamic,
|
||||||
Variable,
|
Variable,
|
||||||
Choice,
|
#Choice,
|
||||||
SymLink,
|
SymLink,
|
||||||
CALCULATION_TYPES,
|
CALCULATION_TYPES,
|
||||||
Calculation,
|
Calculation,
|
||||||
|
@ -237,7 +237,7 @@ class ParserVariable:
|
||||||
#
|
#
|
||||||
self.family = Family
|
self.family = Family
|
||||||
self.dynamic = Dynamic
|
self.dynamic = Dynamic
|
||||||
self.choice = Choice
|
self.choice = Variable #Choice
|
||||||
#
|
#
|
||||||
self.exclude_imports = []
|
self.exclude_imports = []
|
||||||
self.informations = Informations()
|
self.informations = Informations()
|
||||||
|
|
|
@ -442,13 +442,14 @@ class Variable(BaseModel):
|
||||||
version: str
|
version: str
|
||||||
# type will be set dynamically in `annotator/value.py`, default is None
|
# type will be set dynamically in `annotator/value.py`, default is None
|
||||||
type: str = None
|
type: str = None
|
||||||
|
choices: Union[None, List[BASETYPE_CALC], Calculation]
|
||||||
|
|
||||||
model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True)
|
model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True)
|
||||||
|
|
||||||
|
|
||||||
class Choice(Variable):
|
#class Choice(Variable):
|
||||||
type: Literal["choice"] = "choice"
|
# type: Literal["choice"] = "choice"
|
||||||
choices: Union[List[BASETYPE_CALC], Calculation]
|
# choices: Union[List[BASETYPE_CALC], Calculation]
|
||||||
|
|
||||||
|
|
||||||
class SymLink(BaseModel):
|
class SymLink(BaseModel):
|
||||||
|
|
Loading…
Reference in a new issue
This line is not correct to me.
Example:
is an invalid dictionary.