update
parent
3b623d4fdf
commit
383764fca2
@ -0,0 +1,36 @@
|
||||
# to run the tests, run make PASS=controllerpassword test
|
||||
|
||||
PREFIX=/usr/local
|
||||
PYTHON_EXE_MSYS=${PREFIX}/bin/python3.sh
|
||||
PIP_EXE_MSYS=${PREFIX}/bin/pip3.sh
|
||||
LOCAL_DOCTEST=${PREFIX}/bin/toxcore_run_doctest3.bash
|
||||
DOCTEST=${LOCAL_DOCTEST}
|
||||
MOD=phantompy
|
||||
|
||||
check::
|
||||
sh ${PYTHON_EXE_MSYS} -c "import ${MOD}"
|
||||
|
||||
lint::
|
||||
sh .pylint.sh
|
||||
|
||||
install::
|
||||
PYTHONPATH=${PWD}/src \
|
||||
${PIP_EXE_MSYS} install --target ${PREFIX}/lib/python3.11/site-packages/ --upgrade .
|
||||
|
||||
rsync::
|
||||
bash .rsync.sh
|
||||
|
||||
install::
|
||||
PYTHONPATH=${PWD}/src \
|
||||
${PIP_EXE_MSYS} --timeout=30 --disable-pip-version-check --proxy http://127.0.0.1:9128 install --only-binary :none: --progress-bar=off --target /usr/local/lib/python3.11/site-packages --upgrade .
|
||||
|
||||
# execute these tests as: make test PASS=password
|
||||
test::
|
||||
|
||||
doctest:
|
||||
|
||||
veryclean:: clean
|
||||
rm -rf build dist __pycache__ .pylint.err .pylint.out
|
||||
|
||||
clean::
|
||||
find . -name \*~ -delete
|
@ -1,16 +0,0 @@
|
||||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
name = "pypi"
|
||||
verify_ssl = true
|
||||
|
||||
[dev-packages]
|
||||
atomicwrites = "*"
|
||||
pytest = "*"
|
||||
pytest-forked = "*"
|
||||
pytest-raises = "*"
|
||||
|
||||
[packages]
|
||||
|
||||
[dev-packages.phantomjs]
|
||||
editable = true
|
||||
path = "."
|
@ -0,0 +1,44 @@
|
||||
# -*-mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*
|
||||
|
||||
import re
|
||||
from setuptools import setup
|
||||
|
||||
with open("qasync/__init__.py") as f:
|
||||
version = re.search(r'__version__\s+=\s+"(.*)"', f.read()).group(1)
|
||||
|
||||
long_description = "\n\n".join([
|
||||
open("README.md").read(),
|
||||
])
|
||||
|
||||
if __name__ == '__main__':
|
||||
setup(
|
||||
name="phantompy",
|
||||
version=__version__,
|
||||
description="""A simple replacement for phantomjs using PyQt""",
|
||||
long_description=long_description,
|
||||
author="Michael Franzl (originally)",
|
||||
author_email='',
|
||||
license="1clause BSD",
|
||||
packages=['phantompy'],
|
||||
# url="",
|
||||
# download_url="https://",
|
||||
keywords=['JavaScript', 'phantomjs', 'asyncio'],
|
||||
# maybe less - nothing fancy
|
||||
python_requires="~=3.6",
|
||||
# probably works on PyQt6 and PySide2 but untested
|
||||
# https://github.com/CabbageDevelopment/qasync/
|
||||
install_requires=['qasync',
|
||||
'PyQt5'],
|
||||
entry_points={
|
||||
'console_scripts': ['phantompy = phantompy.__main__:iMain', ]},
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'Environment :: Console',
|
||||
'Intended Audience :: Developers',
|
||||
'Intended Audience :: Web Developers',
|
||||
'Natural Language :: English',
|
||||
'Operating System :: OS Independent',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Topic :: Software Development :: Documentation',
|
||||
],
|
||||
)
|
@ -0,0 +1,143 @@
|
||||
#!/usr/local/bin/python3.sh
|
||||
# -*-mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*
|
||||
|
||||
import sys
|
||||
import os
|
||||
import atexit
|
||||
import traceback
|
||||
import functools
|
||||
import asyncio
|
||||
import time
|
||||
import qasync
|
||||
import threading
|
||||
|
||||
QtModuleName = os.environ.get('QT_API')
|
||||
if not QtModuleName:
|
||||
from qasync import QtModuleName
|
||||
QtWidgets = importlib.import_module(QtModuleName + ".QtWidgets", package=QtModuleName)
|
||||
# from PyQt5.QtWidgets import (QProgressBar, QWidget, QVBoxLayout)
|
||||
from qasync import QEventLoop, QThreadExecutor
|
||||
from qasync import asyncSlot, asyncClose, QApplication
|
||||
|
||||
from phantompy import Render
|
||||
from lookupdns import LookFor
|
||||
|
||||
global LOG
|
||||
import logging
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
LOG = logging.getLogger()
|
||||
|
||||
class MainWindow(QWidget.QWidget):
|
||||
"""Main window."""
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.setLayout(QVBoxLayout.QVBoxLayout())
|
||||
self.progress = QtWidgets.QProgressBar()
|
||||
self.progress.setRange(0, 99)
|
||||
self.layout().addWidget(self.progress)
|
||||
|
||||
async def main(app):
|
||||
def close_future(future, loop):
|
||||
loop.call_later(10, future.cancel)
|
||||
future.cancel()
|
||||
|
||||
loop = asyncio.get_running_loop()
|
||||
future = asyncio.Future()
|
||||
app.ldone = []
|
||||
|
||||
getattr(app, "aboutToQuit").connect(
|
||||
functools.partial(close_future, future, loop)
|
||||
)
|
||||
|
||||
if False:
|
||||
progress = QtWidgets.QProgressBar()
|
||||
progress.setRange(0, 99)
|
||||
progress.show()
|
||||
else:
|
||||
mw = MainWindow()
|
||||
progress = mw.progress
|
||||
mw.show()
|
||||
# LOG.info(f"calling first_50 {r}")
|
||||
# await first_50(progress, r)
|
||||
LOG.info(f"calling last_50 {r}")
|
||||
o = QThreadExecutor(max_workers=1)
|
||||
app.o = o
|
||||
with o as executor:
|
||||
await loop.run_in_executor(executor, functools.partial(last_50, progress, sys.argv[1:], app), loop)
|
||||
LOG.info(f" {dir(o)}")
|
||||
|
||||
LOG.info(f"awaiting {future}")
|
||||
await future
|
||||
return True
|
||||
|
||||
async def first_50(progress, r=None):
|
||||
progress.setValue(5)
|
||||
LOG.info(f"first_50 {r}")
|
||||
if r is not None:
|
||||
# loop = asyncio.get_running_loop()
|
||||
# LOG.info(f"first_50.r.run {r}")
|
||||
# loop.call_soon_threadsafe(r.run, r.url, r.outfile, r.jsfile)
|
||||
# r.run( r.url, r.outfile, r.jsfile)
|
||||
for i in range(50):
|
||||
# LOG.info(f"first_50 {r.progress} {i}")
|
||||
# if r.progress >= 100: break
|
||||
# progress.setValue(max(r.progress,i))
|
||||
progress.setValue(i)
|
||||
await asyncio.sleep(.1)
|
||||
return
|
||||
for i in range(50):
|
||||
LOG.info(f"first_50 {r} {i}")
|
||||
loop.call_soon_threadsafe(progress.setValue, i)
|
||||
time.sleep(1)
|
||||
|
||||
def last_50(progress, largs, app, loop):
|
||||
url = largs[0]
|
||||
outfile = largs[1]
|
||||
jsfile = largs[2] if len(largs) > 2 else None
|
||||
r = Render(app, do_print=False, do_save=True)
|
||||
uri = url.strip()
|
||||
loop.call_soon_threadsafe(r.run, uri, outfile, jsfile)
|
||||
time.sleep(1)
|
||||
for i in range(50, 100):
|
||||
j = len(app.ldone) # r.progress
|
||||
if j == 100:
|
||||
LOG.info(f"last_50 None {i} {j}")
|
||||
else:
|
||||
LOG.debug(f"last_50 None {i} {j}")
|
||||
loop.call_soon_threadsafe(progress.setValue, i)
|
||||
time.sleep(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
url = 'https://dns.google/resolve?name=6D6EC2A2E2ED8BFF2D4834F8D669D82FC2A9FA8D.for-privacy.net&type=TXT&cd=true&do=true'
|
||||
outfile = '/tmp/test1.pdf'
|
||||
jsfile = '/tmp/test1.js'
|
||||
from exclude_badExits import vsetup_logging
|
||||
vsetup_logging(10)
|
||||
app = QApplication([])
|
||||
#?
|
||||
loop = qasync.QEventLoop(app)
|
||||
#NOT loop = asyncio.get_event_loop()
|
||||
asyncio._set_running_loop(loop)
|
||||
asyncio.events._set_running_loop(loop)
|
||||
r = Render(app, do_print=False, do_save=True)
|
||||
#loop.call_soon_threadsafe(r.run, url, outfile, jsfile)
|
||||
r.run(url, outfile, jsfile)
|
||||
app.rs = [r]
|
||||
for i in range(20):
|
||||
for elt in app.rs:
|
||||
print (elt.percent)
|
||||
time.sleep(2)
|
||||
try:
|
||||
qasync.run(main(app))
|
||||
except asyncio.exceptions.CancelledError:
|
||||
sys.exit(0)
|
||||
except RuntimeError as e:
|
||||
LOG.debug('Fixme')
|
||||
sys.exit(0)
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(0)
|
||||
else:
|
||||
val = 0
|
||||
sys.exit(val)
|
@ -0,0 +1,49 @@
|
||||
#!/usr/local/bin/python3.sh
|
||||
# -*-mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*
|
||||
|
||||
import sys
|
||||
import os
|
||||
import traceback
|
||||
|
||||
from phantompy import Render
|
||||
|
||||
global LOG
|
||||
import logging
|
||||
import warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
LOG = logging.getLogger()
|
||||
|
||||
import sys
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QProgressBar
|
||||
from quamash import QEventLoop, QThreadExecutor
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
loop = QEventLoop(app)
|
||||
asyncio.set_event_loop(loop) # NEW must set the event loop
|
||||
asyncio.events._set_running_loop(loop)
|
||||
|
||||
progress = QProgressBar()
|
||||
progress.setRange(0, 99)
|
||||
progress.show()
|
||||
|
||||
async def master():
|
||||
await first_50()
|
||||
with QThreadExecutor(1) as executor:
|
||||
await loop.run_in_executor(exec, last_50)
|
||||
# TODO announce completion?
|
||||
|
||||
async def first_50():
|
||||
for i in range(50):
|
||||
progress.setValue(i)
|
||||
await asyncio.sleep(.1)
|
||||
|
||||
def last_50():
|
||||
for i in range(50,100):
|
||||
loop.call_soon_threadsafe(progress.setValue, i)
|
||||
time.sleep(.1)
|
||||
|
||||
with loop: ## context manager calls .close() when loop completes, and releases all resources
|
||||
loop.run_until_complete(master())
|
Loading…
Reference in New Issue