{ "info": { "author": "Nathaniel Watson", "author_email": "nathan.watson86@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "Sequencing Runs Monitor\n***********************\n\nA tool that archives new Illumina sequencing runs to Google Cloud Storage\n\nUse case\n========\nYou have one or more Illumina sequencers that are writing to a mounted filesystem such as NFS.\nYou need a way to detect when there is a new, completed sequencing run directory and then relocate\nit to redundant storage. Downstream tools need to be able to know when a tarred run directory is\navailable to post-processing (i.e. demultiplexing, QC, read alignment, etc.).\n\nHow it works\n============\nSequencing Runs Monitor solves the aforementioned challenges through the use of Google Cloud Platform\nservices and by tracking workflow state. Sequencing runs are tarred with gzip compression and then\nuploaded to Google Cloud Storage. Workflow state is tracked locally via SQLite and optionally \nin the NoSQL database Google Firestore for redundancy and to allow downstream clients to query sequencing\nrun records. \n\nNote: while you don't need to use a Google compute instance to run the monitor script, the documentation\nhere assumes that you are since it is the recommended way. That's due to the fact that the monitor\nmust interact with certain GCP services, and hence must be running with proper Google credentials\n(i.e. a service account).\n\nThe monitor script is named `srun-mon` (a shim that calls the `main` function in *launch_monitor.py*).\nWhen running this, you must provide a path to a JSON configuration file, described in detail further \nbelow. You should set up your compute instance to run this script as a daemon service.\n\nThe workflow is fitted into two tasks: the *tar task* and the *upload task*. When the monitor\ndetects a new sequencing run, it executes the workflow in a child process. The workflow is smart\nenough to detect which task to begin with, thanks to the local SQLite database. This database has\na record for each sequencing run and tracks which workflow tasks have been completed, and whether\nthe workflow is running.\n\nMail notifications\n------------------\nIf the 'mail' JSON object is set in your configuration file, then the designated recipients will\nreceive email notifications under the folowing events:\n\n * A child process running a workflow crashes\n * A child process is killed for running too long (see conf parameter `task_runtime_limit_sec`)\n * There is an Exception in the main thread\n * A new sequencing run is being processed. \n\nYou can use the script `send_test_email.py` to test that the mail configuration you provide is\nworking. If it is, you should receive an email with the subject \"sruns-mon test email\". \n\nThe workflow tasks\n==================\nThe workflow is split up into two tasks, each of which can be run on its own (i.e. if the workflow\nneeds to be restarted from where it left off). \n\nTar task\n-----------\nCreates a tarball with gzip compression. The process ID is stored in the local run record in the\nSQLite database.\n\nUpload task\n-----------\nUploads the tarfile to a Google bucket. This task fetches the run record from the local database\nto get the path to the local tarfile.\n\nThe configuration file\n======================\nThis is a small JSON file that lets the monitor know things such as which GCP bucket and Firestore\ncollection to use, for example. The possible keys are:\n\n * `name`: The name of the monitor. The name will appear in the subject line if email notification\n is configured, as well as in other places, i.e. log messages.\n * `completed_runs_dir`: The directory to move a run directory to after it has completed the\n workflow. This directory will be created if it doesn't yet exist. Defaults to a folder by the \n name 'SRM_COMPLETED` that resides within the same directory as the one being watched. Note \n that at present, there isn't a means to clean out the completed runs directory, but that will \n come in a future release. \n * `cycle_pause_sec`: The number of seconds to wait in-between scans of `watchdir`. Defaults to 60.\n * `firestore_collection`: The name of the Google Firestore collection to use for\n persistent workflow state that downstream tools can query. If it doesn't exist yet, it will be\n created. If this parameter is not provided, support for Firestore is turned off. \n * `gcp_bucket_basedir`: The directory in `gcp_bucket_name` in which to store all uploaded files.\n Defaults to the root directory.\n * `gcp_bucket_name`: (Required) The name of the Google Cloud Storage bucket to which tarred run\n directories will be uploaded.\n * `sentinal_file_age_minutes`: How old in minutes the sentinal file, i.e. CopyComplete.txt, should \n be before initiating any tasks, such as tarring the run directory. Illumina Support recommends \n 15 minutes, which is thus the default. This helps to ensure that the Illumina Universal Copy \n Services (UCS) running on the sequencer has had ample time to complete once the sentinal file \n appears.\n * `sqlite_db`: The name of the local SQLite database to use for tracking workflow state.\n Defaults to *sruns.db* if not specified.\n * `sweep_age_sec`: When a run in the completed runs directory is older than this many seconds, \n remove it. Defaults to 604800 (1 week).\n * `task_runtime_limit_sec`: The number of seconds a child process is allowed to run before\n being killed. This is meant to serve as a safety mechanism to prevent errant child processes\n from consuming resources in the event that this does happen due to unforeseen circumstances.\n An email notification will be sent out in this case to alert about the errant process\n and the sequencing run it was associated with. The number of seconds you set for this depends\n on several factors, such as run size and network speed. It is suggested to use two days (172800\n seconds) at least to be conservative.\n * `watchdir`: (Required) The directory to monitor for new sequencing runs.\n\nThe user-supplied configuration file is validated in the Monitor against a built-in schema. \n\nTracking workflow state\n=======================\nThe state of the workflow for a given run directory is tracked both locally in a SQLite database\nas well as Google Firestore - a NoSQL database. Local state is tracked for the purpose of being\nable to restart workflows if a child process ever crashes, or if the node goes down. Firestore is\nused to enable downstream applications to query the collection (whose name is specified in your\nconfiguration file) to do their own post-processing as desired. For example, an external tool\ncould query the collection and ask if a given run is completed yet. Completed in this sense means\nthat the run was tarred and uploded to a Google bucket. Then, the tool could tell where the tarfile\nblob is located.\n\nSQLite\n------\nThere is a record for every sequencing run, which is stored in the *tasks* table - the only table.\nThe possible fields are:\n\n * `name`: The name of the sequencing run.\n * `pid`: The process ID of the workflow that is running or that already ran.\n * `tarfile`: The path to the local tarfile that was generated by the tar task.\n * `gcp_tarfile`: The blob object path in the Google bucket, stored as *$bucket_name/$blob_name*.\n * `rundir_path`: The directory path of the original sequencing run. \n\nFirestore\n---------\nFirestore is optional. If your configuration file includes the `firestore_collection` setting, then\nattempts to write to the designated Firestore collection will be made (creating it if needbe). \n\nThere is a record in the collection for each sequencing run. The possible fields are:\n\n * `name`: The name of the sequencing run. This mirrors the value of the same attribute in the\n analagous SQLite database record.\n * `storage`: Bucket storage object path for the tarred run directory in the\n form $bucket_name/path/to/run.tar.gz\n * `workflow_status`: The overall status of the worklfow. Possible values are:\n\n * `new`\n * `starting`\n * `tarring`\n * `tarring_complete`\n * `uploading`\n * `uploading_complete`\n * `complete`\n * `not_running`\n\nInstallation and setup\n======================\nThis works in later versions of Python 3 only::\n\n pip3 install sruns-monitor\n\nIt is recommended to start your compute instance (that will run the monitor) using a service account\nwith the following roles:\n\n * roles/storage.objectAdmin\n * roles/datastore.owner\n\n\nRunning Test Cases\n==================\nEach module has associated test cases. There are both unit tests and functional tests.\n\nUnit Tests\n----------\nRun the following command from within the `tests` package directory::\n\n python3 -m unittest\n\nThere are two unit test modules:\n\n * test_sqlite_utils.py: Tests methods in the `sqlite_utils.Db` class. These tests make sure that\n the methods that interface with the local SQLite database function as expected.\n * test_utils.py: Tests general utility functions in `utils.py`, such as tarring a run directory,\n uploading an object to Google Storage, and checking child process state.\n\n\nFunctional Tests\n-----------------\nRunning the functional tests are especially helpful in letting you know that your environment is \nset up correctly and that the monitor can access your Firestore database and Google bucket. \n\nThe test module is named `monitor_integration_tests.py`. It is testing logic in \nthe class `sruns_monitor.Monitor`. Because this class requires a configuration file in JSON format \nduring instantiation, you must create such a file in order to run these tests. \nThe file must be named as `conf.json` and must reside within the calling directory. \nThe following config parameters should not be specified, however:\n\n * watchdir\n * completed_runs_dir\n * sqlite_db\n\nThat is because within the `tests` package directory, it includes its own watch directory with\nmock run directories. The parameters you should provide in the conf.json file for testing are:\n\n * firestore_collection\n * gcp_bucket_name\n * gcp_bucket_basedir\n\nThen, you run the tests like so::\n\n monitor_integration_tests.py\n\nNote that you should be using a Google service account as described above. \n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://pypi.org/project/sruns-monitor/", "keywords": "archive sequencing runs monitor", "license": "", "maintainer": "", "maintainer_email": "", "name": "sruns-monitor", "package_url": "https://pypi.org/project/sruns-monitor/", "platform": "", "project_url": "https://pypi.org/project/sruns-monitor/", "project_urls": { "Homepage": "https://pypi.org/project/sruns-monitor/", "Read the Docs": "https://sruns-monitor.readthedocs.io/en/latest" }, "release_url": "https://pypi.org/project/sruns-monitor/1.2.0/", "requires_dist": [ "docutils", "google-cloud-pubsub", "google-cloud-firestore", "google-cloud-storage", "jsonschema", "psutil" ], "requires_python": "", "summary": "Looks for new Illumina sequencing runs and tars them up into GCP storage", "version": "1.2.0", "yanked": false, "yanked_reason": null }, "last_serial": 7141342, "releases": { "0.1.10": [ { "comment_text": "", "digests": { "md5": "4c02c067a6159c6c5994b7647e0f1caa", "sha256": "4574ddf6170d63f90b822d2fd508ab024d8ca2dedbf76bba1d70b57812ba5a7e" }, "downloads": -1, "filename": "sruns_monitor-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "4c02c067a6159c6c5994b7647e0f1caa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21121, "upload_time": "2019-05-30T06:32:35", "upload_time_iso_8601": "2019-05-30T06:32:35.895544Z", "url": "https://files.pythonhosted.org/packages/e4/5d/3e2d0d925cffb21cbbf8a8667cec23b27b8fd2a9590b148e03636cf46543/sruns_monitor-0.1.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "866d13bc69092baac65314f67405a722", "sha256": "76a454112ce99f46bfa6e42938fabdd3fc93c0b30f9af449813de1daf9290685" }, "downloads": -1, "filename": "sruns-monitor-0.1.10.tar.gz", "has_sig": false, "md5_digest": "866d13bc69092baac65314f67405a722", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19153, "upload_time": "2019-05-30T06:32:37", "upload_time_iso_8601": "2019-05-30T06:32:37.669383Z", "url": "https://files.pythonhosted.org/packages/e9/c3/118b94235569d673fa3259efdc8a7f0683b472ffdffba188eeffc7760d8f/sruns-monitor-0.1.10.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "ce54b52b58ffcb90112e34706918ff84", "sha256": "809dc916e20af0976cfa5bdb10a69383df456f4deaa3b56b107b9bb6958bd739" }, "downloads": -1, "filename": "sruns_monitor-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ce54b52b58ffcb90112e34706918ff84", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21043, "upload_time": "2019-05-30T05:40:18", "upload_time_iso_8601": "2019-05-30T05:40:18.723614Z", "url": "https://files.pythonhosted.org/packages/2b/0f/11c0b46f1ff843e06ae9ea3a16b8d27bb82d51413996f08462f5c55594c6/sruns_monitor-0.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "45d6f2723f27cf1d66bbe2569791fc71", "sha256": "ca2d94b3e9789931f4d044efe62195934b9f8dceb303e9e8c98f76548111428d" }, "downloads": -1, "filename": "sruns-monitor-0.1.6.tar.gz", "has_sig": false, "md5_digest": "45d6f2723f27cf1d66bbe2569791fc71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19000, "upload_time": "2019-05-30T05:40:21", "upload_time_iso_8601": "2019-05-30T05:40:21.024245Z", "url": "https://files.pythonhosted.org/packages/04/21/e60f7e2c0bb1d99fe8c20ee95e671f8046ac73c634fc67bd2e574783efbb/sruns-monitor-0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "11b934d40bc0b571a2c619fba2abec6d", "sha256": "9f257c0ad2e05160db24cf1067d7438c1eb6f2b66636598c3d58f38d7666393e" }, "downloads": -1, "filename": "sruns_monitor-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "11b934d40bc0b571a2c619fba2abec6d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21043, "upload_time": "2019-05-30T05:42:43", "upload_time_iso_8601": "2019-05-30T05:42:43.982769Z", "url": "https://files.pythonhosted.org/packages/6e/d1/80c7ab88577a56c395605633b9e7fd2acd33c60754ad094d96400ab7ef51/sruns_monitor-0.1.8-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8d6157374c923d4608c69b4e25904ea3", "sha256": "ba605d565bd724e868d53800f7ca11c2018e152843f902e58fed4cded0a341d3" }, "downloads": -1, "filename": "sruns-monitor-0.1.8.tar.gz", "has_sig": false, "md5_digest": "8d6157374c923d4608c69b4e25904ea3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19002, "upload_time": "2019-05-30T05:42:45", "upload_time_iso_8601": "2019-05-30T05:42:45.814616Z", "url": "https://files.pythonhosted.org/packages/8b/0b/16dec6b91cfc6da0d04b3ced9911139428568517a86c2031c35f4ce3349f/sruns-monitor-0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "0b2f82ce86ccabac0336ace0818e9b8a", "sha256": "37eac3847531b8bde88279bb7761dbaedf30b31c1eeec6ca02a025209a0bad47" }, "downloads": -1, "filename": "sruns_monitor-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "0b2f82ce86ccabac0336ace0818e9b8a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21038, "upload_time": "2019-05-30T05:48:42", "upload_time_iso_8601": "2019-05-30T05:48:42.984175Z", "url": "https://files.pythonhosted.org/packages/6b/83/b5b8d0ed837cafcabb89c1556fcbe82457205feaabec2c45bcd32e337b36/sruns_monitor-0.1.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2a73e651b0fe11486945d1756a262cf4", "sha256": "ed1c2ce655657ed02c37b857088acce3776f803192106e263e905deee8ffdb31" }, "downloads": -1, "filename": "sruns-monitor-0.1.9.tar.gz", "has_sig": false, "md5_digest": "2a73e651b0fe11486945d1756a262cf4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18993, "upload_time": "2019-05-30T05:48:44", "upload_time_iso_8601": "2019-05-30T05:48:44.487233Z", "url": "https://files.pythonhosted.org/packages/5f/f4/7cc74161177ebb14829a07bbc80c382113bd2b0161ca08b604324cc8516c/sruns-monitor-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "bf95cbf8c37e503d87446ed7171b6bfc", "sha256": "4bb20c322430a66eba622b63ffbbec4b2d8744c7c644ee70bbf5211a1a82dfb4" }, "downloads": -1, "filename": "sruns_monitor-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "bf95cbf8c37e503d87446ed7171b6bfc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25730, "upload_time": "2019-05-31T05:41:15", "upload_time_iso_8601": "2019-05-31T05:41:15.234068Z", "url": "https://files.pythonhosted.org/packages/9d/29/8b8d1b6665015779ac81bae7857ed34a9af55a9badcc0e27d7b0e621d142/sruns_monitor-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "627dd42efda8ce0683defeddbbc5cb7b", "sha256": "85367b8eae3e1a356a94f34beb811aaa7316762fc9c235d747fdc088e41b984e" }, "downloads": -1, "filename": "sruns-monitor-0.2.0.tar.gz", "has_sig": false, "md5_digest": "627dd42efda8ce0683defeddbbc5cb7b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21051, "upload_time": "2019-05-31T05:41:17", "upload_time_iso_8601": "2019-05-31T05:41:17.143934Z", "url": "https://files.pythonhosted.org/packages/39/14/281861e744e155e908fbd993298dbf5fc5849466b6e469d1fc79a5aa1645/sruns-monitor-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "1aede1642e9dd696bbca2ec4348676ef", "sha256": "14f65b4c77fef6313a8481169c1e2acad3fe560c64527f2dde0168848be498f3" }, "downloads": -1, "filename": "sruns_monitor-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1aede1642e9dd696bbca2ec4348676ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25725, "upload_time": "2019-05-31T06:01:45", "upload_time_iso_8601": "2019-05-31T06:01:45.256964Z", "url": "https://files.pythonhosted.org/packages/1e/01/c442b90b33a973b9ae5d00d7014acfaba43e0cc95ba483f2a8ab91ab6496/sruns_monitor-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "240e3639fa359449bf90ccbacf5a0443", "sha256": "b95934a842e07b66d8d6f3006b5a867ae17b90270b3f351d40eda186a7b27655" }, "downloads": -1, "filename": "sruns-monitor-0.2.1.tar.gz", "has_sig": false, "md5_digest": "240e3639fa359449bf90ccbacf5a0443", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21054, "upload_time": "2019-05-31T06:01:47", "upload_time_iso_8601": "2019-05-31T06:01:47.130370Z", "url": "https://files.pythonhosted.org/packages/83/79/375bdb90228809ef85e2e8fd7718ace5bfc1e7aac1079a3a25bc5f6908f8/sruns-monitor-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "58ac0945511f16e7e92cb9bba98a1d8d", "sha256": "8cdefdc6d391af21ba8c675a1b889d7b585a2a957f42dfbc0735fd1dfa903676" }, "downloads": -1, "filename": "sruns_monitor-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "58ac0945511f16e7e92cb9bba98a1d8d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25531, "upload_time": "2019-06-01T00:29:21", "upload_time_iso_8601": "2019-06-01T00:29:21.179222Z", "url": "https://files.pythonhosted.org/packages/f4/14/6f9bdf7af4a9c13b6401a16daf99a51ad1a6f6133d2c8897194a668ce460/sruns_monitor-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "657ccac0f90e4d2e7e451977e4deacf8", "sha256": "e0654bfbaeeae5194150f186a7ac7b0d81da45b3953861711b425dfe6df3cfa0" }, "downloads": -1, "filename": "sruns-monitor-0.3.0.tar.gz", "has_sig": false, "md5_digest": "657ccac0f90e4d2e7e451977e4deacf8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20597, "upload_time": "2019-06-01T00:29:22", "upload_time_iso_8601": "2019-06-01T00:29:22.847499Z", "url": "https://files.pythonhosted.org/packages/29/08/c5dc1998cd2aa1e1354305d026204329a5a73ea98a13df53d9554aa3cca6/sruns-monitor-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "d07ab2b316d276572220da771a1e423a", "sha256": "a7553ad39b5c32dd9f1e008aed9cc08f90ef953c7704a71ef797c63816d56368" }, "downloads": -1, "filename": "sruns_monitor-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d07ab2b316d276572220da771a1e423a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 26122, "upload_time": "2019-06-03T18:40:04", "upload_time_iso_8601": "2019-06-03T18:40:04.790905Z", "url": "https://files.pythonhosted.org/packages/c9/16/2f82cbe5e6120701132664e1b2b30a325c23ac3c9cc7305984375050e668/sruns_monitor-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8245509a980a295e300c2132d8164d04", "sha256": "dcb813fc8575053f25dcbbd784835385e31cbf240e4985160fe13f1f6138d806" }, "downloads": -1, "filename": "sruns-monitor-0.3.1.tar.gz", "has_sig": false, "md5_digest": "8245509a980a295e300c2132d8164d04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21009, "upload_time": "2019-06-03T18:40:06", "upload_time_iso_8601": "2019-06-03T18:40:06.731498Z", "url": "https://files.pythonhosted.org/packages/9b/93/7525ad2e717f05d0995d8547e32237c9ddc73f379ac6016fe5185651dd25/sruns-monitor-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "287e27eafb4772dd864201bfdfcadc4a", "sha256": "41dfee2440aa77961dd7ef320035c623ba3020732cb9971c8a6e2ae393c92d7e" }, "downloads": -1, "filename": "sruns_monitor-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "287e27eafb4772dd864201bfdfcadc4a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32123, "upload_time": "2019-06-05T22:37:07", "upload_time_iso_8601": "2019-06-05T22:37:07.880347Z", "url": "https://files.pythonhosted.org/packages/a4/bd/353fb8b7e860c428110267c8c4181dff26936f9cd55e69eb316456659728/sruns_monitor-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "bb538593a04f50eeeff56312dc652768", "sha256": "1f4a81dd822ccdf46a9b47cc32e88b9708ae93aca7907a45e97e815655568f90" }, "downloads": -1, "filename": "sruns-monitor-0.4.0.tar.gz", "has_sig": false, "md5_digest": "bb538593a04f50eeeff56312dc652768", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25355, "upload_time": "2019-06-05T22:37:09", "upload_time_iso_8601": "2019-06-05T22:37:09.478278Z", "url": "https://files.pythonhosted.org/packages/55/2c/66d8a96dd481f54b0e23ea8fec3e1ba3c53f060672c7c5c3ac8fa7d90365/sruns-monitor-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "fe52d122f93fad7767ec8808a0e1947e", "sha256": "6d7e3f2c3e276da4537295a29350fbc6d5c4640e1d54c7b07c90ccd62e04e5f7" }, "downloads": -1, "filename": "sruns_monitor-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "fe52d122f93fad7767ec8808a0e1947e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33414, "upload_time": "2019-06-07T00:49:23", "upload_time_iso_8601": "2019-06-07T00:49:23.524377Z", "url": "https://files.pythonhosted.org/packages/e3/45/725c4290e4a21e8ccd31e573ca6d1eb196ce000cc29a54674c9cfb7fb53d/sruns_monitor-0.5.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b9c2bbc66923c130c06f22e33e18ade2", "sha256": "c5957a186b2de990cf7aff33166f29d23dd4046d5e06f6fee9167781c1e9bf09" }, "downloads": -1, "filename": "sruns-monitor-0.5.0.tar.gz", "has_sig": false, "md5_digest": "b9c2bbc66923c130c06f22e33e18ade2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26247, "upload_time": "2019-06-07T00:49:25", "upload_time_iso_8601": "2019-06-07T00:49:25.284626Z", "url": "https://files.pythonhosted.org/packages/f7/dd/e29f55dc5c2e30671c64f27e1be8322ad8fc8d5a7365a39d66af377afb55/sruns-monitor-0.5.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "967be19426843d951c92dce2d5bc26be", "sha256": "bc1b9d693718fbcf63420144bf098d4fba8d173f58a1693b296df2f97fdedbcc" }, "downloads": -1, "filename": "sruns_monitor-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "967be19426843d951c92dce2d5bc26be", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34517, "upload_time": "2019-09-29T03:56:10", "upload_time_iso_8601": "2019-09-29T03:56:10.312079Z", "url": "https://files.pythonhosted.org/packages/e9/47/13fad572bc00becf2bc96974b41afb79a2a32b38c228038448803e4b5e34/sruns_monitor-0.6.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b5a804314c4990e2d7783b27f49e75de", "sha256": "0b94db86858241ca74576fd9a233e90393583ced42c0f853a518df0af1d1de93" }, "downloads": -1, "filename": "sruns-monitor-0.6.1.tar.gz", "has_sig": false, "md5_digest": "b5a804314c4990e2d7783b27f49e75de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26895, "upload_time": "2019-09-29T03:56:12", "upload_time_iso_8601": "2019-09-29T03:56:12.440064Z", "url": "https://files.pythonhosted.org/packages/6d/c9/8f46671c2655d224085093d64bb7e49477b86799a0ab48677301151c2fc6/sruns-monitor-0.6.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "e234c653a875432fa4f8193960ca64ec", "sha256": "75377fd5c07cb6fbbf043a6e040e21b186a76cedc731b3549c653db77cf86f98" }, "downloads": -1, "filename": "sruns_monitor-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e234c653a875432fa4f8193960ca64ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35294, "upload_time": "2019-09-29T06:42:41", "upload_time_iso_8601": "2019-09-29T06:42:41.375816Z", "url": "https://files.pythonhosted.org/packages/51/84/fc3775f170111c29de1d3c260d6f84826abc3b8fcdd9d7ad68d353392483/sruns_monitor-0.7.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8301f8df4f550363198665f7cb5cf65c", "sha256": "880bf929836fccbd6827f96cfe0617f25c71c2d5d49b837c272b63d188bc731b" }, "downloads": -1, "filename": "sruns-monitor-0.7.0.tar.gz", "has_sig": false, "md5_digest": "8301f8df4f550363198665f7cb5cf65c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26550, "upload_time": "2019-09-29T06:42:44", "upload_time_iso_8601": "2019-09-29T06:42:44.416675Z", "url": "https://files.pythonhosted.org/packages/2e/7c/734e3aa72f28ff5ace390b188365cd08d4442fcecfbbbb6270e75d7a24da/sruns-monitor-0.7.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "d2510c8b748e8752599660b956390c8e", "sha256": "90b2b549e82755222c548b027475e7034702c9a570cca9c292385a7f07cf9ec1" }, "downloads": -1, "filename": "sruns_monitor-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d2510c8b748e8752599660b956390c8e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34951, "upload_time": "2019-10-28T23:45:15", "upload_time_iso_8601": "2019-10-28T23:45:15.363035Z", "url": "https://files.pythonhosted.org/packages/33/0f/09272c7534e37569d1d36ff84c9a32223aa645f681474b851be6e68ec838/sruns_monitor-0.8.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f39b60e76b20c8a887a4771823165974", "sha256": "4d5a20802f856f0631b4daa4a28f1dd32f8b350d46825a362455b0a9c0a281d0" }, "downloads": -1, "filename": "sruns-monitor-0.8.0.tar.gz", "has_sig": false, "md5_digest": "f39b60e76b20c8a887a4771823165974", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27873, "upload_time": "2019-10-28T23:45:17", "upload_time_iso_8601": "2019-10-28T23:45:17.318983Z", "url": "https://files.pythonhosted.org/packages/de/43/4a45ff77372409c1696dbf16f01e94b752c27c614f153c66446e0c9166f1/sruns-monitor-0.8.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "91816a7eed911738957f2c559193f103", "sha256": "54839ea6d1ddd91280e033a9e31ee633f95f98c1f716347c298377eab48392c5" }, "downloads": -1, "filename": "sruns_monitor-0.8.1-py3-none-any.whl", "has_sig": false, "md5_digest": "91816a7eed911738957f2c559193f103", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 34902, "upload_time": "2019-10-29T18:12:17", "upload_time_iso_8601": "2019-10-29T18:12:17.398545Z", "url": "https://files.pythonhosted.org/packages/41/c0/33a10b8eaffcaea19e4c04d22ebc18ccacc3e998885078d715878951878d/sruns_monitor-0.8.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8fe53bf85e899fd15db61049c1402b3d", "sha256": "47b3a4c99082b4a2b12db5013f5dc4bc53e0179a58fe5b2fdadb5f8831849cf1" }, "downloads": -1, "filename": "sruns-monitor-0.8.1.tar.gz", "has_sig": false, "md5_digest": "8fe53bf85e899fd15db61049c1402b3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27836, "upload_time": "2019-10-29T18:12:19", "upload_time_iso_8601": "2019-10-29T18:12:19.268393Z", "url": "https://files.pythonhosted.org/packages/95/c4/e84d459f4711bc9bafab4d87c1b77043ffb179fbc7bdcc229d4e5296a185/sruns-monitor-0.8.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "89c7e7d8e9e8ab8f52dc37b9421922a4", "sha256": "4255d5c9e0ad927e8dc6dd413cd938bb6049e0cdc26fb99a7713a6a78b6266dd" }, "downloads": -1, "filename": "sruns_monitor-0.8.3-py2-none-any.whl", "has_sig": false, "md5_digest": "89c7e7d8e9e8ab8f52dc37b9421922a4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 34888, "upload_time": "2019-12-14T04:30:52", "upload_time_iso_8601": "2019-12-14T04:30:52.718308Z", "url": "https://files.pythonhosted.org/packages/3f/15/8b2c8d25cc1d2a379377a1726df7942f15c2f82b777f27533c9914fbb8b9/sruns_monitor-0.8.3-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "916033ac9d1bcda0a4eb4f453ab23056", "sha256": "6bc057150f70ce058356296c0724b0d68c3342967010f23066d275abd03846f2" }, "downloads": -1, "filename": "sruns-monitor-0.8.3.tar.gz", "has_sig": false, "md5_digest": "916033ac9d1bcda0a4eb4f453ab23056", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27866, "upload_time": "2019-12-14T04:30:54", "upload_time_iso_8601": "2019-12-14T04:30:54.753114Z", "url": "https://files.pythonhosted.org/packages/49/51/e7bba5c1051846f66e6d997d864d030910feaedfa24db74bce965fc18d72/sruns-monitor-0.8.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "2a58b387057b9a8d4763ec51ea369aea", "sha256": "ef28c5100aa6107703f1e7e6b7cd87bd6eb11428a9cb1b96381d7b1fcb877d86" }, "downloads": -1, "filename": "sruns_monitor-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "2a58b387057b9a8d4763ec51ea369aea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38293, "upload_time": "2020-01-14T18:16:09", "upload_time_iso_8601": "2020-01-14T18:16:09.598713Z", "url": "https://files.pythonhosted.org/packages/a5/02/67587aa0136a418bae7b5f8939f129ac2b121d1b1a4216cb73d81510b947/sruns_monitor-0.9.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0c707acbfcb8fc63defcf6929d52b867", "sha256": "16a7429e61a5abe7721747c5e5216054aaf4c741ea39dfa97b3f019077288a1f" }, "downloads": -1, "filename": "sruns-monitor-0.9.0.tar.gz", "has_sig": false, "md5_digest": "0c707acbfcb8fc63defcf6929d52b867", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30089, "upload_time": "2020-01-14T18:16:13", "upload_time_iso_8601": "2020-01-14T18:16:13.257175Z", "url": "https://files.pythonhosted.org/packages/16/72/5549b1ddf577d35d5d8a45a8947d3343fc1f3390c489c3a0e983f4009506/sruns-monitor-0.9.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "f61d193e21e2d5e30392ae46046fcdfd", "sha256": "1cbf1c59bdbc6b5e30c03328e06742eeed20c9eaa99e03970a20736bfdcd1a64" }, "downloads": -1, "filename": "sruns_monitor-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f61d193e21e2d5e30392ae46046fcdfd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38292, "upload_time": "2020-01-14T18:16:11", "upload_time_iso_8601": "2020-01-14T18:16:11.387710Z", "url": "https://files.pythonhosted.org/packages/13/4e/acf1306e2134f099e62155753231e011efb30c481074123a91cb277d201c/sruns_monitor-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ff72bcd140929ae997258d837c2f2f3d", "sha256": "e59e56451e8069e9190c69994c9bc1e598abfd22fbcb81f71252f84617146ad8" }, "downloads": -1, "filename": "sruns-monitor-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ff72bcd140929ae997258d837c2f2f3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30088, "upload_time": "2020-01-14T18:16:14", "upload_time_iso_8601": "2020-01-14T18:16:14.936263Z", "url": "https://files.pythonhosted.org/packages/af/23/6f8ec2a54cea2e55fd45b94a00b4fca2d1c2afb873eb7e723757425519b2/sruns-monitor-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "e0c21cfb9219898deea2a1dbf6befe15", "sha256": "24e6c83b2b05d4c70f02dcd6c7b7bc38a27adaa3c3da1a223d2dc78feaaf69c0" }, "downloads": -1, "filename": "sruns_monitor-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e0c21cfb9219898deea2a1dbf6befe15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38428, "upload_time": "2020-01-14T22:55:11", "upload_time_iso_8601": "2020-01-14T22:55:11.268198Z", "url": "https://files.pythonhosted.org/packages/25/67/87dc620226d020d59884d271094e6adb41797ace6cb888f97ea748816422/sruns_monitor-1.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4e6b50914f32bd17517ef7b49ecadc27", "sha256": "6d9939fffb89023db09eae3021099102e29188a2b43bcdbca8678b2878cbfd39" }, "downloads": -1, "filename": "sruns-monitor-1.1.0.tar.gz", "has_sig": false, "md5_digest": "4e6b50914f32bd17517ef7b49ecadc27", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30189, "upload_time": "2020-01-14T22:55:12", "upload_time_iso_8601": "2020-01-14T22:55:12.873929Z", "url": "https://files.pythonhosted.org/packages/7f/20/4fb4784727469963327e700d87722254688895183061a17a639228b1c1a4/sruns-monitor-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "a537156e5ef43d7b01802889efeb71c6", "sha256": "c8dbc70a8039af30483371dcf679e9e96124f29c77f628799a509e56c64cdc40" }, "downloads": -1, "filename": "sruns_monitor-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a537156e5ef43d7b01802889efeb71c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38587, "upload_time": "2020-04-30T22:37:45", "upload_time_iso_8601": "2020-04-30T22:37:45.341536Z", "url": "https://files.pythonhosted.org/packages/d6/2e/229f346764af81e08d8c09aa5e78fed89e8e76fc0408956709266a8667b7/sruns_monitor-1.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d4d347e9d86e55e3d78506915e64a034", "sha256": "091560ee3ddd22bfbdce8761246cb779e599a64aae9a510bdc61d41fdaca9be5" }, "downloads": -1, "filename": "sruns-monitor-1.2.0.tar.gz", "has_sig": false, "md5_digest": "d4d347e9d86e55e3d78506915e64a034", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30338, "upload_time": "2020-04-30T22:37:46", "upload_time_iso_8601": "2020-04-30T22:37:46.737507Z", "url": "https://files.pythonhosted.org/packages/4d/2f/3c0be688823066b8b01ee62ca57fe2e2583a6f318a4d93c14a44cc30537b/sruns-monitor-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a537156e5ef43d7b01802889efeb71c6", "sha256": "c8dbc70a8039af30483371dcf679e9e96124f29c77f628799a509e56c64cdc40" }, "downloads": -1, "filename": "sruns_monitor-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a537156e5ef43d7b01802889efeb71c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38587, "upload_time": "2020-04-30T22:37:45", "upload_time_iso_8601": "2020-04-30T22:37:45.341536Z", "url": "https://files.pythonhosted.org/packages/d6/2e/229f346764af81e08d8c09aa5e78fed89e8e76fc0408956709266a8667b7/sruns_monitor-1.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d4d347e9d86e55e3d78506915e64a034", "sha256": "091560ee3ddd22bfbdce8761246cb779e599a64aae9a510bdc61d41fdaca9be5" }, "downloads": -1, "filename": "sruns-monitor-1.2.0.tar.gz", "has_sig": false, "md5_digest": "d4d347e9d86e55e3d78506915e64a034", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30338, "upload_time": "2020-04-30T22:37:46", "upload_time_iso_8601": "2020-04-30T22:37:46.737507Z", "url": "https://files.pythonhosted.org/packages/4d/2f/3c0be688823066b8b01ee62ca57fe2e2583a6f318a4d93c14a44cc30537b/sruns-monitor-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }