Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes to address unintended props reshuffling behaviour #545

Merged
merged 38 commits into from
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour #545

merged 38 commits into from
Jan 29, 2019

Conversation

rpkyle
Copy link
Contributor

@rpkyle rpkyle commented Jan 18, 2019

Proposed changes introduced by this PR:

  • The ordering of props in Dash components is maintained by providing object_pairs_hook=OrderedDict to json.loads .
  • Handling of prop_keys exclusions has been refactored to account for removal of events, and to properly omit wildcards.
  • R components now require children to be passed as a list or function, as in Dash for Python, and ellipsis is used for wildcards only, as the final formal argument for component functions.
  • Component library dependencies are now copied to inst/deps rather than inst/lib to address an issue with install_github.
  • R documentation now has additional whitespace to improve readability.
  • R (overall) package help files are now available.
  • R component handling of defaultValue fields is now similar to Dash for Python, fixing issues with rendering of components due to passing incorrect defaults.
  • Removed dependency of JavaScript metadata generation for DashR on version.py.
  • Use modified version of Mark Amery's byteify function to avoid storing strings from JSON as Unicode in Python 2.x, so that lists of strings in components should be identical in appearance across versions.
  • A new function assert_valid_wildcards is called when wildcards are available for a given component, to validate any wildcard input passed in via ... in the corresponding function formals in R.

@rpkyle rpkyle self-assigned this Jan 18, 2019
.gitignore Outdated
@@ -20,3 +20,4 @@ dist
npm-debug*
/.tox
.idea
package-lock.json
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It shouldn't be necessary to ignore this, though there are occasional issues.

Copy link
Contributor Author

@rpkyle rpkyle Jan 21, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

K, this has been 🔪 ... as has the package-lock.json.

Copy link
Contributor

@T4rk1n T4rk1n left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the package-lock.json, there's no package.json in dash. 🔪

Copy link
Contributor

@T4rk1n T4rk1n left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to fix the error in generate_class_string

dash/development/_r_components_generation.py Show resolved Hide resolved
@@ -163,7 +142,7 @@ def generate_class_string(name, props, project_shortname, prefix):
'\'{}\''.format(p)
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That doesn't work.

>>> 'setProps' + ['**kwargs']
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: must be str, not list
Suggested change
p != 'setProps' + ['**kwargs']
p not in ['setProps', '**kwargs']

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh that's not quite it either... the p not in [...] or p != ... clause is a filter in an iterator - in the python generator code:

default_argtext += ", ".join(
[('{:s}=Component.REQUIRED'.format(p)
if props[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
for p in prop_keys
if not p.endswith("-*") and
p not in python_keywords and
p not in ['dashEvents', 'fireEvent', 'setProps']] + ['**kwargs']
)

note the extra [...] from immediately after .join( to right before + ['**kwargs'] that turns this into a list that we can then append '**kwargs' to by adding a second list. I'm assuming in R **kwargs doesn't mean anything, but there's some other feature to play the role of allowing arbitrary extra named arguments?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm assuming in R **kwargs doesn't mean anything, but there's some other feature to play the role of allowing arbitrary extra named arguments?

@alexcjohnson Correct. For the wildcards, I've used ellipsis (aka \dots, ...) for this purpose. It seems to be working to pass in an arbitrary number (including zero) of wildcard arguments.

@alexcjohnson
Copy link
Collaborator

I don't understand the package-lock.json, there's no package.json in dash. 🔪

Hah too funny! Right, dash is the one repo that doesn't use npm at all. Oh well, sounds like @rpkyle sorted this out :)

@rpkyle
Copy link
Contributor Author

rpkyle commented Jan 22, 2019

I don't understand the package-lock.json, there's no package.json in dash. hocho

Hah too funny! Right, dash is the one repo that doesn't use npm at all. Oh well, sounds like @rpkyle sorted this out :)

I'm glad I've somehow fallen into the component management pipeline on the Python side as well, because for all the bumps and bruises, I'm certainly learning a few things.

Ryan Patrick Kyle added 2 commits January 22, 2019 15:03
🐛 modified prop_names

address trailing whitespace

🔧 flake8 and pylint edits

🚿 pylint edits
🚿 pylint edit

🚿 flake8 edit

🚿 flake8 edit

🐛 fixed TypeError
@rpkyle
Copy link
Contributor Author

rpkyle commented Jan 22, 2019

  • Use modified version of Mark Amery's byteify function to avoid storing strings from JSON as Unicode in Python 2.x, so that lists of strings in components should be identical in appearance across versions.

If it's possible to have a look at my recent changes and let me know if they are acceptable, and what further refinements are needed, that'd be great.

N.B. I ran into an error while testing the R component generation in Python 3 I hadn't seen previously:

File "dash/dash/development/_r_components_generation.py", line 282, in write_help_file for item in prop_keys[:]: TypeError: 'odict_keys' object is not subscriptable

I attempted to address this by wrapping props.keys() with list;

prop_keys = list(props.keys())

prop_keys = list(props.keys())

Component generation appears to be successful for both languages, and using Python 2 and 3; will look a bit more tonight to confirm.

@alexcjohnson @T4rk1n @rmarren1

@alexcjohnson
Copy link
Collaborator

I attempted to address this by wrapping props.keys() with list;

Yeah, .keys() and various other things return iterators instead of lists in py3, that one continually trips me up / annoys me... you've got the correct solution.

@T4rk1n
Copy link
Contributor

T4rk1n commented Jan 23, 2019

File "dash/dash/development/_r_components_generation.py", line 282, in write_help_file for item in prop_keys[:]: TypeError: 'odict_keys' object is not subscriptable

Yes, dict.keys() returns a list in python 2 and a generator in python 3 so you need to cast to list.

Copy link
Contributor

@T4rk1n T4rk1n left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💃

@@ -82,13 +89,17 @@ def generate_components(components_source, project_shortname,
)

with open(os.path.join(project_shortname, 'metadata.json'), 'w') as f:
json.dump(metadata, f)
json.dump(metadata, f, sort_keys=True)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⏪ Sorting the key reorder the keys, the ordered dict will keep the right order alone.

@rpkyle
Copy link
Contributor Author

rpkyle commented Jan 29, 2019

@T4rk1n If PRs #439 and #91 look ready to go, mind quickly checking this one also? It should be somewhat straightforward.

@rpkyle rpkyle merged commit ab4f708 into master Jan 29, 2019
@alexcjohnson alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
AnnMarieW pushed a commit to AnnMarieW/dash that referenced this pull request Jan 6, 2022
set default type of Input components to 'text'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants