Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
64dc0c9
remove old misspelled supress->suppress fallback
alexcjohnson Jun 4, 2019
3be5dc6
remove Dash `**kwargs`, unused except to warn about csrf removal
alexcjohnson Jun 4, 2019
e48b12c
remove static_folder kwarg - assets_folder is better
alexcjohnson Jun 4, 2019
50527e1
remove components_cache_max_age kwarg - we have cache-busting urls
alexcjohnson Jun 4, 2019
f0282f8
remove unused resources.config.infer_from_layout
alexcjohnson Jun 4, 2019
ae685ee
new Dash kwarg serve_locally - sets Scripts and Css config
alexcjohnson Jun 4, 2019
7c76583
helpful errors if old kwargs are used in Dash constructor
alexcjohnson Jun 4, 2019
37cf546
remove leading '/' from default assets_url_path
alexcjohnson Jun 5, 2019
b4185e2
docstring for Dash class
alexcjohnson Jun 5, 2019
1ef7046
set default debug=True if enable_dev_tools is called directly
alexcjohnson Jun 5, 2019
2f737cd
change hot_reload_interval from msec to sec to match watch_interval
alexcjohnson Jun 5, 2019
e32914e
update docstrings for enable_dev_tools and run_server
alexcjohnson Jun 5, 2019
77d42a4
simplify and DRY dev_tools setup
alexcjohnson Jun 5, 2019
e579d34
simpler AttributeDict usage, and typo fix
alexcjohnson Jun 5, 2019
2eab141
include all constructor args in app.config
alexcjohnson Jun 6, 2019
3d749f1
fix some callback deps validation edge cases
alexcjohnson Jun 6, 2019
d4a09ba
linting / style improvements
alexcjohnson Jun 6, 2019
a4146d3
linting, encapsulate hot reload state & helpers in AttributeDict, and…
alexcjohnson Jun 6, 2019
e75de81
prevent changing some config keys or adding any new ones
alexcjohnson Jun 7, 2019
d898546
oops, who knew, reload is a builtin
alexcjohnson Jun 7, 2019
080ac2b
test_utils import order fix
alexcjohnson Jun 7, 2019
0056298
changelog for dash.Dash API changes PR
alexcjohnson Jun 7, 2019
cbd48b0
docstring updates as suggested by @byronz
alexcjohnson Jun 8, 2019
02b31cd
self-documenting **obsolete
alexcjohnson Jun 8, 2019
519fdc9
boom in changelog
alexcjohnson Jun 8, 2019
bc50899
Merge branch 'master' into config-cleanup
alexcjohnson Jun 10, 2019
9f20298
re-remove supress fallback after merging test refactor
alexcjohnson Jun 10, 2019
b7b71af
improve testing messages for default timeout
alexcjohnson Jun 10, 2019
dbc1981
re-convert hot_reload_interval to seconds in tests
alexcjohnson Jun 10, 2019
7fe4b52
try to robustify callbacks_generating_children
alexcjohnson Jun 10, 2019
55274be
collapse _time intermediate
alexcjohnson Jun 11, 2019
6c93e60
evaluate wait_cond before any wait in until(_not)
alexcjohnson Jun 11, 2019
4052507
convert test_integration.py to pytest
alexcjohnson Jun 11, 2019
571a710
Merge branch 'master' into config-cleanup
alexcjohnson Jun 11, 2019
62a18d3
add some tcids
alexcjohnson Jun 11, 2019
b389bfb
BZ-proof test_integration
alexcjohnson Jun 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions dash/CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
## Unreleased
### Changed
- 💥 [#761](https://github.com/plotly/dash/pull/761) Several breaking changes to the `dash.Dash` API:
- Removed two obsolete constructor kwargs: `static_folder` and `components_cache_max_age`
- Removed the misspelled `supress_callback_exceptions` fallback
- Removed the unused `resources.config.infer_from_layout`
- Revamped `app.config`: ALL constructor args are now stored in `config`, with three exceptions: `server`, `index_string`, and `plugins`. None of these are stored in any other instance attributes anymore.
- Changed `hot_reload_interval` from msec to seconds, for consistency with `hot_reload_watch_interval`
- When called from `enable_dev_tools`, `debug=True` by default. It's still `False` by default from `run_server`.

- [#753](https://github.com/plotly/dash/pull/753) `Component` no longer inherits `MutableMapping`, so `values`, `keys`, and more are no longer methods. This fixed an issue reported in [dcc](https://github.com/plotly/dash-core-components/issues/440) where components with certain prop names defined but not provided would cause a failure to render. During component generation we now disallow all props with leading underscores or matching a few remaining reserved words: `UNDEFINED`, `REQUIRED`, `to_plotly_json`, `available_properties`, and `available_wildcard_properties`.

- [#739](https://github.com/plotly/dash/pull/739) Allow the Flask app to be provided to Dash after object initialization. This allows users to define Dash layouts etc when using the app factory pattern, or any other pattern that inhibits access to the app object. This broadly complies with the flask extension API, allowing Dash to be considered as a Flask extension where it needs to be.
Expand Down
24 changes: 22 additions & 2 deletions dash/_utils.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,8 +75,28 @@ def __getattr__(self, key):
try:
return self[key]
except KeyError:
# to conform with __getattr__ spec
raise AttributeError(key)
pass
# to conform with __getattr__ spec
# but get out of the except block so it doesn't look like a nested err
raise AttributeError(key)

def set_read_only(self, names, msg='Attribute is read-only'):
object.__setattr__(self, '_read_only', names)
object.__setattr__(self, '_read_only_msg', msg)

def finalize(self, msg='Object is final: No new keys may be added.'):
"""Prevent any new keys being set"""
object.__setattr__(self, '_final', msg)

def __setitem__(self, key, val):
if key in self.__dict__.get('_read_only', []):
raise AttributeError(self._read_only_msg, key)

final_msg = self.__dict__.get('_final')
if final_msg and key not in self:
raise AttributeError(final_msg, key)

return super(AttributeDict, self).__setitem__(key, val)

# pylint: disable=inconsistent-return-statements
def first(self, *names):
Expand Down
Loading