update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson
, '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

update get_asset_url function - #1528

Merged
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev
Jan 17, 2021
Merged

update get_asset_url function#1528
alexcjohnson merged 6 commits into
plotly:devfrom
karosc:dev

Conversation

@karosc

Copy link
Copy Markdown
Contributor

This pull request addresses #1527 by adding and if statement to the get_asset_url function in dash.py instructing the app to use the external asset path if it is defined.

I have tested this with an short I wrote and published. If you run the app and examine the src attribute of the image, it references and image on my own site karosc.github.io.

- use external asset path if defined
@alexcjohnson

Copy link
Copy Markdown
Collaborator

Very nice! Could be a little DRYer, as it's only the first arg to get_asset_path that needs to change, but that's not a big deal.

Can you add a couple of unit tests of app.get_asset_url? Should cover both the local and external cases, make an app and test a couple of asset urls for that app, but we don't need to run the app (so the external url need not be valid). test_configs.py looks like a good place to put it, and it would look something like these two:

@pytest.mark.parametrize(
"name, server, expected",
[
(None, True, "__main__"),
("test", True, "test"),
("test", False, "test"),
(None, Flask("test"), "test"),
("test", Flask("other"), "test"),
],
)
deftest_app_name_server(empty_environ, name, server, expected):
app=Dash(name=name, server=server)
assertapp.config.name==expected
@pytest.mark.parametrize(
"prefix, partial_path, expected",
[
("/", "", "/"),
("/my-dash-app/", "", "/my-dash-app/"),
("/", "/", "/"),
("/my-dash-app/", "/", "/my-dash-app/"),
("/", "/page-1", "/page-1"),
("/my-dash-app/", "/page-1", "/my-dash-app/page-1"),
("/", "/page-1/", "/page-1/"),
("/my-dash-app/", "/page-1/", "/my-dash-app/page-1/"),
("/", "/page-1/sub-page-1", "/page-1/sub-page-1"),
("/my-dash-app/", "/page-1/sub-page-1", "/my-dash-app/page-1/sub-page-1"),
],
)
deftest_pathname_prefix_relative_url(prefix, partial_path, expected):
path=get_relative_path(prefix, partial_path)
assertpath==expected

After that, we'll just need a changelog entry and it'll be ready to go!

@karosc

Copy link
Copy Markdown
ContributorAuthor

does this seem more DRY? Not sure exactly what you were referring to.

defget_asset_url(self, path):
ifself.config.assets_external_path:
prefix=self.config.assets_external_pathelse:
prefix=self.config.requests_pathname_prefixasset=get_asset_path(
prefix,
path,
self.config.assets_url_path.lstrip("/"),
)
returnasset

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Yep, that's about what I had in mind. But again, not a big deal.

 - changed assets_external_path doc string to be more descriptive
- revised _add_assets_resource to join assets_external_path with
assets_url_path so that it is cogruent with how get_asset_path works
- added unit test `test_asset_url`
- updated changelog
Comment threadtests/unit/test_configs.py Outdated
Comment threaddash/dash.py Outdated
self.config.assets_external_path, url_path
res["external_url"] = "/".join([
self.config.assets_external_path.rstrip('/'), self.config.assets_url_path.strip('/'), url_path.lstrip('/')
]

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.

Hmm, maybe we could just call get_asset_url here?

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.

That works! Passing all tests.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Looking good, just a couple of minor comments above, but also I think it needs linting (I sympathize with wanting aligned values in the test matrix but I don't think black will go for it 😅 ) - Probably just needs npm run format.

Co-authored-by: Alex Johnson <johnson.alex.c@gmail.com>
@karosc

Copy link
Copy Markdown
ContributorAuthor

running npm format changed a bunch of other files, sorry for creating more review work...🤷‍♂️

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Ah, I'm guessing you're on a newer version of black. What version do you have installed? We've talked about the need to update to 20.8b1 (and maybe now is the right time to do that across Dash, cc @Marc-Andre-Rivet?) but currently we have 19.10b0

black==19.10b0;python_version>="3.0"

@karosc

Copy link
Copy Markdown
ContributorAuthor

oh shoot, you're right I am running 20.8b1. I can downgrade and reformat then if that's when you want to do.

@alexcjohnson

Copy link
Copy Markdown
Collaborator

Downgrading and reformatting would be the easiest way to get this merged quickly 😄 We may upgrade but that's going to take a little work because we'll want to do it evenly across all the dash repos.

@karosc

Copy link
Copy Markdown
ContributorAuthor

Alright, I reset to before I ran the format routine, downgraded black to 19.10b0 and then redid the format. Things came out to be more expected since only my changes were reformatted by black.

@alexcjohnsonalexcjohnson left a comment

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.

Very nice - thank you! 💃

@alexcjohnson
alexcjohnson merged commit 4ce87ee into plotly:devJan 17, 2021
alexcjohnson added a commit that referenced this pull request Jan 17, 2021
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.

2 participants

@karosc@alexcjohnson