1
0
mirror of https://github.com/pyscript/pyscript.git synced 2022-05-01 19:47:48 +03:00

allow pyscript to specify source and try loading pyscript python injections from file

This commit is contained in:
Fabio Pliger
2022-04-11 23:13:06 -05:00
parent 8dc1ade1e2
commit 973a14baea
3 changed files with 56 additions and 45 deletions

View File

@@ -7,50 +7,14 @@
<title>Todo App</title> <title>Todo App</title>
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="favicon.png" />
<link rel="stylesheet" href="../build/bundle.css" /> <link rel="stylesheet" href="/build/pyscript.css" />
<script defer src="../build/pyscript.js"></script> <script defer src="/build/pyscript.js"></script>
</head> </head>
<py-script> <body class="container">
from datetime import datetime as dt <!-- <py-repl id="my-repl" auto-generate="true"> </py-repl> -->
<py-script src="/todo.py"> </py-script>
tasks = []
# define the task template that will be use to render new templates to the page
task_template = Element("task-template").select('.task', from_content=True)
task_list = Element("list-tasks-container")
new_task_content = Element("new-task-content")
def add_task(*ags, **kws):
# create task
task_id = f"task-{len(tasks)}"
task = {"id": task_id, "content": new_task_content.element.value, "done": False, "created_at": dt.now()}
tasks.append(task)
# add the task element to the page as new node in the list by cloning from a template
taskHtml = task_template.clone(task_id, to=task_list)
taskHtmlContent = taskHtml.select('p')
taskHtmlContent.element.innerText = task['content']
taskHtmlCheck = taskHtml.select('input')
task_list.element.appendChild(taskHtml.element)
def check_task(evt=None):
task['done'] = not task['done']
if task['done']:
taskHtmlContent.element.classList.add("line-through")
else:
taskHtmlContent.element.classList.remove("line-through")
new_task_content.clear()
taskHtmlCheck.element.onclick = check_task
def add_task_event(e):
console.log("im in")
if (e.key == "Enter"):
add_task()
</py-script>
<main class="max-w-xs mx-auto mt-4"> <main class="max-w-xs mx-auto mt-4">
<section> <section>
@@ -80,4 +44,5 @@ def add_task_event(e):
</section> </section>
</main> </main>
</body>
</html> </html>

View File

@@ -95,6 +95,7 @@ export class PyScript extends HTMLElement {
btnConfig: HTMLElement; btnConfig: HTMLElement;
btnRun: HTMLElement; btnRun: HTMLElement;
editorOut: HTMLElement; //HTMLTextAreaElement; editorOut: HTMLElement; //HTMLTextAreaElement;
source: string;
// editorState: EditorState; // editorState: EditorState;
constructor() { constructor() {
@@ -205,6 +206,10 @@ export class PyScript extends HTMLElement {
} }
console.log('connected'); console.log('connected');
if (this.hasAttribute('src')) {
this.source = this.getAttribute('src');
}
} }
addToOutput(s: string) { addToOutput(s: string) {
@@ -212,8 +217,36 @@ export class PyScript extends HTMLElement {
this.editorOut.hidden = false; this.editorOut.hidden = false;
} }
async loadFromFile(s: string){
let pyodide = await pyodideReadyPromise;
let response = await fetch(s);
this.code = await response.text();
await pyodide.runPythonAsync(this.code);
await pyodide.runPythonAsync(`
from pyodide.http import pyfetch
from pyodide import eval_code
response = await pyfetch("`+s+`")
content = await response.bytes()
with open("todo.py", "wb") as f:
print(content)
f.write(content)
print("done writing")
`)
// let pkg = pyodide.pyimport("todo");
// pyodide.runPython(`
// import todo
// `)
// pkg.do_something();
}
async evaluate() { async evaluate() {
console.log('evaluate'); console.log('evaluate');
if (this.source){
this.loadFromFile(this.source)
}else{
let pyodide = await pyodideReadyPromise; let pyodide = await pyodideReadyPromise;
// debugger // debugger
try { try {
@@ -238,8 +271,9 @@ export class PyScript extends HTMLElement {
this.addToOutput(err); this.addToOutput(err);
console.log(err); console.log(err);
} }
}
} }
render(){ render(){
console.log('rendered'); console.log('rendered');
@@ -298,5 +332,5 @@ async function mountElements() {
} }
await pyodide.runPythonAsync(source); await pyodide.runPythonAsync(source);
} }
addPostInitializer(initHandlers);
addInitializer(mountElements); addInitializer(mountElements);
addPostInitializer(initHandlers);

View File

@@ -98,17 +98,29 @@ pyscript = PyScript()
let loadInterpreter = async function(): any { let loadInterpreter = async function(): any {
/* @ts-ignore */ /* @ts-ignore */
console.log("creating pyodide runtime");
pyodide = await loadPyodide({ pyodide = await loadPyodide({
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.19.0/full/",
stdout: console.log, stdout: console.log,
stderr: console.log stderr: console.log
}); });
// now that we loaded, add additional convenience fuctions // now that we loaded, add additional convenience fuctions
console.log("loading micropip");
await pyodide.loadPackage("micropip"); await pyodide.loadPackage("micropip");
console.log('loading pyscript module');
await pyodide.runPythonAsync(`
from pyodide.http import pyfetch
response = await pyfetch("/build/pyscript.py")
with open("pyscript.py", "wb") as f:
content = await response.bytes()
print(content)
f.write(content)
`)
let pkg = pyodide.pyimport("pyscript");
console.log("creating additional definitions");
let output = pyodide.runPython(additional_definitions); let output = pyodide.runPython(additional_definitions);
console.log("done setting up environment");
/* @ts-ignore */ /* @ts-ignore */
return pyodide; return pyodide;
} }