Source code for coalib.bearlib.aspects.root
from .base import aspectbase
from .meta import aspectclass
[docs]class Root(aspectbase, metaclass=aspectclass):
"""
The root aspectclass.
Define sub-aspectclasses with class-bound ``.subaspect`` decorator.
Definition string is taken from doc-string of decorated class.
Remaining docs are taken from a nested ``docs`` class.
Tastes are defined as class attributes that are instances of
:class:`coalib.bearlib.aspects.Taste`.
>>> from coalib.bearlib.aspects import Taste
>>> @Root.subaspect
... class Formatting:
... \"""
... A parent aspect for code formatting aspects...
... \
"""
... class docs:
... example = "..."
... example_language = "..."
... importance_reason = "..."
... fix_suggestions = "..."
We can now create subaspects like this:
>>> @Formatting.subaspect
... class LineLength:
... \"""
... This aspect controls the length of a line...
... \"""
... class docs:
... example = "..."
... example_language = "..."
... importance_reason = "..."
... fix_suggestions = "..."
...
... max_line_length = Taste[int](
... "Maximum length allowed for a line.",
... (80, 90, 120), default=80)
The representation will show the full "path" to the leaf of the tree:
>>> Root.Formatting.LineLength
<aspectclass 'Root.Formatting.LineLength'>
We can see, which settings are availables:
>>> Formatting.tastes
{}
>>> LineLength.tastes
{'max_line_length': <....Taste[int] object at ...>}
And instantiate the aspect with the values, they will be automatically
converted:
>>> Formatting('Python')
<....Root.Formatting object at 0x...>
>>> LineLength('Python', max_line_length="100").tastes
{'max_line_length': 100}
If no settings are given, the defaults will be taken:
>>> LineLength('Python').tastes
{'max_line_length': 80}
Tastes can also be made available for only specific languages:
>>> from coalib.bearlib.languages import Language
>>> @Language
... class GreaterTrumpScript:
... pass
>>> @Formatting.subaspect
... class Greatness:
... \"""
... This aspect controls the greatness of a file...
... \"""
... class docs:
... example = "..."
... example_language = "..."
... importance_reason = "..."
... fix_suggestions = "..."
... min_greatness = Taste[int](
... "Minimum greatness factor needed for a TrumpScript file. "
... "This is fact.",
... (1000000, 1000000000, 1000000000000), default=1000000,
... languages=('GreaterTrumpScript' ,))
>>> Greatness.tastes
{'min_greatness': <....Taste[int] object at ...>}
>>> Greatness('GreaterTrumpScript').tastes
{'min_greatness': 1000000}
>>> Greatness('GreaterTrumpScript', min_greatness=1000000000000).tastes
{'min_greatness': 1000000000000}
>>> Greatness('Python').tastes
{}
>>> Greatness('Python', min_greatness=1000000000)
... # doctest: +NORMALIZE_WHITESPACE
Traceback (most recent call last):
...
coalib.bearlib.aspects.taste.TasteError:
Root.Formatting.Greatness.min_greatness is not available ...
>>> Greatness('Python').min_greatness
... # doctest: +NORMALIZE_WHITESPACE
Traceback (most recent call last):
...
coalib.bearlib.aspects.taste.TasteError:
Root.Formatting.Greatness.min_greatness is not available ...
"""
parent = None
_tastes = {}