edtlib: move PropertySpec
This is just moving the class definition higher in the file
to make it easier to type annotate the module.
Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
diff --git a/scripts/dts/python-devicetree/src/devicetree/edtlib.py b/scripts/dts/python-devicetree/src/devicetree/edtlib.py
index 8cc478d..c5d807b 100644
--- a/scripts/dts/python-devicetree/src/devicetree/edtlib.py
+++ b/scripts/dts/python-devicetree/src/devicetree/edtlib.py
@@ -459,6 +459,145 @@
"is not a list")
+class PropertySpec:
+ """
+ Represents a "property specification", i.e. the description of a
+ property provided by a binding file, like its type and description.
+
+ These attributes are available on PropertySpec objects:
+
+ binding:
+ The Binding object which defined this property.
+
+ name:
+ The property's name.
+
+ path:
+ The file where this property was defined. In case a binding includes
+ other bindings, this is the file where the property was last modified.
+
+ type:
+ The type of the property as a string, as given in the binding.
+
+ description:
+ The free-form description of the property as a string, or None.
+
+ enum:
+ A list of values the property may take as given in the binding, or None.
+
+ enum_tokenizable:
+ True if enum is not None and all the values in it are tokenizable;
+ False otherwise.
+
+ A property must have string type and an "enum:" in its binding to be
+ tokenizable. Additionally, the "enum:" values must be unique after
+ converting all non-alphanumeric characters to underscores (so "foo bar"
+ and "foo_bar" in the same "enum:" would not be tokenizable).
+
+ enum_upper_tokenizable:
+ Like 'enum_tokenizable', with the additional restriction that the
+ "enum:" values must be unique after uppercasing and converting
+ non-alphanumeric characters to underscores.
+
+ const:
+ The property's constant value as given in the binding, or None.
+
+ default:
+ The property's default value as given in the binding, or None.
+
+ deprecated:
+ True if the property is deprecated; False otherwise.
+
+ required:
+ True if the property is marked required; False otherwise.
+
+ specifier_space:
+ The specifier space for the property as given in the binding, or None.
+ """
+
+ def __init__(self, name, binding):
+ self.binding = binding
+ self.name = name
+ self._raw = self.binding.raw["properties"][name]
+
+ def __repr__(self):
+ return f"<PropertySpec {self.name} type '{self.type}'>"
+
+ @property
+ def path(self):
+ "See the class docstring"
+ return self.binding.path
+
+ @property
+ def type(self):
+ "See the class docstring"
+ return self._raw["type"]
+
+ @property
+ def description(self):
+ "See the class docstring"
+ return self._raw.get("description")
+
+ @property
+ def enum(self):
+ "See the class docstring"
+ return self._raw.get("enum")
+
+ @property
+ def enum_tokenizable(self):
+ "See the class docstring"
+ if not hasattr(self, '_enum_tokenizable'):
+ if self.type != 'string' or self.enum is None:
+ self._enum_tokenizable = False
+ else:
+ # Saving _as_tokens here lets us reuse it in
+ # enum_upper_tokenizable.
+ self._as_tokens = [re.sub(_NOT_ALPHANUM_OR_UNDERSCORE,
+ '_', value)
+ for value in self.enum]
+ self._enum_tokenizable = (len(self._as_tokens) ==
+ len(set(self._as_tokens)))
+
+ return self._enum_tokenizable
+
+ @property
+ def enum_upper_tokenizable(self):
+ "See the class docstring"
+ if not hasattr(self, '_enum_upper_tokenizable'):
+ if not self.enum_tokenizable:
+ self._enum_upper_tokenizable = False
+ else:
+ self._enum_upper_tokenizable = \
+ (len(self._as_tokens) ==
+ len(set(x.upper() for x in self._as_tokens)))
+ return self._enum_upper_tokenizable
+
+ @property
+ def const(self):
+ "See the class docstring"
+ return self._raw.get("const")
+
+ @property
+ def default(self):
+ "See the class docstring"
+ return self._raw.get("default")
+
+ @property
+ def required(self):
+ "See the class docstring"
+ return self._raw.get("required", False)
+
+ @property
+ def deprecated(self):
+ "See the class docstring"
+ return self._raw.get("deprecated", False)
+
+ @property
+ def specifier_space(self):
+ "See the class docstring"
+ return self._raw.get("specifier-space")
+
+
class EDT:
"""
Represents a devicetree augmented with information from bindings.
@@ -2133,144 +2272,6 @@
return ret
-class PropertySpec:
- """
- Represents a "property specification", i.e. the description of a
- property provided by a binding file, like its type and description.
-
- These attributes are available on PropertySpec objects:
-
- binding:
- The Binding object which defined this property.
-
- name:
- The property's name.
-
- path:
- The file where this property was defined. In case a binding includes
- other bindings, this is the file where the property was last modified.
-
- type:
- The type of the property as a string, as given in the binding.
-
- description:
- The free-form description of the property as a string, or None.
-
- enum:
- A list of values the property may take as given in the binding, or None.
-
- enum_tokenizable:
- True if enum is not None and all the values in it are tokenizable;
- False otherwise.
-
- A property must have string type and an "enum:" in its binding to be
- tokenizable. Additionally, the "enum:" values must be unique after
- converting all non-alphanumeric characters to underscores (so "foo bar"
- and "foo_bar" in the same "enum:" would not be tokenizable).
-
- enum_upper_tokenizable:
- Like 'enum_tokenizable', with the additional restriction that the
- "enum:" values must be unique after uppercasing and converting
- non-alphanumeric characters to underscores.
-
- const:
- The property's constant value as given in the binding, or None.
-
- default:
- The property's default value as given in the binding, or None.
-
- deprecated:
- True if the property is deprecated; False otherwise.
-
- required:
- True if the property is marked required; False otherwise.
-
- specifier_space:
- The specifier space for the property as given in the binding, or None.
- """
-
- def __init__(self, name, binding):
- self.binding = binding
- self.name = name
- self._raw = self.binding.raw["properties"][name]
-
- def __repr__(self):
- return f"<PropertySpec {self.name} type '{self.type}'>"
-
- @property
- def path(self):
- "See the class docstring"
- return self.binding.path
-
- @property
- def type(self):
- "See the class docstring"
- return self._raw["type"]
-
- @property
- def description(self):
- "See the class docstring"
- return self._raw.get("description")
-
- @property
- def enum(self):
- "See the class docstring"
- return self._raw.get("enum")
-
- @property
- def enum_tokenizable(self):
- "See the class docstring"
- if not hasattr(self, '_enum_tokenizable'):
- if self.type != 'string' or self.enum is None:
- self._enum_tokenizable = False
- else:
- # Saving _as_tokens here lets us reuse it in
- # enum_upper_tokenizable.
- self._as_tokens = [re.sub(_NOT_ALPHANUM_OR_UNDERSCORE,
- '_', value)
- for value in self.enum]
- self._enum_tokenizable = (len(self._as_tokens) ==
- len(set(self._as_tokens)))
-
- return self._enum_tokenizable
-
- @property
- def enum_upper_tokenizable(self):
- "See the class docstring"
- if not hasattr(self, '_enum_upper_tokenizable'):
- if not self.enum_tokenizable:
- self._enum_upper_tokenizable = False
- else:
- self._enum_upper_tokenizable = \
- (len(self._as_tokens) ==
- len(set(x.upper() for x in self._as_tokens)))
- return self._enum_upper_tokenizable
-
- @property
- def const(self):
- "See the class docstring"
- return self._raw.get("const")
-
- @property
- def default(self):
- "See the class docstring"
- return self._raw.get("default")
-
- @property
- def required(self):
- "See the class docstring"
- return self._raw.get("required", False)
-
- @property
- def deprecated(self):
- "See the class docstring"
- return self._raw.get("deprecated", False)
-
- @property
- def specifier_space(self):
- "See the class docstring"
- return self._raw.get("specifier-space")
-
class EDTError(Exception):
"Exception raised for devicetree- and binding-related errors"