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:
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user