diff --git a/CHANGELOG.md b/CHANGELOG.md index 54efb82c0c..5fbb8e87ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Fixed - Fix missing indentation for generated metadata.json [#600](https://github.com/plotly/dash/issues/600) - Fix missing component prop docstring error [#598](https://github.com/plotly/dash/issues/598) +- Moved `__repr__` to base component instead of being generated. [#492](https://github.com/plotly/dash/pull/492) ## [0.37.0] - 2019-02-11 ## Fixed diff --git a/dash/development/_py_components_generation.py b/dash/development/_py_components_generation.py index 98b6b7b509..74462ba96b 100644 --- a/dash/development/_py_components_generation.py +++ b/dash/development/_py_components_generation.py @@ -61,42 +61,16 @@ def __init__(self, {default_argtext}): _locals.update(kwargs) # For wildcard attrs args = {{k: _locals[k] for k in _explicit_args if k != 'children'}} - for k in {required_args}: + for k in {required_props}: if k not in args: raise TypeError( 'Required argument `' + k + '` was not specified.') super({typename}, self).__init__({argtext}) - - def __repr__(self): - if(any(getattr(self, c, None) is not None - for c in self._prop_names - if c is not self._prop_names[0]) - or any(getattr(self, c, None) is not None - for c in self.__dict__.keys() - if any(c.startswith(wc_attr) - for wc_attr in self._valid_wildcard_attributes))): - props_string = ', '.join([c+'='+repr(getattr(self, c, None)) - for c in self._prop_names - if getattr(self, c, None) is not None]) - wilds_string = ', '.join([c+'='+repr(getattr(self, c, None)) - for c in self.__dict__.keys() - if any([c.startswith(wc_attr) - for wc_attr in - self._valid_wildcard_attributes])]) - return ('{typename}(' + props_string + - (', ' + wilds_string if wilds_string != '' else '') + ')') - else: - return ( - '{typename}(' + - repr(getattr(self, self._prop_names[0], None)) + ')') ''' filtered_props = reorder_props(filter_props(props)) - # pylint: disable=unused-variable - list_of_valid_wildcard_attr_prefixes = repr(parse_wildcards(props)) - # pylint: disable=unused-variable + wildcard_prefixes = repr(parse_wildcards(props)) list_of_valid_keys = repr(list(map(str, filtered_props.keys()))) - # pylint: disable=unused-variable docstring = create_docstring( component_name=typename, props=filtered_props, @@ -109,7 +83,6 @@ def __repr__(self): if 'children' in props: prop_keys.remove('children') default_argtext = "children=None, " - # pylint: disable=unused-variable argtext = 'children=children, **args' else: default_argtext = "" @@ -121,11 +94,20 @@ def __repr__(self): for p in prop_keys if not p.endswith("-*") and p not in python_keywords and - p != 'setProps'] + ['**kwargs'] + p != 'setProps'] + ["**kwargs"] ) - required_args = required_props(props) - return c.format(**locals()) + return c.format( + typename=typename, + namespace=namespace, + filtered_props=filtered_props, + list_of_valid_wildcard_attr_prefixes=wildcard_prefixes, + list_of_valid_keys=list_of_valid_keys, + docstring=docstring, + default_argtext=default_argtext, + argtext=argtext, + required_props=required_args + ) def generate_class_file(typename, props, description, namespace): diff --git a/dash/development/base_component.py b/dash/development/base_component.py index 80b9734354..d4e30dea39 100644 --- a/dash/development/base_component.py +++ b/dash/development/base_component.py @@ -272,6 +272,35 @@ def __len__(self): length = 1 return length + def __repr__(self): + # pylint: disable=no-member + props_with_values = [ + c for c in self._prop_names + if getattr(self, c, None) is not None + ] + [ + c for c in self.__dict__ + if any( + c.startswith(wc_attr) + for wc_attr in self._valid_wildcard_attributes + ) + ] + if any( + p != 'children' + for p in props_with_values + ): + props_string = ", ".join( + '{prop}={value}'.format( + prop=p, + value=repr(getattr(self, p)) + ) for p in props_with_values + ) + else: + props_string = repr(getattr(self, 'children', None)) + return "{type}({props_string})".format( + type=self._type, + props_string=props_string + ) + def _explicitize_args(func): # Python 2 diff --git a/tests/development/metadata_test.py b/tests/development/metadata_test.py index 1deb97efe6..c1a580fa6b 100644 --- a/tests/development/metadata_test.py +++ b/tests/development/metadata_test.py @@ -55,26 +55,3 @@ def __init__(self, children=None, optionalArray=Component.UNDEFINED, optionalBoo raise TypeError( 'Required argument `' + k + '` was not specified.') super(Table, self).__init__(children=children, **args) - - def __repr__(self): - if(any(getattr(self, c, None) is not None - for c in self._prop_names - if c is not self._prop_names[0]) - or any(getattr(self, c, None) is not None - for c in self.__dict__.keys() - if any(c.startswith(wc_attr) - for wc_attr in self._valid_wildcard_attributes))): - props_string = ', '.join([c+'='+repr(getattr(self, c, None)) - for c in self._prop_names - if getattr(self, c, None) is not None]) - wilds_string = ', '.join([c+'='+repr(getattr(self, c, None)) - for c in self.__dict__.keys() - if any([c.startswith(wc_attr) - for wc_attr in - self._valid_wildcard_attributes])]) - return ('Table(' + props_string + - (', ' + wilds_string if wilds_string != '' else '') + ')') - else: - return ( - 'Table(' + - repr(getattr(self, self._prop_names[0], None)) + ')')