feat: System stub
This commit is contained in:
parent
45e2daa4fb
commit
1905b56862
|
@ -4,3 +4,8 @@
|
||||||
# Python
|
# Python
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*.egg-info
|
*.egg-info
|
||||||
|
|
||||||
|
# Output
|
||||||
|
/dist
|
||||||
|
|
||||||
|
pantograph/pantograph
|
||||||
|
|
13
README.md
13
README.md
|
@ -1,2 +1,15 @@
|
||||||
# PyPantograph
|
# PyPantograph
|
||||||
|
|
||||||
Python interface to the Pantograph library
|
Python interface to the Pantograph library
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
Execute
|
||||||
|
```bash
|
||||||
|
poetry build
|
||||||
|
```
|
||||||
|
If the build is successful, the following command should succeed and output the current version of Pantograph.
|
||||||
|
``` bash
|
||||||
|
python -m pantograph.server
|
||||||
|
```
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import subprocess, shutil, os, stat
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
PATH_PANTOGRAPH = Path("./src")
|
||||||
|
PATH_PY = Path("./pantograph")
|
||||||
|
|
||||||
|
with subprocess.Popen(["make"], cwd=PATH_PANTOGRAPH) as p:
|
||||||
|
p.wait()
|
||||||
|
|
||||||
|
path_executable = PATH_PY / "pantograph"
|
||||||
|
shutil.copyfile(PATH_PANTOGRAPH / ".lake/build/bin/pantograph", path_executable)
|
||||||
|
os.chmod(path_executable, os.stat(path_executable).st_mode | stat.S_IEXEC)
|
|
@ -0,0 +1,64 @@
|
||||||
|
import json, pexpect, pathlib
|
||||||
|
|
||||||
|
def _get_proc_path():
|
||||||
|
return pathlib.Path(__file__).parent / "pantograph"
|
||||||
|
|
||||||
|
class Server:
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
imports=["Init"],
|
||||||
|
options=[],
|
||||||
|
timeout=20,
|
||||||
|
maxread=1000000):
|
||||||
|
"""
|
||||||
|
timeout: Amount of time to wait for execution
|
||||||
|
maxread: Maximum number of characters to read (especially important for large proofs and catalogs)
|
||||||
|
"""
|
||||||
|
self.timeout = timeout
|
||||||
|
self.imports = imports
|
||||||
|
self.maxread = maxread
|
||||||
|
self.proc_path = _get_proc_path()
|
||||||
|
|
||||||
|
self.options = options
|
||||||
|
self.args = " ".join(imports + [f'--{opt}' for opt in options])
|
||||||
|
self.proc = None
|
||||||
|
self.restart()
|
||||||
|
|
||||||
|
def restart(self):
|
||||||
|
if self.proc is not None:
|
||||||
|
self.proc.close()
|
||||||
|
self.proc = pexpect.spawn(
|
||||||
|
f"{self.proc_path} {self.args}",
|
||||||
|
encoding="utf-8",
|
||||||
|
maxread=self.maxread
|
||||||
|
)
|
||||||
|
self.proc.setecho(False)
|
||||||
|
|
||||||
|
def run(self, cmd, payload):
|
||||||
|
s = json.dumps(payload)
|
||||||
|
self.proc.sendline(f"{cmd} {s}")
|
||||||
|
try:
|
||||||
|
self.proc.expect("{.*}\r\n", timeout=self.timeout)
|
||||||
|
output = self.proc.match.group()
|
||||||
|
return json.loads(output)
|
||||||
|
except pexpect.exceptions.TIMEOUT:
|
||||||
|
raise pexpect.exceptions.TIMEOUT
|
||||||
|
|
||||||
|
def reset(self):
|
||||||
|
return self.run("reset", {})
|
||||||
|
|
||||||
|
def goal_start(self, expr: str):
|
||||||
|
return self.run('goal.start', {"expr": str(expr)})
|
||||||
|
def goal_tactic(self, stateId: int, goalId: int, tactic):
|
||||||
|
return self.run('goal.tactic', {"stateId": stateId, "goalId": goalId, "tactic": tactic})
|
||||||
|
|
||||||
|
|
||||||
|
def check_version():
|
||||||
|
import subprocess
|
||||||
|
with subprocess.Popen([_get_proc_path(), "--version"], stdout=subprocess.PIPE) as p:
|
||||||
|
v = p.communicate()[0].decode('utf-8').strip()
|
||||||
|
print(v)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
check_version()
|
|
@ -1,7 +1,31 @@
|
||||||
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
|
||||||
package = []
|
|
||||||
|
[[package]]
|
||||||
|
name = "pexpect"
|
||||||
|
version = "4.9.0"
|
||||||
|
description = "Pexpect allows easy control of interactive console applications."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
|
||||||
|
{file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
ptyprocess = ">=0.5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ptyprocess"
|
||||||
|
version = "0.7.0"
|
||||||
|
description = "Run a subprocess in a pseudo terminal"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
|
||||||
|
{file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
|
||||||
|
]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.11"
|
||||||
content-hash = "81b2fa642d7f2d1219cf80112ace12d689d053d81be7f7addb98144d56fc0fb2"
|
content-hash = "aaae6d4832f97d9ad1b145776be94a2c44a7e77068bb1b3a05241a81dde23909"
|
||||||
|
|
|
@ -8,7 +8,11 @@ readme = "README.md"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.11"
|
python = "^3.11"
|
||||||
|
pexpect = "^4.9.0"
|
||||||
|
|
||||||
|
[tool.poetry.build]
|
||||||
|
generate-setup-file = false
|
||||||
|
script = "build.py"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core"]
|
requires = ["poetry-core"]
|
||||||
|
|
Loading…
Reference in New Issue