aboutsummaryrefslogtreecommitdiff
path: root/venv/lib/python3.8/site-packages/werkzeug/debug/shared
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
committersotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
commit5bf22fc7e3c392c8bd44315ca2d06d7dca7d084e (patch)
tree8dacb0f195df1c0788d36dd0064f6bbaa3143ede /venv/lib/python3.8/site-packages/werkzeug/debug/shared
parentb832d364da8c2efe09e3f75828caf73c50d01ce3 (diff)
add code for analysis of data
Diffstat (limited to 'venv/lib/python3.8/site-packages/werkzeug/debug/shared')
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/ICON_LICENSE.md6
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/console.pngbin0 -> 507 bytes
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/debugger.js344
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/less.pngbin0 -> 191 bytes
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/more.pngbin0 -> 200 bytes
-rw-r--r--venv/lib/python3.8/site-packages/werkzeug/debug/shared/style.css150
6 files changed, 500 insertions, 0 deletions
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/ICON_LICENSE.md b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/ICON_LICENSE.md
new file mode 100644
index 0000000..3bdbfc7
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/ICON_LICENSE.md
@@ -0,0 +1,6 @@
+Silk icon set 1.3 by Mark James <mjames@gmail.com>
+
+http://www.famfamfam.com/lab/icons/silk/
+
+License: [CC-BY-2.5](https://creativecommons.org/licenses/by/2.5/)
+or [CC-BY-3.0](https://creativecommons.org/licenses/by/3.0/)
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/console.png b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/console.png
new file mode 100644
index 0000000..c28dd63
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/console.png
Binary files differ
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/debugger.js b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/debugger.js
new file mode 100644
index 0000000..809b14a
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/debugger.js
@@ -0,0 +1,344 @@
+docReady(() => {
+ if (!EVALEX_TRUSTED) {
+ initPinBox();
+ }
+ // if we are in console mode, show the console.
+ if (CONSOLE_MODE && EVALEX) {
+ createInteractiveConsole();
+ }
+
+ const frames = document.querySelectorAll("div.traceback div.frame");
+ if (EVALEX) {
+ addConsoleIconToFrames(frames);
+ }
+ addEventListenersToElements(document.querySelectorAll("div.detail"), "click", () =>
+ document.querySelector("div.traceback").scrollIntoView(false)
+ );
+ addToggleFrameTraceback(frames);
+ addToggleTraceTypesOnClick(document.querySelectorAll("h2.traceback"));
+ addInfoPrompt(document.querySelectorAll("span.nojavascript"));
+ wrapPlainTraceback();
+});
+
+function addToggleFrameTraceback(frames) {
+ frames.forEach((frame) => {
+ frame.addEventListener("click", () => {
+ frame.getElementsByTagName("pre")[0].parentElement.classList.toggle("expanded");
+ });
+ })
+}
+
+
+function wrapPlainTraceback() {
+ const plainTraceback = document.querySelector("div.plain textarea");
+ const wrapper = document.createElement("pre");
+ const textNode = document.createTextNode(plainTraceback.textContent);
+ wrapper.appendChild(textNode);
+ plainTraceback.replaceWith(wrapper);
+}
+
+function makeDebugURL(args) {
+ const params = new URLSearchParams(args)
+ params.set("s", SECRET)
+ return `?__debugger__=yes&${params}`
+}
+
+function initPinBox() {
+ document.querySelector(".pin-prompt form").addEventListener(
+ "submit",
+ function (event) {
+ event.preventDefault();
+ const btn = this.btn;
+ btn.disabled = true;
+
+ fetch(
+ makeDebugURL({cmd: "pinauth", pin: this.pin.value})
+ )
+ .then((res) => res.json())
+ .then(({auth, exhausted}) => {
+ if (auth) {
+ EVALEX_TRUSTED = true;
+ fadeOut(document.getElementsByClassName("pin-prompt")[0]);
+ } else {
+ alert(
+ `Error: ${
+ exhausted
+ ? "too many attempts. Restart server to retry."
+ : "incorrect pin"
+ }`
+ );
+ }
+ })
+ .catch((err) => {
+ alert("Error: Could not verify PIN. Network error?");
+ console.error(err);
+ })
+ .finally(() => (btn.disabled = false));
+ },
+ false
+ );
+}
+
+function promptForPin() {
+ if (!EVALEX_TRUSTED) {
+ fetch(makeDebugURL({cmd: "printpin"}));
+ const pinPrompt = document.getElementsByClassName("pin-prompt")[0];
+ fadeIn(pinPrompt);
+ document.querySelector('.pin-prompt input[name="pin"]').focus();
+ }
+}
+
+/**
+ * Helper function for shell initialization
+ */
+function openShell(consoleNode, target, frameID) {
+ promptForPin();
+ if (consoleNode) {
+ slideToggle(consoleNode);
+ return consoleNode;
+ }
+ let historyPos = 0;
+ const history = [""];
+ const consoleElement = createConsole();
+ const output = createConsoleOutput();
+ const form = createConsoleInputForm();
+ const command = createConsoleInput();
+
+ target.parentNode.appendChild(consoleElement);
+ consoleElement.append(output);
+ consoleElement.append(form);
+ form.append(command);
+ command.focus();
+ slideToggle(consoleElement);
+
+ form.addEventListener("submit", (e) => {
+ handleConsoleSubmit(e, command, frameID).then((consoleOutput) => {
+ output.append(consoleOutput);
+ command.focus();
+ consoleElement.scrollTo(0, consoleElement.scrollHeight);
+ const old = history.pop();
+ history.push(command.value);
+ if (typeof old !== "undefined") {
+ history.push(old);
+ }
+ historyPos = history.length - 1;
+ command.value = "";
+ });
+ });
+
+ command.addEventListener("keydown", (e) => {
+ if (e.key === "l" && e.ctrlKey) {
+ output.innerText = "--- screen cleared ---";
+ } else if (e.key === "ArrowUp" || e.key === "ArrowDown") {
+ // Handle up arrow and down arrow.
+ if (e.key === "ArrowUp" && historyPos > 0) {
+ e.preventDefault();
+ historyPos--;
+ } else if (e.key === "ArrowDown" && historyPos < history.length - 1) {
+ historyPos++;
+ }
+ command.value = history[historyPos];
+ }
+ return false;
+ });
+
+ return consoleElement;
+}
+
+function addEventListenersToElements(elements, event, listener) {
+ elements.forEach((el) => el.addEventListener(event, listener));
+}
+
+/**
+ * Add extra info
+ */
+function addInfoPrompt(elements) {
+ for (let i = 0; i < elements.length; i++) {
+ elements[i].innerHTML =
+ "<p>To switch between the interactive traceback and the plaintext " +
+ 'one, you can click on the "Traceback" headline. From the text ' +
+ "traceback you can also create a paste of it. " +
+ (!EVALEX
+ ? ""
+ : "For code execution mouse-over the frame you want to debug and " +
+ "click on the console icon on the right side." +
+ "<p>You can execute arbitrary Python code in the stack frames and " +
+ "there are some extra helpers available for introspection:" +
+ "<ul><li><code>dump()</code> shows all variables in the frame" +
+ "<li><code>dump(obj)</code> dumps all that's known about the object</ul>");
+ elements[i].classList.remove("nojavascript");
+ }
+}
+
+function addConsoleIconToFrames(frames) {
+ for (let i = 0; i < frames.length; i++) {
+ let consoleNode = null;
+ const target = frames[i];
+ const frameID = frames[i].id.substring(6);
+
+ for (let j = 0; j < target.getElementsByTagName("pre").length; j++) {
+ const img = createIconForConsole();
+ img.addEventListener("click", (e) => {
+ e.stopPropagation();
+ consoleNode = openShell(consoleNode, target, frameID);
+ return false;
+ });
+ target.getElementsByTagName("pre")[j].append(img);
+ }
+ }
+}
+
+function slideToggle(target) {
+ target.classList.toggle("active");
+}
+
+/**
+ * toggle traceback types on click.
+ */
+function addToggleTraceTypesOnClick(elements) {
+ for (let i = 0; i < elements.length; i++) {
+ elements[i].addEventListener("click", () => {
+ document.querySelector("div.traceback").classList.toggle("hidden");
+ document.querySelector("div.plain").classList.toggle("hidden");
+ });
+ elements[i].style.cursor = "pointer";
+ document.querySelector("div.plain").classList.toggle("hidden");
+ }
+}
+
+function createConsole() {
+ const consoleNode = document.createElement("pre");
+ consoleNode.classList.add("console");
+ consoleNode.classList.add("active");
+ return consoleNode;
+}
+
+function createConsoleOutput() {
+ const output = document.createElement("div");
+ output.classList.add("output");
+ output.innerHTML = "[console ready]";
+ return output;
+}
+
+function createConsoleInputForm() {
+ const form = document.createElement("form");
+ form.innerHTML = "&gt;&gt;&gt; ";
+ return form;
+}
+
+function createConsoleInput() {
+ const command = document.createElement("input");
+ command.type = "text";
+ command.setAttribute("autocomplete", "off");
+ command.setAttribute("spellcheck", false);
+ command.setAttribute("autocapitalize", "off");
+ command.setAttribute("autocorrect", "off");
+ return command;
+}
+
+function createIconForConsole() {
+ const img = document.createElement("img");
+ img.setAttribute("src", makeDebugURL({cmd: "resource", f: "console.png"}));
+ img.setAttribute("title", "Open an interactive python shell in this frame");
+ return img;
+}
+
+function createExpansionButtonForConsole() {
+ const expansionButton = document.createElement("a");
+ expansionButton.setAttribute("href", "#");
+ expansionButton.setAttribute("class", "toggle");
+ expansionButton.innerHTML = "&nbsp;&nbsp;";
+ return expansionButton;
+}
+
+function createInteractiveConsole() {
+ const target = document.querySelector("div.console div.inner");
+ while (target.firstChild) {
+ target.removeChild(target.firstChild);
+ }
+ openShell(null, target, 0);
+}
+
+function handleConsoleSubmit(e, command, frameID) {
+ // Prevent page from refreshing.
+ e.preventDefault();
+
+ return new Promise((resolve) => {
+ fetch(makeDebugURL({cmd: command.value, frm: frameID}))
+ .then((res) => {
+ return res.text();
+ })
+ .then((data) => {
+ const tmp = document.createElement("div");
+ tmp.innerHTML = data;
+ resolve(tmp);
+
+ // Handle expandable span for long list outputs.
+ // Example to test: list(range(13))
+ let wrapperAdded = false;
+ const wrapperSpan = document.createElement("span");
+ const expansionButton = createExpansionButtonForConsole();
+
+ tmp.querySelectorAll("span.extended").forEach((spanToWrap) => {
+ const parentDiv = spanToWrap.parentNode;
+ if (!wrapperAdded) {
+ parentDiv.insertBefore(wrapperSpan, spanToWrap);
+ wrapperAdded = true;
+ }
+ parentDiv.removeChild(spanToWrap);
+ wrapperSpan.append(spanToWrap);
+ spanToWrap.hidden = true;
+
+ expansionButton.addEventListener("click", (event) => {
+ event.preventDefault();
+ spanToWrap.hidden = !spanToWrap.hidden;
+ expansionButton.classList.toggle("open");
+ return false;
+ });
+ });
+
+ // Add expansion button at end of wrapper.
+ if (wrapperAdded) {
+ wrapperSpan.append(expansionButton);
+ }
+ })
+ .catch((err) => {
+ console.error(err);
+ });
+ return false;
+ });
+}
+
+function fadeOut(element) {
+ element.style.opacity = 1;
+
+ (function fade() {
+ element.style.opacity -= 0.1;
+ if (element.style.opacity < 0) {
+ element.style.display = "none";
+ } else {
+ requestAnimationFrame(fade);
+ }
+ })();
+}
+
+function fadeIn(element, display) {
+ element.style.opacity = 0;
+ element.style.display = display || "block";
+
+ (function fade() {
+ let val = parseFloat(element.style.opacity) + 0.1;
+ if (val <= 1) {
+ element.style.opacity = val;
+ requestAnimationFrame(fade);
+ }
+ })();
+}
+
+function docReady(fn) {
+ if (document.readyState === "complete" || document.readyState === "interactive") {
+ setTimeout(fn, 1);
+ } else {
+ document.addEventListener("DOMContentLoaded", fn);
+ }
+}
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/less.png b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/less.png
new file mode 100644
index 0000000..5efefd6
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/less.png
Binary files differ
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/more.png b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/more.png
new file mode 100644
index 0000000..804fa22
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/more.png
Binary files differ
diff --git a/venv/lib/python3.8/site-packages/werkzeug/debug/shared/style.css b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/style.css
new file mode 100644
index 0000000..e9397ca
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/werkzeug/debug/shared/style.css
@@ -0,0 +1,150 @@
+body, input { font-family: sans-serif; color: #000; text-align: center;
+ margin: 1em; padding: 0; font-size: 15px; }
+h1, h2, h3 { font-weight: normal; }
+
+input { background-color: #fff; margin: 0; text-align: left;
+ outline: none !important; }
+input[type="submit"] { padding: 3px 6px; }
+a { color: #11557C; }
+a:hover { color: #177199; }
+pre, code,
+textarea { font-family: monospace; font-size: 14px; }
+
+div.debugger { text-align: left; padding: 12px; margin: auto;
+ background-color: white; }
+h1 { font-size: 36px; margin: 0 0 0.3em 0; }
+div.detail { cursor: pointer; }
+div.detail p { margin: 0 0 8px 13px; font-size: 14px; white-space: pre-wrap;
+ font-family: monospace; }
+div.explanation { margin: 20px 13px; font-size: 15px; color: #555; }
+div.footer { font-size: 13px; text-align: right; margin: 30px 0;
+ color: #86989B; }
+
+h2 { font-size: 16px; margin: 1.3em 0 0.0 0; padding: 9px;
+ background-color: #11557C; color: white; }
+h2 em, h3 em { font-style: normal; color: #A5D6D9; font-weight: normal; }
+
+div.traceback, div.plain { border: 1px solid #ddd; margin: 0 0 1em 0; padding: 10px; }
+div.plain p { margin: 0; }
+div.plain textarea,
+div.plain pre { margin: 10px 0 0 0; padding: 4px;
+ background-color: #E8EFF0; border: 1px solid #D3E7E9; }
+div.plain textarea { width: 99%; height: 300px; }
+div.traceback h3 { font-size: 1em; margin: 0 0 0.8em 0; }
+div.traceback ul { list-style: none; margin: 0; padding: 0 0 0 1em; }
+div.traceback h4 { font-size: 13px; font-weight: normal; margin: 0.7em 0 0.1em 0; }
+div.traceback pre { margin: 0; padding: 5px 0 3px 15px;
+ background-color: #E8EFF0; border: 1px solid #D3E7E9; }
+div.traceback .library .current { background: white; color: #555; }
+div.traceback .expanded .current { background: #E8EFF0; color: black; }
+div.traceback pre:hover { background-color: #DDECEE; color: black; cursor: pointer; }
+div.traceback div.source.expanded pre + pre { border-top: none; }
+
+div.traceback span.ws { display: none; }
+div.traceback pre.before, div.traceback pre.after { display: none; background: white; }
+div.traceback div.source.expanded pre.before,
+div.traceback div.source.expanded pre.after {
+ display: block;
+}
+
+div.traceback div.source.expanded span.ws {
+ display: inline;
+}
+
+div.traceback blockquote { margin: 1em 0 0 0; padding: 0; white-space: pre-line; }
+div.traceback img { float: right; padding: 2px; margin: -3px 2px 0 0; display: none; }
+div.traceback img:hover { background-color: #ddd; cursor: pointer;
+ border-color: #BFDDE0; }
+div.traceback pre:hover img { display: block; }
+div.traceback cite.filename { font-style: normal; color: #3B666B; }
+
+pre.console { border: 1px solid #ccc; background: white!important;
+ color: black; padding: 5px!important;
+ margin: 3px 0 0 0!important; cursor: default!important;
+ max-height: 400px; overflow: auto; }
+pre.console form { color: #555; }
+pre.console input { background-color: transparent; color: #555;
+ width: 90%; font-family: monospace; font-size: 14px;
+ border: none!important; }
+
+span.string { color: #30799B; }
+span.number { color: #9C1A1C; }
+span.help { color: #3A7734; }
+span.object { color: #485F6E; }
+span.extended { opacity: 0.5; }
+span.extended:hover { opacity: 1; }
+a.toggle { text-decoration: none; background-repeat: no-repeat;
+ background-position: center center;
+ background-image: url(?__debugger__=yes&cmd=resource&f=more.png); }
+a.toggle:hover { background-color: #444; }
+a.open { background-image: url(?__debugger__=yes&cmd=resource&f=less.png); }
+
+pre.console div.traceback,
+pre.console div.box { margin: 5px 10px; white-space: normal;
+ border: 1px solid #11557C; padding: 10px;
+ font-family: sans-serif; }
+pre.console div.box h3,
+pre.console div.traceback h3 { margin: -10px -10px 10px -10px; padding: 5px;
+ background: #11557C; color: white; }
+
+pre.console div.traceback pre:hover { cursor: default; background: #E8EFF0; }
+pre.console div.traceback pre.syntaxerror { background: inherit; border: none;
+ margin: 20px -10px -10px -10px;
+ padding: 10px; border-top: 1px solid #BFDDE0;
+ background: #E8EFF0; }
+pre.console div.noframe-traceback pre.syntaxerror { margin-top: -10px; border: none; }
+
+pre.console div.box pre.repr { padding: 0; margin: 0; background-color: white; border: none; }
+pre.console div.box table { margin-top: 6px; }
+pre.console div.box pre { border: none; }
+pre.console div.box pre.help { background-color: white; }
+pre.console div.box pre.help:hover { cursor: default; }
+pre.console table tr { vertical-align: top; }
+div.console { border: 1px solid #ccc; padding: 4px; background-color: #fafafa; }
+
+div.traceback pre, div.console pre {
+ white-space: pre-wrap; /* css-3 should we be so lucky... */
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 ?? */
+ white-space: -o-pre-wrap; /* Opera 7 ?? */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+ _white-space: pre; /* IE only hack to re-specify in
+ addition to word-wrap */
+}
+
+
+div.pin-prompt {
+ position: absolute;
+ display: none;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: rgba(255, 255, 255, 0.8);
+}
+
+div.pin-prompt .inner {
+ background: #eee;
+ padding: 10px 50px;
+ width: 350px;
+ margin: 10% auto 0 auto;
+ border: 1px solid #ccc;
+ border-radius: 2px;
+}
+
+div.exc-divider {
+ margin: 0.7em 0 0 -1em;
+ padding: 0.5em;
+ background: #11557C;
+ color: #ddd;
+ border: 1px solid #ddd;
+}
+
+.console.active {
+ max-height: 0!important;
+ display: none;
+}
+
+.hidden {
+ display: none;
+}