diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b9c90a..ef9a152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # Change Log -## Version 0.0.1 (2019-10-01) +## Version 0.0.1 (2020-02-14) ### Added - Initial release. diff --git a/Pipfile b/Pipfile index cac9f44..5084b24 100644 --- a/Pipfile +++ b/Pipfile @@ -6,6 +6,15 @@ verify_ssl = true [dev-packages] pytest = "*" twine = "*" +pytest-asyncio = "*" +pytest-cov = "*" +coverage = "*" +coveralls = "*" +pytest-mock = "*" +pytest-pylint = "*" +pylint = "*" +wheel = "*" +autopep8 = "*" [packages] synapseclient = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 5403054..15d5089 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "b09326560fc86bbc4370f1b601e9d38adc4a7a16bb0463768250bdb2c0f4f2dd" + "sha256": "8850aa46f90302e164503384f33191c29521da86fbd28bceaccb1e1c314ed672" }, "pipfile-spec": 6, "requires": { @@ -26,29 +26,21 @@ }, "aiohttp": { "hashes": [ - "sha256:022c400e30848b1994236e31fb38db1dc4b551efe049f737cbac690ab2cdf5c4", - "sha256:10f9316ef068536dec0b9f09531fa1cb6bfa8394f278022cb96e789c77811ad2", - "sha256:2599b93fd5ba1120b3bd1366d67a7e26bd45b3d5d5548069e00b2fbef7f20ab0", - "sha256:2a1c71e7fb8c50e60fb4c9bab8bd5cf7c07f91a6b27dc2556d7354cd2ebb3689", - "sha256:6a19d34cc01414d94dd5a4466f8f397293fcb8929df8eeb8989119cc5ef928bb", - "sha256:7aab39c2a61a5c6b15bb7e561218ef64770ca1fbf4cc1878c96e630e2b7cc3cc", - "sha256:8959e28bc1b87542b0ee4a8302128f633bee296252f261bf03e118c4dff725f0", - "sha256:89820f7c488f4e9b1f74371da33403181e11e006663ddf074317aacd690838a6", - "sha256:ab761cf0f0b0b90887e276b4a7918f11e323f2228bbb30814bbd538c122028bf", - "sha256:cc648ecaca79e37c6e26f370e802e7ae640a069913f661f66c0421084bef219a", - "sha256:d6f26e80cd55ac88e1f0397fc8d547933225a5dc1add040e27788c2a028c64c6", - "sha256:e7d6ae4a36bfe6d7f93c6f42a0bfa1659f7d011006cb6e8207c85ef5acdb2986", - "sha256:fc55b1fec0e4cc1134ffb09ea3970783ee2906dc5dfd7cd16917913f2cfed65b" + "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e", + "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326", + "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a", + "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654", + "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a", + "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4", + "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17", + "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec", + "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd", + "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48", + "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59", + "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965" ], "index": "pypi", - "version": "==3.6.1" - }, - "asn1crypto": { - "hashes": [ - "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87", - "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49" - ], - "version": "==0.24.0" + "version": "==3.6.2" }, "async-timeout": { "hashes": [ @@ -59,10 +51,10 @@ }, "attrs": { "hashes": [ - "sha256:ec20e7a4825331c1b5ebf261d111e16fa9612c1f7a5e1f884f12bd53a664dfd2", - "sha256:f913492e1663d3c36f502e5e9ba6cd13cf19d7fab50aa13239e420fef95e1396" + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], - "version": "==19.2.0" + "version": "==19.3.0" }, "backports.csv": { "hashes": [ @@ -73,43 +65,43 @@ }, "certifi": { "hashes": [ - "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", - "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" + "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", + "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" ], - "version": "==2019.9.11" + "version": "==2019.11.28" }, "cffi": { "hashes": [ - "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774", - "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d", - "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90", - "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b", - "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63", - "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45", - "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25", - "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3", - "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b", - "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647", - "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016", - "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4", - "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb", - "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753", - "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7", - "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9", - "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f", - "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8", - "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f", - "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc", - "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42", - "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3", - "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909", - "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45", - "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d", - "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512", - "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff", - "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201" - ], - "version": "==1.12.3" + "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", + "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", + "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", + "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", + "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", + "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", + "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", + "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", + "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", + "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", + "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", + "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", + "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", + "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", + "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", + "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", + "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", + "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", + "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", + "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", + "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", + "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", + "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", + "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", + "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", + "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", + "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", + "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + ], + "version": "==1.14.0" }, "chardet": { "hashes": [ @@ -120,24 +112,29 @@ }, "cryptography": { "hashes": [ - "sha256:24b61e5fcb506424d3ec4e18bca995833839bf13c59fc43e530e488f28d46b8c", - "sha256:25dd1581a183e9e7a806fe0543f485103232f940fcfc301db65e630512cce643", - "sha256:3452bba7c21c69f2df772762be0066c7ed5dc65df494a1d53a58b683a83e1216", - "sha256:41a0be220dd1ed9e998f5891948306eb8c812b512dc398e5a01846d855050799", - "sha256:5751d8a11b956fbfa314f6553d186b94aa70fdb03d8a4d4f1c82dcacf0cbe28a", - "sha256:5f61c7d749048fa6e3322258b4263463bfccefecb0dd731b6561cb617a1d9bb9", - "sha256:72e24c521fa2106f19623a3851e9f89ddfdeb9ac63871c7643790f872a305dfc", - "sha256:7b97ae6ef5cba2e3bb14256625423413d5ce8d1abb91d4f29b6d1a081da765f8", - "sha256:961e886d8a3590fd2c723cf07be14e2a91cf53c25f02435c04d39e90780e3b53", - "sha256:96d8473848e984184b6728e2c9d391482008646276c3ff084a1bd89e15ff53a1", - "sha256:ae536da50c7ad1e002c3eee101871d93abdc90d9c5f651818450a0d3af718609", - "sha256:b0db0cecf396033abb4a93c95d1602f268b3a68bb0a9cc06a7cff587bb9a7292", - "sha256:cfee9164954c186b191b91d4193989ca994703b2fff406f71cf454a2d3c7327e", - "sha256:e6347742ac8f35ded4a46ff835c60e68c22a536a8ae5c4422966d06946b6d4c6", - "sha256:f27d93f0139a3c056172ebb5d4f9056e770fdf0206c2f422ff2ebbad142e09ed", - "sha256:f57b76e46a58b63d1c6375017f4564a28f19a5ca912691fd2e4261b3414b618d" - ], - "version": "==2.7" + "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", + "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", + "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", + "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", + "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", + "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", + "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", + "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", + "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", + "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", + "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", + "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", + "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", + "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", + "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", + "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", + "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", + "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", + "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", + "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", + "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" + ], + "version": "==2.8" }, "deprecated": { "hashes": [ @@ -155,9 +152,9 @@ }, "future": { "hashes": [ - "sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8" + "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d" ], - "version": "==0.17.1" + "version": "==0.18.2" }, "idna": { "hashes": [ @@ -178,42 +175,29 @@ "sha256:6a00fa799baf1385cf9620bd01bcc815aa56e6970342a567bcfea0c4d21abe5f", "sha256:b59c86b67b9027a86e841a49efc41025bcc3b1b0308629617b66b7011e52db5a" ], - "markers": "sys_platform == 'linux2' or sys_platform == 'linux'", "version": "==3.1" }, "multidict": { "hashes": [ - "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f", - "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3", - "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef", - "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b", - "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73", - "sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc", - "sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3", - "sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd", - "sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351", - "sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941", - "sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d", - "sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1", - "sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b", - "sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a", - "sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3", - "sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7", - "sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0", - "sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0", - "sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014", - "sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5", - "sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036", - "sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d", - "sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a", - "sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce", - "sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1", - "sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a", - "sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9", - "sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7", - "sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b" - ], - "version": "==4.5.2" + "sha256:13f3ebdb5693944f52faa7b2065b751cb7e578b8dd0a5bb8e4ab05ad0188b85e", + "sha256:26502cefa86d79b86752e96639352c7247846515c864d7c2eb85d036752b643c", + "sha256:4fba5204d32d5c52439f88437d33ad14b5f228e25072a192453f658bddfe45a7", + "sha256:527124ef435f39a37b279653ad0238ff606b58328ca7989a6df372fd75d7fe26", + "sha256:5414f388ffd78c57e77bd253cf829373721f450613de53dc85a08e34d806e8eb", + "sha256:5eee66f882ab35674944dfa0d28b57fa51e160b4dce0ce19e47f495fdae70703", + "sha256:63810343ea07f5cd86ba66ab66706243a6f5af075eea50c01e39b4ad6bc3c57a", + "sha256:6bd10adf9f0d6a98ccc792ab6f83d18674775986ba9bacd376b643fe35633357", + "sha256:83c6ddf0add57c6b8a7de0bc7e2d656be3eefeff7c922af9a9aae7e49f225625", + "sha256:93166e0f5379cf6cd29746989f8a594fa7204dcae2e9335ddba39c870a287e1c", + "sha256:9a7b115ee0b9b92d10ebc246811d8f55d0c57e82dbb6a26b23c9a9a6ad40ce0c", + "sha256:a38baa3046cce174a07a59952c9f876ae8875ef3559709639c17fdf21f7b30dd", + "sha256:a6d219f49821f4b2c85c6d426346a5d84dab6daa6f85ca3da6c00ed05b54022d", + "sha256:a8ed33e8f9b67e3b592c56567135bb42e7e0e97417a4b6a771e60898dfd5182b", + "sha256:d7d428488c67b09b26928950a395e41cc72bb9c3d5abfe9f0521940ee4f796d4", + "sha256:dcfed56aa085b89d644af17442cdc2debaa73388feba4b8026446d168ca8dad7", + "sha256:f29b885e4903bd57a7789f09fe9d60b6475a6c1a4c0eca874d8558f00f9d4b51" + ], + "version": "==4.7.4" }, "pycparser": { "hashes": [ @@ -237,24 +221,24 @@ }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.12.0" + "version": "==1.14.0" }, "synapseclient": { "hashes": [ - "sha256:3e855444586be80630c4f452a594443a82775bd17cc2904eb38880d3a8f34ebd" + "sha256:d739a872b8135a82c79bef88312b2b6acf874fa1e1cb37e2d4d26bcda298cd2d" ], "index": "pypi", - "version": "==1.9.3" + "version": "==1.9.4" }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "version": "==1.25.6" + "version": "==1.25.8" }, "wrapt": { "hashes": [ @@ -264,35 +248,48 @@ }, "yarl": { "hashes": [ - "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9", - "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f", - "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb", - "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320", - "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842", - "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0", - "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829", - "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310", - "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4", - "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8", - "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1" - ], - "version": "==1.3.0" + "sha256:0c2ab325d33f1b824734b3ef51d4d54a54e0e7a23d13b86974507602334c2cce", + "sha256:0ca2f395591bbd85ddd50a82eb1fde9c1066fafe888c5c7cc1d810cf03fd3cc6", + "sha256:2098a4b4b9d75ee352807a95cdf5f10180db903bc5b7270715c6bbe2551f64ce", + "sha256:25e66e5e2007c7a39541ca13b559cd8ebc2ad8fe00ea94a2aad28a9b1e44e5ae", + "sha256:26d7c90cb04dee1665282a5d1a998defc1a9e012fdca0f33396f81508f49696d", + "sha256:308b98b0c8cd1dfef1a0311dc5e38ae8f9b58349226aa0533f15a16717ad702f", + "sha256:3ce3d4f7c6b69c4e4f0704b32eca8123b9c58ae91af740481aa57d7857b5e41b", + "sha256:58cd9c469eced558cd81aa3f484b2924e8897049e06889e8ff2510435b7ef74b", + "sha256:5b10eb0e7f044cf0b035112446b26a3a2946bca9d7d7edb5e54a2ad2f6652abb", + "sha256:6faa19d3824c21bcbfdfce5171e193c8b4ddafdf0ac3f129ccf0cdfcb083e462", + "sha256:944494be42fa630134bf907714d40207e646fd5a94423c90d5b514f7b0713fea", + "sha256:a161de7e50224e8e3de6e184707476b5a989037dcb24292b391a3d66ff158e70", + "sha256:a4844ebb2be14768f7994f2017f70aca39d658a96c786211be5ddbe1c68794c1", + "sha256:c2b509ac3d4b988ae8769901c66345425e361d518aecbe4acbfc2567e416626a", + "sha256:c9959d49a77b0e07559e579f38b2f3711c2b8716b8410b320bf9713013215a1b", + "sha256:d8cdee92bc930d8b09d8bd2043cedd544d9c8bd7436a77678dd602467a993080", + "sha256:e15199cdb423316e15f108f51249e44eb156ae5dba232cb73be555324a1d49c2" + ], + "version": "==1.4.2" } }, "develop": { - "atomicwrites": { + "astroid": { "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", + "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42" ], - "version": "==1.3.0" + "version": "==2.3.3" }, "attrs": { "hashes": [ - "sha256:ec20e7a4825331c1b5ebf261d111e16fa9612c1f7a5e1f884f12bd53a664dfd2", - "sha256:f913492e1663d3c36f502e5e9ba6cd13cf19d7fab50aa13239e420fef95e1396" + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" ], - "version": "==19.2.0" + "version": "==19.3.0" + }, + "autopep8": { + "hashes": [ + "sha256:0f592a0447acea0c2b0a9602be1e4e3d86db52badd2e3c84f0193bfd89fd3a43" + ], + "index": "pypi", + "version": "==1.5" }, "bleach": { "hashes": [ @@ -303,10 +300,43 @@ }, "certifi": { "hashes": [ - "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50", - "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" + "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", + "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" ], - "version": "==2019.9.11" + "version": "==2019.11.28" + }, + "cffi": { + "hashes": [ + "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", + "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b", + "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac", + "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0", + "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384", + "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26", + "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6", + "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b", + "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e", + "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd", + "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2", + "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66", + "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc", + "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8", + "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55", + "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4", + "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5", + "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d", + "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78", + "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa", + "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793", + "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f", + "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a", + "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f", + "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30", + "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f", + "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3", + "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c" + ], + "version": "==1.14.0" }, "chardet": { "hashes": [ @@ -315,13 +345,89 @@ ], "version": "==3.0.4" }, + "coverage": { + "hashes": [ + "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", + "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", + "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", + "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", + "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", + "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", + "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", + "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", + "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", + "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", + "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", + "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", + "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", + "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", + "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", + "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", + "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", + "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", + "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", + "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", + "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", + "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", + "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", + "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", + "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", + "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", + "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", + "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", + "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", + "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", + "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" + ], + "index": "pypi", + "version": "==5.0.3" + }, + "coveralls": { + "hashes": [ + "sha256:0a102a9326933e23213f29103b08f148c97fc3128292c3aa24fae1e773940650", + "sha256:b4b21b15f4a5297794b5393cc40f720ef70c50f20772325d26965d96000ce0ca" + ], + "index": "pypi", + "version": "==1.11.0" + }, + "cryptography": { + "hashes": [ + "sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c", + "sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595", + "sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad", + "sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651", + "sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2", + "sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff", + "sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d", + "sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42", + "sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d", + "sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e", + "sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912", + "sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793", + "sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13", + "sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7", + "sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0", + "sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879", + "sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f", + "sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9", + "sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2", + "sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf", + "sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8" + ], + "version": "==2.8" + }, + "docopt": { + "hashes": [ + "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" + ], + "version": "==0.6.2" + }, "docutils": { "hashes": [ - "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0", - "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827", - "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99" + "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af", + "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc" ], - "version": "==0.15.2" + "version": "==0.16" }, "idna": { "hashes": [ @@ -332,25 +438,80 @@ }, "importlib-metadata": { "hashes": [ - "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", - "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" + "sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302", + "sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b" ], "markers": "python_version < '3.8'", - "version": "==0.23" + "version": "==1.5.0" + }, + "isort": { + "hashes": [ + "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", + "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" + ], + "version": "==4.3.21" + }, + "jeepney": { + "hashes": [ + "sha256:0ba6d8c597e9bef1ebd18aaec595f942a264e25c1a48f164d46120eacaa2e9bb", + "sha256:6f45dce1125cf6c58a1c88123d3831f36a789f9204fbad3172eac15f8ccd08d0" + ], + "markers": "sys_platform == 'linux'", + "version": "==0.4.2" + }, + "keyring": { + "hashes": [ + "sha256:26edbe23dd0d79682b9c2cf825e58376fa87412ba4c94018edbbcabb7dcedfcf", + "sha256:445d9521b4fcf900e51c075112e25ddcf8af1db7d1d717380b64eda2cda84abc" + ], + "version": "==12.0.2" + }, + "lazy-object-proxy": { + "hashes": [ + "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", + "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", + "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", + "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", + "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", + "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", + "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", + "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", + "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", + "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", + "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", + "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", + "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", + "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", + "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", + "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", + "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", + "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", + "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", + "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", + "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" + ], + "version": "==1.4.3" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" }, "more-itertools": { "hashes": [ - "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", - "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c", + "sha256:b1ddb932186d8a6ac451e1d95844b382f55e12686d51ca0c68b6f61f2ab7a507" ], - "version": "==7.2.0" + "version": "==8.2.0" }, "packaging": { "hashes": [ - "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", - "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", + "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" ], - "version": "==19.2" + "version": "==20.1" }, "pkginfo": { "hashes": [ @@ -361,39 +522,92 @@ }, "pluggy": { "hashes": [ - "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", - "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], - "version": "==0.13.0" + "version": "==0.13.1" }, "py": { "hashes": [ - "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", - "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa", + "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0" + ], + "version": "==1.8.1" + }, + "pycodestyle": { + "hashes": [ + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" ], - "version": "==1.8.0" + "version": "==2.5.0" + }, + "pycparser": { + "hashes": [ + "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + ], + "version": "==2.19" }, "pygments": { "hashes": [ - "sha256:71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127", - "sha256:881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297" + "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", + "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" ], - "version": "==2.4.2" + "version": "==2.5.2" + }, + "pylint": { + "hashes": [ + "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd", + "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4" + ], + "index": "pypi", + "version": "==2.4.4" }, "pyparsing": { "hashes": [ - "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", - "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" + "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f", + "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec" ], - "version": "==2.4.2" + "version": "==2.4.6" }, "pytest": { "hashes": [ - "sha256:13c1c9b22127a77fc684eee24791efafcef343335d855e3573791c68588fe1a5", - "sha256:d8ba7be9466f55ef96ba203fc0f90d0cf212f2f927e69186e1353e30bc7f62e5" + "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", + "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" ], "index": "pypi", - "version": "==5.2.0" + "version": "==5.3.5" + }, + "pytest-asyncio": { + "hashes": [ + "sha256:9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf", + "sha256:d734718e25cfc32d2bf78d346e99d33724deeba774cc4afdf491530c6184b63b" + ], + "index": "pypi", + "version": "==0.10.0" + }, + "pytest-cov": { + "hashes": [ + "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b", + "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626" + ], + "index": "pypi", + "version": "==2.8.1" + }, + "pytest-mock": { + "hashes": [ + "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f", + "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307" + ], + "index": "pypi", + "version": "==2.0.0" + }, + "pytest-pylint": { + "hashes": [ + "sha256:3996a55ba66ce8ddf150754d8549567a4b067d63fa4513fdfd3325c7553c8075", + "sha256:b3f83f4525b2cbd019e9e46b4ee9c4ccee82bde66edf9872690ccfdc75456703" + ], + "index": "pypi", + "version": "==0.15.0" }, "readme-renderer": { "hashes": [ @@ -416,41 +630,75 @@ ], "version": "==0.9.1" }, + "secretstorage": { + "hashes": [ + "sha256:3af65c87765323e6f64c83575b05393f9e003431959c9395d1791d51497f29b6" + ], + "markers": "sys_platform == 'linux2' or sys_platform == 'linux'", + "version": "==2.3.1" + }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.12.0" + "version": "==1.14.0" }, "tqdm": { "hashes": [ - "sha256:abc25d0ce2397d070ef07d8c7e706aede7920da163c64997585d42d3537ece3d", - "sha256:dd3fcca8488bb1d416aa7469d2f277902f26260c45aa86b667b074cd44b3b115" + "sha256:251ee8440dbda126b8dfa8a7c028eb3f13704898caaef7caa699b35e119301e2", + "sha256:fe231261cfcbc6f4a99165455f8f6b9ef4e1032a6e29bccf168b4bf42012f09c" ], - "version": "==4.36.1" + "version": "==4.42.1" }, "twine": { "hashes": [ - "sha256:5319dd3e02ac73fcddcd94f035b9631589ab5d23e1f4699d57365199d85261e1", - "sha256:9fe7091715c7576df166df8ef6654e61bada39571783f2fd415bdcba867c6993" + "sha256:c1af8ca391e43b0a06bbc155f7f67db0bf0d19d284bfc88d1675da497a946124", + "sha256:d561a5e511f70275e5a485a6275ff61851c16ffcb3a95a602189161112d9f160" ], "index": "pypi", - "version": "==2.0.0" + "version": "==3.1.1" + }, + "typed-ast": { + "hashes": [ + "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", + "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", + "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", + "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", + "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", + "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", + "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", + "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", + "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", + "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", + "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", + "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", + "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", + "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", + "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", + "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", + "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", + "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", + "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", + "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", + "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" + ], + "markers": "implementation_name == 'cpython' and python_version < '3.8'", + "version": "==1.4.1" }, "urllib3": { "hashes": [ - "sha256:3de946ffbed6e6746608990594d08faac602528ac7015ac28d33cee6a45b7398", - "sha256:9a107b99a5393caf59c7aa3c1249c16e6879447533d0887f4336dde834c7be86" + "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", + "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" ], - "version": "==1.25.6" + "version": "==1.25.8" }, "wcwidth": { "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", + "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8" ], - "version": "==0.1.7" + "version": "==0.1.8" }, "webencodings": { "hashes": [ @@ -459,12 +707,26 @@ ], "version": "==0.5.1" }, + "wheel": { + "hashes": [ + "sha256:8788e9155fe14f54164c1b9eb0a319d98ef02c160725587ad60f14ddc57b6f96", + "sha256:df277cb51e61359aba502208d680f90c0493adec6f0e848af94948778aed386e" + ], + "index": "pypi", + "version": "==0.34.2" + }, + "wrapt": { + "hashes": [ + "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1" + ], + "version": "==1.11.2" + }, "zipp": { "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + "sha256:5c56e330306215cd3553342cfafc73dda2c60792384117893f3a83f8a1209f50", + "sha256:d65287feb793213ffe11c0f31b81602be31448f38aeb8ffc2eb286c4f6f6657e" ], - "version": "==0.6.0" + "version": "==2.2.0" } } } diff --git a/README.md b/README.md index 9df4f06..574837a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,70 @@ # Synapse Downloader Utility for downloading large datasets from Synapse. + +## Dependencies + +- [Python3.7](https://www.python.org/) +- A [Synapse](https://www.synapse.org/) account with a username/password. Authentication through a 3rd party (.e.g., Google) will not work, you must have a Synapse user/pass for the [API to authenticate](http://docs.synapse.org/python/#connecting-to-synapse). + +## Install + +```bash +pip install synapse-downloader +``` + +## Configuration + +Your Synapse credential can be provided on the command line (`--username`, `--password`) or via environment variables. + +```bash +SYNAPSE_USERNAME=your-synapse-username +SYNAPSE_PASSWORD=your-synapse-password +``` + +## Usage + +```text +usage: synapse-downloader [-h] [-u USERNAME] [-p PASSWORD] [-ll LOG_LEVEL] + [-ld LOG_DIR] [-dt DOWNLOAD_TIMEOUT] [-w] [-wc] [-c] + [-ci [COMPARE_IGNORE]] + entity-id download-path + +positional arguments: + entity-id The ID of the Synapse entity to download or compare + (Project, Folder or File). + download-path The local path to save the files to or to compare. + +optional arguments: + -h, --help show this help message and exit + -u USERNAME, --username USERNAME + Synapse username. + -p PASSWORD, --password PASSWORD + Synapse password. + -ll LOG_LEVEL, --log-level LOG_LEVEL + Set the logging level. + -ld LOG_DIR, --log-dir LOG_DIR + Set the directory where the log file will be written. + -dt DOWNLOAD_TIMEOUT, --download-timeout DOWNLOAD_TIMEOUT + Set the maximum time (in seconds) a file can download + before it is canceled. + -w, --with-view Use an entity view for loading file info. Fastest for + large projects. + -wc, --with-compare Run the comparison after downloading everything. + -c, --compare Compare a local directory against a remote project or + folder. + -ci [COMPARE_IGNORE], --compare-ignore [COMPARE_IGNORE] + Path to directories or files to ignore when comparing. + +``` + +## Development Setup + +```bash +pipenv --three +pipenv shell +make pip_install +make build +make install_local +``` +See [Makefile](Makefile) for all commands. diff --git a/setup.py b/setup.py index 1ef40e2..179a5a7 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="synapse-downloader", - version="0.0.b39", + version="0.0.1", author="Patrick Stout", author_email="pstout@prevagroup.com", license="Apache2", diff --git a/src/synapse_downloader/cli.py b/src/synapse_downloader/cli.py index 4025088..4257f9b 100644 --- a/src/synapse_downloader/cli.py +++ b/src/synapse_downloader/cli.py @@ -55,7 +55,7 @@ def main(args=None): default=SynapseProxy.Aio.FILE_DOWNLOAD_TIMEOUT) parser.add_argument('-w', '--with-view', - help='Use an entity view for loading file info. Fastest for large projects. Only available for "-s new or basic" and "-c"', + help='Use an entity view for loading file info. Fastest for large projects.', default=False, action='store_true') diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..48343aa --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,91 @@ +import pytest +import os +import json +import shutil +import tempfile +from .synapse_test_helper import SynapseTestHelper +from src.synapse_downloader.core import SynapseProxy + +# Load Environment variables. +module_dir = os.path.dirname(os.path.abspath(__file__)) + +test_env_file = os.path.join(module_dir, 'private.test.env.json') + +if os.path.isfile(test_env_file): + with open(test_env_file) as f: + config = json.load(f).get('test') + + for key, value in config.items(): + os.environ[key] = value +else: + print('WARNING: Test environment file not found at: {0}'.format(test_env_file)) + + +@pytest.fixture(scope='module') +def syn_client(): + return SynapseProxy.client() + + +@pytest.fixture(scope='module') +def syn_test_helper(): + """ + Provides the SynapseTestHelper as a fixture per session. + """ + helper = SynapseTestHelper() + yield helper + helper.dispose() + + +@pytest.fixture(scope='module') +def syn_test_helper_class(): + """ + Provides the SynapseTestHelper as a fixture per session. + """ + helper = SynapseTestHelper() + yield helper + helper.dispose() + + +@pytest.fixture(scope='module') +def mk_tempdir(): + created = [] + + def _mk(): + path = tempfile.mkdtemp() + created.append(path) + return path + + yield _mk + + for path in created: + if os.path.isdir(path): + shutil.rmtree(path) + + +@pytest.fixture(scope='module') +def mk_tempfile(mk_tempdir, syn_test_helper): + temp_dir = mk_tempdir() + + def _mk(content=syn_test_helper.uniq_name()): + fd, tmp_filename = tempfile.mkstemp(dir=temp_dir) + with os.fdopen(fd, 'w') as tmp: + tmp.write(content) + return tmp_filename + + yield _mk + + if os.path.isdir(temp_dir): + shutil.rmtree(temp_dir) + + +@pytest.fixture(scope='module') +def write_file(syn_test_helper): + def _write(full_path, content=syn_test_helper.uniq_name()): + # Create the directory if it doesn't exist. + if not os.path.exists(os.path.dirname(full_path)): + os.makedirs(os.path.dirname(full_path)) + + with open(full_path, mode='w') as f: + f.write(content) + + yield _write diff --git a/tests/synapse_downloader/compare/__init__.py b/tests/synapse_downloader/compare/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/synapse_downloader/compare/test_compare.py b/tests/synapse_downloader/compare/test_compare.py new file mode 100644 index 0000000..2851ccd --- /dev/null +++ b/tests/synapse_downloader/compare/test_compare.py @@ -0,0 +1,61 @@ +import pytest +import os +from src.synapse_downloader.compare.comparer import Comparer + + +@pytest.fixture(scope='module') +def syn_data(syn_test_helper_class, mk_tempdir, write_file): + source_dir = mk_tempdir() + + project = syn_test_helper_class.create_project(prefix='Project-') + file0 = os.path.join(source_dir, 'file0.txt') + write_file(file0) + syn_file0 = syn_test_helper_class.create_file(name=os.path.basename(file0), path=file0, parent=project) + + folder1 = os.path.join(source_dir, 'folder1') + syn_folder1 = syn_test_helper_class.create_folder(name=os.path.basename(folder1), parent=project) + + file1 = os.path.join(folder1, 'file1.txt') + write_file(file1) + syn_file1 = syn_test_helper_class.create_file(name=os.path.basename(file1), path=file1, parent=syn_folder1) + + folder2 = os.path.join(folder1, 'folder2') + syn_folder2 = syn_test_helper_class.create_folder(name=os.path.basename(folder2), parent=syn_folder1) + + file2 = os.path.join(folder2, 'file2.txt') + write_file(file2) + syn_file2 = syn_test_helper_class.create_file(name=os.path.basename(file2), path=file2, parent=syn_folder2) + + return { + 'source_dir': source_dir, + 'project': project, + 'file0': file0, + 'syn_file0': syn_file0, + 'syn_folder1': syn_folder1, + 'file1': file1, + 'syn_file1': syn_file1, + 'syn_folder2': syn_folder2, + 'file2': file2, + 'syn_file2': syn_file2 + } + + +def test_it_compares_everything(syn_data): + source_dir = syn_data['source_dir'] + project = syn_data['project'] + + comparer = Comparer(project.id, source_dir) + comparer.start() + assert comparer.has_errors is False + + +def test_it_compares_everything_with_entity_view(syn_data, capsys): + source_dir = syn_data['source_dir'] + project = syn_data['project'] + + comparer = Comparer(project.id, source_dir) + comparer.start() + assert comparer.has_errors is False + # TODO: Figure out how to test the view was used. + +# TODO: Add additional tests... diff --git a/tests/synapse_downloader/core/__init__.py b/tests/synapse_downloader/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/synapse_downloader/download/__init__.py b/tests/synapse_downloader/download/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/synapse_downloader/download/test_downloader.py b/tests/synapse_downloader/download/test_downloader.py new file mode 100644 index 0000000..c063505 --- /dev/null +++ b/tests/synapse_downloader/download/test_downloader.py @@ -0,0 +1,79 @@ +import pytest +import os +from src.synapse_downloader.download.downloader import Downloader + + +@pytest.fixture(scope='module') +def syn_data(syn_test_helper_class, mk_tempdir, mk_tempfile): + download_dir = mk_tempdir() + + project = syn_test_helper_class.create_project(prefix='Project-') + file0 = mk_tempfile() + syn_file0 = syn_test_helper_class.create_file(prefix='file0-', path=file0, parent=project) + + syn_folder1 = syn_test_helper_class.create_folder(prefix='folder1-', parent=project) + file1 = mk_tempfile() + syn_file1 = syn_test_helper_class.create_file(prefix='file1-', path=file1, parent=syn_folder1) + + syn_folder2 = syn_test_helper_class.create_folder(prefix='folder2-', parent=syn_folder1) + file2 = mk_tempfile() + syn_file2 = syn_test_helper_class.create_file(prefix='file2-', path=file2, parent=syn_folder2) + return { + 'download_dir': download_dir, + 'project': project, + 'file0': file0, + 'syn_file0': syn_file0, + 'syn_folder1': syn_folder1, + 'file1': file1, + 'syn_file1': syn_file1, + 'syn_folder2': syn_folder2, + 'file2': file2, + 'syn_file2': syn_file2 + } + + +def assert_local_download_data(syn_data): + download_dir = syn_data['download_dir'] + file0 = syn_data['file0'] + syn_folder1 = syn_data['syn_folder1'] + file1 = syn_data['file1'] + syn_folder2 = syn_data['syn_folder2'] + file2 = syn_data['file2'] + + file0_local_path = os.path.join(download_dir, os.path.basename(file0)) + assert os.path.isfile(file0_local_path) + + folder1_local_path = os.path.join(download_dir, syn_folder1.name) + assert os.path.isdir(folder1_local_path) + + file1_local_path = os.path.join(folder1_local_path, os.path.basename(file1)) + assert os.path.isfile(file1_local_path) + + folder2_local_path = os.path.join(folder1_local_path, syn_folder2.name) + assert os.path.isdir(folder2_local_path) + + file2_local_path = os.path.join(folder2_local_path, os.path.basename(file2)) + assert os.path.isfile(file2_local_path) + + +def test_it_downloads_everything(syn_data): + download_dir = syn_data['download_dir'] + project = syn_data['project'] + + downloader = Downloader(project.id, download_dir) + downloader.start() + assert downloader.has_errors is False + assert_local_download_data(syn_data) + + +def test_it_downloads_everything_with_entity_view(syn_data): + download_dir = syn_data['download_dir'] + project = syn_data['project'] + + downloader = Downloader(project.id, download_dir, with_view=True) + downloader.start() + assert downloader.has_errors is False + # TODO: Figure out how to test the view was used. + assert_local_download_data(syn_data) + +# TODO: Add additional tests... diff --git a/tests/synapse_downloader/test_cli.py b/tests/synapse_downloader/test_cli.py index 2592aaf..5818924 100644 --- a/tests/synapse_downloader/test_cli.py +++ b/tests/synapse_downloader/test_cli.py @@ -3,4 +3,5 @@ def test_cli(): - main(['syn21064576', '/tmp/syn-download', '-c']) + # TODO: test this + pass diff --git a/tests/synapse_downloader/test_synapse_downloader.py b/tests/synapse_downloader/test_synapse_downloader.py deleted file mode 100644 index 8b13789..0000000 --- a/tests/synapse_downloader/test_synapse_downloader.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tests/synapse_test_helper.py b/tests/synapse_test_helper.py new file mode 100644 index 0000000..dd68920 --- /dev/null +++ b/tests/synapse_test_helper.py @@ -0,0 +1,156 @@ +import uuid +from src.synapse_downloader.core import SynapseProxy +from synapseclient import Project, Folder, File, Team, Wiki + + +class SynapseTestHelper: + """Test helper for working with Synapse.""" + + _test_id = uuid.uuid4().hex + _trash = [] + + def test_id(self): + """Gets a unique value to use as a test identifier. + + This string can be used to help identify the test instance that created the object. + """ + return self._test_id + + def uniq_name(self, prefix='', postfix=''): + return "{0}{1}_{2}{3}".format(prefix, self.test_id(), uuid.uuid4().hex, postfix) + + def fake_synapse_id(self): + """Gets a Synapse entity ID that does not exist in Synapse. + + Returns: + String + """ + return 'syn000' + + def dispose_of(self, *syn_objects): + """Adds a Synapse object to the list of objects to be deleted.""" + for syn_object in syn_objects: + if syn_object not in self._trash: + self._trash.append(syn_object) + + def dispose(self): + """Cleans up any Synapse objects that were created during testing. + + This method needs to be manually called after each or all tests are done. + """ + projects = [] + folders = [] + files = [] + teams = [] + wikis = [] + others = [] + + for obj in self._trash: + if isinstance(obj, Project): + projects.append(obj) + elif isinstance(obj, Folder): + folders.append(obj) + elif isinstance(obj, File): + files.append(obj) + elif isinstance(obj, Team): + teams.append(obj) + elif isinstance(obj, Wiki): + wikis.append(obj) + else: + others.append(obj) + + for syn_obj in wikis: + try: + SynapseProxy.client().delete(syn_obj) + except: + pass + self._trash.remove(syn_obj) + + for syn_obj in files: + try: + SynapseProxy.client().delete(syn_obj) + except: + pass + self._trash.remove(syn_obj) + + for syn_obj in folders: + try: + SynapseProxy.client().delete(syn_obj) + except: + pass + self._trash.remove(syn_obj) + + for syn_obj in projects: + try: + SynapseProxy.client().delete(syn_obj) + except: + pass + self._trash.remove(syn_obj) + + for syn_obj in teams: + try: + SynapseProxy.client().delete(syn_obj) + except: + pass + self._trash.remove(syn_obj) + + for obj in others: + print('WARNING: Non-Supported object found: {0}'.format(obj)) + self._trash.remove(obj) + + def create_project(self, **kwargs): + """Creates a new Project and adds it to the trash queue.""" + if 'name' not in kwargs: + kwargs['name'] = self.uniq_name(prefix=kwargs.get('prefix', '')) + + kwargs.pop('prefix', None) + + project = SynapseProxy.client().store(Project(**kwargs)) + self.dispose_of(project) + return project + + def create_folder(self, **kwargs): + """Creates a new Folder and adds it to the trash queue.""" + if 'name' not in kwargs: + kwargs['name'] = self.uniq_name(prefix=kwargs.get('prefix', '')) + + kwargs.pop('prefix', None) + + folder = SynapseProxy.client().store(Folder(**kwargs)) + self.dispose_of(folder) + return folder + + def create_file(self, **kwargs): + """Creates a new File and adds it to the trash queue.""" + if 'name' not in kwargs: + kwargs['name'] = self.uniq_name(prefix=kwargs.get('prefix', '')) + + kwargs.pop('prefix', None) + + file = SynapseProxy.client().store(File(**kwargs)) + self.dispose_of(file) + return file + + def create_team(self, **kwargs): + """Creates a new Team and adds it to the trash queue.""" + if 'name' not in kwargs: + kwargs['name'] = self.uniq_name(prefix=kwargs.get('prefix', '')) + + kwargs.pop('prefix', None) + + team = SynapseProxy.client().store(Team(**kwargs)) + self.dispose_of(team) + return team + + def create_wiki(self, **kwargs): + """Creates a new Wiki and adds it to the trash queue.""" + if 'title' not in kwargs: + kwargs['title'] = self.uniq_name(prefix=kwargs.get('prefix', '')) + kwargs.pop('prefix', None) + + if 'markdown' not in kwargs: + kwargs['markdown'] = 'My Wiki {0}'.format(kwargs['title']) + + wiki = SynapseProxy.client().store(Wiki(**kwargs)) + self.dispose_of(wiki) + return wiki diff --git a/tests/templates/private.test.env.json b/tests/templates/private.test.env.json new file mode 100644 index 0000000..ed50458 --- /dev/null +++ b/tests/templates/private.test.env.json @@ -0,0 +1,8 @@ +{ + "description": "This file contains environment variables that are used during tests.", + "test": { + "SYNAPSE_USERNAME": "...set to a Synapse username that is suitable for testing...", + "SYNAPSE_PASSWORD": "...set to Synapse password...", + "LOG_LEVEL": "DEBUG" + } +} \ No newline at end of file diff --git a/tests/test_synapse_test_helper.py b/tests/test_synapse_test_helper.py new file mode 100644 index 0000000..cc7e09c --- /dev/null +++ b/tests/test_synapse_test_helper.py @@ -0,0 +1,149 @@ +import os +import pytest +import synapseclient +from synapseclient import Project, Folder, File, Team, Wiki + + +def test_test_id(syn_test_helper): + assert syn_test_helper.test_id() == syn_test_helper._test_id + + +def test_uniq_name(syn_test_helper): + assert syn_test_helper.test_id() in syn_test_helper.uniq_name() + + last_name = None + for i in list(range(3)): + uniq_name = syn_test_helper.uniq_name(prefix='aaa-', postfix='-zzz') + assert uniq_name != last_name + assert uniq_name.startswith( + 'aaa-{0}'.format(syn_test_helper.test_id())) + assert uniq_name.endswith('-zzz') + last_name = uniq_name + + +def test_fake_synapse_id(syn_test_helper, syn_client): + fake_id = syn_test_helper.fake_synapse_id() + + with pytest.raises(synapseclient.exceptions.SynapseHTTPError) as ex: + syn_client.get(fake_id) + + err_str = str(ex.value) + assert 'The resource you are attempting to access cannot be found' in err_str + + +def test_dispose_of(syn_test_helper): + # Add a single object + for obj in [object(), object()]: + syn_test_helper.dispose_of(obj) + assert obj in syn_test_helper._trash + + # Add a list of objects + obj1 = object() + obj2 = object() + syn_test_helper.dispose_of(obj1, obj2) + assert obj1 in syn_test_helper._trash + assert obj2 in syn_test_helper._trash + + # Does not add duplicates + syn_test_helper.dispose_of(obj1, obj2) + assert len(syn_test_helper._trash) == 4 + + +def test_dispose(syn_client, syn_test_helper, mk_tempfile): + project = syn_client.store(Project(name=syn_test_helper.uniq_name())) + + folder = syn_client.store( + Folder(name=syn_test_helper.uniq_name(prefix='Folder '), parent=project)) + + file = syn_client.store(File(name=syn_test_helper.uniq_name( + prefix='File '), path=mk_tempfile(), parent=folder)) + + team = syn_client.store( + Team(name=syn_test_helper.uniq_name(prefix='Team '))) + + wiki = syn_client.store( + Wiki(title=syn_test_helper.uniq_name(prefix='Wiki '), owner=project)) + + wikiChild = syn_client.store(Wiki(title=syn_test_helper.uniq_name( + prefix='Wiki Child '), owner=project, parentWikiId=wiki.id)) + + syn_objects = [project, folder, file, team, wiki, wikiChild] + + for syn_obj in syn_objects: + syn_test_helper.dispose_of(syn_obj) + assert syn_obj in syn_test_helper._trash + + syn_test_helper.dispose() + assert len(syn_test_helper._trash) == 0 + + for syn_obj in syn_objects: + with pytest.raises(synapseclient.exceptions.SynapseHTTPError) as ex: + if isinstance(syn_obj, Wiki): + syn_client.getWiki(syn_obj) + elif isinstance(syn_obj, Team): + syn_client.getTeam(syn_obj.id) + else: + syn_client.get(syn_obj, downloadFile=False) + + err_str = str(ex.value) + assert "Not Found" in err_str or "cannot be found" in err_str or "is in trash can" in err_str or "does not exist" in err_str + + +def test_create_project(syn_test_helper): + # Uses the name arg + name = syn_test_helper.uniq_name() + project = syn_test_helper.create_project(name=name) + assert project.name == name + assert project in syn_test_helper._trash + syn_test_helper.dispose() + assert project not in syn_test_helper._trash + + # Uses the prefix arg + prefix = '-z-z-z-' + project = syn_test_helper.create_project(prefix=prefix) + assert project.name.startswith(prefix) + + # Generates a name + project = syn_test_helper.create_project() + assert syn_test_helper.test_id() in project.name + + +def test_create_team(syn_test_helper): + # Uses the name arg + name = syn_test_helper.uniq_name() + team = syn_test_helper.create_team(name=name) + assert team.name == name + assert team in syn_test_helper._trash + syn_test_helper.dispose() + assert team not in syn_test_helper._trash + + # Uses the prefix arg + prefix = '-z-z-z-' + team = syn_test_helper.create_team(prefix=prefix) + assert team.name.startswith(prefix) + + # Generates a name + team = syn_test_helper.create_team() + assert syn_test_helper.test_id() in team.name + + +def test_create_wiki(syn_test_helper): + project = syn_test_helper.create_project() + + # Uses the title arg + title = syn_test_helper.uniq_name() + wiki = syn_test_helper.create_wiki(title=title, owner=project) + assert wiki.title == title + assert wiki in syn_test_helper._trash + + # Uses the prefix arg + prefix = '-z-z-z-' + wiki = syn_test_helper.create_wiki(prefix=prefix, owner=project) + assert wiki.title.startswith(prefix) + + # Generates a title + wiki = syn_test_helper.create_wiki(owner=project) + assert syn_test_helper.test_id() in wiki.title + + syn_test_helper.dispose() + assert len(syn_test_helper._trash) == 0