Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Fixes to address unintended props reshuffling behaviour by rpkyle · Pull Request #545 · plotly/dash · GitHub
Skip to content

Fixes to address unintended props reshuffling behaviour - #545

Merged
rpkyle merged 38 commits into
masterfrom
RPK2
Jan 29, 2019
Merged

Fixes to address unintended props reshuffling behaviour#545
rpkyle merged 38 commits into
masterfrom
RPK2

Conversation

@rpkyle

@rpkylerpkyle commented Jan 18, 2019

Copy link
Copy Markdown
Contributor

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.

Comment thread.gitignore Outdated
npm-debug*
/.tox
.idea
package-lock.json

Copy link
Copy Markdown
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.

@rpkylerpkyleJan 21, 2019

Copy link
Copy Markdown
ContributorAuthor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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. 🔪

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

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

Comment threaddash/development/_r_components_generation.py
for p in prop_keys
if '*' not in p and
p not in ['setProps', 'dashEvents', 'fireEvent']
p != 'setProps' + ['**kwargs']

Copy link
Copy Markdown
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 (mostrecentcalllast):
File"<input>", line1, in<module>TypeError: mustbestr, notlist
Suggested change
p!='setProps'+ ['**kwargs']
pnotin ['setProps', '**kwargs']

Copy link
Copy Markdown
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)
ifprops[p]['required'] else
'{:s}=Component.UNDEFINED'.format(p))
forpinprop_keys
ifnotp.endswith("-*") and
pnotinpython_keywordsand
pnotin ['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
Copy Markdown
ContributorAuthor

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
Copy Markdown
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
Copy Markdown
ContributorAuthor

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
Copy Markdown
ContributorAuthor
  • 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
Copy Markdown
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
Copy Markdown
Contributor

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.

@T4rk1nT4rk1n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💃


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
Copy Markdown
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

rpkyle commented Jan 29, 2019

Copy link
Copy Markdown
ContributorAuthor

@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 masterJan 29, 2019
@alexcjohnson
alexcjohnson deleted the RPK2 branch January 31, 2019 23:29
@alexcjohnsonalexcjohnson mentioned this pull request Feb 1, 2019
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 freeto 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

@rpkyle@alexcjohnson@T4rk1n