# HG changeset patch # User drewp@bigasterisk.com # Date 1649096705 25200 # Node ID 8d3c3e7cfb541324bad9c4e08ba73cd0ffb5f842 # Parent 22c9679dbf6744167d631e76a2e0d6086a9b9a4a (barely) runnable demo service instance diff -r 22c9679dbf67 -r 8d3c3e7cfb54 .hgignore --- a/.hgignore Mon Apr 04 11:01:59 2022 -0700 +++ b/.hgignore Mon Apr 04 11:25:05 2022 -0700 @@ -1,2 +1,3 @@ __pypackages__ - +rdfdb/__pycache__ +.pytest_cache diff -r 22c9679dbf67 -r 8d3c3e7cfb54 pdm.lock --- a/pdm.lock Mon Apr 04 11:01:59 2022 -0700 +++ b/pdm.lock Mon Apr 04 11:25:05 2022 -0700 @@ -1,3 +1,9 @@ +[[package]] +name = "atomicwrites" +version = "1.4.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Atomic file writes." + [[package]] name = "attrs" version = "21.4.0" @@ -45,6 +51,12 @@ summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." [[package]] +name = "colorama" +version = "0.4.4" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Cross-platform colored terminal text." + +[[package]] name = "constantly" version = "15.1.0" summary = "Symbolic constants in Python" @@ -105,6 +117,11 @@ summary = "A small library that versions your Python projects." [[package]] +name = "iniconfig" +version = "1.1.1" +summary = "iniconfig: brain-dead simple config-ini parsing" + +[[package]] name = "isodate" version = "0.6.1" summary = "An ISO 8601 date/time/duration parser and formatter" @@ -133,6 +150,27 @@ ] [[package]] +name = "packaging" +version = "21.3" +requires_python = ">=3.6" +summary = "Core utilities for Python packages" +dependencies = [ + "pyparsing!=3.0.5,>=2.0.2", +] + +[[package]] +name = "pluggy" +version = "1.0.0" +requires_python = ">=3.6" +summary = "plugin and hook calling mechanisms for python" + +[[package]] +name = "py" +version = "1.11.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "library with cross-python path, ini-parsing, io, code, log facilities" + +[[package]] name = "pyasn1" version = "0.4.8" summary = "ASN.1 types and codecs" @@ -185,6 +223,31 @@ summary = "Python parsing module" [[package]] +name = "pytest" +version = "7.1.1" +requires_python = ">=3.7" +summary = "pytest: simple powerful testing with Python" +dependencies = [ + "atomicwrites>=1.0; sys_platform == \"win32\"", + "attrs>=19.2.0", + "colorama; sys_platform == \"win32\"", + "iniconfig", + "packaging", + "pluggy<2.0,>=0.12", + "py>=1.8.2", + "tomli>=1.0.0", +] + +[[package]] +name = "pytest-watcher" +version = "0.2.3" +requires_python = ">=3.6.2,<4.0.0" +summary = "Continiously runs pytest on changes in *.py files" +dependencies = [ + "watchdog>=2.0.0", +] + +[[package]] name = "rdflib" version = "6.1.1" requires_python = ">=3.7" @@ -232,6 +295,12 @@ summary = "Python 2 and 3 compatibility utilities" [[package]] +name = "tomli" +version = "2.0.1" +requires_python = ">=3.7" +summary = "A lil' TOML parser" + +[[package]] name = "treq" version = "22.2.0" requires_python = ">=3.6" @@ -284,6 +353,12 @@ summary = "HTTP library with thread-safe connection pooling, file post, and more." [[package]] +name = "watchdog" +version = "2.1.7" +requires_python = ">=3.6" +summary = "Filesystem events monitoring" + +[[package]] name = "yapf" version = "0.32.0" summary = "A formatter for Python code." @@ -299,9 +374,13 @@ [metadata] lock_version = "3.1" -content_hash = "sha256:04cc82aab272414f85feeec215b820c07a08e12dc1b47507a1c70a4236f5eaa8" +content_hash = "sha256:10171a8c0dfde956d65e7aa39b508030ec9787d6349aee2b829315dfa668724b" [metadata.files] +"atomicwrites 1.4.0" = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] "attrs 21.4.0" = [ {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, @@ -373,6 +452,10 @@ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, ] +"colorama 0.4.4" = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] "constantly 15.1.0" = [ {file = "constantly-15.1.0-py2.py3-none-any.whl", hash = "sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d"}, {file = "constantly-15.1.0.tar.gz", hash = "sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35"}, @@ -462,6 +545,10 @@ {file = "incremental-21.3.0-py2.py3-none-any.whl", hash = "sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321"}, {file = "incremental-21.3.0.tar.gz", hash = "sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57"}, ] +"iniconfig 1.1.1" = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] "isodate 0.6.1" = [ {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, @@ -478,6 +565,18 @@ {file = "nose2-0.11.0-py2.py3-none-any.whl", hash = "sha256:d37e75e3010bb4739fe6045a29d4c633ac3146cb5704ee4e4a9e4abeceb2dee3"}, {file = "nose2-0.11.0.tar.gz", hash = "sha256:6d208d7d6ec9f9d55c74dac81c9394bc3906dbef81a8ca5420b2b9b7f8e69de9"}, ] +"packaging 21.3" = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +"pluggy 1.0.0" = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +"py 1.11.0" = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] "pyasn1 0.4.8" = [ {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, @@ -510,6 +609,14 @@ {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, ] +"pytest 7.1.1" = [ + {file = "pytest-7.1.1-py3-none-any.whl", hash = "sha256:92f723789a8fdd7180b6b06483874feca4c48a5c76968e03bb3e7f806a1869ea"}, + {file = "pytest-7.1.1.tar.gz", hash = "sha256:841132caef6b1ad17a9afde46dc4f6cfa59a05f9555aae5151f73bdf2820ca63"}, +] +"pytest-watcher 0.2.3" = [ + {file = "pytest_watcher-0.2.3-py3-none-any.whl", hash = "sha256:af935963399509a5b0e855740ba7227852f1a7fccfbb1cbb79fa19a445af02d2"}, + {file = "pytest-watcher-0.2.3.tar.gz", hash = "sha256:1937dd97e72caafd371d8cea7b3d70c88ff4fe35e6cdecb29c41bbdcbf1dcc2b"}, +] "rdflib 6.1.1" = [ {file = "rdflib-6.1.1-py3-none-any.whl", hash = "sha256:fc81cef513cd552d471f2926141396b633207109d0154c8e77926222c70367fe"}, {file = "rdflib-6.1.1.tar.gz", hash = "sha256:8dbfa0af2990b98471dacbc936d6494c997ede92fd8ed693fb84ee700ef6f754"}, @@ -530,6 +637,10 @@ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +"tomli 2.0.1" = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] "treq 22.2.0" = [ {file = "treq-22.2.0-py3-none-any.whl", hash = "sha256:27d95b07c5c14be3e7b280416139b036087617ad5595be913b1f9b3ce981b9b2"}, {file = "treq-22.2.0.tar.gz", hash = "sha256:df757e3f141fc782ede076a604521194ffcb40fa2645cf48e5a37060307f52ec"}, @@ -549,6 +660,32 @@ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] +"watchdog 2.1.7" = [ + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, + {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, + {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, + {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, + {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, + {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, + {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, + {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, + {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, +] "yapf 0.32.0" = [ {file = "yapf-0.32.0-py2.py3-none-any.whl", hash = "sha256:8fea849025584e486fd06d6ba2bed717f396080fd3cc236ba10cb97c4c51cf32"}, {file = "yapf-0.32.0.tar.gz", hash = "sha256:a3f5085d37ef7e3e004c4ba9f9b3e40c54ff1901cd111f05145ae313a7c67d1b"}, diff -r 22c9679dbf67 -r 8d3c3e7cfb54 pyproject.toml --- a/pyproject.toml Mon Apr 04 11:01:59 2022 -0700 +++ b/pyproject.toml Mon Apr 04 11:25:05 2022 -0700 @@ -26,7 +26,8 @@ dev = [ "flake8>=4.0.1", "yapf>=0.32.0", - "nose2>=0.11.0", + "pytest>=7.1.1", + "pytest-watcher>=0.2.3", ] [build-system] diff -r 22c9679dbf67 -r 8d3c3e7cfb54 rdfdb/service.py --- a/rdfdb/service.py Mon Apr 04 11:01:59 2022 -0700 +++ b/rdfdb/service.py Mon Apr 04 11:25:05 2022 -0700 @@ -10,10 +10,7 @@ import cyclone.web import cyclone.websocket import twisted.internet.error -from greplin import scales -from greplin.scales.cyclonehandler import StatsHandler from rdflib import ConjunctiveGraph, Graph, URIRef -from standardservice.scalessetup import gatherProcessStats from twisted.internet import reactor, task from twisted.internet.inotify import IN_CREATE, INotify from twisted.python.failure import Failure @@ -24,22 +21,22 @@ from rdfdb.patch import ALLSTMTS, Patch from rdfdb.rdflibpatch import patchQuads -gatherProcessStats() -stats = scales.collection( - '/webServer', - scales.IntStat('clients'), - scales.IntStat('liveClients'), - scales.PmfStat('setAttr'), -) -graphStats = scales.collection( - '/graph', - scales.IntStat('statements'), - scales.RecentFpsStat('patchFps'), -) -fileStats = scales.collection( - '/file', - scales.IntStat('mappedGraphFiles'), -) +# gatherProcessStats() +# stats = scales.collection( +# '/webServer', +# scales.IntStat('clients'), +# scales.IntStat('liveClients'), +# scales.PmfStat('setAttr'), +# ) +# graphStats = scales.collection( +# '/graph', +# scales.IntStat('statements'), +# scales.RecentFpsStat('patchFps'), +# ) +# fileStats = scales.collection( +# '/file', +# scales.IntStat('mappedGraphFiles'), +# ) log = logging.getLogger('rdfdb') @@ -223,14 +220,14 @@ def __init__(self, dirUriMap: DirUriMap, addlPrefixes): self.clients: List[WebsocketClient] = [] self.graph = ConjunctiveGraph() - stats.graphLen = len(self.graph) - stats.clients = len(self.clients) + # stats.graphLen = len(self.graph) + # stats.clients = len(self.clients) self.watchedFiles = WatchedFiles(dirUriMap, self.patch, self.getSubgraph, addlPrefixes) self.summarizeToLog() - @graphStats.patchFps.rate() + # @graphStats.patchFps.rate() def patch(self, patch: Patch, sender: Optional[str] = None, dueToFileChange: bool = False) -> None: """ apply this patch to the master graph then notify everyone about it @@ -365,9 +362,9 @@ (r'/graph', GraphResource), (r'/syncedGraph', WebsocketClient), (r'/prefixes', Prefixes), - (r'/stats/(.*)', StatsHandler, { - 'serverName': 'rdfdb' - }), + # (r'/stats/(.*)', StatsHandler, { + # 'serverName': 'rdfdb' + # }), (r'/(.*)', NoExts, { "path": FilePath(__file__).sibling("web").path, "default_filename": "index.html" @@ -377,3 +374,5 @@ db=db)) log.info("serving on %s" % port) reactor.run() +if __name__ == '__main__': + main() \ No newline at end of file diff -r 22c9679dbf67 -r 8d3c3e7cfb54 tasks.py --- a/tasks.py Mon Apr 04 11:01:59 2022 -0700 +++ b/tasks.py Mon Apr 04 11:25:05 2022 -0700 @@ -12,4 +12,18 @@ @task def test(ctx): - ctx.run('pdm run nose2 -v rdfdb.currentstategraphapi_test rdfdb.graphfile_test', pty=True) + test_forever(ctx, forever=False) + + +@task +def test_forever(ctx, forever=True): + watchdir = 'rdfdb' + testdir = 'rdfdb' + ctx.run(f'pdm run pytest {testdir}', pty=True) # ptw doesn't do an initial run + if forever: + ctx.run(f'pdm run ptw {watchdir} {testdir}', pty=True) + + +@task +def demo(ctx): + ctx.run('PYTHONPATH=. pdm run python3 rdfdb/service.py -v', pty=True)