From b064648ee6e138bcdcfe2e33a6798c855188c0d9 Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 10:55:53 +0100 Subject: [PATCH 1/8] Publishing syncsketch-1.0.12.0 Update to include support for 3.13 and 3.14 Fix the python_requires as it incorrectly limited to 3.12 which pip doesnt always validate to allow versions such as 3.12.x Add mocked tests with tox to test the package across multiple pythin versions. (>=2.7, <3.15) --- .gitignore | 5 +- README.md | 1 + _build/.buildinfo | 4 +- _build/.doctrees/environment.pickle | Bin 60140 -> 63297 bytes _build/.doctrees/index.doctree | Bin 330166 -> 455784 bytes _build/_static/alabaster.css | 115 +-- _build/_static/base-stemmer.js | 476 +++++++++ _build/_static/basic.css | 23 +- _build/_static/doctools.js | 18 +- _build/_static/english-stemmer.js | 1066 +++++++++++++++++++++ _build/_static/github-banner.svg | 5 + _build/_static/language_data.js | 200 +--- _build/_static/pygments.css | 124 +-- _build/_static/searchtools.js | 211 ++-- _build/_static/sphinx_highlight.js | 67 +- _build/genindex.html | 56 +- _build/index.html | 542 ++++++++--- _build/objects.inv | Bin 718 -> 753 bytes _build/search.html | 13 +- _build/searchindex.js | 2 +- build/lib/syncsketch/__init__.py | 2 +- dist/syncsketch-1.0.12.0-py3-none-any.whl | Bin 0 -> 20978 bytes dist/syncsketch-1.0.12.0.tar.gz | Bin 0 -> 32266 bytes setup.py | 13 +- syncsketch.egg-info/PKG-INFO | 15 +- syncsketch.egg-info/SOURCES.txt | 16 +- syncsketch.egg-info/requires.txt | 5 + syncsketch/__init__.py | 2 +- tests/README.md | 61 ++ tests/__init__.py | 0 tests/conftest.py | 109 +++ tests/test_accounts.py | 39 + tests/test_annotations.py | 145 +++ tests/test_auth.py | 64 ++ tests/test_backward_compat.py | 64 ++ tests/test_connection.py | 65 ++ tests/test_get_json_response.py | 133 +++ tests/test_items.py | 106 ++ tests/test_media_upload.py | 205 ++++ tests/test_projects.py | 158 +++ tests/test_real_file_io.py | 260 +++++ tests/test_reviews.py | 167 ++++ tests/test_shotgrid.py | 130 +++ tests/test_tree.py | 27 + tests/test_users.py | 146 +++ tox.ini | 11 + 46 files changed, 4243 insertions(+), 628 deletions(-) create mode 100644 _build/_static/base-stemmer.js create mode 100644 _build/_static/english-stemmer.js create mode 100644 _build/_static/github-banner.svg create mode 100644 dist/syncsketch-1.0.12.0-py3-none-any.whl create mode 100644 dist/syncsketch-1.0.12.0.tar.gz create mode 100644 tests/README.md create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_accounts.py create mode 100644 tests/test_annotations.py create mode 100644 tests/test_auth.py create mode 100644 tests/test_backward_compat.py create mode 100644 tests/test_connection.py create mode 100644 tests/test_get_json_response.py create mode 100644 tests/test_items.py create mode 100644 tests/test_media_upload.py create mode 100644 tests/test_projects.py create mode 100644 tests/test_real_file_io.py create mode 100644 tests/test_reviews.py create mode 100644 tests/test_shotgrid.py create mode 100644 tests/test_tree.py create mode 100644 tests/test_users.py create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 2fae3d1..ef37262 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,7 @@ .idea/workspace.xml local_test.py __pycache__/ -*.pyc \ No newline at end of file +*.pyc +.tox/ +htmlcov/ +.coverage \ No newline at end of file diff --git a/README.md b/README.md index b08e2ca..ab53009 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ This library was tested with and confirmed on python versions: - 3.10 - 3.11 - 3.12 +- 3.13 #### Installation diff --git a/_build/.buildinfo b/_build/.buildinfo index 3ef5a91..2ea5174 100644 --- a/_build/.buildinfo +++ b/_build/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 92f8d6ac56ccab42ac73d860c02e5024 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: ad357e14ce56b1b9f762fda6051cd040 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/.doctrees/environment.pickle b/_build/.doctrees/environment.pickle index 06c5eab1973655b496dbe5bae9d78eb15f975294..d682858daf44f8339a9ca1ddf9b0229d8ff53674 100644 GIT binary patch literal 63297 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 Y^9^>I(xxdU7B6~|`0%=7b9(%L0QS1PF8}}l literal 60140 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

+u{hCz=XJdO3?raYE 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≶ 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 div { @@ -263,10 +261,6 @@ div.admonition p.last { margin-bottom: 0; } -div.highlight { - background-color: #fff; -} - dt:target, .highlight { background: #FAF3E8; } @@ -454,7 +448,7 @@ ul, ol { } pre { - background: #EEE; + background: unset; padding: 7px 30px; margin: 15px 0px; line-height: 1.3em; @@ -485,15 +479,15 @@ a.reference { border-bottom: 1px dotted #004B6B; } +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + /* Don't put an underline on images */ a.image-reference, a.image-reference:hover { border-bottom: none; } -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - a.footnote-reference { text-decoration: none; font-size: 0.7em; @@ -509,68 +503,7 @@ a:hover tt, a:hover code { background: #EEE; } - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { +@media screen and (max-width: 940px) { body { margin: 0; @@ -580,12 +513,16 @@ a:hover tt, a:hover code { div.documentwrapper { float: none; background: #fff; + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; } div.sphinxsidebar { display: block; float: none; - width: 102.5%; + width: unset; margin: 50px -30px -20px -30px; padding: 10px 20px; background: #333; @@ -620,8 +557,14 @@ a:hover tt, a:hover code { div.body { min-height: 0; + min-width: auto; /* fixes width on small screens, breaks .hll */ padding: 0; } + + .hll { + /* "fixes" the breakage */ + width: max-content; + } .rtd_doc_footer { display: none; @@ -635,13 +578,18 @@ a:hover tt, a:hover code { width: auto; } - .footer { - width: auto; - } - .github { display: none; } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } } @@ -705,4 +653,11 @@ nav#breadcrumbs li+li:before { div.related { display: none; } +} + +img.github { + position: absolute; + top: 0; + border: 0; + right: 0; } \ No newline at end of file diff --git a/_build/_static/base-stemmer.js b/_build/_static/base-stemmer.js new file mode 100644 index 0000000..e6fa0c4 --- /dev/null +++ b/_build/_static/base-stemmer.js @@ -0,0 +1,476 @@ +// @ts-check + +/**@constructor*/ +BaseStemmer = function() { + /** @protected */ + this.current = ''; + this.cursor = 0; + this.limit = 0; + this.limit_backward = 0; + this.bra = 0; + this.ket = 0; + + /** + * @param {string} value + */ + this.setCurrent = function(value) { + this.current = value; + this.cursor = 0; + this.limit = this.current.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }; + + /** + * @return {string} + */ + this.getCurrent = function() { + return this.current; + }; + + /** + * @param {BaseStemmer} other + */ + this.copy_from = function(other) { + /** @protected */ + this.current = other.current; + this.cursor = other.cursor; + this.limit = other.limit; + this.limit_backward = other.limit_backward; + this.bra = other.bra; + this.ket = other.ket; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.in_grouping = function(s, min, max) { + /** @protected */ + if (this.cursor >= this.limit) return false; + var ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) return false; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false; + this.cursor++; + return true; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.go_in_grouping = function(s, min, max) { + /** @protected */ + while (this.cursor < this.limit) { + var ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) + return true; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) + return true; + this.cursor++; + } + return false; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.in_grouping_b = function(s, min, max) { + /** @protected */ + if (this.cursor <= this.limit_backward) return false; + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) return false; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return false; + this.cursor--; + return true; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.go_in_grouping_b = function(s, min, max) { + /** @protected */ + while (this.cursor > this.limit_backward) { + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) return true; + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) return true; + this.cursor--; + } + return false; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.out_grouping = function(s, min, max) { + /** @protected */ + if (this.cursor >= this.limit) return false; + var ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) == 0) { + this.cursor++; + return true; + } + return false; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.go_out_grouping = function(s, min, max) { + /** @protected */ + while (this.cursor < this.limit) { + var ch = this.current.charCodeAt(this.cursor); + if (ch <= max && ch >= min) { + ch -= min; + if ((s[ch >>> 3] & (0X1 << (ch & 0x7))) != 0) { + return true; + } + } + this.cursor++; + } + return false; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.out_grouping_b = function(s, min, max) { + /** @protected */ + if (this.cursor <= this.limit_backward) return false; + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) == 0) { + this.cursor--; + return true; + } + return false; + }; + + /** + * @param {number[]} s + * @param {number} min + * @param {number} max + * @return {boolean} + */ + this.go_out_grouping_b = function(s, min, max) { + /** @protected */ + while (this.cursor > this.limit_backward) { + var ch = this.current.charCodeAt(this.cursor - 1); + if (ch <= max && ch >= min) { + ch -= min; + if ((s[ch >>> 3] & (0x1 << (ch & 0x7))) != 0) { + return true; + } + } + this.cursor--; + } + return false; + }; + + /** + * @param {string} s + * @return {boolean} + */ + this.eq_s = function(s) + { + /** @protected */ + if (this.limit - this.cursor < s.length) return false; + if (this.current.slice(this.cursor, this.cursor + s.length) != s) + { + return false; + } + this.cursor += s.length; + return true; + }; + + /** + * @param {string} s + * @return {boolean} + */ + this.eq_s_b = function(s) + { + /** @protected */ + if (this.cursor - this.limit_backward < s.length) return false; + if (this.current.slice(this.cursor - s.length, this.cursor) != s) + { + return false; + } + this.cursor -= s.length; + return true; + }; + + /** + * @param {Among[]} v + * @return {number} + */ + this.find_among = function(v) + { + /** @protected */ + var i = 0; + var j = v.length; + + var c = this.cursor; + var l = this.limit; + + var common_i = 0; + var common_j = 0; + + var first_key_inspected = false; + + while (true) + { + var k = i + ((j - i) >>> 1); + var diff = 0; + var common = common_i < common_j ? common_i : common_j; // smaller + // w[0]: string, w[1]: substring_i, w[2]: result, w[3]: function (optional) + var w = v[k]; + var i2; + for (i2 = common; i2 < w[0].length; i2++) + { + if (c + common == l) + { + diff = -1; + break; + } + diff = this.current.charCodeAt(c + common) - w[0].charCodeAt(i2); + if (diff != 0) break; + common++; + } + if (diff < 0) + { + j = k; + common_j = common; + } + else + { + i = k; + common_i = common; + } + if (j - i <= 1) + { + if (i > 0) break; // v->s has been inspected + if (j == i) break; // only one item in v + + // - but now we need to go round once more to get + // v->s inspected. This looks messy, but is actually + // the optimal approach. + + if (first_key_inspected) break; + first_key_inspected = true; + } + } + do { + var w = v[i]; + if (common_i >= w[0].length) + { + this.cursor = c + w[0].length; + if (w.length < 4) return w[2]; + var res = w[3](this); + this.cursor = c + w[0].length; + if (res) return w[2]; + } + i = w[1]; + } while (i >= 0); + return 0; + }; + + // find_among_b is for backwards processing. Same comments apply + /** + * @param {Among[]} v + * @return {number} + */ + this.find_among_b = function(v) + { + /** @protected */ + var i = 0; + var j = v.length + + var c = this.cursor; + var lb = this.limit_backward; + + var common_i = 0; + var common_j = 0; + + var first_key_inspected = false; + + while (true) + { + var k = i + ((j - i) >> 1); + var diff = 0; + var common = common_i < common_j ? common_i : common_j; + var w = v[k]; + var i2; + for (i2 = w[0].length - 1 - common; i2 >= 0; i2--) + { + if (c - common == lb) + { + diff = -1; + break; + } + diff = this.current.charCodeAt(c - 1 - common) - w[0].charCodeAt(i2); + if (diff != 0) break; + common++; + } + if (diff < 0) + { + j = k; + common_j = common; + } + else + { + i = k; + common_i = common; + } + if (j - i <= 1) + { + if (i > 0) break; + if (j == i) break; + if (first_key_inspected) break; + first_key_inspected = true; + } + } + do { + var w = v[i]; + if (common_i >= w[0].length) + { + this.cursor = c - w[0].length; + if (w.length < 4) return w[2]; + var res = w[3](this); + this.cursor = c - w[0].length; + if (res) return w[2]; + } + i = w[1]; + } while (i >= 0); + return 0; + }; + + /* to replace chars between c_bra and c_ket in this.current by the + * chars in s. + */ + /** + * @param {number} c_bra + * @param {number} c_ket + * @param {string} s + * @return {number} + */ + this.replace_s = function(c_bra, c_ket, s) + { + /** @protected */ + var adjustment = s.length - (c_ket - c_bra); + this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket); + this.limit += adjustment; + if (this.cursor >= c_ket) this.cursor += adjustment; + else if (this.cursor > c_bra) this.cursor = c_bra; + return adjustment; + }; + + /** + * @return {boolean} + */ + this.slice_check = function() + { + /** @protected */ + if (this.bra < 0 || + this.bra > this.ket || + this.ket > this.limit || + this.limit > this.current.length) + { + return false; + } + return true; + }; + + /** + * @param {number} c_bra + * @return {boolean} + */ + this.slice_from = function(s) + { + /** @protected */ + var result = false; + if (this.slice_check()) + { + this.replace_s(this.bra, this.ket, s); + result = true; + } + return result; + }; + + /** + * @return {boolean} + */ + this.slice_del = function() + { + /** @protected */ + return this.slice_from(""); + }; + + /** + * @param {number} c_bra + * @param {number} c_ket + * @param {string} s + */ + this.insert = function(c_bra, c_ket, s) + { + /** @protected */ + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) this.bra += adjustment; + if (c_bra <= this.ket) this.ket += adjustment; + }; + + /** + * @return {string} + */ + this.slice_to = function() + { + /** @protected */ + var result = ''; + if (this.slice_check()) + { + result = this.current.slice(this.bra, this.ket); + } + return result; + }; + + /** + * @return {string} + */ + this.assign_to = function() + { + /** @protected */ + return this.current.slice(0, this.limit); + }; +}; diff --git a/_build/_static/basic.css b/_build/_static/basic.css index e5179b7..0028826 100644 --- a/_build/_static/basic.css +++ b/_build/_static/basic.css @@ -1,12 +1,5 @@ /* - * basic.css - * ~~~~~~~~~ - * * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ /* -- main layout ----------------------------------------------------------- */ @@ -115,15 +108,11 @@ img { /* -- search page ----------------------------------------------------------- */ ul.search { - margin: 10px 0 0 20px; - padding: 0; + margin-top: 10px; } ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; + padding: 5px 0; } ul.search li a { @@ -752,14 +741,6 @@ abbr, acronym { cursor: help; } -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - /* -- code displays --------------------------------------------------------- */ pre { diff --git a/_build/_static/doctools.js b/_build/_static/doctools.js index 4d67807..807cdb1 100644 --- a/_build/_static/doctools.js +++ b/_build/_static/doctools.js @@ -1,12 +1,5 @@ /* - * doctools.js - * ~~~~~~~~~~~ - * * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -66,7 +59,7 @@ const Documentation = { Object.assign(Documentation.TRANSLATIONS, catalog.messages); Documentation.PLURAL_EXPR = new Function( "n", - `return (${catalog.plural_expr})` + `return (${catalog.plural_expr})`, ); Documentation.LOCALE = catalog.locale; }, @@ -96,7 +89,7 @@ const Documentation = { const togglerElements = document.querySelectorAll("img.toggler"); togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) + el.addEventListener("click", (event) => toggler(event.currentTarget)), ); togglerElements.forEach((el) => (el.style.display = "")); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); @@ -105,14 +98,15 @@ const Documentation = { initOnKeyListeners: () => { // only install a listener if it is really needed if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS + && !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS ) return; document.addEventListener("keydown", (event) => { // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) + return; // bail with special keys if (event.altKey || event.ctrlKey || event.metaKey) return; diff --git a/_build/_static/english-stemmer.js b/_build/_static/english-stemmer.js new file mode 100644 index 0000000..056760e --- /dev/null +++ b/_build/_static/english-stemmer.js @@ -0,0 +1,1066 @@ +// Generated from english.sbl by Snowball 3.0.1 - https://snowballstem.org/ + +/**@constructor*/ +var EnglishStemmer = function() { + var base = new BaseStemmer(); + + /** @const */ var a_0 = [ + ["arsen", -1, -1], + ["commun", -1, -1], + ["emerg", -1, -1], + ["gener", -1, -1], + ["later", -1, -1], + ["organ", -1, -1], + ["past", -1, -1], + ["univers", -1, -1] + ]; + + /** @const */ var a_1 = [ + ["'", -1, 1], + ["'s'", 0, 1], + ["'s", -1, 1] + ]; + + /** @const */ var a_2 = [ + ["ied", -1, 2], + ["s", -1, 3], + ["ies", 1, 2], + ["sses", 1, 1], + ["ss", 1, -1], + ["us", 1, -1] + ]; + + /** @const */ var a_3 = [ + ["succ", -1, 1], + ["proc", -1, 1], + ["exc", -1, 1] + ]; + + /** @const */ var a_4 = [ + ["even", -1, 2], + ["cann", -1, 2], + ["inn", -1, 2], + ["earr", -1, 2], + ["herr", -1, 2], + ["out", -1, 2], + ["y", -1, 1] + ]; + + /** @const */ var a_5 = [ + ["", -1, -1], + ["ed", 0, 2], + ["eed", 1, 1], + ["ing", 0, 3], + ["edly", 0, 2], + ["eedly", 4, 1], + ["ingly", 0, 2] + ]; + + /** @const */ var a_6 = [ + ["", -1, 3], + ["bb", 0, 2], + ["dd", 0, 2], + ["ff", 0, 2], + ["gg", 0, 2], + ["bl", 0, 1], + ["mm", 0, 2], + ["nn", 0, 2], + ["pp", 0, 2], + ["rr", 0, 2], + ["at", 0, 1], + ["tt", 0, 2], + ["iz", 0, 1] + ]; + + /** @const */ var a_7 = [ + ["anci", -1, 3], + ["enci", -1, 2], + ["ogi", -1, 14], + ["li", -1, 16], + ["bli", 3, 12], + ["abli", 4, 4], + ["alli", 3, 8], + ["fulli", 3, 9], + ["lessli", 3, 15], + ["ousli", 3, 10], + ["entli", 3, 5], + ["aliti", -1, 8], + ["biliti", -1, 12], + ["iviti", -1, 11], + ["tional", -1, 1], + ["ational", 14, 7], + ["alism", -1, 8], + ["ation", -1, 7], + ["ization", 17, 6], + ["izer", -1, 6], + ["ator", -1, 7], + ["iveness", -1, 11], + ["fulness", -1, 9], + ["ousness", -1, 10], + ["ogist", -1, 13] + ]; + + /** @const */ var a_8 = [ + ["icate", -1, 4], + ["ative", -1, 6], + ["alize", -1, 3], + ["iciti", -1, 4], + ["ical", -1, 4], + ["tional", -1, 1], + ["ational", 5, 2], + ["ful", -1, 5], + ["ness", -1, 5] + ]; + + /** @const */ var a_9 = [ + ["ic", -1, 1], + ["ance", -1, 1], + ["ence", -1, 1], + ["able", -1, 1], + ["ible", -1, 1], + ["ate", -1, 1], + ["ive", -1, 1], + ["ize", -1, 1], + ["iti", -1, 1], + ["al", -1, 1], + ["ism", -1, 1], + ["ion", -1, 2], + ["er", -1, 1], + ["ous", -1, 1], + ["ant", -1, 1], + ["ent", -1, 1], + ["ment", 15, 1], + ["ement", 16, 1] + ]; + + /** @const */ var a_10 = [ + ["e", -1, 1], + ["l", -1, 2] + ]; + + /** @const */ var a_11 = [ + ["andes", -1, -1], + ["atlas", -1, -1], + ["bias", -1, -1], + ["cosmos", -1, -1], + ["early", -1, 5], + ["gently", -1, 3], + ["howe", -1, -1], + ["idly", -1, 2], + ["news", -1, -1], + ["only", -1, 6], + ["singly", -1, 7], + ["skies", -1, 1], + ["sky", -1, -1], + ["ugly", -1, 4] + ]; + + /** @const */ var /** Array */ g_aeo = [17, 64]; + + /** @const */ var /** Array */ g_v = [17, 65, 16, 1]; + + /** @const */ var /** Array */ g_v_WXY = [1, 17, 65, 208, 1]; + + /** @const */ var /** Array */ g_valid_LI = [55, 141, 2]; + + var /** boolean */ B_Y_found = false; + var /** number */ I_p2 = 0; + var /** number */ I_p1 = 0; + + + /** @return {boolean} */ + function r_prelude() { + B_Y_found = false; + /** @const */ var /** number */ v_1 = base.cursor; + lab0: { + base.bra = base.cursor; + if (!(base.eq_s("'"))) + { + break lab0; + } + base.ket = base.cursor; + if (!base.slice_del()) + { + return false; + } + } + base.cursor = v_1; + /** @const */ var /** number */ v_2 = base.cursor; + lab1: { + base.bra = base.cursor; + if (!(base.eq_s("y"))) + { + break lab1; + } + base.ket = base.cursor; + if (!base.slice_from("Y")) + { + return false; + } + B_Y_found = true; + } + base.cursor = v_2; + /** @const */ var /** number */ v_3 = base.cursor; + lab2: { + while(true) + { + /** @const */ var /** number */ v_4 = base.cursor; + lab3: { + golab4: while(true) + { + /** @const */ var /** number */ v_5 = base.cursor; + lab5: { + if (!(base.in_grouping(g_v, 97, 121))) + { + break lab5; + } + base.bra = base.cursor; + if (!(base.eq_s("y"))) + { + break lab5; + } + base.ket = base.cursor; + base.cursor = v_5; + break golab4; + } + base.cursor = v_5; + if (base.cursor >= base.limit) + { + break lab3; + } + base.cursor++; + } + if (!base.slice_from("Y")) + { + return false; + } + B_Y_found = true; + continue; + } + base.cursor = v_4; + break; + } + } + base.cursor = v_3; + return true; + }; + + /** @return {boolean} */ + function r_mark_regions() { + I_p1 = base.limit; + I_p2 = base.limit; + /** @const */ var /** number */ v_1 = base.cursor; + lab0: { + lab1: { + /** @const */ var /** number */ v_2 = base.cursor; + lab2: { + if (base.find_among(a_0) == 0) + { + break lab2; + } + break lab1; + } + base.cursor = v_2; + if (!base.go_out_grouping(g_v, 97, 121)) + { + break lab0; + } + base.cursor++; + if (!base.go_in_grouping(g_v, 97, 121)) + { + break lab0; + } + base.cursor++; + } + I_p1 = base.cursor; + if (!base.go_out_grouping(g_v, 97, 121)) + { + break lab0; + } + base.cursor++; + if (!base.go_in_grouping(g_v, 97, 121)) + { + break lab0; + } + base.cursor++; + I_p2 = base.cursor; + } + base.cursor = v_1; + return true; + }; + + /** @return {boolean} */ + function r_shortv() { + lab0: { + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab1: { + if (!(base.out_grouping_b(g_v_WXY, 89, 121))) + { + break lab1; + } + if (!(base.in_grouping_b(g_v, 97, 121))) + { + break lab1; + } + if (!(base.out_grouping_b(g_v, 97, 121))) + { + break lab1; + } + break lab0; + } + base.cursor = base.limit - v_1; + lab2: { + if (!(base.out_grouping_b(g_v, 97, 121))) + { + break lab2; + } + if (!(base.in_grouping_b(g_v, 97, 121))) + { + break lab2; + } + if (base.cursor > base.limit_backward) + { + break lab2; + } + break lab0; + } + base.cursor = base.limit - v_1; + if (!(base.eq_s_b("past"))) + { + return false; + } + } + return true; + }; + + /** @return {boolean} */ + function r_R1() { + return I_p1 <= base.cursor; + }; + + /** @return {boolean} */ + function r_R2() { + return I_p2 <= base.cursor; + }; + + /** @return {boolean} */ + function r_Step_1a() { + var /** number */ among_var; + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab0: { + base.ket = base.cursor; + if (base.find_among_b(a_1) == 0) + { + base.cursor = base.limit - v_1; + break lab0; + } + base.bra = base.cursor; + if (!base.slice_del()) + { + return false; + } + } + base.ket = base.cursor; + among_var = base.find_among_b(a_2); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + if (!base.slice_from("ss")) + { + return false; + } + break; + case 2: + lab1: { + /** @const */ var /** number */ v_2 = base.limit - base.cursor; + lab2: { + { + /** @const */ var /** number */ c1 = base.cursor - 2; + if (c1 < base.limit_backward) + { + break lab2; + } + base.cursor = c1; + } + if (!base.slice_from("i")) + { + return false; + } + break lab1; + } + base.cursor = base.limit - v_2; + if (!base.slice_from("ie")) + { + return false; + } + } + break; + case 3: + if (base.cursor <= base.limit_backward) + { + return false; + } + base.cursor--; + if (!base.go_out_grouping_b(g_v, 97, 121)) + { + return false; + } + base.cursor--; + if (!base.slice_del()) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_Step_1b() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_5); + base.bra = base.cursor; + lab0: { + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab1: { + switch (among_var) { + case 1: + /** @const */ var /** number */ v_2 = base.limit - base.cursor; + lab2: { + lab3: { + /** @const */ var /** number */ v_3 = base.limit - base.cursor; + lab4: { + if (base.find_among_b(a_3) == 0) + { + break lab4; + } + if (base.cursor > base.limit_backward) + { + break lab4; + } + break lab3; + } + base.cursor = base.limit - v_3; + if (!r_R1()) + { + break lab2; + } + if (!base.slice_from("ee")) + { + return false; + } + } + } + base.cursor = base.limit - v_2; + break; + case 2: + break lab1; + case 3: + among_var = base.find_among_b(a_4); + if (among_var == 0) + { + break lab1; + } + switch (among_var) { + case 1: + /** @const */ var /** number */ v_4 = base.limit - base.cursor; + if (!(base.out_grouping_b(g_v, 97, 121))) + { + break lab1; + } + if (base.cursor > base.limit_backward) + { + break lab1; + } + base.cursor = base.limit - v_4; + base.bra = base.cursor; + if (!base.slice_from("ie")) + { + return false; + } + break; + case 2: + if (base.cursor > base.limit_backward) + { + break lab1; + } + break; + } + break; + } + break lab0; + } + base.cursor = base.limit - v_1; + /** @const */ var /** number */ v_5 = base.limit - base.cursor; + if (!base.go_out_grouping_b(g_v, 97, 121)) + { + return false; + } + base.cursor--; + base.cursor = base.limit - v_5; + if (!base.slice_del()) + { + return false; + } + base.ket = base.cursor; + base.bra = base.cursor; + /** @const */ var /** number */ v_6 = base.limit - base.cursor; + among_var = base.find_among_b(a_6); + switch (among_var) { + case 1: + if (!base.slice_from("e")) + { + return false; + } + return false; + case 2: + { + /** @const */ var /** number */ v_7 = base.limit - base.cursor; + lab5: { + if (!(base.in_grouping_b(g_aeo, 97, 111))) + { + break lab5; + } + if (base.cursor > base.limit_backward) + { + break lab5; + } + return false; + } + base.cursor = base.limit - v_7; + } + break; + case 3: + if (base.cursor != I_p1) + { + return false; + } + /** @const */ var /** number */ v_8 = base.limit - base.cursor; + if (!r_shortv()) + { + return false; + } + base.cursor = base.limit - v_8; + if (!base.slice_from("e")) + { + return false; + } + return false; + } + base.cursor = base.limit - v_6; + base.ket = base.cursor; + if (base.cursor <= base.limit_backward) + { + return false; + } + base.cursor--; + base.bra = base.cursor; + if (!base.slice_del()) + { + return false; + } + } + return true; + }; + + /** @return {boolean} */ + function r_Step_1c() { + base.ket = base.cursor; + lab0: { + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab1: { + if (!(base.eq_s_b("y"))) + { + break lab1; + } + break lab0; + } + base.cursor = base.limit - v_1; + if (!(base.eq_s_b("Y"))) + { + return false; + } + } + base.bra = base.cursor; + if (!(base.out_grouping_b(g_v, 97, 121))) + { + return false; + } + lab2: { + if (base.cursor > base.limit_backward) + { + break lab2; + } + return false; + } + if (!base.slice_from("i")) + { + return false; + } + return true; + }; + + /** @return {boolean} */ + function r_Step_2() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_7); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + if (!r_R1()) + { + return false; + } + switch (among_var) { + case 1: + if (!base.slice_from("tion")) + { + return false; + } + break; + case 2: + if (!base.slice_from("ence")) + { + return false; + } + break; + case 3: + if (!base.slice_from("ance")) + { + return false; + } + break; + case 4: + if (!base.slice_from("able")) + { + return false; + } + break; + case 5: + if (!base.slice_from("ent")) + { + return false; + } + break; + case 6: + if (!base.slice_from("ize")) + { + return false; + } + break; + case 7: + if (!base.slice_from("ate")) + { + return false; + } + break; + case 8: + if (!base.slice_from("al")) + { + return false; + } + break; + case 9: + if (!base.slice_from("ful")) + { + return false; + } + break; + case 10: + if (!base.slice_from("ous")) + { + return false; + } + break; + case 11: + if (!base.slice_from("ive")) + { + return false; + } + break; + case 12: + if (!base.slice_from("ble")) + { + return false; + } + break; + case 13: + if (!base.slice_from("og")) + { + return false; + } + break; + case 14: + if (!(base.eq_s_b("l"))) + { + return false; + } + if (!base.slice_from("og")) + { + return false; + } + break; + case 15: + if (!base.slice_from("less")) + { + return false; + } + break; + case 16: + if (!(base.in_grouping_b(g_valid_LI, 99, 116))) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_Step_3() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_8); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + if (!r_R1()) + { + return false; + } + switch (among_var) { + case 1: + if (!base.slice_from("tion")) + { + return false; + } + break; + case 2: + if (!base.slice_from("ate")) + { + return false; + } + break; + case 3: + if (!base.slice_from("al")) + { + return false; + } + break; + case 4: + if (!base.slice_from("ic")) + { + return false; + } + break; + case 5: + if (!base.slice_del()) + { + return false; + } + break; + case 6: + if (!r_R2()) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_Step_4() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_9); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + if (!r_R2()) + { + return false; + } + switch (among_var) { + case 1: + if (!base.slice_del()) + { + return false; + } + break; + case 2: + lab0: { + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab1: { + if (!(base.eq_s_b("s"))) + { + break lab1; + } + break lab0; + } + base.cursor = base.limit - v_1; + if (!(base.eq_s_b("t"))) + { + return false; + } + } + if (!base.slice_del()) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_Step_5() { + var /** number */ among_var; + base.ket = base.cursor; + among_var = base.find_among_b(a_10); + if (among_var == 0) + { + return false; + } + base.bra = base.cursor; + switch (among_var) { + case 1: + lab0: { + lab1: { + if (!r_R2()) + { + break lab1; + } + break lab0; + } + if (!r_R1()) + { + return false; + } + { + /** @const */ var /** number */ v_1 = base.limit - base.cursor; + lab2: { + if (!r_shortv()) + { + break lab2; + } + return false; + } + base.cursor = base.limit - v_1; + } + } + if (!base.slice_del()) + { + return false; + } + break; + case 2: + if (!r_R2()) + { + return false; + } + if (!(base.eq_s_b("l"))) + { + return false; + } + if (!base.slice_del()) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_exception1() { + var /** number */ among_var; + base.bra = base.cursor; + among_var = base.find_among(a_11); + if (among_var == 0) + { + return false; + } + base.ket = base.cursor; + if (base.cursor < base.limit) + { + return false; + } + switch (among_var) { + case 1: + if (!base.slice_from("sky")) + { + return false; + } + break; + case 2: + if (!base.slice_from("idl")) + { + return false; + } + break; + case 3: + if (!base.slice_from("gentl")) + { + return false; + } + break; + case 4: + if (!base.slice_from("ugli")) + { + return false; + } + break; + case 5: + if (!base.slice_from("earli")) + { + return false; + } + break; + case 6: + if (!base.slice_from("onli")) + { + return false; + } + break; + case 7: + if (!base.slice_from("singl")) + { + return false; + } + break; + } + return true; + }; + + /** @return {boolean} */ + function r_postlude() { + if (!B_Y_found) + { + return false; + } + while(true) + { + /** @const */ var /** number */ v_1 = base.cursor; + lab0: { + golab1: while(true) + { + /** @const */ var /** number */ v_2 = base.cursor; + lab2: { + base.bra = base.cursor; + if (!(base.eq_s("Y"))) + { + break lab2; + } + base.ket = base.cursor; + base.cursor = v_2; + break golab1; + } + base.cursor = v_2; + if (base.cursor >= base.limit) + { + break lab0; + } + base.cursor++; + } + if (!base.slice_from("y")) + { + return false; + } + continue; + } + base.cursor = v_1; + break; + } + return true; + }; + + this.stem = /** @return {boolean} */ function() { + lab0: { + /** @const */ var /** number */ v_1 = base.cursor; + lab1: { + if (!r_exception1()) + { + break lab1; + } + break lab0; + } + base.cursor = v_1; + lab2: { + { + /** @const */ var /** number */ v_2 = base.cursor; + lab3: { + { + /** @const */ var /** number */ c1 = base.cursor + 3; + if (c1 > base.limit) + { + break lab3; + } + base.cursor = c1; + } + break lab2; + } + base.cursor = v_2; + } + break lab0; + } + base.cursor = v_1; + r_prelude(); + r_mark_regions(); + base.limit_backward = base.cursor; base.cursor = base.limit; + /** @const */ var /** number */ v_3 = base.limit - base.cursor; + r_Step_1a(); + base.cursor = base.limit - v_3; + /** @const */ var /** number */ v_4 = base.limit - base.cursor; + r_Step_1b(); + base.cursor = base.limit - v_4; + /** @const */ var /** number */ v_5 = base.limit - base.cursor; + r_Step_1c(); + base.cursor = base.limit - v_5; + /** @const */ var /** number */ v_6 = base.limit - base.cursor; + r_Step_2(); + base.cursor = base.limit - v_6; + /** @const */ var /** number */ v_7 = base.limit - base.cursor; + r_Step_3(); + base.cursor = base.limit - v_7; + /** @const */ var /** number */ v_8 = base.limit - base.cursor; + r_Step_4(); + base.cursor = base.limit - v_8; + /** @const */ var /** number */ v_9 = base.limit - base.cursor; + r_Step_5(); + base.cursor = base.limit - v_9; + base.cursor = base.limit_backward; + /** @const */ var /** number */ v_10 = base.cursor; + r_postlude(); + base.cursor = v_10; + } + return true; + }; + + /**@return{string}*/ + this['stemWord'] = function(/**string*/word) { + base.setCurrent(word); + this.stem(); + return base.getCurrent(); + }; +}; diff --git a/_build/_static/github-banner.svg b/_build/_static/github-banner.svg new file mode 100644 index 0000000..c47d9dc --- /dev/null +++ b/_build/_static/github-banner.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_build/_static/language_data.js b/_build/_static/language_data.js index 367b8ed..5776786 100644 --- a/_build/_static/language_data.js +++ b/_build/_static/language_data.js @@ -1,199 +1,13 @@ /* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * * This script contains the language-specific data used by searchtools.js, - * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * + * namely the set of stopwords, stemmer, scorer and splitter. */ -var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; +const stopwords = new Set(["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]); +window.stopwords = stopwords; // Export to global scope -/* Non-minified version is copied as a separate JS file, if available */ - -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - +/* Non-minified versions are copied as separate JavaScript files, if available */ +BaseStemmer=function(){this.current="",this.cursor=0,this.limit=0,this.limit_backward=0,this.bra=0,this.ket=0,this.setCurrent=function(t){this.current=t,this.cursor=0,this.limit=this.current.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},this.getCurrent=function(){return this.current},this.copy_from=function(t){this.current=t.current,this.cursor=t.cursor,this.limit=t.limit,this.limit_backward=t.limit_backward,this.bra=t.bra,this.ket=t.ket},this.in_grouping=function(t,r,i){return!(this.cursor>=this.limit||i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i))||(this.cursor++,0))},this.go_in_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.in_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward||i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i))||(this.cursor--,0))},this.go_in_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(i>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.out_grouping=function(t,r,i){return!(this.cursor>=this.limit)&&(i<(i=this.current.charCodeAt(this.cursor))||i>>3]&1<<(7&i)))&&(this.cursor++,!0)},this.go_out_grouping=function(t,r,i){for(;this.cursor>>3]&1<<(7&s)))return!0;this.cursor++}return!1},this.out_grouping_b=function(t,r,i){return!(this.cursor<=this.limit_backward)&&(i<(i=this.current.charCodeAt(this.cursor-1))||i>>3]&1<<(7&i)))&&(this.cursor--,!0)},this.go_out_grouping_b=function(t,r,i){for(;this.cursor>this.limit_backward;){var s=this.current.charCodeAt(this.cursor-1);if(s<=i&&r<=s&&0!=(t[(s-=r)>>>3]&1<<(7&s)))return!0;this.cursor--}return!1},this.eq_s=function(t){return!(this.limit-this.cursor>>1),o=0,a=e=(l=t[r])[0].length){if(this.cursor=s+l[0].length,l.length<4)return l[2];var g=l[3](this);if(this.cursor=s+l[0].length,g)return l[2]}}while(0<=(r=l[1]));return 0},this.find_among_b=function(t){for(var r=0,i=t.length,s=this.cursor,h=this.limit_backward,e=0,n=0,c=!1;;){for(var u,o=r+(i-r>>1),a=0,l=e=(u=t[r])[0].length){if(this.cursor=s-u[0].length,u.length<4)return u[2];var g=u[3](this);if(this.cursor=s-u[0].length,g)return u[2]}}while(0<=(r=u[1]));return 0},this.replace_s=function(t,r,i){var s=i.length-(r-t);return this.current=this.current.slice(0,t)+i+this.current.slice(r),this.limit+=s,this.cursor>=r?this.cursor+=s:this.cursor>t&&(this.cursor=t),s},this.slice_check=function(){return!(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>this.current.length)},this.slice_from=function(t){var r=!1;return this.slice_check()&&(this.replace_s(this.bra,this.ket,t),r=!0),r},this.slice_del=function(){return this.slice_from("")},this.insert=function(t,r,i){r=this.replace_s(t,r,i);t<=this.bra&&(this.bra+=r),t<=this.ket&&(this.ket+=r)},this.slice_to=function(){var t="";return t=this.slice_check()?this.current.slice(this.bra,this.ket):t},this.assign_to=function(){return this.current.slice(0,this.limit)}}; +var EnglishStemmer=function(){var a=new BaseStemmer,c=[["arsen",-1,-1],["commun",-1,-1],["emerg",-1,-1],["gener",-1,-1],["later",-1,-1],["organ",-1,-1],["past",-1,-1],["univers",-1,-1]],o=[["'",-1,1],["'s'",0,1],["'s",-1,1]],u=[["ied",-1,2],["s",-1,3],["ies",1,2],["sses",1,1],["ss",1,-1],["us",1,-1]],t=[["succ",-1,1],["proc",-1,1],["exc",-1,1]],l=[["even",-1,2],["cann",-1,2],["inn",-1,2],["earr",-1,2],["herr",-1,2],["out",-1,2],["y",-1,1]],n=[["",-1,-1],["ed",0,2],["eed",1,1],["ing",0,3],["edly",0,2],["eedly",4,1],["ingly",0,2]],f=[["",-1,3],["bb",0,2],["dd",0,2],["ff",0,2],["gg",0,2],["bl",0,1],["mm",0,2],["nn",0,2],["pp",0,2],["rr",0,2],["at",0,1],["tt",0,2],["iz",0,1]],_=[["anci",-1,3],["enci",-1,2],["ogi",-1,14],["li",-1,16],["bli",3,12],["abli",4,4],["alli",3,8],["fulli",3,9],["lessli",3,15],["ousli",3,10],["entli",3,5],["aliti",-1,8],["biliti",-1,12],["iviti",-1,11],["tional",-1,1],["ational",14,7],["alism",-1,8],["ation",-1,7],["ization",17,6],["izer",-1,6],["ator",-1,7],["iveness",-1,11],["fulness",-1,9],["ousness",-1,10],["ogist",-1,13]],m=[["icate",-1,4],["ative",-1,6],["alize",-1,3],["iciti",-1,4],["ical",-1,4],["tional",-1,1],["ational",5,2],["ful",-1,5],["ness",-1,5]],b=[["ic",-1,1],["ance",-1,1],["ence",-1,1],["able",-1,1],["ible",-1,1],["ate",-1,1],["ive",-1,1],["ize",-1,1],["iti",-1,1],["al",-1,1],["ism",-1,1],["ion",-1,2],["er",-1,1],["ous",-1,1],["ant",-1,1],["ent",-1,1],["ment",15,1],["ement",16,1]],k=[["e",-1,1],["l",-1,2]],g=[["andes",-1,-1],["atlas",-1,-1],["bias",-1,-1],["cosmos",-1,-1],["early",-1,5],["gently",-1,3],["howe",-1,-1],["idly",-1,2],["news",-1,-1],["only",-1,6],["singly",-1,7],["skies",-1,1],["sky",-1,-1],["ugly",-1,4]],d=[17,64],v=[17,65,16,1],i=[1,17,65,208,1],w=[55,141,2],p=!1,y=0,h=0;function q(){var r=a.limit-a.cursor;return!!(a.out_grouping_b(i,89,121)&&a.in_grouping_b(v,97,121)&&a.out_grouping_b(v,97,121)||(a.cursor=a.limit-r,a.out_grouping_b(v,97,121)&&a.in_grouping_b(v,97,121)&&!(a.cursor>a.limit_backward))||(a.cursor=a.limit-r,a.eq_s_b("past")))}function z(){return h<=a.cursor}function Y(){return y<=a.cursor}this.stem=function(){var r=a.cursor;if(!(()=>{var r;if(a.bra=a.cursor,0!=(r=a.find_among(g))&&(a.ket=a.cursor,!(a.cursora.limit)a.cursor=i;else{a.cursor=e,a.cursor=r,(()=>{p=!1;var r=a.cursor;if(a.bra=a.cursor,!a.eq_s("'")||(a.ket=a.cursor,a.slice_del())){a.cursor=r;r=a.cursor;if(a.bra=a.cursor,a.eq_s("y")){if(a.ket=a.cursor,!a.slice_from("Y"))return;p=!0}a.cursor=r;for(r=a.cursor;;){var i=a.cursor;r:{for(;;){var e=a.cursor;if(a.in_grouping(v,97,121)&&(a.bra=a.cursor,a.eq_s("y"))){a.ket=a.cursor,a.cursor=e;break}if(a.cursor=e,a.cursor>=a.limit)break r;a.cursor++}if(!a.slice_from("Y"))return;p=!0;continue}a.cursor=i;break}a.cursor=r}})(),h=a.limit,y=a.limit;i=a.cursor;r:{var s=a.cursor;if(0==a.find_among(c)){if(a.cursor=s,!a.go_out_grouping(v,97,121))break r;if(a.cursor++,!a.go_in_grouping(v,97,121))break r;a.cursor++}h=a.cursor,a.go_out_grouping(v,97,121)&&(a.cursor++,a.go_in_grouping(v,97,121))&&(a.cursor++,y=a.cursor)}a.cursor=i,a.limit_backward=a.cursor,a.cursor=a.limit;var e=a.limit-a.cursor,r=((()=>{var r=a.limit-a.cursor;if(a.ket=a.cursor,0==a.find_among_b(o))a.cursor=a.limit-r;else if(a.bra=a.cursor,!a.slice_del())return;if(a.ket=a.cursor,0!=(r=a.find_among_b(u)))switch(a.bra=a.cursor,r){case 1:if(a.slice_from("ss"))break;return;case 2:r:{var i=a.limit-a.cursor,e=a.cursor-2;if(!(e{a.ket=a.cursor,o=a.find_among_b(n),a.bra=a.cursor;r:{var r=a.limit-a.cursor;i:{switch(o){case 1:var i=a.limit-a.cursor;e:{var e=a.limit-a.cursor;if(0==a.find_among_b(t)||a.cursor>a.limit_backward){if(a.cursor=a.limit-e,!z())break e;if(!a.slice_from("ee"))return}}a.cursor=a.limit-i;break;case 2:break i;case 3:if(0==(o=a.find_among_b(l)))break i;switch(o){case 1:var s=a.limit-a.cursor;if(!a.out_grouping_b(v,97,121))break i;if(a.cursor>a.limit_backward)break i;if(a.cursor=a.limit-s,a.bra=a.cursor,a.slice_from("ie"))break;return;case 2:if(a.cursor>a.limit_backward)break i}}break r}a.cursor=a.limit-r;var c=a.limit-a.cursor;if(!a.go_out_grouping_b(v,97,121))return;if(a.cursor--,a.cursor=a.limit-c,!a.slice_del())return;a.ket=a.cursor,a.bra=a.cursor;var o,c=a.limit-a.cursor;switch(o=a.find_among_b(f)){case 1:return a.slice_from("e");case 2:var u=a.limit-a.cursor;if(a.in_grouping_b(d,97,111)&&!(a.cursor>a.limit_backward))return;a.cursor=a.limit-u;break;case 3:return a.cursor!=h||(u=a.limit-a.cursor,q()&&(a.cursor=a.limit-u,a.slice_from("e")))}if(a.cursor=a.limit-c,a.ket=a.cursor,a.cursor<=a.limit_backward)return;if(a.cursor--,a.bra=a.cursor,!a.slice_del())return}})(),a.cursor=a.limit-r,a.limit-a.cursor),r=(a.ket=a.cursor,e=a.limit-a.cursor,(a.eq_s_b("y")||(a.cursor=a.limit-e,a.eq_s_b("Y")))&&(a.bra=a.cursor,a.out_grouping_b(v,97,121))&&a.cursor>a.limit_backward&&a.slice_from("i"),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(_))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ence"))break;return;case 3:if(a.slice_from("ance"))break;return;case 4:if(a.slice_from("able"))break;return;case 5:if(a.slice_from("ent"))break;return;case 6:if(a.slice_from("ize"))break;return;case 7:if(a.slice_from("ate"))break;return;case 8:if(a.slice_from("al"))break;return;case 9:if(a.slice_from("ful"))break;return;case 10:if(a.slice_from("ous"))break;return;case 11:if(a.slice_from("ive"))break;return;case 12:if(a.slice_from("ble"))break;return;case 13:if(a.slice_from("og"))break;return;case 14:if(!a.eq_s_b("l"))return;if(a.slice_from("og"))break;return;case 15:if(a.slice_from("less"))break;return;case 16:if(!a.in_grouping_b(w,99,116))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.limit-a.cursor),i=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(m))&&(a.bra=a.cursor,z()))switch(r){case 1:if(a.slice_from("tion"))break;return;case 2:if(a.slice_from("ate"))break;return;case 3:if(a.slice_from("al"))break;return;case 4:if(a.slice_from("ic"))break;return;case 5:if(a.slice_del())break;return;case 6:if(!Y())return;if(a.slice_del())break}})(),a.cursor=a.limit-e,a.limit-a.cursor),r=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(b))&&(a.bra=a.cursor,Y()))switch(r){case 1:if(a.slice_del())break;return;case 2:var i=a.limit-a.cursor;if(!a.eq_s_b("s")&&(a.cursor=a.limit-i,!a.eq_s_b("t")))return;if(a.slice_del())break}})(),a.cursor=a.limit-i,a.limit-a.cursor),e=((()=>{var r;if(a.ket=a.cursor,0!=(r=a.find_among_b(k)))switch(a.bra=a.cursor,r){case 1:if(!Y()){if(!z())return;var i=a.limit-a.cursor;if(q())return;a.cursor=a.limit-i}if(a.slice_del())break;return;case 2:if(!Y())return;if(!a.eq_s_b("l"))return;if(a.slice_del())break}})(),a.cursor=a.limit-r,a.cursor=a.limit_backward,a.cursor);(()=>{if(p)for(;;){var r=a.cursor;r:{for(;;){var i=a.cursor;if(a.bra=a.cursor,a.eq_s("Y")){a.ket=a.cursor,a.cursor=i;break}if(a.cursor=i,a.cursor>=a.limit)break r;a.cursor++}if(a.slice_from("y"))continue;return}a.cursor=r;break}})(),a.cursor=e}}return!0},this.stemWord=function(r){return a.setCurrent(r),this.stem(),a.getCurrent()}}; +window.Stemmer = EnglishStemmer; diff --git a/_build/_static/pygments.css b/_build/_static/pygments.css index 04a4174..9392ddc 100644 --- a/_build/_static/pygments.css +++ b/_build/_static/pygments.css @@ -5,80 +5,80 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } -.highlight .c { color: #8f5902; font-style: italic } /* Comment */ -.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.highlight .g { color: #000000 } /* Generic */ +.highlight .c { color: #8F5902; font-style: italic } /* Comment */ +.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */ +.highlight .g { color: #000 } /* Generic */ .highlight .k { color: #004461; font-weight: bold } /* Keyword */ -.highlight .l { color: #000000 } /* Literal */ -.highlight .n { color: #000000 } /* Name */ +.highlight .l { color: #000 } /* Literal */ +.highlight .n { color: #000 } /* Name */ .highlight .o { color: #582800 } /* Operator */ -.highlight .x { color: #000000 } /* Other */ -.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ -.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #8f5902 } /* Comment.Preproc */ -.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #a40000 } /* Generic.Deleted */ -.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .ges { color: #000000 } /* Generic.EmphStrong */ -.highlight .gr { color: #ef2929 } /* Generic.Error */ +.highlight .x { color: #000 } /* Other */ +.highlight .p { color: #000; font-weight: bold } /* Punctuation */ +.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #8F5902 } /* Comment.Preproc */ +.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A40000 } /* Generic.Deleted */ +.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000 } /* Generic.EmphStrong */ +.highlight .gr { color: #EF2929 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .go { color: #888 } /* Generic.Output */ .highlight .gp { color: #745334 } /* Generic.Prompt */ -.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ +.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ +.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */ .highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */ -.highlight .ld { color: #000000 } /* Literal.Date */ -.highlight .m { color: #990000 } /* Literal.Number */ -.highlight .s { color: #4e9a06 } /* Literal.String */ -.highlight .na { color: #c4a000 } /* Name.Attribute */ +.highlight .ld { color: #000 } /* Literal.Date */ +.highlight .m { color: #900 } /* Literal.Number */ +.highlight .s { color: #4E9A06 } /* Literal.String */ +.highlight .na { color: #C4A000 } /* Name.Attribute */ .highlight .nb { color: #004461 } /* Name.Builtin */ -.highlight .nc { color: #000000 } /* Name.Class */ -.highlight .no { color: #000000 } /* Name.Constant */ -.highlight .nd { color: #888888 } /* Name.Decorator */ -.highlight .ni { color: #ce5c00 } /* Name.Entity */ -.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #000000 } /* Name.Function */ -.highlight .nl { color: #f57900 } /* Name.Label */ -.highlight .nn { color: #000000 } /* Name.Namespace */ -.highlight .nx { color: #000000 } /* Name.Other */ -.highlight .py { color: #000000 } /* Name.Property */ +.highlight .nc { color: #000 } /* Name.Class */ +.highlight .no { color: #000 } /* Name.Constant */ +.highlight .nd { color: #888 } /* Name.Decorator */ +.highlight .ni { color: #CE5C00 } /* Name.Entity */ +.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #000 } /* Name.Function */ +.highlight .nl { color: #F57900 } /* Name.Label */ +.highlight .nn { color: #000 } /* Name.Namespace */ +.highlight .nx { color: #000 } /* Name.Other */ +.highlight .py { color: #000 } /* Name.Property */ .highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #000000 } /* Name.Variable */ +.highlight .nv { color: #000 } /* Name.Variable */ .highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ -.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ -.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ -.highlight .mb { color: #990000 } /* Literal.Number.Bin */ -.highlight .mf { color: #990000 } /* Literal.Number.Float */ -.highlight .mh { color: #990000 } /* Literal.Number.Hex */ -.highlight .mi { color: #990000 } /* Literal.Number.Integer */ -.highlight .mo { color: #990000 } /* Literal.Number.Oct */ -.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ -.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ -.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ -.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ -.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ -.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ -.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ -.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ -.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ -.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ -.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ -.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #000000 } /* Name.Function.Magic */ -.highlight .vc { color: #000000 } /* Name.Variable.Class */ -.highlight .vg { color: #000000 } /* Name.Variable.Global */ -.highlight .vi { color: #000000 } /* Name.Variable.Instance */ -.highlight .vm { color: #000000 } /* Name.Variable.Magic */ -.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */ +.highlight .w { color: #F8F8F8 } /* Text.Whitespace */ +.highlight .mb { color: #900 } /* Literal.Number.Bin */ +.highlight .mf { color: #900 } /* Literal.Number.Float */ +.highlight .mh { color: #900 } /* Literal.Number.Hex */ +.highlight .mi { color: #900 } /* Literal.Number.Integer */ +.highlight .mo { color: #900 } /* Literal.Number.Oct */ +.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */ +.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */ +.highlight .sc { color: #4E9A06 } /* Literal.String.Char */ +.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */ +.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */ +.highlight .se { color: #4E9A06 } /* Literal.String.Escape */ +.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */ +.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */ +.highlight .sx { color: #4E9A06 } /* Literal.String.Other */ +.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */ +.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */ +.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */ +.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #000 } /* Name.Function.Magic */ +.highlight .vc { color: #000 } /* Name.Variable.Class */ +.highlight .vg { color: #000 } /* Name.Variable.Global */ +.highlight .vi { color: #000 } /* Name.Variable.Instance */ +.highlight .vm { color: #000 } /* Name.Variable.Magic */ +.highlight .il { color: #900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_build/_static/searchtools.js b/_build/_static/searchtools.js index b08d58c..e29b1c7 100644 --- a/_build/_static/searchtools.js +++ b/_build/_static/searchtools.js @@ -1,12 +1,5 @@ /* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * */ "use strict"; @@ -20,7 +13,7 @@ if (typeof Scorer === "undefined") { // and returns the new score. /* score: result => { - const [docname, title, anchor, descr, score, filename] = result + const [docname, title, anchor, descr, score, filename, kind] = result return score }, */ @@ -47,6 +40,15 @@ if (typeof Scorer === "undefined") { }; } +// Global search result kind enum, used by themes to style search results. +// prettier-ignore +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + const _removeChildren = (element) => { while (element && element.lastChild) element.removeChild(element.lastChild); }; @@ -57,6 +59,15 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string +const _escapeHTML = (text) => { + return text + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +}; + const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; @@ -64,9 +75,13 @@ const _displayItem = (item, searchTerms, highlightTerms) => { const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr, score, _filename] = item; + const [docName, title, anchor, descr, score, _filename, kind] = item; let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); let requestUrl; let linkUrl; if (docBuilder === "dirhtml") { @@ -85,25 +100,30 @@ const _displayItem = (item, searchTerms, highlightTerms) => { let linkEl = listItem.appendChild(document.createElement("a")); linkEl.href = linkUrl + anchor; linkEl.dataset.score = score; - linkEl.innerHTML = title; + linkEl.innerHTML = _escapeHTML(title); if (descr) { listItem.appendChild(document.createElement("span")).innerHTML = - " (" + descr + ")"; + ` (${_escapeHTML(descr)})`; // highlight search terms in the description - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); - } - else if (showSearchSummary) + if (SPHINX_HIGHLIGHT_ENABLED) + // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js + highlightTerms.forEach((term) => + _highlightText(listItem, term, "highlighted"), + ); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, anchor) + Search.makeSearchSummary(data, searchTerms, anchor), ); // highlight search terms in the summary - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + if (SPHINX_HIGHLIGHT_ENABLED) + // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js + highlightTerms.forEach((term) => + _highlightText(listItem, term, "highlighted"), + ); }); Search.output.appendChild(listItem); }; @@ -112,12 +132,14 @@ const _finishSearch = (resultCount) => { Search.title.innerText = _("Search Results"); if (!resultCount) Search.status.innerText = Documentation.gettext( - "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.", ); else - Search.status.innerText = _( - "Search finished, found ${resultCount} page(s) matching the search query." - ).replace('${resultCount}', resultCount); + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace("${resultCount}", resultCount); }; const _displayNextItem = ( results, @@ -131,14 +153,14 @@ const _displayNextItem = ( _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), - 5 + 5, ); } // search finished, update title and status message else _finishSearch(resultCount); }; // Helper function used by query() to order search results. -// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. // Order the results by score (in opposite order of appearance, since the // `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. const _orderResultsByScoreThenName = (a, b) => { @@ -163,9 +185,10 @@ const _orderResultsByScoreThenName = (a, b) => { * This is the same as ``\W+`` in Python, preserving the surrogate pair area. */ if (typeof splitQuery === "undefined") { - var splitQuery = (query) => query + var splitQuery = (query) => + query .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) - .filter(term => term) // remove remaining empty strings + .filter((term) => term); // remove remaining empty strings } /** @@ -177,16 +200,23 @@ const Search = { _pulse_status: -1, htmlToText: (htmlString, anchor) => { - const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + const htmlElement = new DOMParser().parseFromString( + htmlString, + "text/html", + ); for (const removalQuery of [".headerlink", "script", "style"]) { - htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + htmlElement.querySelectorAll(removalQuery).forEach((el) => { + el.remove(); + }); } if (anchor) { - const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + const anchorContent = htmlElement.querySelector( + `[role="main"] ${anchor}`, + ); if (anchorContent) return anchorContent.textContent; console.warn( - `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`, ); } @@ -195,7 +225,7 @@ const Search = { if (docContent) return docContent.textContent; console.warn( - "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template.", ); return ""; }, @@ -248,6 +278,7 @@ const Search = { searchSummary.classList.add("search-summary"); searchSummary.innerText = ""; const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); searchList.classList.add("search"); const out = document.getElementById("search-results"); @@ -279,12 +310,8 @@ const Search = { const queryTermLower = queryTerm.toLowerCase(); // maybe skip this "word" - // stopwords array is from language_data.js - if ( - stopwords.indexOf(queryTermLower) !== -1 || - queryTerm.match(/^\d+$/) - ) - return; + // stopwords set is from language_data.js + if (stopwords.has(queryTermLower) || queryTerm.match(/^\d+$/)) return; // stem the word let word = stemmer.stemWord(queryTermLower); @@ -296,8 +323,12 @@ const Search = { } }); - if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js - localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + if (SPHINX_HIGHLIGHT_ENABLED) { + // SPHINX_HIGHLIGHT_ENABLED is set in sphinx_highlight.js + localStorage.setItem( + "sphinx_highlight_terms", + [...highlightTerms].join(" "), + ); } // console.debug("SEARCH: searching for:"); @@ -310,7 +341,13 @@ const Search = { /** * execute search (requires search index to be loaded) */ - _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + _performSearch: ( + query, + searchTerms, + excludedTerms, + highlightTerms, + objectTerms, + ) => { const filenames = Search._index.filenames; const docNames = Search._index.docnames; const titles = Search._index.titles; @@ -318,7 +355,7 @@ const Search = { const indexEntries = Search._index.indexentries; // Collect multiple result groups to be sorted separately and then ordered. - // Each is an array of [docname, title, anchor, descr, score, filename]. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. const normalResults = []; const nonMainIndexResults = []; @@ -326,10 +363,15 @@ const Search = { const queryLower = query.toLowerCase().trim(); for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + if ( + title.toLowerCase().trim().includes(queryLower) + && queryLower.length >= title.length / 2 + ) { for (const [file, id] of foundTitles) { - const score = Math.round(Scorer.title * queryLower.length / title.length); - const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + const score = Math.round( + (Scorer.title * queryLower.length) / title.length, + ); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles normalResults.push([ docNames[file], titles[file] !== title ? `${titles[file]} > ${title}` : title, @@ -337,6 +379,7 @@ const Search = { null, score + boost, filenames[file], + SearchResultKind.title, ]); } } @@ -344,9 +387,9 @@ const Search = { // search for explicit entries in index directives for (const [entry, foundEntries] of Object.entries(indexEntries)) { - if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + if (entry.includes(queryLower) && queryLower.length >= entry.length / 2) { for (const [file, id, isMain] of foundEntries) { - const score = Math.round(100 * queryLower.length / entry.length); + const score = Math.round((100 * queryLower.length) / entry.length); const result = [ docNames[file], titles[file], @@ -354,6 +397,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.index, ]; if (isMain) { normalResults.push(result); @@ -366,11 +410,13 @@ const Search = { // lookup as object objectTerms.forEach((term) => - normalResults.push(...Search.performObjectSearch(term, objectTerms)) + normalResults.push(...Search.performObjectSearch(term, objectTerms)), ); // lookup as search terms in fulltext - normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + normalResults.push( + ...Search.performTermsSearch(searchTerms, excludedTerms), + ); // let the scorer override scores with a custom scoring function if (Scorer.score) { @@ -391,7 +437,11 @@ const Search = { // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept let seen = new Set(); results = results.reverse().reduce((acc, result) => { - let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + let resultStr = result + .slice(0, 4) + .concat([result[5]]) + .map((v) => String(v)) + .join(","); if (!seen.has(resultStr)) { acc.push(result); seen.add(resultStr); @@ -403,8 +453,20 @@ const Search = { }, query: (query) => { - const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); - const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + const [ + searchQuery, + searchTerms, + excludedTerms, + highlightTerms, + objectTerms, + ] = Search._parseQuery(query); + const results = Search._performSearch( + searchQuery, + searchTerms, + excludedTerms, + highlightTerms, + objectTerms, + ); // for debugging //Search.lastresults = results.slice(); // a copy @@ -427,7 +489,7 @@ const Search = { const results = []; const objectSearchCallback = (prefix, match) => { - const name = match[4] + const name = match[4]; const fullname = (prefix ? prefix + "." : "") + name; const fullnameLower = fullname.toLowerCase(); if (fullnameLower.indexOf(object) < 0) return; @@ -475,12 +537,11 @@ const Search = { descr, score, filenames[match[0]], + SearchResultKind.object, ]); }; Object.keys(objects).forEach((prefix) => - objects[prefix].forEach((array) => - objectSearchCallback(prefix, array) - ) + objects[prefix].forEach((array) => objectSearchCallback(prefix, array)), ); return results; }, @@ -502,9 +563,17 @@ const Search = { // perform the search on the required terms searchTerms.forEach((word) => { const files = []; + // find documents, if any, containing the query word in their text/title term indices + // use Object.hasOwnProperty to avoid mismatching against prototype properties const arr = [ - { files: terms[word], score: Scorer.term }, - { files: titleTerms[word], score: Scorer.title }, + { + files: terms.hasOwnProperty(word) ? terms[word] : undefined, + score: Scorer.term, + }, + { + files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, + score: Scorer.title, + }, ]; // add support for partial matches if (word.length > 2) { @@ -536,15 +605,17 @@ const Search = { // set score for the word in each file recordFiles.forEach((file) => { - if (!scoreMap.has(file)) scoreMap.set(file, {}); - scoreMap.get(file)[word] = record.score; + if (!scoreMap.has(file)) scoreMap.set(file, new Map()); + const fileScores = scoreMap.get(file); + fileScores.set(word, record.score); }); }); // create the mapping files.forEach((file) => { if (!fileMap.has(file)) fileMap.set(file, [word]); - else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + else if (fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); }); }); @@ -555,11 +626,11 @@ const Search = { // as search terms with length < 3 are discarded const filteredTermCount = [...searchTerms].filter( - (term) => term.length > 2 + (term) => term.length > 2, ).length; if ( - wordList.length !== searchTerms.size && - wordList.length !== filteredTermCount + wordList.length !== searchTerms.size + && wordList.length !== filteredTermCount ) continue; @@ -567,16 +638,16 @@ const Search = { if ( [...excludedTerms].some( (term) => - terms[term] === file || - titleTerms[term] === file || - (terms[term] || []).includes(file) || - (titleTerms[term] || []).includes(file) + terms[term] === file + || titleTerms[term] === file + || (terms[term] || []).includes(file) + || (titleTerms[term] || []).includes(file), ) ) break; // select one (max) score for the file. - const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w))); // add result to the result list results.push([ docNames[file], @@ -585,6 +656,7 @@ const Search = { null, score, filenames[file], + SearchResultKind.text, ]); } return results; @@ -611,7 +683,8 @@ const Search = { let summary = document.createElement("p"); summary.classList.add("context"); - summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + summary.textContent = + top + text.substr(startWithContext, 240).trim() + tail; return summary; }, diff --git a/_build/_static/sphinx_highlight.js b/_build/_static/sphinx_highlight.js index 8a96c69..a74e103 100644 --- a/_build/_static/sphinx_highlight.js +++ b/_build/_static/sphinx_highlight.js @@ -1,7 +1,7 @@ /* Highlighting utilities for Sphinx HTML documentation. */ "use strict"; -const SPHINX_HIGHLIGHT_ENABLED = true +const SPHINX_HIGHLIGHT_ENABLED = true; /** * highlight a given string on a node by wrapping it in @@ -13,9 +13,9 @@ const _highlight = (node, addItems, text, className) => { const parent = node.parentNode; const pos = val.toLowerCase().indexOf(text); if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") + pos >= 0 + && !parent.classList.contains(className) + && !parent.classList.contains("nohighlight") ) { let span; @@ -30,13 +30,7 @@ const _highlight = (node, addItems, text, className) => { span.appendChild(document.createTextNode(val.substr(pos, text.length))); const rest = document.createTextNode(val.substr(pos + text.length)); - parent.insertBefore( - span, - parent.insertBefore( - rest, - node.nextSibling - ) - ); + parent.insertBefore(span, parent.insertBefore(rest, node.nextSibling)); node.nodeValue = val.substr(0, pos); /* There may be more occurrences of search term in this node. So call this * function recursively on the remaining fragment. @@ -46,7 +40,7 @@ const _highlight = (node, addItems, text, className) => { if (isInSVG) { const rect = document.createElementNS( "http://www.w3.org/2000/svg", - "rect" + "rect", ); const bbox = parent.getBBox(); rect.x.baseVal.value = bbox.x; @@ -65,7 +59,7 @@ const _highlightText = (thisNode, text, className) => { let addItems = []; _highlight(thisNode, addItems, text, className); addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) + obj.parent.insertAdjacentElement("beforebegin", obj.target), ); }; @@ -73,25 +67,31 @@ const _highlightText = (thisNode, text, className) => { * Small JavaScript module for the documentation. */ const SphinxHighlight = { - /** * highlight the search words provided in localstorage in the text */ highlightSearchWords: () => { - if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight // get and clear terms from localstorage const url = new URL(window.location); const highlight = - localStorage.getItem("sphinx_highlight_terms") - || url.searchParams.get("highlight") - || ""; - localStorage.removeItem("sphinx_highlight_terms") - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms"); + // Update history only if '?highlight' is present; otherwise it + // clears text fragments (not set in window.location by the browser) + if (url.searchParams.has("highlight")) { + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + } // get individual terms from highlight string - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + const terms = highlight + .toLowerCase() + .split(/\s+/) + .filter((x) => x); if (terms.length === 0) return; // nothing to do // There should never be more than one element matching "div.body" @@ -107,11 +107,11 @@ const SphinxHighlight = { document .createRange() .createContextualFragment( - '

" - ) + '", + ), ); }, @@ -125,7 +125,7 @@ const SphinxHighlight = { document .querySelectorAll("span.highlighted") .forEach((el) => el.classList.remove("highlighted")); - localStorage.removeItem("sphinx_highlight_terms") + localStorage.removeItem("sphinx_highlight_terms"); }, initEscapeListener: () => { @@ -134,10 +134,15 @@ const SphinxHighlight = { document.addEventListener("keydown", (event) => { // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) + return; // bail with special keys - if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; - if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) + return; + if ( + DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + && event.key === "Escape" + ) { SphinxHighlight.hideSearchWords(); event.preventDefault(); } diff --git a/_build/genindex.html b/_build/genindex.html index c65496e..266d5ad 100644 --- a/_build/genindex.html +++ b/_build/genindex.html @@ -5,11 +5,12 @@ Index — SyncSketch Python API Library 1.0.10.5 documentation - - + + + - - + + @@ -85,6 +86,12 @@

C

+
@@ -99,6 +106,8 @@

D

- + @@ -260,25 +275,24 @@

SyncSketch Python API Library

-

Navigation

-
-

Related Topics

- -
- +

Navigation

+ +
+

Related Topics

+ +
@@ -295,8 +309,8 @@

Quick search

©2024, Brady Endres, Phil Floetotto, Nicholas Kegler dos Santos, Tyler Nickerson. | - Powered by Sphinx 7.4.7 - & Alabaster 0.7.16 + Powered by Sphinx 9.1.0 + & Alabaster 1.0.0 diff --git a/_build/index.html b/_build/index.html index 3108077..2fe628e 100644 --- a/_build/index.html +++ b/_build/index.html @@ -6,11 +6,12 @@ SyncSketch Python API Library documentation — SyncSketch Python API Library 1.0.10.5 documentation - - + + + - - + + @@ -37,7 +38,7 @@

SyncSketch Python API Library documentation
-class syncsketch.SyncSketchAPI
+class syncsketch.SyncSketchAPI

SyncSketchAPI is a class that provides a set of methods to interact with SyncSketch API.

@@ -84,12 +85,12 @@

SyncSketch Python API Library documentation
-class syncsketch.SyncSketchAPI(auth, api_key, host='https://www.syncsketch.com', useExpiringToken=False, debug=False, api_version='v1', use_header_auth=False)
+class syncsketch.SyncSketchAPI(auth, api_key, host='https://www.syncsketch.com', useExpiringToken=False, debug=False, api_version='v1', use_header_auth=False)

Bases: object

Convenience API to communicate with the SyncSketch Service for collaborative online reviews

-is_connected()
+is_connected(raw_response=True)

Convenience function to check if the API is connected to SyncSketch Will check against Status Code 200 and return False if not which most likely would be and authorization error

@@ -105,11 +106,14 @@

SyncSketch Python API Library documentation
-get_tree(withItems=False)
+get_tree(withItems=False, raw_response=False)

Get nested tree of account, projects, reviews and optionally items for the current user

Parameters:
-

withItems (bool) – Include items in the response

+
    +
  • withItems (bool) – Include items in the response

  • +
  • raw_response (bool) – Get whole response from REST API.

  • +
Returns:

Tree data

@@ -122,27 +126,34 @@

SyncSketch Python API Library documentation
-get_accounts()
-

Summary

+get_accounts(fields=None, raw_response=False) +

Get a list of workspaces the user has access to

-
Returns:
-

List of workspaces the user has access to

+
Parameters:
+
    +
  • fields (list|str|int|bool) – fields to fetch from backend

  • +
  • raw_response (bool) – Get whole response from REST API.

  • +
-
Return type:
-

list[dict]

+
Returns:
+

List of workspaces the user has access to

+
+
Return type:
+

list[dict]

-update_account(account_id, data)
+update_account(account_id, data, raw_response=False)

Update a workspace / account

Parameters:
  • account_id (int) – the id of the item

  • data (dict) – normal dict with data for item

  • +
  • raw_response (bool) – Get whole response from REST API.

Returns:
@@ -156,7 +167,7 @@

SyncSketch Python API Library documentation
-create_project(account_id, name, description='', data=None)
+create_project(account_id, name, description='', data=None, raw_response=False)

Add a project to your account. Please make sure to pass the accountId which you can query using the getAccounts command.

Parameters:
@@ -165,6 +176,7 @@

SyncSketch Python API Library documentationReturns: @@ -178,8 +190,8 @@

SyncSketch Python API Library documentation
-get_projects(include_deleted=False, include_archived=False, include_tags=False, include_connections=False, limit=100, offset=0)
-

Get a list of currently active projects

+get_projects(include_deleted=False, include_archived=False, include_tags=False, include_connections=False, limit=100, offset=0, fields=None, raw_response=False) +

Get a list of currently active projects the user has access to

Parameters:
    @@ -189,6 +201,8 @@

    SyncSketch Python API Library documentationReturns: @@ -202,11 +216,15 @@

    SyncSketch Python API Library documentation
    -get_projects_by_name(name)
    -

    Get a project by name regardless of status

    +get_projects_by_name(name, fields=None, raw_response=False) +

    Get a list of projects by name

    Parameters:
    -

    name (str) – Name to search for

    +
      +
    • name (str) – Name to search for

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    List of projects

    @@ -219,11 +237,15 @@

    SyncSketch Python API Library documentation
    -get_project_by_id(project_id)
    +get_project_by_id(project_id, fields=None, raw_response=False)

    Get single project by id

    Parameters:
    -

    project_id (int) – Project id

    +
      +
    • project_id (int) – Project id

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Project data

    @@ -236,27 +258,38 @@

    SyncSketch Python API Library documentation
    -get_project_storage(project_id)
    +get_project_storage(project_id, raw_response=False)

    Get project storage usage in bytes

    +
    # Example response
    +{'storage': 12345}
    +
    +
    Parameters:
    -

    project_id (int) – Project id

    +
      +
    • project_id (int) – Project ID

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Storage usage in bytes

    +
    Return type:
    +

    dict[str, int]

    +

    -update_project(project_id, data)
    +update_project(project_id, data, raw_response=False)

    Update a project

    Parameters:
    • project_id (int) – the id of the item

    • data (dict) – dict with new data for item

    • +
    • raw_response (bool) – Get whole response from REST API.

    Returns:
    @@ -270,11 +303,14 @@

    SyncSketch Python API Library documentation
    -delete_project(project_id)
    +delete_project(project_id, raw_response=False)

    Delete a project by id.

    Parameters:
    -

    project_id (int) – Project ID to delete

    +
      +
    • project_id (int) – Project ID to delete

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    @@ -284,7 +320,7 @@

    SyncSketch Python API Library documentation
    -duplicate_project(project_id, name=None, copy_reviews=False, copy_users=False, copy_settings=False)
    +duplicate_project(project_id, name=None, copy_reviews=False, copy_users=False, copy_settings=False, raw_response=False)

    Create a new project from an existing project

    Parameters:
    @@ -294,6 +330,7 @@

    SyncSketch Python API Library documentationReturns: @@ -307,56 +344,110 @@

    SyncSketch Python API Library documentation
    -archive_project(project_id)
    +archive_project(project_id, raw_response=False)

    Archive a project

    Parameters:
    -

    project_id (int)

    +
      +
    • project_id (int)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    +

    Project data

    +
    +
    Return type:
    +

    dict

    -restore_project(project_id)
    +restore_project(project_id, raw_response=False)

    Restore (unarchive) a project

    Parameters:
    -

    project_id (int)

    +
      +
    • project_id (int)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    +

    Project data

    +
    +
    Return type:
    +

    dict

    +
    +
    +
    + +
    +
    +create_review(project_id, name, description='', data=None, raw_response=False)
    +

    Add a review to a project

    +
    +
    Parameters:
    +
      +
    • project_id (int)

    • +
    • name (str)

    • +
    • description (str)

    • +
    • data (dict)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    +
    +
    Returns:
    +

    Review data

    +
    +
    Return type:
    +

    dict

    -get_reviews_by_project_id(project_id, limit=100, offset=0)
    +get_reviews_by_project_id(project_id, limit=100, offset=0, fields=None, raw_response=False)

    Get list of reviews by project id.

    +
    # Example response
    +{
    +    "meta": {...},
    +    "objects": [...]
    +}
    +
    +
    Parameters:
    -

    project_id (int) – SyncSketch project id

    +
      +
    • project_id (int) – SyncSketch project id

    • +
    • limit (int) – Limit the number of results

    • +
    • offset (int) – Offset the results

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Dict with meta information and an array of found projects

    Return type:
    -

    list[dict]

    +

    dict

    -get_review_by_name(name)
    -

    Get reviews by name using a case insensitive startswith query

    +get_review_by_name(name, limit=100, offset=0, fields=None, raw_response=False) +

    Get list of reviews by name using a case insensitive startswith query

    Parameters:
    -

    name – String - Name of the review

    +
      +
    • name (str) – Name of the review

    • +
    • limit (int) – Limit the number of results

    • +
    • offset (int) – Offset the results

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Dict with meta information and an array of found projects

    @@ -366,26 +457,37 @@

    SyncSketch Python API Library documentation
    -get_review_by_id(review_id)
    +get_review_by_id(review_id, fields=None, raw_response=False)

    Get single review by id.

    Parameters:
    -

    review_id – Number

    +
      +
    • review_id – Number

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    Review Dict

    +

    Review Data

    +
    +
    Return type:
    +

    dict

    -get_review_by_uuid(uuid)
    +get_review_by_uuid(uuid, fields=None, raw_response=False)

    Get single review by uuid. UUID can be found in the review URL e.g. syncsketch.com/sketch/<uuid>/

    Parameters:
    -

    uuid (str) – UUID of the review.

    +
      +
    • uuid (str) – UUID of the review.

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Review dict

    @@ -398,30 +500,34 @@

    SyncSketch Python API Library documentation
    -get_review_storage(review_id)
    +get_review_storage(review_id, raw_response=False)

    Get review storage usage in bytes

    Parameters:
    -

    review_id (int) – Review ID

    +
      +
    • review_id (int) – Review ID

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Storage usage in bytes

    Return type:
    -

    int

    +

    dict[str, int]

    -update_review(review_id, data)
    +update_review(review_id, data, raw_response=False)

    Update a review

    Parameters:
    • review_id (int) – the id of the item

    • data (dict) – dict with data for item

    • +
    • raw_response (bool) – Get whole response from REST API.

    Returns:
    @@ -435,7 +541,7 @@

    SyncSketch Python API Library documentation
    -sort_review_items(review_id, items)
    +sort_review_items(review_id, items, raw_response=False)

    Update a review

    Example items param

    Returns:
    @@ -467,55 +574,165 @@

    SyncSketch Python API Library documentation
    -archive_review(review_id)
    +archive_review(review_id, raw_response=True)

    Archive a review

    Parameters:
    -

    review_id (int)

    +
      +
    • review_id (int)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    empty response

    +

    Response object

    -restore_review(review_id)
    +restore_review(review_id, raw_response=True)

    Restore (unarchive) a review

    Parameters:
    -

    review_id (int)

    +
      +
    • review_id (int)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    empty response

    +

    Response object

    -delete_review(review_id)
    +delete_review(review_id, raw_response=False)

    Delete a review by id.

    Parameters:
    -

    review_id (int) – Review ID to delete

    +
      +
    • review_id (int) – Review ID to delete

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:
    -

    +

    Review data

    +
    +
    Return type:
    +

    dict

    +
    +
    +
    + +
    +
    +create_review_section(review_id, name, item_ids, uuid=None, raw_response=False)
    +

    Create a new review section

    +
    +
    Parameters:
    +
      +
    • review_id (int) – Review ID

    • +
    • name (str) – Section name

    • +
    • item_ids (list) – List of item IDs to add to the section

    • +
    • uuid (str) – Optional UUID for the section

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    +
    +
    Returns:
    +

    Section data

    +
    +
    Return type:
    +

    dict

    +
    +
    +
    + +
    +
    +update_review_sections(review_id, data, raw_response=False)
    +

    Update one or more review sections

    +
    # Example data
    +sections_to_update = [
    +    {
    +        "uuid": "section-uuid",
    +        "name": "New Section Name",
    +        "itemIds": [1, 2, 3],
    +    }
    +]
    +
    +
    +
    +
    Parameters:
    +
      +
    • review_id (int) – Review ID

    • +
    • data (list[dict]) – Section data

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    +
    +
    Returns:
    +

    Section data

    +
    +
    Return type:
    +

    dict

    +
    +
    +
    + +
    +
    +delete_review_section(review_id, section_uuid, raw_response=False)
    +

    Delete a review section

    +
    +
    Parameters:
    +
      +
    • review_id (int) – Review ID

    • +
    • section_uuid (str) – Section UUID

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    +
    +
    Returns:
    +

    Section data

    +
    +
    Return type:
    +

    dict

    +
    +
    +
    + +
    +
    +get_item(item_id, data=None, fields=None, raw_response=False)
    +

    Get single item by id

    +
    +
    Parameters:
    +
      +
    • item_id (int)

    • +
    • data (dict)

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    +
    +
    Returns:
    +

    Item data

    +
    +
    Return type:
    +

    dict

    -update_item(item_id, data)
    +update_item(item_id, data, raw_response=False)

    Update an item

    Parameters:
    • item_id (int) – the id of the item

    • data (dict) – dict with data for item

    • +
    • raw_response (bool) – Get whole response from REST API.

    Returns:
    @@ -529,7 +746,7 @@

    SyncSketch Python API Library documentation
    -add_item(review_id, name, fps, additional_data)
    +add_item(review_id, name, fps, additional_data, raw_response=False)

    create a media item record and connect it to a review. This should be used in case you want to add items with externaly hosted media by passing in the external_url and external_thumbnail_url to the additionalData dict e.g

    additionalData = {
    @@ -560,6 +777,7 @@ 

    SyncSketch Python API Library documentationReturns: @@ -621,6 +839,32 @@

    SyncSketch Python API Library documentation +
    +upload_file(review_id, filepath, file_name='', item_uuid=None, noConvertFlag=False, chunk_size=5242880, max_workers=None)
    +

    Upload a file to a review using multipart upload. +This uses direct to s3 multipart upload to upload large files in chunks.

    +
    +
    Parameters:
    +
      +
    • review_id (int) – Required review_id

    • +
    • filepath (str) – Path for the file on disk e.g /tmp/movie.webm

    • +
    • file_name (str) – The name of the file. Please make sure to pass the correct file extension

    • +
    • item_uuid (str) – Optional UUID for the item. If not provided, a new one will be generated by the server

    • +
    • noConvertFlag (bool) – The video you are uploading is already in a browser compatible format

    • +
    • chunk_size (int) – Size of each chunk in bytes for multipart upload (default: 5MB)

    • +
    • max_workers (int) – Maximum number of parallel upload workers (default: auto-detected based on system capabilities)

    • +
    +
    +
    Returns:
    +

    A dict containing item information including “id” and “uuid” or None on failure

    +
    +
    Return type:
    +

    Optional[dict]

    +
    +
    +

    +
    add_media_v2(review_id, filepath, file_name='', item_uuid=None, noConvertFlag=False)
    @@ -647,15 +891,17 @@

    SyncSketch Python API Library documentation
    -get_media(searchCriteria)
    +get_media(searchCriteria, fields=None, raw_response=False)

    This is a general search function. You can search media items by

    -

    ‘id’ -‘name’ -‘status’ -‘active’ -‘creator’: ALL_WITH_RELATIONS, <– these are foreign key queries -‘reviews’: ALL_WITH_RELATIONS, <– these are foreign key queries -‘created’ using ‘exact’, ‘range’, ‘gt’, ‘gte’, ‘lt’, ‘lte’

    +
      +
    • ‘id’

    • +
    • ‘name’

    • +
    • ‘status’

    • +
    • ‘active’

    • +
    • ‘creator’: ALL_WITH_RELATIONS, <– these are foreign key queries

    • +
    • ‘reviews’: ALL_WITH_RELATIONS, <– these are foreign key queries

    • +
    • ‘created’ using ‘exact’, ‘range’, ‘gt’, ‘gte’, ‘lt’, ‘lte’

    • +

    To query items by foreign keys please use the foreign key syntax described in the Django search definition: https://docs.djangoproject.com/en/1.11/topics/db/queries/

    If you want to query by “review name” for example you would pass in

    @@ -663,12 +909,18 @@

    SyncSketch Python API Library documentation
    results = s.getMedia({'reviews__project__name':'test', 'limit': 1, 'active': 1})
    +
    +

    NOTE: Please make sure to include the active:1 query if you only want active media. Deleted files are currently only deactivated and kept for a certain period of time before they are “purged” from the system.

    Parameters:
    -

    searchCriteria (dict) – Search params

    +
      +
    • searchCriteria (dict) – Search params

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    List of media items

    @@ -681,11 +933,15 @@

    SyncSketch Python API Library documentation
    -get_items_by_review_id(review_id)
    +get_items_by_review_id(review_id, fields=None, raw_response=False)

    Get all items in a review

    Parameters:
    -

    review_id (int) – Review ID

    +
      +
    • review_id (int) – Review ID

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    List of media items

    @@ -698,11 +954,14 @@

    SyncSketch Python API Library documentation
    -delete_item(item_id)
    +delete_item(item_id, raw_response=False)

    Delete a item by id.

    Parameters:
    -

    item_id (int) – Item ID to delete

    +
      +
    • item_id (int) – Item ID to delete

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    @@ -712,11 +971,14 @@

    SyncSketch Python API Library documentation
    -bulk_delete_items(item_ids)
    +bulk_delete_items(item_ids, raw_response=True)

    Delete multiple items by id.

    Parameters:
    -

    item_ids (list[int]) – List of item IDs to delete

    +
      +
    • item_ids (list[int]) – List of item IDs to delete

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    @@ -726,7 +988,7 @@

    SyncSketch Python API Library documentation
    -move_items(new_review_id, item_data)
    +move_items(new_review_id, item_data, raw_response=True)

    Move items from one review to another

    item_data should be a list of dictionaries with the old review id and the item id. The items in the list will be moved to the new review for the param new_review_id

    @@ -745,6 +1007,7 @@

    SyncSketch Python API Library documentation
    • new_review_id (int) – The review id to move the items to

    • item_data (list[dict]) – List of dictionaries with the old review id and the item id

    • +
    • raw_response (bool) – Get whole response from REST API.

    Returns:
    @@ -755,7 +1018,7 @@

    SyncSketch Python API Library documentation
    -add_comment(item_id, text, review_id, frame=0)
    +add_comment(item_id, text, review_id, frame=0, raw_response=False)

    Add a comment to an item

    Parameters:
    @@ -764,6 +1027,7 @@

    SyncSketch Python API Library documentationReturns: @@ -774,7 +1038,7 @@

    SyncSketch Python API Library documentation
    -get_annotations(item_id, revisionId=False, review_id=False)
    +get_annotations(item_id, revisionId=False, review_id=False, raw_response=False)

    Get sketches and comments for an item. Frames have a revision id which signifies a “set of notes”. When querying an item you’ll get the available revisions for this item. If you wish to get only the latest revision, please get the revisionId for the latest revision.

    @@ -784,6 +1048,7 @@

    SyncSketch Python API Library documentationReturns: @@ -794,7 +1059,7 @@

    SyncSketch Python API Library documentation
    -get_flattened_annotations(review_id, item_id, with_tracing_paper=False, return_as_base64=False)
    +get_flattened_annotations(review_id, item_id, with_tracing_paper=False, return_as_base64=False, raw_response=False)

    Returns a list of sketches either as signed urls from s3 or base64 encoded strings. The sketches are composited over the background frame of the item.

    @@ -804,6 +1069,7 @@

    SyncSketch Python API Library documentationReturns: @@ -838,11 +1104,15 @@

    SyncSketch Python API Library documentation
    -get_users_by_name(name)
    +get_users_by_name(name, fields=None, raw_response=False)

    Name is a combined search and will search in first_name, last_name and email

    Parameters:
    -

    name (str) – Name to search for

    +
      +
    • name (str) – Name to search for

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    List of users

    @@ -855,11 +1125,15 @@

    SyncSketch Python API Library documentation
    -get_user_by_email(email)
    +get_user_by_email(email, fields=None, raw_response=True)

    Get user by email

    Parameters:
    -

    email (str) – Email to search for

    +
      +
    • email (str) – Email to search for

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    User data

    @@ -872,11 +1146,14 @@

    SyncSketch Python API Library documentation
    -get_users_by_project_id(project_id)
    +get_users_by_project_id(project_id, raw_response=False)

    Get all users in a project

    Parameters:
    -

    project_id (int)

    +
      +
    • project_id (int)

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    List of users

    @@ -889,7 +1166,7 @@

    SyncSketch Python API Library documentation
    -get_connections_by_user_id(user_id, account_id, include_inactive=None, include_archived=None)
    +get_connections_by_user_id(user_id, account_id, include_inactive=None, include_archived=None, raw_response=False)

    Get all project and account connections for a user. Good for checking access for a user that might have left…

    Parameters:
    @@ -898,6 +1175,7 @@

    SyncSketch Python API Library documentationReturns: @@ -911,11 +1189,15 @@

    SyncSketch Python API Library documentation
    -get_user_by_id(user_id)
    +get_user_by_id(user_id, fields=None, raw_response=False)

    Get a user by ID

    Parameters:
    -

    user_id (int)

    +
      +
    • user_id (int)

    • +
    • fields (list|str|int|bool) – fields to fetch from backend

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    User data

    @@ -928,7 +1210,7 @@

    SyncSketch Python API Library documentation
    -add_users_to_workspace(workspace_id, users, note='')
    +add_users_to_workspace(workspace_id, users, note='', raw_response=False)

    Add Users to Workspace

    users=[{"email":"test@test.de","permission":"admin"}]
     
    @@ -939,6 +1221,7 @@

    SyncSketch Python API Library documentationReturns: @@ -949,7 +1232,7 @@

    SyncSketch Python API Library documentation
    -remove_users_from_workspace(workspace_id, users)
    +remove_users_from_workspace(workspace_id, users, raw_response=False)

    Remove a list of users from a workspace Can remove by id or email

    Returns:
    @@ -970,7 +1254,7 @@

    SyncSketch Python API Library documentation
    -add_users_to_project(project_id, users, note='')
    +add_users_to_project(project_id, users, note='', raw_response=False)

    Add Users to Project

    possible permissions

    @@ -1016,7 +1302,7 @@

    SyncSketch Python API Library documentation
    -shotgrid_create_config(syncsketch_account_id, syncsketch_project_id=None, data=None)
    +shotgrid_create_config(syncsketch_account_id, syncsketch_project_id=None, data=None, raw_response=True)

    Create a new Shotgrid configuration for a SyncSketch workspace and optionally a project

    Parameters:
    @@ -1024,6 +1310,7 @@

    SyncSketch Python API Library documentationReturns: @@ -1034,7 +1321,7 @@

    SyncSketch Python API Library documentation
    -shotgrid_get_playlists(syncsketch_account_id, syncsketch_project_id, shotgun_project_id=None)
    +shotgrid_get_playlists(syncsketch_account_id, syncsketch_project_id, shotgun_project_id=None, raw_response=False)

    Returns list of Shotgrid playlists modified in the last 120 days If the syncsketch project is directly linked to a shotgrid by the workspace admin, the param shotgun_project_id will be ignored and can be omitted during the function call

    @@ -1044,6 +1331,7 @@

    SyncSketch Python API Library documentationReturns: @@ -1054,7 +1342,7 @@

    SyncSketch Python API Library documentation
    -shotgrid_sync_review_notes(review_id)
    +shotgrid_sync_review_notes(review_id, raw_response=False)

    Sync notes from SyncSketch review to the original shotgrid playlist Returns task id to use in get_shotgun_sync_review_notes_progress to get progress

    returns dict with information about the REST API call:

    @@ -1069,7 +1357,10 @@

    SyncSketch Python API Library documentation
    Parameters:
    -

    review_id (int) – SyncSketch review id

    +
      +
    • review_id (int) – SyncSketch review id

    • +
    • raw_response (bool) – Get whole response from REST API.

    • +
    Returns:

    Progress information

    @@ -1082,7 +1373,7 @@

    SyncSketch Python API Library documentation
    -shotgrid_sync_new_item_notes(project_id, review_id, item_id)
    +shotgrid_sync_new_item_notes(project_id, review_id, item_id, raw_response=False)

    Sync new notes from SyncSketch review item to the original shotgrid playlist Returns dict with information about the REST API call

      @@ -1098,6 +1389,7 @@

      SyncSketch Python API Library documentationReturns: @@ -1108,7 +1400,7 @@

      SyncSketch Python API Library documentation
      -get_shotgrid_sync_review_notes_progress(task_id)
      +get_shotgrid_sync_review_notes_progress(task_id, raw_response=False)

      Returns status of review notes sync for the task id provided in shotgun_sync_review_notes

      Returns a dict with the following keys:

        @@ -1122,7 +1414,10 @@

        SyncSketch Python API Library documentation
        Parameters:
        -

        task_id (str) – UUID of the task returned by shotgrid_sync_review_notes

        +
          +
        • task_id (str) – UUID of the task returned by shotgrid_sync_review_notes

        • +
        • raw_response (bool) – Get whole response from REST API.

        • +
        Returns:

        Progress information

        @@ -1267,7 +1562,7 @@

        SyncSketch Python API Library documentation
        -shotgun_sync_new_item_notes(project_id, review_id, item_id)
        +shotgun_sync_new_item_notes(project_id, review_id, item_id, raw_response=False)

        Sync new notes from SyncSketch review item to the original shotgrid playlist Returns dict with information about the REST API call

          @@ -1283,6 +1578,7 @@

          SyncSketch Python API Library documentationReturns: @@ -1293,7 +1589,7 @@

          SyncSketch Python API Library documentation
          -shotgun_sync_review_notes(review_id)
          +shotgun_sync_review_notes(review_id, raw_response=False)

          Sync notes from SyncSketch review to the original shotgrid playlist Returns task id to use in get_shotgun_sync_review_notes_progress to get progress

          returns dict with information about the REST API call:

          @@ -1308,7 +1604,10 @@

          SyncSketch Python API Library documentation
          Parameters:
          -

          review_id (int) – SyncSketch review id

          +
            +
          • review_id (int) – SyncSketch review id

          • +
          • raw_response (bool) – Get whole response from REST API.

          • +
          Returns:

          Progress information

          @@ -1321,7 +1620,7 @@

          SyncSketch Python API Library documentation
          -shotgun_get_playlists(syncsketch_account_id, syncsketch_project_id, shotgun_project_id=None)
          +shotgun_get_playlists(syncsketch_account_id, syncsketch_project_id, shotgun_project_id=None, raw_response=False)

          Returns list of Shotgrid playlists modified in the last 120 days If the syncsketch project is directly linked to a shotgrid by the workspace admin, the param shotgun_project_id will be ignored and can be omitted during the function call

          @@ -1331,6 +1630,7 @@

          SyncSketch Python API Library documentationReturns: @@ -1341,7 +1641,7 @@

          SyncSketch Python API Library documentation
          -shotgun_create_config(syncsketch_account_id, syncsketch_project_id=None, data=None)
          +shotgun_create_config(syncsketch_account_id, syncsketch_project_id=None, data=None, raw_response=True)

          Create a new Shotgrid configuration for a SyncSketch workspace and optionally a project

          Parameters:
          @@ -1349,6 +1649,7 @@

          SyncSketch Python API Library documentationReturns: @@ -1388,25 +1689,24 @@

          SyncSketch Python API Library

          -

          Navigation

          -
          -

          Related Topics

          - -
          - +

          Navigation

          + +
          +

          Related Topics

          + +
          @@ -1423,8 +1723,8 @@

          Quick search

          ©2024, Brady Endres, Phil Floetotto, Nicholas Kegler dos Santos, Tyler Nickerson. | - Powered by Sphinx 7.4.7 - & Alabaster 0.7.16 + Powered by Sphinx 9.1.0 + & Alabaster 1.0.0 | t%Hzx7l?~&wGy;+BnYIdk?#`h%U%s;K27hC+ z6H0OE`W|e^<~@Y7Q~zkM1N640O=D z^A{Y1gf^6yXMF{loXYTU)$rbgI7V~f3Je4&Nrp`n=|KeAS}KCDlm&rf5~7`LB0czn zVoz~LMG)MvAkf?q2cso5z#RlGq;$~+YzJ8Dg2*drXGmx54VybDJdlR$)`hV0f2&Xs?1u!k=fOE-e_!WE6XZk>pq|A$O^#6+OZyvs4f+@ zm12-cD}`VtQH}_Us=ZbyKkEXk(Fod{4|Gj&P&p0i?Sg`6J}*~$N^z- zUiguv@iG5AD>ti6@6;zV4&!$IFd@G?6_fO7?uV~`F{{%rtP%2mmZjnJuBxBDAJTbs J^8vNTR3(z+Dlh;5 delta 588 zcmV-S0<-<`1?bVi?V{SP{Y9&kg00_f)mzu|lhtvJ`0haYc zO%;`)H^eeO{xHKZte*|{X9#@Uy`|<`X}%m@$uvK6#k?nbB8`CGyD@0>?K|0S{9jCV zObE)Y)?h+5*APZ4{?T3r(9Omggk(5tdYox=3JJOFv4E#$K!5b$JPnpk&i(=(@Su0= z&VFJX+E9*<@&Y(HmEqtb;k^lQjOt7UCF5-q1b3Sb}7%mmH7jTNr z?YI*Bd6kR%F@Ni9&$rpSMoyN3(6CZ`u#OFY<#;q8ug5UmuB7?}w=FkFCoM7J)nI+J zV9E}!ZbyjnqYZxAG zaKVQDm4Xa4>DTK8+5kGGd_>9Opa7QToSfCDEBj9xu75gA;hK^HAT=!vL_KpoueHES z9y`eahbossx~i4*jn~R!7BTglFL|T`@IH6+!y(nB#Ma3NiPXsjD+yB~JY?-&uKes4 z=te_mvo7E@#YyBas1F1TqWP^=?J>!zBEHT|1DMi7d=Sry9YK-po~*rP9C^*n&25;l zJP*1XaYdV)9Og8UA^B&{4|#OV%_NPF`S(nDk!-XTpUgPT+x5eO{Aop0Q0Kn;`h{7Y a{=wQqe#t)?E`3$~^8JvC#LWj70KTWHR3Rt; diff --git a/_build/search.html b/_build/search.html index 7744bca..47cb26d 100644 --- a/_build/search.html +++ b/_build/search.html @@ -5,12 +5,13 @@ Search — SyncSketch Python API Library 1.0.10.5 documentation - - + + + - - + + @@ -104,8 +105,8 @@

          Related Topics

          ©2024, Brady Endres, Phil Floetotto, Nicholas Kegler dos Santos, Tyler Nickerson. | - Powered by
          Sphinx 7.4.7 - & Alabaster 0.7.16 + Powered by Sphinx 9.1.0 + & Alabaster 1.0.0 diff --git a/_build/searchindex.js b/_build/searchindex.js index 8d853b2..f1b0d26 100644 --- a/_build/searchindex.js +++ b/_build/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"SyncSketch Python API Library documentation": [[0, null]]}, "docnames": ["index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["index.rst"], "indexentries": {"add_comment() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_comment", false]], "add_item() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_item", false]], "add_media() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_media", false]], "add_media_by_url() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_media_by_url", false]], "add_media_v1() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_media_v1", false]], "add_media_v2() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_media_v2", false]], "add_users_to_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_users_to_project", false]], "add_users_to_workspace() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.add_users_to_workspace", false]], "archive_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.archive_project", false]], "archive_review() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.archive_review", false]], "bulk_delete_items() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.bulk_delete_items", false]], "create_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.create_project", false]], "delete_item() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.delete_item", false]], "delete_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.delete_project", false]], "delete_review() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.delete_review", false]], "duplicate_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.duplicate_project", false]], "get_accounts() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_accounts", false]], "get_annotations() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_annotations", false]], "get_connections_by_user_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_connections_by_user_id", false]], "get_flattened_annotations() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_flattened_annotations", false]], "get_grease_pencil_overlays() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_grease_pencil_overlays", false]], "get_items_by_review_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_items_by_review_id", false]], "get_media() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_media", false]], "get_project_by_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_project_by_id", false]], "get_project_storage() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_project_storage", false]], "get_projects() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_projects", false]], "get_projects_by_name() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_projects_by_name", false]], "get_review_by_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_review_by_id", false]], "get_review_by_name() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_review_by_name", false]], "get_review_by_uuid() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_review_by_uuid", false]], "get_review_storage() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_review_storage", false]], "get_reviews_by_project_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_reviews_by_project_id", false]], "get_shotgrid_sync_review_items_progress() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_shotgrid_sync_review_items_progress", false]], "get_shotgrid_sync_review_notes_progress() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_shotgrid_sync_review_notes_progress", false]], "get_shotgun_sync_review_items_progress() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_shotgun_sync_review_items_progress", false]], "get_tree() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_tree", false]], "get_user_by_email() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_user_by_email", false]], "get_user_by_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_user_by_id", false]], "get_users_by_name() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_users_by_name", false]], "get_users_by_project_id() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.get_users_by_project_id", false]], "is_connected() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.is_connected", false]], "move_items() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.move_items", false]], "remove_users_from_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.remove_users_from_project", false]], "remove_users_from_workspace() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.remove_users_from_workspace", false]], "restore_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.restore_project", false]], "restore_review() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.restore_review", false]], "shotgrid_create_config() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgrid_create_config", false]], "shotgrid_get_playlists() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgrid_get_playlists", false]], "shotgrid_sync_new_item_notes() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgrid_sync_new_item_notes", false]], "shotgrid_sync_review_items() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgrid_sync_review_items", false]], "shotgrid_sync_review_notes() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgrid_sync_review_notes", false]], "shotgun_create_config() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_create_config", false]], "shotgun_get_playlists() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_get_playlists", false]], "shotgun_get_projects() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_get_projects", false]], "shotgun_sync_new_item_notes() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_sync_new_item_notes", false]], "shotgun_sync_review_items() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_sync_review_items", false]], "shotgun_sync_review_notes() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.shotgun_sync_review_notes", false]], "sort_review_items() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.sort_review_items", false]], "syncsketchapi (class in syncsketch)": [[0, "syncsketch.SyncSketchAPI", false]], "update_account() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.update_account", false]], "update_item() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.update_item", false]], "update_project() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.update_project", false]], "update_review() (syncsketch.syncsketchapi method)": [[0, "syncsketch.SyncSketchAPI.update_review", false]]}, "objects": {"syncsketch": [[0, 0, 1, "", "SyncSketchAPI"]], "syncsketch.SyncSketchAPI": [[0, 1, 1, "", "add_comment"], [0, 1, 1, "", "add_item"], [0, 1, 1, "", "add_media"], [0, 1, 1, "", "add_media_by_url"], [0, 1, 1, "", "add_media_v1"], [0, 1, 1, "", "add_media_v2"], [0, 1, 1, "", "add_users_to_project"], [0, 1, 1, "", "add_users_to_workspace"], [0, 1, 1, "", "archive_project"], [0, 1, 1, "", "archive_review"], [0, 1, 1, "", "bulk_delete_items"], [0, 1, 1, "", "create_project"], [0, 1, 1, "", "delete_item"], [0, 1, 1, "", "delete_project"], [0, 1, 1, "", "delete_review"], [0, 1, 1, "", "duplicate_project"], [0, 1, 1, "", "get_accounts"], [0, 1, 1, "", "get_annotations"], [0, 1, 1, "", "get_connections_by_user_id"], [0, 1, 1, "", "get_flattened_annotations"], [0, 1, 1, "", "get_grease_pencil_overlays"], [0, 1, 1, "", "get_items_by_review_id"], [0, 1, 1, "", "get_media"], [0, 1, 1, "", "get_project_by_id"], [0, 1, 1, "", "get_project_storage"], [0, 1, 1, "", "get_projects"], [0, 1, 1, "", "get_projects_by_name"], [0, 1, 1, "", "get_review_by_id"], [0, 1, 1, "", "get_review_by_name"], [0, 1, 1, "", "get_review_by_uuid"], [0, 1, 1, "", "get_review_storage"], [0, 1, 1, "", "get_reviews_by_project_id"], [0, 1, 1, "", "get_shotgrid_sync_review_items_progress"], [0, 1, 1, "", "get_shotgrid_sync_review_notes_progress"], [0, 1, 1, "", "get_shotgun_sync_review_items_progress"], [0, 1, 1, "", "get_tree"], [0, 1, 1, "", "get_user_by_email"], [0, 1, 1, "", "get_user_by_id"], [0, 1, 1, "", "get_users_by_name"], [0, 1, 1, "", "get_users_by_project_id"], [0, 1, 1, "", "is_connected"], [0, 1, 1, "", "move_items"], [0, 1, 1, "", "remove_users_from_project"], [0, 1, 1, "", "remove_users_from_workspace"], [0, 1, 1, "", "restore_project"], [0, 1, 1, "", "restore_review"], [0, 1, 1, "", "shotgrid_create_config"], [0, 1, 1, "", "shotgrid_get_playlists"], [0, 1, 1, "", "shotgrid_sync_new_item_notes"], [0, 1, 1, "", "shotgrid_sync_review_items"], [0, 1, 1, "", "shotgrid_sync_review_notes"], [0, 1, 1, "", "shotgun_create_config"], [0, 1, 1, "", "shotgun_get_playlists"], [0, 1, 1, "", "shotgun_get_projects"], [0, 1, 1, "", "shotgun_sync_new_item_notes"], [0, 1, 1, "", "shotgun_sync_review_items"], [0, 1, 1, "", "shotgun_sync_review_notes"], [0, 1, 1, "", "sort_review_items"], [0, 1, 1, "", "update_account"], [0, 1, 1, "", "update_item"], [0, 1, 1, "", "update_project"], [0, 1, 1, "", "update_review"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"]}, "objtypes": {"0": "py:class", "1": "py:method"}, "terms": {"": 0, "0": 0, "03": 0, "1": 0, "10": 0, "100": 0, "1024": 0, "11": 0, "120": 0, "12345": 0, "2": 0, "200": 0, "2015": 0, "2017": 0, "24": 0, "3": 0, "3d": 0, "51": 0, "52": 0, "720": 0, "98": 0, "A": 0, "For": 0, "If": 0, "In": 0, "It": 0, "TO": 0, "The": 0, "To": 0, "Will": 0, "__": 0, "__init__": 0, "about": 0, "access": 0, "account": 0, "account_id": 0, "accountid": 0, "activ": 0, "ad": 0, "add": 0, "add_com": 0, "add_item": 0, "add_media": 0, "add_media_by_url": 0, "add_media_v1": 0, "add_media_v2": 0, "add_users_to_project": 0, "add_users_to_workspac": 0, "addit": 0, "additem": 0, "additional_data": 0, "additionaldata": 0, "admin": 0, "after": 0, "against": 0, "all": 0, "all_with_rel": 0, "alreadi": 0, "also": 0, "alwai": 0, "an": 0, "ani": 0, "annot": 0, "anoth": 0, "api_kei": 0, "api_vers": 0, "applic": 0, "ar": 0, "archiv": 0, "archive_project": 0, "archive_review": 0, "arrai": 0, "artist": 0, "artist_nam": 0, "associ": 0, "attach": 0, "auth": 0, "authent": 0, "author": 0, "autodesk": 0, "autodoc_member_ord": 0, "automat": 0, "avail": 0, "aw": 0, "background": 0, "base": 0, "base64": 0, "befor": 0, "being": 0, "bool": 0, "bradi": 0, "browser": 0, "bulk_delete_item": 0, "bysourc": 0, "byte": 0, "caa": 0, "call": 0, "can": 0, "case": 0, "certain": 0, "check": 0, "class": 0, "cloud": 0, "cloudhelp": 0, "code": 0, "collabor": 0, "com": 0, "combin": 0, "command": 0, "comment": 0, "commun": 0, "compat": 0, "complet": 0, "composit": 0, "configur": 0, "connect": 0, "constructor": 0, "contain": 0, "content": 0, "conveni": 0, "convert": 0, "copi": 0, "copy_review": 0, "copy_set": 0, "copy_us": 0, "correct": 0, "creat": 0, "create_project": 0, "creator": 0, "current": 0, "dai": 0, "data": 0, "db": 0, "de": 0, "deactiv": 0, "debug": 0, "definit": 0, "delet": 0, "delete_item": 0, "delete_project": 0, "delete_review": 0, "deprecationwarn": 0, "describ": 0, "descript": 0, "determin": 0, "dict": 0, "dictionari": 0, "directli": 0, "disk": 0, "django": 0, "djangoproject": 0, "doc": 0, "doe": 0, "done": 0, "down": 0, "download": 0, "dropbox": 0, "duplicate_project": 0, "durat": 0, "dure": 0, "e": 0, "either": 0, "email": 0, "empti": 0, "en": 0, "enabl": 0, "encod": 0, "endr": 0, "enu": 0, "error": 0, "etc": 0, "even": 0, "exact": 0, "exampl": 0, "exist": 0, "expir": 0, "explor": 0, "extens": 0, "external_thumbnail_url": 0, "external_url": 0, "externali": 0, "fail": 0, "failur": 0, "fals": 0, "field": 0, "file": 0, "file_nam": 0, "filepath": 0, "find": 0, "first_nam": 0, "float": 0, "follow": 0, "foreign": 0, "format": 0, "found": 0, "fp": 0, "frame": 0, "from": 0, "full": 0, "function": 0, "g": 0, "gener": 0, "get": 0, "get_account": 0, "get_annot": 0, "get_connections_by_user_id": 0, "get_flattened_annot": 0, "get_grease_pencil_overlai": 0, "get_items_by_review_id": 0, "get_media": 0, "get_project": 0, "get_project_by_id": 0, "get_project_storag": 0, "get_projects_by_nam": 0, "get_review_by_id": 0, "get_review_by_nam": 0, "get_review_by_uuid": 0, "get_review_storag": 0, "get_reviews_by_project_id": 0, "get_shotgrid_sync_review_items_progress": 0, "get_shotgrid_sync_review_notes_progress": 0, "get_shotgun_sync_review_items_progress": 0, "get_shotgun_sync_review_notes_progress": 0, "get_tre": 0, "get_user_by_email": 0, "get_user_by_id": 0, "get_users_by_nam": 0, "get_users_by_project_id": 0, "getaccount": 0, "getmedia": 0, "good": 0, "greas": 0, "greasepencil": 0, "gt": 0, "gte": 0, "ha": 0, "have": 0, "header": 0, "height": 0, "here": 0, "homedir": 0, "host": 0, "hour": 0, "htm": 0, "html": 0, "http": 0, "i": 0, "id": 0, "ignor": 0, "imag": 0, "import": 0, "improv": 0, "inact": 0, "includ": 0, "include_archiv": 0, "include_connect": 0, "include_delet": 0, "include_inact": 0, "include_tag": 0, "info": 0, "inform": 0, "insensit": 0, "instead": 0, "int": 0, "interact": 0, "intern": 0, "invit": 0, "is_connect": 0, "is_publ": 0, "item": 0, "item_data": 0, "item_id": 0, "item_nam": 0, "item_uuid": 0, "itemparentid": 0, "items_to_mov": 0, "jpg": 0, "kei": 0, "kept": 0, "knowledg": 0, "last": 0, "last_nam": 0, "latest": 0, "learn": 0, "left": 0, "like": 0, "limit": 0, "link": 0, "list": 0, "ll": 0, "load": 0, "lt": 0, "lte": 0, "make": 0, "manag": 0, "maya": 0, "media": 0, "media_url": 0, "mediaurl": 0, "member": 0, "messag": 0, "meta": 0, "method": 0, "might": 0, "mode": 0, "model": 0, "modifi": 0, "more": 0, "most": 0, "move": 0, "move_item": 0, "movi": 0, "much": 0, "multipl": 0, "name": 0, "narrow": 0, "need": 0, "nest": 0, "new": 0, "new_review_id": 0, "noconvertflag": 0, "none": 0, "normal": 0, "note": 0, "number": 0, "obj": 0, "object": 0, "offset": 0, "old": 0, "omit": 0, "one": 0, "onli": 0, "onlin": 0, "option": 0, "origin": 0, "out": 0, "output": 0, "over": 0, "overlai": 0, "own": 0, "paper": 0, "param": 0, "paramet": 0, "pass": 0, "path": 0, "payload": 0, "pencil": 0, "per": 0, "percent": 0, "percent_complet": 0, "perform": 0, "period": 0, "permiss": 0, "player": 0, "playlist": 0, "playlist_cod": 0, "playlist_id": 0, "pleas": 0, "png": 0, "possibl": 0, "process": 0, "progress": 0, "progress_url": 0, "project": 0, "project_id": 0, "provid": 0, "pull": 0, "purg": 0, "queri": 0, "rain": 0, "rang": 0, "recommend": 0, "record": 0, "regardless": 0, "remaining_item": 0, "remov": 0, "remove_users_from_project": 0, "remove_users_from_workspac": 0, "requir": 0, "respons": 0, "rest": 0, "restor": 0, "restore_project": 0, "restore_review": 0, "result": 0, "retriev": 0, "return": 0, "return_as_base64": 0, "review": 0, "review_id": 0, "review_link": 0, "reviews__nam": 0, "reviews__project__nam": 0, "revis": 0, "revisionid": 0, "s3": 0, "schema": 0, "search": 0, "searchcriteria": 0, "second": 0, "server": 0, "servic": 0, "set": 0, "shotgrid": 0, "shotgrid_create_config": 0, "shotgrid_get_playlist": 0, "shotgrid_sync_new_item_not": 0, "shotgrid_sync_review_item": 0, "shotgrid_sync_review_not": 0, "shotgun_create_config": 0, "shotgun_get_playlist": 0, "shotgun_get_project": 0, "shotgun_project_id": 0, "shotgun_sync_new_item_not": 0, "shotgun_sync_review_item": 0, "shotgun_sync_review_not": 0, "should": 0, "sign": 0, "signifi": 0, "similar": 0, "singl": 0, "size": 0, "sketch": 0, "sketch_upload_error": 0, "some": 0, "sort": 0, "sort_review_item": 0, "sortord": 0, "sourc": 0, "specif": 0, "speed": 0, "stabil": 0, "start": 0, "startswith": 0, "statu": 0, "storag": 0, "str": 0, "string": 0, "success": 0, "summari": 0, "support": 0, "sure": 0, "sync": 0, "syncsketch_account_id": 0, "syncsketch_project_id": 0, "syncsketchapi": 0, "syntax": 0, "system": 0, "tag": 0, "task": 0, "task_id": 0, "test": 0, "text": 0, "thei": 0, "thi": 0, "time": 0, "tmp": 0, "token": 0, "tool": 0, "topic": 0, "total_item": 0, "trace": 0, "tree": 0, "true": 0, "try": 0, "type": 0, "unarch": 0, "unlik": 0, "up": 0, "updat": 0, "update_account": 0, "update_item": 0, "update_project": 0, "update_review": 0, "updated_item": 0, "upload": 0, "url": 0, "us": 0, "usag": 0, "use_header_auth": 0, "useexpiringtoken": 0, "user": 0, "user_id": 0, "usernam": 0, "uuid": 0, "v1": 0, "valu": 0, "veri": 0, "version": 0, "video": 0, "viewer": 0, "visit": 0, "wa": 0, "want": 0, "we": 0, "webm": 0, "when": 0, "whether": 0, "which": 0, "width": 0, "wish": 0, "with_tracing_pap": 0, "withitem": 0, "without": 0, "work": 0, "workspac": 0, "workspace_id": 0, "would": 0, "wp": 0, "writabl": 0, "www": 0, "xml": 0, "yet": 0, "you": 0, "your": 0, "zip": 0}, "titles": ["SyncSketch Python API Library documentation"], "titleterms": {"api": 0, "document": 0, "librari": 0, "python": 0, "syncsketch": 0}}) \ No newline at end of file +Search.setIndex({"alltitles":{"SyncSketch Python API Library documentation":[[0,null]]},"docnames":["index"],"envversion":{"sphinx":66,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["index.rst"],"indexentries":{"add_comment() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_comment",false]],"add_item() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_item",false]],"add_media() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_media",false]],"add_media_by_url() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_media_by_url",false]],"add_media_v1() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_media_v1",false]],"add_media_v2() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_media_v2",false]],"add_users_to_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_users_to_project",false]],"add_users_to_workspace() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.add_users_to_workspace",false]],"archive_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.archive_project",false]],"archive_review() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.archive_review",false]],"bulk_delete_items() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.bulk_delete_items",false]],"create_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.create_project",false]],"create_review() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.create_review",false]],"create_review_section() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.create_review_section",false]],"delete_item() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.delete_item",false]],"delete_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.delete_project",false]],"delete_review() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.delete_review",false]],"delete_review_section() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.delete_review_section",false]],"duplicate_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.duplicate_project",false]],"get_accounts() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_accounts",false]],"get_annotations() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_annotations",false]],"get_connections_by_user_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_connections_by_user_id",false]],"get_flattened_annotations() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_flattened_annotations",false]],"get_grease_pencil_overlays() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_grease_pencil_overlays",false]],"get_item() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_item",false]],"get_items_by_review_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_items_by_review_id",false]],"get_media() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_media",false]],"get_project_by_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_project_by_id",false]],"get_project_storage() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_project_storage",false]],"get_projects() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_projects",false]],"get_projects_by_name() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_projects_by_name",false]],"get_review_by_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_review_by_id",false]],"get_review_by_name() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_review_by_name",false]],"get_review_by_uuid() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_review_by_uuid",false]],"get_review_storage() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_review_storage",false]],"get_reviews_by_project_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_reviews_by_project_id",false]],"get_shotgrid_sync_review_items_progress() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_shotgrid_sync_review_items_progress",false]],"get_shotgrid_sync_review_notes_progress() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_shotgrid_sync_review_notes_progress",false]],"get_shotgun_sync_review_items_progress() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_shotgun_sync_review_items_progress",false]],"get_tree() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_tree",false]],"get_user_by_email() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_user_by_email",false]],"get_user_by_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_user_by_id",false]],"get_users_by_name() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_users_by_name",false]],"get_users_by_project_id() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.get_users_by_project_id",false]],"is_connected() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.is_connected",false]],"move_items() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.move_items",false]],"remove_users_from_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.remove_users_from_project",false]],"remove_users_from_workspace() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.remove_users_from_workspace",false]],"restore_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.restore_project",false]],"restore_review() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.restore_review",false]],"shotgrid_create_config() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgrid_create_config",false]],"shotgrid_get_playlists() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgrid_get_playlists",false]],"shotgrid_sync_new_item_notes() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgrid_sync_new_item_notes",false]],"shotgrid_sync_review_items() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgrid_sync_review_items",false]],"shotgrid_sync_review_notes() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgrid_sync_review_notes",false]],"shotgun_create_config() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_create_config",false]],"shotgun_get_playlists() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_get_playlists",false]],"shotgun_get_projects() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_get_projects",false]],"shotgun_sync_new_item_notes() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_sync_new_item_notes",false]],"shotgun_sync_review_items() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_sync_review_items",false]],"shotgun_sync_review_notes() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.shotgun_sync_review_notes",false]],"sort_review_items() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.sort_review_items",false]],"syncsketchapi (class in syncsketch)":[[0,"syncsketch.SyncSketchAPI",false]],"update_account() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.update_account",false]],"update_item() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.update_item",false]],"update_project() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.update_project",false]],"update_review() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.update_review",false]],"update_review_sections() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.update_review_sections",false]],"upload_file() (syncsketch.syncsketchapi method)":[[0,"syncsketch.SyncSketchAPI.upload_file",false]]},"objects":{"syncsketch":[[0,0,1,"","SyncSketchAPI"]],"syncsketch.SyncSketchAPI":[[0,1,1,"","add_comment"],[0,1,1,"","add_item"],[0,1,1,"","add_media"],[0,1,1,"","add_media_by_url"],[0,1,1,"","add_media_v1"],[0,1,1,"","add_media_v2"],[0,1,1,"","add_users_to_project"],[0,1,1,"","add_users_to_workspace"],[0,1,1,"","archive_project"],[0,1,1,"","archive_review"],[0,1,1,"","bulk_delete_items"],[0,1,1,"","create_project"],[0,1,1,"","create_review"],[0,1,1,"","create_review_section"],[0,1,1,"","delete_item"],[0,1,1,"","delete_project"],[0,1,1,"","delete_review"],[0,1,1,"","delete_review_section"],[0,1,1,"","duplicate_project"],[0,1,1,"","get_accounts"],[0,1,1,"","get_annotations"],[0,1,1,"","get_connections_by_user_id"],[0,1,1,"","get_flattened_annotations"],[0,1,1,"","get_grease_pencil_overlays"],[0,1,1,"","get_item"],[0,1,1,"","get_items_by_review_id"],[0,1,1,"","get_media"],[0,1,1,"","get_project_by_id"],[0,1,1,"","get_project_storage"],[0,1,1,"","get_projects"],[0,1,1,"","get_projects_by_name"],[0,1,1,"","get_review_by_id"],[0,1,1,"","get_review_by_name"],[0,1,1,"","get_review_by_uuid"],[0,1,1,"","get_review_storage"],[0,1,1,"","get_reviews_by_project_id"],[0,1,1,"","get_shotgrid_sync_review_items_progress"],[0,1,1,"","get_shotgrid_sync_review_notes_progress"],[0,1,1,"","get_shotgun_sync_review_items_progress"],[0,1,1,"","get_tree"],[0,1,1,"","get_user_by_email"],[0,1,1,"","get_user_by_id"],[0,1,1,"","get_users_by_name"],[0,1,1,"","get_users_by_project_id"],[0,1,1,"","is_connected"],[0,1,1,"","move_items"],[0,1,1,"","remove_users_from_project"],[0,1,1,"","remove_users_from_workspace"],[0,1,1,"","restore_project"],[0,1,1,"","restore_review"],[0,1,1,"","shotgrid_create_config"],[0,1,1,"","shotgrid_get_playlists"],[0,1,1,"","shotgrid_sync_new_item_notes"],[0,1,1,"","shotgrid_sync_review_items"],[0,1,1,"","shotgrid_sync_review_notes"],[0,1,1,"","shotgun_create_config"],[0,1,1,"","shotgun_get_playlists"],[0,1,1,"","shotgun_get_projects"],[0,1,1,"","shotgun_sync_new_item_notes"],[0,1,1,"","shotgun_sync_review_items"],[0,1,1,"","shotgun_sync_review_notes"],[0,1,1,"","sort_review_items"],[0,1,1,"","update_account"],[0,1,1,"","update_item"],[0,1,1,"","update_project"],[0,1,1,"","update_review"],[0,1,1,"","update_review_sections"],[0,1,1,"","upload_file"]]},"objnames":{"0":["py","class","Python class"],"1":["py","method","Python method"]},"objtypes":{"0":"py:class","1":"py:method"},"terms":{"3d":0,"5mb":0,"A":0,"For":0,"If":0,"In":0,"It":0,"TO":0,"The":0,"This":0,"To":0,"We":0,"When":0,"You":0,"__":0,"__init__":0,"access":0,"account":0,"account_id":0,"accountid":0,"activ":0,"add":0,"add_com":0,"add_item":0,"add_media":0,"add_media_by_url":0,"add_media_v1":0,"add_media_v2":0,"add_users_to_project":0,"add_users_to_workspac":0,"addit":0,"additem":0,"additional_data":0,"additionaldata":0,"admin":0,"all_with_rel":0,"alreadi":0,"also":0,"alway":0,"ani":0,"annot":0,"anoth":0,"api_key":0,"api_vers":0,"applic":0,"archiv":0,"archive_project":0,"archive_review":0,"array":0,"artist":0,"artist_nam":0,"associ":0,"attach":0,"auth":0,"authent":0,"author":0,"auto":0,"autodesk":0,"autodoc_member_ord":0,"automat":0,"avail":0,"aw":0,"backend":0,"background":0,"base":0,"base64":0,"befor":0,"bool":0,"bradi":0,"browser":0,"bulk_delete_item":0,"bysourc":0,"byte":0,"caa":0,"call":0,"can":0,"capabl":0,"case":0,"certain":0,"check":0,"chunk":0,"chunk_siz":0,"class":0,"cloud":0,"cloudhelp":0,"code":0,"collabor":0,"com":0,"combin":0,"command":0,"comment":0,"communic":0,"compat":0,"complet":0,"composit":0,"configur":0,"connect":0,"constructor":0,"contain":0,"content":0,"conveni":0,"convert":0,"copi":0,"copy_review":0,"copy_set":0,"copy_us":0,"correct":0,"creat":0,"create_project":0,"create_review":0,"create_review_sect":0,"creator":0,"current":0,"data":0,"day":0,"db":0,"de":0,"deactiv":0,"debug":0,"default":0,"definit":0,"delet":0,"delete_item":0,"delete_project":0,"delete_review":0,"delete_review_sect":0,"deprecationwarn":0,"describ":0,"descript":0,"detect":0,"determin":0,"dict":0,"dictionari":0,"direct":0,"disk":0,"django":0,"djangoproject":0,"doc":0,"doe":0,"done":0,"download":0,"dropbox":0,"duplicate_project":0,"durat":0,"dure":0,"e":0,"either":0,"email":0,"en":0,"enabl":0,"encod":0,"endr":0,"enu":0,"error":0,"etc":0,"even":0,"exact":0,"exampl":0,"exist":0,"expir":0,"explor":0,"extens":0,"external_thumbnail_url":0,"external_url":0,"externali":0,"fail":0,"failur":0,"fals":0,"fetch":0,"field":0,"file":0,"file_nam":0,"filepath":0,"find":0,"first_nam":0,"float":0,"follow":0,"foreign":0,"format":0,"found":0,"fps":0,"frame":0,"full":0,"function":0,"g":0,"general":0,"generat":0,"get":0,"get_account":0,"get_annot":0,"get_connections_by_user_id":0,"get_flattened_annot":0,"get_grease_pencil_overlay":0,"get_item":0,"get_items_by_review_id":0,"get_media":0,"get_project":0,"get_project_by_id":0,"get_project_storag":0,"get_projects_by_nam":0,"get_review_by_id":0,"get_review_by_nam":0,"get_review_by_uuid":0,"get_review_storag":0,"get_reviews_by_project_id":0,"get_shotgrid_sync_review_items_progress":0,"get_shotgrid_sync_review_notes_progress":0,"get_shotgun_sync_review_items_progress":0,"get_shotgun_sync_review_notes_progress":0,"get_tre":0,"get_user_by_email":0,"get_user_by_id":0,"get_users_by_nam":0,"get_users_by_project_id":0,"getaccount":0,"getmedia":0,"good":0,"greas":0,"greasepencil":0,"gt":0,"gte":0,"header":0,"height":0,"homedir":0,"host":0,"hour":0,"htm":0,"html":0,"http":0,"https":0,"id":0,"ignor":0,"imag":0,"import":0,"improv":0,"inact":0,"includ":0,"include_archiv":0,"include_connect":0,"include_delet":0,"include_inact":0,"include_tag":0,"info":0,"inform":0,"insensit":0,"instead":0,"int":0,"interact":0,"internal":0,"invit":0,"is_connect":0,"is_publ":0,"item":0,"item_data":0,"item_id":0,"item_nam":0,"item_uuid":0,"itemid":0,"itemparentid":0,"items_to_mov":0,"jpg":0,"kept":0,"key":0,"knowledg":0,"larg":0,"last":0,"last_nam":0,"latest":0,"learn":0,"left":0,"like":0,"limit":0,"link":0,"list":0,"ll":0,"load":0,"lt":0,"lte":0,"make":0,"manag":0,"max_work":0,"maximum":0,"maya":0,"media":0,"media_url":0,"mediaurl":0,"member":0,"messag":0,"meta":0,"method":0,"might":0,"mode":0,"model":0,"modifi":0,"move":0,"move_item":0,"movi":0,"much":0,"multipart":0,"multipl":0,"name":0,"narrow":0,"need":0,"nest":0,"new":0,"new_review_id":0,"noconvertflag":0,"none":0,"normal":0,"note":0,"number":0,"obj":0,"object":0,"offset":0,"old":0,"omit":0,"one":0,"onli":0,"onlin":0,"option":0,"origin":0,"output":0,"overlay":0,"paper":0,"parallel":0,"param":0,"paramet":0,"pass":0,"path":0,"payload":0,"pencil":0,"per":0,"percent":0,"percent_complet":0,"perform":0,"period":0,"permiss":0,"player":0,"playlist":0,"playlist_cod":0,"playlist_id":0,"pleas":0,"png":0,"possibl":0,"process":0,"progress":0,"progress_url":0,"project":0,"project_id":0,"provid":0,"pull":0,"purg":0,"queri":0,"rain":0,"rang":0,"raw_respons":0,"recommend":0,"record":0,"remaining_item":0,"remov":0,"remove_users_from_project":0,"remove_users_from_workspac":0,"requir":0,"respons":0,"rest":0,"restor":0,"restore_project":0,"restore_review":0,"result":0,"retriev":0,"return":0,"return_as_base64":0,"review":0,"review_id":0,"review_link":0,"reviews__nam":0,"reviews__project__nam":0,"revis":0,"revisionid":0,"s":0,"s3":0,"schema":0,"search":0,"searchcriteria":0,"second":0,"section":0,"section_uuid":0,"sections_to_upd":0,"server":0,"servic":0,"set":0,"shotgrid":0,"shotgrid_create_config":0,"shotgrid_get_playlist":0,"shotgrid_sync_new_item_not":0,"shotgrid_sync_review_item":0,"shotgrid_sync_review_not":0,"shotgun_create_config":0,"shotgun_get_playlist":0,"shotgun_get_project":0,"shotgun_project_id":0,"shotgun_sync_new_item_not":0,"shotgun_sync_review_item":0,"shotgun_sync_review_not":0,"sign":0,"signifi":0,"similar":0,"singl":0,"size":0,"sketch":0,"sketch_upload_error":0,"sort":0,"sort_review_item":0,"sortord":0,"sourc":0,"specif":0,"speed":0,"stabil":0,"start":0,"startswith":0,"status":0,"storag":0,"str":0,"string":0,"success":0,"support":0,"sure":0,"sync":0,"syncsketch_account_id":0,"syncsketch_project_id":0,"syncsketchapi":0,"syntax":0,"system":0,"tag":0,"task":0,"task_id":0,"test":0,"text":0,"time":0,"tmp":0,"token":0,"tool":0,"topic":0,"total_item":0,"trace":0,"tree":0,"tri":0,"true":0,"type":0,"unarch":0,"unlik":0,"updat":0,"update_account":0,"update_item":0,"update_project":0,"update_review":0,"update_review_sect":0,"updated_item":0,"upload":0,"upload_fil":0,"url":0,"usag":0,"use":0,"use_header_auth":0,"useexpiringtoken":0,"user":0,"user_id":0,"usernam":0,"uuid":0,"v1":0,"valu":0,"veri":0,"version":0,"video":0,"viewer":0,"visit":0,"want":0,"webm":0,"whether":0,"whole":0,"width":0,"will":0,"wish":0,"with_tracing_pap":0,"withitem":0,"without":0,"work":0,"worker":0,"workspac":0,"workspace_id":0,"wp":0,"writabl":0,"www":0,"xml":0,"yet":0,"zip":0},"titles":["SyncSketch Python API Library documentation"],"titleterms":{"api":0,"document":0,"librari":0,"python":0,"syncsketch":0}}) \ No newline at end of file diff --git a/build/lib/syncsketch/__init__.py b/build/lib/syncsketch/__init__.py index c51c39a..5965791 100644 --- a/build/lib/syncsketch/__init__.py +++ b/build/lib/syncsketch/__init__.py @@ -8,6 +8,6 @@ from .syncsketch import SyncSketchAPI -__version__ = "1.0.11.2" +__version__ = "1.0.12.0" __author__ = "SyncSketch Dev Team" __credits__ = "Philip Floetotto, Yafes Sahin, Brady Endres, Eric Palakovich Carr" diff --git a/dist/syncsketch-1.0.12.0-py3-none-any.whl b/dist/syncsketch-1.0.12.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..3894bcac934c05afd0e6aa14c630611787b8e3f7 GIT binary patch literal 20978 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.20.0"], + extras_require={ + "test": [ + "pytest>=7.0,<9.0", + "pytest-cov>=4.0", + "responses>=0.20.0", + ], + }, license="BSD-3-Clause", ) diff --git a/syncsketch.egg-info/PKG-INFO b/syncsketch.egg-info/PKG-INFO index 84c0c30..967df5c 100644 --- a/syncsketch.egg-info/PKG-INFO +++ b/syncsketch.egg-info/PKG-INFO @@ -1,6 +1,6 @@ -Metadata-Version: 2.2 +Metadata-Version: 2.4 Name: syncsketch -Version: 1.0.11.2 +Version: 1.0.12.0 Summary: SyncSketch Python API Home-page: https://github.com/syncsketch/python-api Author: Philip Floetotto @@ -18,10 +18,16 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 -Requires-Python: >=2.7, <=3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=2.7, <3.15 Description-Content-Type: text/markdown License-File: LICENSE Requires-Dist: requests>=2.20.0 +Provides-Extra: test +Requires-Dist: pytest<9.0,>=7.0; extra == "test" +Requires-Dist: pytest-cov>=4.0; extra == "test" +Requires-Dist: responses>=0.20.0; extra == "test" Dynamic: author Dynamic: author-email Dynamic: classifier @@ -29,6 +35,8 @@ Dynamic: description Dynamic: description-content-type Dynamic: home-page Dynamic: license +Dynamic: license-file +Dynamic: provides-extra Dynamic: requires-dist Dynamic: requires-python Dynamic: summary @@ -69,6 +77,7 @@ This library was tested with and confirmed on python versions: - 3.10 - 3.11 - 3.12 +- 3.13 #### Installation diff --git a/syncsketch.egg-info/SOURCES.txt b/syncsketch.egg-info/SOURCES.txt index 2d067e6..99fdb92 100644 --- a/syncsketch.egg-info/SOURCES.txt +++ b/syncsketch.egg-info/SOURCES.txt @@ -7,4 +7,18 @@ syncsketch.egg-info/PKG-INFO syncsketch.egg-info/SOURCES.txt syncsketch.egg-info/dependency_links.txt syncsketch.egg-info/requires.txt -syncsketch.egg-info/top_level.txt \ No newline at end of file +syncsketch.egg-info/top_level.txt +tests/test_accounts.py +tests/test_annotations.py +tests/test_auth.py +tests/test_backward_compat.py +tests/test_connection.py +tests/test_get_json_response.py +tests/test_items.py +tests/test_media_upload.py +tests/test_projects.py +tests/test_real_file_io.py +tests/test_reviews.py +tests/test_shotgrid.py +tests/test_tree.py +tests/test_users.py \ No newline at end of file diff --git a/syncsketch.egg-info/requires.txt b/syncsketch.egg-info/requires.txt index 111f18b..ca2bfbe 100644 --- a/syncsketch.egg-info/requires.txt +++ b/syncsketch.egg-info/requires.txt @@ -1 +1,6 @@ requests>=2.20.0 + +[test] +pytest<9.0,>=7.0 +pytest-cov>=4.0 +responses>=0.20.0 diff --git a/syncsketch/__init__.py b/syncsketch/__init__.py index c51c39a..5965791 100644 --- a/syncsketch/__init__.py +++ b/syncsketch/__init__.py @@ -8,6 +8,6 @@ from .syncsketch import SyncSketchAPI -__version__ = "1.0.11.2" +__version__ = "1.0.12.0" __author__ = "SyncSketch Dev Team" __credits__ = "Philip Floetotto, Yafes Sahin, Brady Endres, Eric Palakovich Carr" diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..a9cf616 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,61 @@ +# SyncSketch API Tests + +Unit tests for the SyncSketch Python API using **pytest** with mocked HTTP via the **responses** library. +These tests are not a true reflection of the live API behavior but are designed to validate the client-side logic and ensure consistent behavior across Python versions. + +## Setup + +```bash +pip install -e ".[test]" + +# Install tox +pip install tox +``` + +## Running Tests + +```bash +# All tests +pytest tests/ -v + +# With coverage +pytest tests/ --cov=syncsketch --cov-report=term-missing + +# Single file +pytest tests/test_projects.py -v +``` + +## Multi-version Testing (tox) + +```bash +# All configured Python versions (3.7-3.13) +tox + +# Specific version +tox -e py313 +``` + +Requires the target Python versions to be installed (e.g. via pyenv). Missing interpreters are skipped automatically. + +## Test Structure + +| File | Covers | +|------|--------| +| `conftest.py` | Shared fixtures, sample data, helpers | +| `test_auth.py` | Constructor and 3 auth modes (query param, expiring token, header) | +| `test_get_json_response.py` | Core HTTP dispatch, auth injection, response parsing | +| `test_connection.py` | `is_connected`, URL utilities, `_update_params` | +| `test_accounts.py` | Workspace/account CRUD | +| `test_projects.py` | Project CRUD, archive/restore, duplicate | +| `test_reviews.py` | Review CRUD, sections, archive/restore | +| `test_items.py` | Item CRUD, bulk delete, move | +| `test_media_upload.py` | `add_media`, `add_media_v2`, `upload_file` multipart S3 flow | +| `test_annotations.py` | Comments, annotations, grease pencil overlays | +| `test_users.py` | User lookup, workspace/project user management | +| `test_shotgrid.py` | ShotGrid config, sync, deprecation | +| `test_tree.py` | `get_tree` | +| `test_backward_compat.py` | camelCase backward-compatibility alias checks | + +## Mocking Approach + +All HTTP calls are intercepted at the `requests` transport layer using the [responses](https://github.com/getsentry/responses) library. This catches both calls through `_get_json_response()` and direct `requests.*` calls in upload/annotation methods. File I/O and `time.sleep` in polling loops are patched with `unittest.mock`. 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..e9afbe2 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,109 @@ +import pytest +import responses + +from syncsketch import SyncSketchAPI + +HOST = "https://test.syncsketch.com" +USERNAME = "testuser" +API_KEY = "testapikey123" + + +@pytest.fixture +def api(): + """Standard API client using default query-param auth.""" + return SyncSketchAPI( + auth=USERNAME, + api_key=API_KEY, + host=HOST, + ) + + +@pytest.fixture +def api_token(): + """API client using expiring token auth.""" + return SyncSketchAPI( + auth="test@example.com", + api_key="expiring-token-123", + host=HOST, + useExpiringToken=True, + ) + + +@pytest.fixture +def api_header(): + """API client using header-based auth.""" + return SyncSketchAPI( + auth=USERNAME, + api_key=API_KEY, + host=HOST, + use_header_auth=True, + ) + + +@pytest.fixture +def api_debug(): + """API client with debug enabled.""" + return SyncSketchAPI( + auth=USERNAME, + api_key=API_KEY, + host=HOST, + debug=True, + ) + + +@pytest.fixture +def mocked(): + """Activate the responses mock for the duration of a test.""" + with responses.RequestsMock() as rsps: + yield rsps + + +def make_list_response(objects, total_count=None): + """Build a standard Tastypie list response envelope.""" + if total_count is None: + total_count = len(objects) + return { + "meta": { + "limit": 100, + "next": None, + "offset": 0, + "previous": None, + "total_count": total_count, + }, + "objects": objects, + } + + +SAMPLE_PROJECT = { + "id": 123, + "name": "Test Project", + "description": "A test project", + "active": True, + "is_archived": False, + "account_id": 1, +} + +SAMPLE_REVIEW = { + "id": 456, + "name": "Test Review", + "description": "A test review", + "active": True, + "project": "/api/v1/project/123/", + "uuid": "abc-def-ghi", +} + +SAMPLE_ITEM = { + "id": 789, + "name": "test_clip.mp4", + "active": True, + "fps": 24.0, + "status": "done", + "revision_id": 101, +} + +SAMPLE_USER = { + "id": 42, + "first_name": "Test", + "last_name": "User", + "email": "test@example.com", +} diff --git a/tests/test_accounts.py b/tests/test_accounts.py new file mode 100644 index 0000000..9ca5ffc --- /dev/null +++ b/tests/test_accounts.py @@ -0,0 +1,39 @@ +"""Tests for workspace/account methods.""" + +import responses + +from tests.conftest import HOST, SAMPLE_PROJECT, make_list_response + + +class TestGetAccounts: + @responses.activate + def test_get_accounts(self, api): + body = make_list_response([{"id": 1, "name": "Workspace"}]) + responses.add(responses.GET, HOST + "/api/v1/account/", json=body) + result = api.get_accounts() + assert result["objects"][0]["name"] == "Workspace" + assert responses.calls[0].request.params["active"] == "1" + + @responses.activate + def test_get_accounts_with_fields(self, api): + responses.add(responses.GET, HOST + "/api/v1/account/", json=make_list_response([])) + api.get_accounts(fields=["id", "name"]) + assert responses.calls[0].request.params["fields"] == "id,name" + + @responses.activate + def test_get_accounts_raw_response(self, api): + responses.add(responses.GET, HOST + "/api/v1/account/", json={}) + result = api.get_accounts(raw_response=True) + assert hasattr(result, "status_code") + + +class TestUpdateAccount: + @responses.activate + def test_update_account(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/account/1/", json={"id": 1, "name": "Updated"}) + result = api.update_account(1, {"name": "Updated"}) + assert result["name"] == "Updated" + + def test_update_account_non_dict_returns_false(self, api): + result = api.update_account(1, "not a dict") + assert result is False diff --git a/tests/test_annotations.py b/tests/test_annotations.py new file mode 100644 index 0000000..0c648e9 --- /dev/null +++ b/tests/test_annotations.py @@ -0,0 +1,145 @@ +"""Tests for comments, annotations, and grease pencil overlays.""" + +import json +import os +from unittest.mock import mock_open, patch + +import responses + +from tests.conftest import HOST, SAMPLE_ITEM, make_list_response + + +class TestAddComment: + @responses.activate + def test_add_comment(self, api): + # get_item call + responses.add(responses.GET, HOST + "/api/v1/item/789/", json=SAMPLE_ITEM) + # post frame + frame_data = {"id": 1, "text": "Great work!"} + responses.add(responses.POST, HOST + "/api/v1/frame/", json=frame_data) + + result = api.add_comment(789, "Great work!", 456, frame=5) + assert result["text"] == "Great work!" + + # Verify the POST body + body = json.loads(responses.calls[1].request.body) + assert body["item"] == "/api/v1/item/789/" + assert body["frame"] == 5 + assert body["revision"] == "/api/v1/revision/101/" + assert body["type"] == "comment" + assert body["text"] == "Great work!" + + @responses.activate + def test_no_revision_id_returns_error(self, api): + item_no_revision = {"id": 789, "name": "test.mp4"} + responses.add(responses.GET, HOST + "/api/v1/item/789/", json=item_no_revision) + result = api.add_comment(789, "text", 456) + assert result == "error" + + +class TestGetAnnotations: + @responses.activate + def test_get_annotations(self, api): + responses.add(responses.GET, HOST + "/api/v1/frame/", json=make_list_response([{"id": 1}])) + api.get_annotations(789) + params = responses.calls[0].request.params + assert params["item__id"] == "789" + assert params["active"] == "1" + + @responses.activate + def test_with_revision_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/frame/", json=make_list_response([])) + api.get_annotations(789, revisionId=101) + assert responses.calls[0].request.params["revision__id"] == "101" + + @responses.activate + def test_with_review_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/frame/", json=make_list_response([])) + api.get_annotations(789, review_id=456) + assert responses.calls[0].request.params["revision__review_id"] == "456" + + +class TestGetFlattenedAnnotations: + @responses.activate + @patch("time.sleep") + def test_success(self, mock_sleep, api): + flattened_url = HOST + "/api/v2/downloads/flattenedSketches/456/789/" + # POST to start celery task + responses.add(responses.POST, flattened_url, json="task-id-123") + # First GET: processing + check_url = HOST + "/api/v2/downloads/flattenedSketches/task-id-123/" + responses.add(responses.GET, check_url, json={"status": "processing"}) + # Second GET: done + responses.add(responses.GET, check_url, json={"status": "done", "data": ["sketch1.png"]}) + + result = api.get_flattened_annotations(456, 789) + assert result["status"] == "done" + + @responses.activate + def test_failed(self, api): + flattened_url = HOST + "/api/v2/downloads/flattenedSketches/456/789/" + responses.add(responses.POST, flattened_url, json="task-id-123") + check_url = HOST + "/api/v2/downloads/flattenedSketches/task-id-123/" + responses.add(responses.GET, check_url, json={"status": "failed"}) + + result = api.get_flattened_annotations(456, 789) + assert result is None + + +class TestGetGreasePencilOverlays: + @responses.activate + @patch("time.sleep") + def test_success(self, mock_sleep, api): + gp_url = HOST + "/api/v2/downloads/greasePencil/456/789/" + responses.add(responses.POST, gp_url, json="task-id-456") + + check_url = HOST + "/api/v2/downloads/greasePencil/task-id-456/" + responses.add( + responses.GET, + check_url, + json={ + "status": "done", + "data": {"fileName": "overlay", "s3Path": "https://s3.example.com/overlay.zip"}, + }, + ) + responses.add(responses.GET, "https://s3.example.com/overlay.zip", body=b"zipdata") + + m = mock_open() + with patch("syncsketch.syncsketch.open", m): + result = api.get_grease_pencil_overlays(456, 789) + + assert result == "/tmp/overlay.zip" + m.assert_called_once_with("/tmp/overlay.zip", "wb") + + @responses.activate + def test_failed(self, api): + gp_url = HOST + "/api/v2/downloads/greasePencil/456/789/" + responses.add(responses.POST, gp_url, json="task-id-456") + check_url = HOST + "/api/v2/downloads/greasePencil/task-id-456/" + responses.add(responses.GET, check_url, json={"status": "failed"}) + + result = api.get_grease_pencil_overlays(456, 789) + assert result is False + + @responses.activate + @patch("time.sleep") + def test_custom_homedir(self, mock_sleep, api): + gp_url = HOST + "/api/v2/downloads/greasePencil/456/789/" + responses.add(responses.POST, gp_url, json="task-id-456") + check_url = HOST + "/api/v2/downloads/greasePencil/task-id-456/" + responses.add( + responses.GET, + check_url, + json={ + "status": "done", + "data": {"fileName": "overlay", "s3Path": "https://s3.example.com/overlay.zip"}, + }, + ) + responses.add(responses.GET, "https://s3.example.com/overlay.zip", body=b"zipdata") + + m = mock_open() + with patch("syncsketch.syncsketch.open", m): + result = api.get_grease_pencil_overlays(456, 789, homedir="/custom/path") + + expected_path = os.path.join("/custom/path", "overlay.zip") + assert result == expected_path diff --git a/tests/test_auth.py b/tests/test_auth.py new file mode 100644 index 0000000..e92358b --- /dev/null +++ b/tests/test_auth.py @@ -0,0 +1,64 @@ +"""Tests for SyncSketchAPI constructor and authentication modes.""" + +from syncsketch import SyncSketchAPI + +HOST = "https://test.syncsketch.com" + + +class TestDefaultAuth: + def test_query_params_set(self, api): + assert api.api_params == {"api_key": "testapikey123", "username": "testuser"} + + def test_headers_empty(self, api): + assert api.headers == {} + + +class TestExpiringTokenAuth: + def test_token_params_set(self, api_token): + assert api_token.api_params == { + "token": "expiring-token-123", + "email": "test@example.com", + } + + def test_headers_empty(self, api_token): + assert api_token.headers == {} + + +class TestHeaderAuth: + def test_authorization_header_set(self, api_header): + assert api_header.headers == { + "Authorization": "apikey testuser:testapikey123", + } + + def test_api_params_empty(self, api_header): + assert api_header.api_params == {} + + def test_header_auth_with_expiring_token(self): + api = SyncSketchAPI( + auth="test@example.com", + api_key="expiring-token-123", + host=HOST, + useExpiringToken=True, + use_header_auth=True, + ) + assert api.headers["Authorization"] == "token test@example.com:expiring-token-123" + assert api.api_params == {} + + +class TestConstructorOptions: + def test_host_trailing_slash_stripped(self): + api = SyncSketchAPI(auth="u", api_key="k", host="https://test.syncsketch.com/") + assert api.HOST == "https://test.syncsketch.com" + + def test_default_api_version(self, api): + assert api.api_version == "v1" + + def test_custom_api_version(self): + api = SyncSketchAPI(auth="u", api_key="k", host=HOST, api_version="v2") + assert api.api_version == "v2" + + def test_debug_default_false(self, api): + assert api.debug is False + + def test_debug_true(self, api_debug): + assert api_debug.debug is True diff --git a/tests/test_backward_compat.py b/tests/test_backward_compat.py new file mode 100644 index 0000000..2f1bd01 --- /dev/null +++ b/tests/test_backward_compat.py @@ -0,0 +1,64 @@ +"""Tests that camelCase aliases point to the correct snake_case methods.""" + +import pytest + +from syncsketch import SyncSketchAPI + + +@pytest.mark.parametrize( + "alias,target", + [ + # Core + ("isConnected", "is_connected"), + # Accounts + ("getAccounts", "get_accounts"), + # Projects + ("getProjects", "get_projects"), + ("getProjectsByName", "get_projects_by_name"), + ("getProjectById", "get_project_by_id"), + ("addProject", "create_project"), + ("deleteProject", "delete_project"), + # Reviews + ("addReview", "create_review"), + ("getReviewsByProjectId", "get_reviews_by_project_id"), + ("getReviewByName", "get_review_by_name"), + ("getReviewById", "get_review_by_id"), + ("deleteReview", "delete_review"), + # Items + ("getItem", "get_item"), + ("addItem", "add_item"), + ("updateItem", "update_item"), + ("addMedia", "add_media"), + ("addMediaByURL", "add_media_by_url"), + ("getMediaByReviewId", "get_items_by_review_id"), + ("get_media_by_review_id", "get_items_by_review_id"), + ("getMedia", "get_media"), + ("connectItemToReview", "connect_item_to_review"), + ("deleteItem", "delete_item"), + # v1 alias + ("add_media_v1", "add_media"), + # Users + ("getUsersByName", "get_users_by_name"), + ("getUsersByProjectId", "get_users_by_project_id"), + ("getUserById", "get_user_by_id"), + ("addUsers", "add_users"), + ("getCurrentUser", "get_current_user"), + # Annotations + ("addComment", "add_comment"), + ("getGreasePencilOverlays", "get_grease_pencil_overlays"), + ("getAnnotations", "get_annotations"), + # Tree + ("getTree", "get_tree"), + # Shotgrid/Shotgun aliases + ("get_shotgun_sync_review_items_progress", "get_shotgrid_sync_review_items_progress"), + ("shotgun_sync_review_items", "shotgrid_sync_review_items"), + ("get_shotgun_sync_review_notes_progress", "get_shotgrid_sync_review_notes_progress"), + ("shotgun_sync_new_item_notes", "shotgrid_sync_new_item_notes"), + ("shotgun_sync_review_notes", "shotgrid_sync_review_notes"), + ("shotgun_get_playlists", "shotgrid_get_playlists"), + ("shotgun_create_config", "shotgrid_create_config"), + ("shotgun_get_projects", "shotgrid_get_projects"), + ], +) +def test_backward_compat_alias(alias, target): + assert getattr(SyncSketchAPI, alias) is getattr(SyncSketchAPI, target) diff --git a/tests/test_connection.py b/tests/test_connection.py new file mode 100644 index 0000000..5dba98b --- /dev/null +++ b/tests/test_connection.py @@ -0,0 +1,65 @@ +"""Tests for connection, URL utilities, and _update_params.""" + +import responses + +from syncsketch import SyncSketchAPI + +HOST = "https://test.syncsketch.com" + + +class TestIsConnected: + @responses.activate + def test_raw_response_returns_response_object(self, api): + responses.add(responses.GET, HOST + "/api/v1/person/connected/", json={}, status=200) + result = api.is_connected(raw_response=True) + assert hasattr(result, "status_code") + assert result.status_code == 200 + + +class TestGetApiBaseUrl: + def test_default_version(self, api): + assert api.get_api_base_url() == HOST + "/api/v1/" + + def test_custom_version(self, api): + assert api.get_api_base_url("v2") == HOST + "/api/v2/" + + +class TestJoinUrlPath: + def test_single_segment(self): + assert SyncSketchAPI.join_url_path("abc") == "abc/" + + def test_two_segments(self): + assert SyncSketchAPI.join_url_path("abc", "123") == "abc/123/" + + def test_strips_slashes(self): + assert SyncSketchAPI.join_url_path("abc", "/123/", "/xyz/") == "abc/123/xyz/" + + def test_already_terminated(self): + assert SyncSketchAPI.join_url_path("abc/") == "abc/" + + +class TestUpdateParams: + def test_string_value(self): + params = {} + SyncSketchAPI._update_params("key", "val", params) + assert params == {"key": "val"} + + def test_list_value_joined(self): + params = {} + SyncSketchAPI._update_params("key", ["a", "b", "c"], params) + assert params == {"key": "a,b,c"} + + def test_tuple_value_joined(self): + params = {} + SyncSketchAPI._update_params("key", ("x", "y"), params) + assert params == {"key": "x,y"} + + def test_none_does_not_update(self): + params = {"existing": 1} + SyncSketchAPI._update_params("key", None, params) + assert params == {"existing": 1} + + def test_falsy_zero_does_not_update(self): + params = {} + SyncSketchAPI._update_params("key", 0, params) + assert params == {} diff --git a/tests/test_get_json_response.py b/tests/test_get_json_response.py new file mode 100644 index 0000000..51ab9c5 --- /dev/null +++ b/tests/test_get_json_response.py @@ -0,0 +1,133 @@ +"""Tests for _get_json_response HTTP dispatch logic.""" + +import json + +import responses + +HOST = "https://test.syncsketch.com" + + +class TestHTTPMethodRouting: + @responses.activate + def test_get_request_default(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={"ok": True}) + result = api._get_json_response("/api/v1/test/") + assert result == {"ok": True} + assert responses.calls[0].request.method == "GET" + + @responses.activate + def test_post_request_with_post_data(self, api): + responses.add(responses.POST, HOST + "/api/v1/test/", json={"created": True}) + result = api._get_json_response("/api/v1/test/", postData={"key": "val"}) + assert result == {"created": True} + req = responses.calls[0].request + assert req.method == "POST" + assert json.loads(req.body) == {"key": "val"} + + @responses.activate + def test_patch_request_with_patch_data(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/test/", json={"updated": True}) + result = api._get_json_response("/api/v1/test/", patchData={"key": "val"}) + assert result == {"updated": True} + assert responses.calls[0].request.method == "PATCH" + + @responses.activate + def test_put_request_with_put_data(self, api): + responses.add(responses.PUT, HOST + "/api/v1/test/", json={"updated": True}) + result = api._get_json_response("/api/v1/test/", putData={"key": "val"}) + assert result == {"updated": True} + assert responses.calls[0].request.method == "PUT" + + @responses.activate + def test_delete_request(self, api): + responses.add(responses.DELETE, HOST + "/api/v1/test/", json={"deleted": True}) + result = api._get_json_response("/api/v1/test/", method="delete") + assert result == {"deleted": True} + assert responses.calls[0].request.method == "DELETE" + + @responses.activate + def test_explicit_post_method_no_data(self, api): + responses.add(responses.POST, HOST + "/api/v1/test/", json={"ok": True}) + api._get_json_response("/api/v1/test/", method="post") + assert responses.calls[0].request.method == "POST" + + +class TestAuthParamInjection: + @responses.activate + def test_get_data_merged_with_auth_params(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={}) + api._get_json_response("/api/v1/test/", getData={"limit": 10}) + params = responses.calls[0].request.params + assert params["api_key"] == "testapikey123" + assert params["username"] == "testuser" + assert params["limit"] == "10" + + @responses.activate + def test_header_auth_sends_authorization_header(self, api_header): + responses.add(responses.GET, HOST + "/api/v1/test/", json={}) + api_header._get_json_response("/api/v1/test/") + headers = responses.calls[0].request.headers + assert "Authorization" in headers + assert headers["Authorization"] == "apikey testuser:testapikey123" + # No auth query params + params = responses.calls[0].request.params + assert "api_key" not in params + assert "username" not in params + + @responses.activate + def test_token_auth_sends_token_params(self, api_token): + responses.add(responses.GET, HOST + "/api/v1/test/", json={}) + api_token._get_json_response("/api/v1/test/") + params = responses.calls[0].request.params + assert params["token"] == "expiring-token-123" + assert params["email"] == "test@example.com" + + +class TestContentType: + @responses.activate + def test_default_content_type(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={}) + api._get_json_response("/api/v1/test/") + assert responses.calls[0].request.headers["Content-Type"] == "application/json" + + @responses.activate + def test_custom_content_type(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={}) + api._get_json_response("/api/v1/test/", content_type="text/plain") + assert responses.calls[0].request.headers["Content-Type"] == "text/plain" + + +class TestResponseHandling: + @responses.activate + def test_raw_response_returns_response_object(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={"ok": True}) + result = api._get_json_response("/api/v1/test/", raw_response=True) + assert hasattr(result, "status_code") + assert result.status_code == 200 + assert result.json() == {"ok": True} + + @responses.activate + def test_json_parse_success(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", json={"data": [1, 2, 3]}) + result = api._get_json_response("/api/v1/test/") + assert result == {"data": [1, 2, 3]} + + @responses.activate + def test_json_parse_failure_returns_empty_objects(self, api): + responses.add(responses.GET, HOST + "/api/v1/test/", body="not json", status=200) + result = api._get_json_response("/api/v1/test/") + assert result == {"objects": []} + + +class TestURLHandling: + @responses.activate + def test_full_url_passthrough(self, api): + responses.add(responses.GET, "https://other.example.com/api/test/", json={}) + api._get_json_response("https://other.example.com/api/test/") + assert "other.example.com" in responses.calls[0].request.url + + @responses.activate + def test_relative_url_gets_host_prefix(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json={}) + api._get_json_response("/api/v1/project/") + assert responses.calls[0].request.url.startswith(HOST) diff --git a/tests/test_items.py b/tests/test_items.py new file mode 100644 index 0000000..36c579a --- /dev/null +++ b/tests/test_items.py @@ -0,0 +1,106 @@ +"""Tests for item CRUD methods (excluding uploads).""" + +import json + +import responses + +from tests.conftest import HOST, SAMPLE_ITEM, make_list_response + + +class TestGetItem: + @responses.activate + def test_get_item(self, api): + responses.add(responses.GET, HOST + "/api/v1/item/789/", json=SAMPLE_ITEM) + result = api.get_item(789) + assert result["id"] == 789 + + @responses.activate + def test_get_item_with_data_and_fields(self, api): + responses.add(responses.GET, HOST + "/api/v1/item/789/", json=SAMPLE_ITEM) + api.get_item(789, data={"review_id": 456}, fields=["id", "name"]) + params = responses.calls[0].request.params + assert params["review_id"] == "456" + assert params["fields"] == "id,name" + + +class TestUpdateItem: + @responses.activate + def test_update_item(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/item/789/", json={"id": 789, "name": "Updated"}) + result = api.update_item(789, {"name": "Updated"}) + assert result["name"] == "Updated" + + def test_non_dict_returns_false(self, api): + assert api.update_item(789, "not a dict") is False + + +class TestAddItem: + @responses.activate + def test_add_item(self, api): + responses.add(responses.POST, HOST + "/api/v1/item/", json=SAMPLE_ITEM) + additional_data = {"external_url": "https://example.com/video.mp4"} + result = api.add_item(456, "test_clip.mp4", 24.0, additional_data) + assert result["id"] == 789 + body = json.loads(responses.calls[0].request.body) + assert body["reviewId"] == 456 + assert body["name"] == "test_clip.mp4" + assert body["fps"] == 24.0 + assert body["status"] == "done" + assert body["external_url"] == "https://example.com/video.mp4" + + +class TestGetMedia: + @responses.activate + def test_get_media(self, api): + responses.add(responses.GET, HOST + "/api/v1/item/", json=make_list_response([SAMPLE_ITEM])) + result = api.get_media({"reviews__project__name": "test", "limit": 1, "active": 1}) + assert len(result["objects"]) == 1 + + +class TestGetItemsByReviewId: + @responses.activate + def test_get_items_by_review_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/item/", json=make_list_response([SAMPLE_ITEM])) + api.get_items_by_review_id(456) + params = responses.calls[0].request.params + assert params["reviews__id"] == "456" + assert params["active"] == "1" + + +class TestDeleteItem: + @responses.activate + def test_delete_item(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/item/789/", json={}) + api.delete_item(789) + body = json.loads(responses.calls[0].request.body) + assert body["active"] is False + + +class TestBulkDeleteItems: + @responses.activate + def test_bulk_delete_items(self, api): + responses.add(responses.POST, HOST + "/api/v2/bulk-delete-items/", json={}, status=200) + result = api.bulk_delete_items([1, 2, 3]) + # Default raw_response=True + assert hasattr(result, "status_code") + body = json.loads(responses.calls[0].request.body) + assert body["item_ids"] == [1, 2, 3] + + +class TestConnectItemToReview: + def test_deprecated(self, api): + result = api.connect_item_to_review(789, 456) + assert result == "Deprecated" + + +class TestMoveItems: + @responses.activate + def test_move_items(self, api): + item_data = [{"review_id": 1, "item_id": 1}, {"review_id": 1, "item_id": 2}] + responses.add(responses.POST, HOST + "/api/v2/move-review-items/", json={}, status=200) + result = api.move_items(999, item_data) + # Default raw_response=True + assert hasattr(result, "status_code") + body = json.loads(responses.calls[0].request.body) + assert body["new_review_id"] == 999 + assert body["item_data"] == item_data diff --git a/tests/test_media_upload.py b/tests/test_media_upload.py new file mode 100644 index 0000000..25ff92e --- /dev/null +++ b/tests/test_media_upload.py @@ -0,0 +1,205 @@ +"""Tests for media upload methods: add_media, add_media_by_url, add_media_v2, upload_file.""" + +import io +import json +import os +from unittest.mock import MagicMock, mock_open, patch + +import pytest +import responses + +from tests.conftest import HOST, SAMPLE_ITEM + +UPLOAD_URL_PREFIX = HOST + "/items/uploadToReview/" + +# Patch targets in the syncsketch module +OPEN_PATCH = "syncsketch.syncsketch.open" +STAT_PATCH = "syncsketch.syncsketch.os.stat" +MIMETYPES_PATCH = "syncsketch.syncsketch.mimetypes.guess_type" + + +def fake_open(data=b"fake file data"): + """Return a callable that produces BytesIO objects (works both as direct call and context manager).""" + + def _open(*args, **kwargs): + return io.BytesIO(data) + + return _open + + +class TestAddMedia: + @responses.activate + def test_add_media_basic(self, api): + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json=SAMPLE_ITEM) + + with patch(OPEN_PATCH, side_effect=fake_open()): + result = api.add_media(456, "/tmp/test.mp4", artist_name="Artist", file_name="test.mp4") + + assert result["id"] == 789 + + @responses.activate + def test_add_media_with_no_convert_flag(self, api): + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json=SAMPLE_ITEM) + + with patch(OPEN_PATCH, side_effect=fake_open()): + api.add_media(456, "/tmp/test.mp4", noConvertFlag=True) + + assert "noConvertFlag=1" in responses.calls[0].request.url + + @responses.activate + def test_add_media_with_item_parent_id(self, api): + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json=SAMPLE_ITEM) + + with patch(OPEN_PATCH, side_effect=fake_open()): + api.add_media(456, "/tmp/test.mp4", itemParentId=10) + + assert "itemParentId=10" in responses.calls[0].request.url + + +class TestAddMediaByUrl: + @responses.activate + def test_add_media_by_url(self, api): + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json=SAMPLE_ITEM) + result = api.add_media_by_url(456, "https://example.com/video.mp4", artist_name="Artist") + assert result["id"] == 789 + + def test_missing_review_id_raises(self, api): + with pytest.raises(Exception, match="review id"): + api.add_media_by_url(None, "https://example.com/video.mp4") + + def test_missing_media_url_raises(self, api): + with pytest.raises(Exception, match="media_url"): + api.add_media_by_url(456, "") + + @responses.activate + def test_with_no_convert_flag(self, api): + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json=SAMPLE_ITEM) + api.add_media_by_url(456, "https://example.com/v.mp4", noConvertFlag=True) + assert "noConvertFlag=1" in responses.calls[0].request.url + + +class TestAddMediaV2: + def test_no_header_auth_returns_none(self, api): + result = api.add_media_v2(456, "/tmp/test.mp4") + assert result is None + + @responses.activate + @patch(MIMETYPES_PATCH, return_value=("video/mp4", None)) + @patch(STAT_PATCH) + def test_large_file_delegates_to_v1(self, mock_stat, mock_mime, api_header): + mock_stat.return_value = MagicMock(st_size=6_000_000) + responses.add(responses.POST, UPLOAD_URL_PREFIX + "456/", json={"id": 10, "uuid": "abc"}) + + with patch(OPEN_PATCH, side_effect=fake_open()): + result = api_header.add_media_v2(456, "/tmp/test.mp4") + assert result["id"] == 10 + assert result["uuid"] == "abc" + + @responses.activate + @patch(MIMETYPES_PATCH, return_value=("video/mp4", None)) + @patch(STAT_PATCH) + def test_small_file_s3_flow(self, mock_stat, mock_mime, api_header): + mock_stat.return_value = MagicMock(st_size=1000) + + signed_url_response = { + "url": "https://s3.amazonaws.com/bucket", + "fields": { + "key": "uploads/test.mp4", + "x-amz-meta-item-id": "10", + "x-amz-meta-item-uuid": "abc-123", + }, + } + responses.add(responses.POST, HOST + "/uploads/get-s3-signed-url/", json=signed_url_response) + responses.add(responses.POST, "https://s3.amazonaws.com/bucket", status=204) + + with patch(OPEN_PATCH, side_effect=fake_open()): + result = api_header.add_media_v2(456, "/tmp/test.mp4") + + assert result == {"id": "10", "uuid": "abc-123"} + + +class TestUploadFile: + def test_no_header_auth_returns_none(self, api): + result = api.upload_file(456, "/tmp/test.mp4") + assert result is None + + @responses.activate + @patch("time.sleep") + @patch(MIMETYPES_PATCH, return_value=("video/mp4", None)) + @patch(STAT_PATCH) + def test_success_flow(self, mock_stat, mock_mime, mock_sleep, api_header): + mock_stat.return_value = MagicMock(st_size=100) + + # Step 1: start upload + responses.add( + responses.POST, + HOST + "/uploads/stats/upload-start/", + json={"item_id": 10, "item_uuid": "abc-123"}, + ) + # Step 2: init multipart + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/", + json={"uploadId": "upload-1", "key": "upload-key"}, + ) + # Step 3: sign part + responses.add( + responses.GET, + HOST + "/uploads/multipart-upload/upload-1/sign-part/1/", + json={"url": "https://s3.example.com/part1"}, + ) + # Upload part to S3 + responses.add( + responses.PUT, + "https://s3.example.com/part1", + headers={"ETag": '"etag1"'}, + status=200, + ) + # Step 5: complete multipart + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/upload-1/complete/", + json={"ok": True}, + ) + # Final: get_item + responses.add(responses.GET, HOST + "/api/v1/item/10/", json=SAMPLE_ITEM) + + with patch(OPEN_PATCH, mock_open(read_data=b"chunk")): + result = api_header.upload_file(456, "/tmp/test.mp4", max_workers=1) + + assert result["id"] == 789 + + @responses.activate + @patch(MIMETYPES_PATCH, return_value=("video/mp4", None)) + @patch(STAT_PATCH) + def test_start_upload_failure(self, mock_stat, mock_mime, api_header): + mock_stat.return_value = MagicMock(st_size=100) + responses.add( + responses.POST, + HOST + "/uploads/stats/upload-start/", + json={"error": "fail"}, + status=400, + ) + with patch(OPEN_PATCH, mock_open(read_data=b"chunk")): + result = api_header.upload_file(456, "/tmp/test.mp4", max_workers=1) + assert result is None + + @responses.activate + @patch(MIMETYPES_PATCH, return_value=("video/mp4", None)) + @patch(STAT_PATCH) + def test_multipart_init_failure(self, mock_stat, mock_mime, api_header): + mock_stat.return_value = MagicMock(st_size=100) + responses.add( + responses.POST, + HOST + "/uploads/stats/upload-start/", + json={"item_id": 10, "item_uuid": "abc"}, + ) + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/", + json={"error": "fail"}, + status=400, + ) + with patch(OPEN_PATCH, mock_open(read_data=b"chunk")): + result = api_header.upload_file(456, "/tmp/test.mp4", max_workers=1) + assert result is None diff --git a/tests/test_projects.py b/tests/test_projects.py new file mode 100644 index 0000000..88304fa --- /dev/null +++ b/tests/test_projects.py @@ -0,0 +1,158 @@ +"""Tests for project CRUD methods.""" + +import json + +import responses + +from tests.conftest import HOST, SAMPLE_PROJECT, make_list_response + + +class TestCreateProject: + @responses.activate + def test_create_project(self, api): + responses.add(responses.POST, HOST + "/api/v1/project/", json=SAMPLE_PROJECT) + result = api.create_project(1, "Test Project", "A test project") + assert result["id"] == 123 + body = json.loads(responses.calls[0].request.body) + assert body["name"] == "Test Project" + assert body["description"] == "A test project" + assert body["account_id"] == 1 + + @responses.activate + def test_create_project_with_extra_data(self, api): + responses.add(responses.POST, HOST + "/api/v1/project/", json=SAMPLE_PROJECT) + api.create_project(1, "Test", data={"is_public": True}) + body = json.loads(responses.calls[0].request.body) + assert body["is_public"] is True + + +class TestGetProjects: + @responses.activate + def test_default_params(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([SAMPLE_PROJECT])) + api.get_projects() + params = responses.calls[0].request.params + assert params["active"] == "1" + assert params["is_archived"] == "0" + assert params["account__active"] == "1" + assert params["limit"] == "100" + assert params["offset"] == "0" + + @responses.activate + def test_include_deleted(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(include_deleted=True) + params = responses.calls[0].request.params + assert "active" not in params + + @responses.activate + def test_include_archived(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(include_archived=True) + params = responses.calls[0].request.params + assert "active" not in params + assert "is_archived" not in params + + @responses.activate + def test_include_tags(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(include_tags=True) + assert responses.calls[0].request.params["include_tags"] == "1" + + @responses.activate + def test_include_connections(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(include_connections=True) + assert responses.calls[0].request.params["withFullConnections"] == "True" + + @responses.activate + def test_custom_limit_offset(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(limit=50, offset=10) + params = responses.calls[0].request.params + assert params["limit"] == "50" + assert params["offset"] == "10" + + @responses.activate + def test_with_fields(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([])) + api.get_projects(fields=["id", "name"]) + assert responses.calls[0].request.params["fields"] == "id,name" + + +class TestGetProjectsByName: + @responses.activate + def test_search_by_name(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/", json=make_list_response([SAMPLE_PROJECT])) + api.get_projects_by_name("Test") + assert responses.calls[0].request.params["name__istartswith"] == "Test" + + +class TestGetProjectById: + @responses.activate + def test_get_by_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/project/123/", json=SAMPLE_PROJECT) + result = api.get_project_by_id(123) + assert result["id"] == 123 + + +class TestGetProjectStorage: + @responses.activate + def test_get_storage(self, api): + responses.add(responses.GET, HOST + "/api/v2/project/123/storage/", json={"storage": 12345}) + result = api.get_project_storage(123) + assert result["storage"] == 12345 + + +class TestUpdateProject: + @responses.activate + def test_update_project(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/project/123/", json={"id": 123, "name": "Updated"}) + result = api.update_project(123, {"name": "Updated"}) + assert result["name"] == "Updated" + + def test_non_dict_returns_false(self, api): + assert api.update_project(123, "not a dict") is False + + +class TestDeleteProject: + @responses.activate + def test_delete_project(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/project/123/", json={}) + api.delete_project(123) + body = json.loads(responses.calls[0].request.body) + assert body["active"] is False + + +class TestDuplicateProject: + @responses.activate + def test_duplicate_project(self, api): + responses.add(responses.POST, HOST + "/api/v2/project/123/duplicate/", json={"id": 999}) + result = api.duplicate_project(123, copy_reviews=True, copy_users=True) + assert result["id"] == 999 + body = json.loads(responses.calls[0].request.body) + assert body["reviews"] is True + assert body["users"] is True + + @responses.activate + def test_duplicate_with_name(self, api): + responses.add(responses.POST, HOST + "/api/v2/project/123/duplicate/", json={"id": 999}) + api.duplicate_project(123, name="Copy of Project") + body = json.loads(responses.calls[0].request.body) + assert body["name"] == "Copy of Project" + + +class TestArchiveRestoreProject: + @responses.activate + def test_archive_project(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/project/123/", json={}) + api.archive_project(123) + body = json.loads(responses.calls[0].request.body) + assert body["is_archived"] is True + + @responses.activate + def test_restore_project(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/project/123/", json={}) + api.restore_project(123) + body = json.loads(responses.calls[0].request.body) + assert body["is_archived"] is False diff --git a/tests/test_real_file_io.py b/tests/test_real_file_io.py new file mode 100644 index 0000000..fa66ed9 --- /dev/null +++ b/tests/test_real_file_io.py @@ -0,0 +1,260 @@ +"""Tests using real temporary files to exercise os.stat, mimetypes.guess_type, and io.open +across Python versions. Only HTTP calls are mocked.""" + +import json +import os +import tempfile + +import responses + +from tests.conftest import HOST, SAMPLE_ITEM + + +def _make_temp_file(suffix=".mp4", content=b"fake video content", size=None): + """Create a real temp file. If size is given, write exactly that many bytes.""" + f = tempfile.NamedTemporaryFile(suffix=suffix, delete=False) + if size is not None: + f.write(b"\x00" * size) + else: + f.write(content) + f.close() + return f.name + + +class TestAddMediaRealFile: + @responses.activate + def test_upload_real_file(self, api): + filepath = _make_temp_file(suffix=".mp4") + try: + responses.add( + responses.POST, + HOST + "/items/uploadToReview/456/", + json=SAMPLE_ITEM, + ) + result = api.add_media(456, filepath, artist_name="Artist", file_name="test.mp4") + assert result["id"] == 789 + # Verify the file was actually read and sent as multipart + assert responses.calls[0].request.body is not None + finally: + os.unlink(filepath) + + @responses.activate + def test_various_extensions(self, api): + """Verify mimetypes.guess_type works for common media types across Python versions.""" + for suffix in [".mp4", ".mov", ".png", ".jpg", ".webm", ".pdf"]: + filepath = _make_temp_file(suffix=suffix, content=b"data") + try: + responses.add( + responses.POST, + HOST + "/items/uploadToReview/456/", + json=SAMPLE_ITEM, + ) + result = api.add_media(456, filepath) + assert result is not None + finally: + os.unlink(filepath) + + +class TestAddMediaV2RealFile: + @responses.activate + def test_small_file_real_io(self, api_header): + """Exercise os.stat and mimetypes.guess_type with a real small file.""" + filepath = _make_temp_file(suffix=".mp4", size=1000) + try: + signed_url_response = { + "url": "https://s3.amazonaws.com/bucket", + "fields": { + "key": "uploads/test.mp4", + "x-amz-meta-item-id": "10", + "x-amz-meta-item-uuid": "abc-123", + }, + } + responses.add(responses.POST, HOST + "/uploads/get-s3-signed-url/", json=signed_url_response) + responses.add(responses.POST, "https://s3.amazonaws.com/bucket", status=204) + + result = api_header.add_media_v2(456, filepath) + assert result == {"id": "10", "uuid": "abc-123"} + + # Verify os.stat was used correctly — the signed URL request should contain the real size + body = json.loads(responses.calls[0].request.body) + assert body["item_data"]["content_length"] == 1000 + assert body["item_data"]["content_type"] is not None + finally: + os.unlink(filepath) + + @responses.activate + def test_large_file_falls_back_to_v1(self, api_header): + """Files > 5MB should fall back to add_media_v1 (direct upload).""" + filepath = _make_temp_file(suffix=".mp4", size=6_000_000) + try: + responses.add( + responses.POST, + HOST + "/items/uploadToReview/456/", + json={"id": 10, "uuid": "abc"}, + ) + result = api_header.add_media_v2(456, filepath) + assert result["id"] == 10 + finally: + os.unlink(filepath) + + @responses.activate + def test_file_name_passed_as_is(self, api_header): + """add_media_v2 passes file_name directly without appending extension.""" + filepath = _make_temp_file(suffix=".webm", size=500) + try: + signed_url_response = { + "url": "https://s3.amazonaws.com/bucket", + "fields": { + "key": "uploads/test.webm", + "x-amz-meta-item-id": "10", + "x-amz-meta-item-uuid": "abc-123", + }, + } + responses.add(responses.POST, HOST + "/uploads/get-s3-signed-url/", json=signed_url_response) + responses.add(responses.POST, "https://s3.amazonaws.com/bucket", status=204) + + result = api_header.add_media_v2(456, filepath, file_name="my_video") + assert result is not None + + body = json.loads(responses.calls[0].request.body) + # add_media_v2 does NOT append extension (unlike upload_file) + assert body["item_name"] == "my_video" + finally: + os.unlink(filepath) + + +class TestUploadFileRealFile: + @responses.activate + def test_multipart_upload_real_file(self, api_header): + """Full multipart upload flow with a real file — exercises open, os.stat, mimetypes.""" + filepath = _make_temp_file(suffix=".mp4", size=100) + try: + # Step 1: start upload + responses.add( + responses.POST, + HOST + "/uploads/stats/upload-start/", + json={"item_id": 10, "item_uuid": "abc-123"}, + ) + # Step 2: init multipart + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/", + json={"uploadId": "upload-1", "key": "upload-key"}, + ) + # Step 3: sign part + responses.add( + responses.GET, + HOST + "/uploads/multipart-upload/upload-1/sign-part/1/", + json={"url": "https://s3.example.com/part1"}, + ) + # Upload part to S3 + responses.add( + responses.PUT, + "https://s3.example.com/part1", + headers={"ETag": '"etag1"'}, + status=200, + ) + # Step 5: complete multipart + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/upload-1/complete/", + json={"ok": True}, + ) + # Final: get_item + responses.add(responses.GET, HOST + "/api/v1/item/10/", json=SAMPLE_ITEM) + + result = api_header.upload_file(456, filepath, max_workers=1) + assert result["id"] == 789 + + # Verify the start-upload request has correct file metadata + start_body = json.loads(responses.calls[0].request.body) + assert start_body["item_data"]["size"] == 100 + assert start_body["item_data"]["content_type"] is not None + + # Verify the actual file content was uploaded to S3 + s3_body = responses.calls[3].request.body + assert len(s3_body) == 100 + finally: + os.unlink(filepath) + + @responses.activate + def test_chunking_with_multiple_parts(self, api_header): + """Verify file is split into correct number of chunks.""" + # 15 bytes with chunk_size=5 = 3 parts + filepath = _make_temp_file(suffix=".mp4", size=15) + try: + responses.add( + responses.POST, + HOST + "/uploads/stats/upload-start/", + json={"item_id": 10, "item_uuid": "abc-123"}, + ) + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/", + json={"uploadId": "upload-1", "key": "upload-key"}, + ) + # 3 sign-part + 3 S3 PUT calls + for i in range(1, 4): + responses.add( + responses.GET, + HOST + "/uploads/multipart-upload/upload-1/sign-part/%d/" % i, + json={"url": "https://s3.example.com/part%d" % i}, + ) + responses.add( + responses.PUT, + "https://s3.example.com/part%d" % i, + headers={"ETag": '"etag%d"' % i}, + status=200, + ) + responses.add( + responses.POST, + HOST + "/uploads/multipart-upload/upload-1/complete/", + json={"ok": True}, + ) + responses.add(responses.GET, HOST + "/api/v1/item/10/", json=SAMPLE_ITEM) + + result = api_header.upload_file(456, filepath, chunk_size=5, max_workers=1) + assert result["id"] == 789 + + # Verify complete request has 3 parts + complete_body = json.loads(responses.calls[8].request.body) + assert len(complete_body["parts"]) == 3 + for i, part in enumerate(complete_body["parts"], 1): + assert part["PartNumber"] == i + finally: + os.unlink(filepath) + + +class TestOsStatBehavior: + def test_stat_returns_correct_size(self): + """Verify os.stat works consistently across Python versions.""" + for size in [0, 1, 1024, 5 * 1024 * 1024]: + filepath = _make_temp_file(size=size) + try: + assert os.stat(filepath).st_size == size + finally: + os.unlink(filepath) + + +class TestMimetypesConsistency: + def test_common_media_types(self): + """Verify mimetypes.guess_type returns expected types across Python versions.""" + import mimetypes + + expected = { + ".mp4": "video/mp4", + ".mov": "video/quicktime", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".webm": "video/webm", + ".pdf": "application/pdf", + ".gif": "image/gif", + } + for ext, expected_type in expected.items(): + filepath = _make_temp_file(suffix=ext, content=b"x") + try: + guessed = mimetypes.guess_type(filepath, strict=False)[0] + assert guessed == expected_type, "Expected %s for %s, got %s" % (expected_type, ext, guessed) + finally: + os.unlink(filepath) diff --git a/tests/test_reviews.py b/tests/test_reviews.py new file mode 100644 index 0000000..021361c --- /dev/null +++ b/tests/test_reviews.py @@ -0,0 +1,167 @@ +"""Tests for review CRUD and section methods.""" + +import json + +import responses + +from tests.conftest import HOST, SAMPLE_REVIEW, make_list_response + + +class TestCreateReview: + @responses.activate + def test_create_review(self, api): + responses.add(responses.POST, HOST + "/api/v1/review/", json=SAMPLE_REVIEW) + result = api.create_review(123, "Test Review", "A test review") + assert result["id"] == 456 + body = json.loads(responses.calls[0].request.body) + assert body["project"] == "/api/v1/project/123/" + assert body["name"] == "Test Review" + assert body["description"] == "A test review" + + @responses.activate + def test_create_review_with_extra_data(self, api): + responses.add(responses.POST, HOST + "/api/v1/review/", json=SAMPLE_REVIEW) + api.create_review(123, "Test", data={"deadline": "2026-01-01"}) + body = json.loads(responses.calls[0].request.body) + assert body["deadline"] == "2026-01-01" + + +class TestGetReviews: + @responses.activate + def test_get_reviews_by_project_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/", json=make_list_response([SAMPLE_REVIEW])) + api.get_reviews_by_project_id(123) + params = responses.calls[0].request.params + assert params["project__id"] == "123" + assert params["project__active"] == "1" + assert params["project__is_archived"] == "0" + + @responses.activate + def test_get_reviews_with_pagination(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/", json=make_list_response([])) + api.get_reviews_by_project_id(123, limit=50, offset=10) + params = responses.calls[0].request.params + assert params["limit"] == "50" + assert params["offset"] == "10" + + @responses.activate + def test_get_review_by_name(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/", json=make_list_response([SAMPLE_REVIEW])) + api.get_review_by_name("Test") + params = responses.calls[0].request.params + assert params["name__istartswith"] == "Test" + assert params["active"] == "True" + + @responses.activate + def test_get_review_by_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/456/", json=SAMPLE_REVIEW) + result = api.get_review_by_id(456) + assert result["id"] == 456 + + +class TestGetReviewByUuid: + @responses.activate + def test_found(self, api): + responses.add( + responses.GET, + HOST + "/api/v1/review/", + json=make_list_response([SAMPLE_REVIEW]), + ) + result = api.get_review_by_uuid("abc-def-ghi") + assert result["uuid"] == "abc-def-ghi" + + @responses.activate + def test_not_found(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/", json=make_list_response([])) + result = api.get_review_by_uuid("nonexistent") + assert result is None + + @responses.activate + def test_raw_response(self, api): + responses.add(responses.GET, HOST + "/api/v1/review/", json=make_list_response([SAMPLE_REVIEW])) + result = api.get_review_by_uuid("abc-def-ghi", raw_response=True) + assert hasattr(result, "status_code") + + +class TestReviewStorage: + @responses.activate + def test_get_review_storage(self, api): + responses.add(responses.GET, HOST + "/api/v2/review/456/storage/", json={"storage": 5000}) + result = api.get_review_storage(456) + assert result["storage"] == 5000 + + +class TestUpdateReview: + @responses.activate + def test_update_review(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/review/456/", json={"id": 456, "name": "Updated"}) + result = api.update_review(456, {"name": "Updated"}) + assert result["name"] == "Updated" + + def test_non_dict_returns_false(self, api): + assert api.update_review(456, "not a dict") is False + + +class TestSortReviewItems: + @responses.activate + def test_sort_items(self, api): + items = [{"id": 1, "sortorder": 0}, {"id": 2, "sortorder": 1}] + responses.add(responses.PUT, HOST + "/api/v2/review/456/sort_items/", json={"updated_items": 2}) + result = api.sort_review_items(456, items) + assert result["updated_items"] == 2 + + def test_non_list_returns_false(self, api): + assert api.sort_review_items(456, "not a list") is False + + +class TestArchiveRestoreDeleteReview: + @responses.activate + def test_archive_review(self, api): + responses.add(responses.POST, HOST + "/api/v2/review/456/archive/", json={}, status=200) + result = api.archive_review(456) + # Default raw_response=True + assert hasattr(result, "status_code") + + @responses.activate + def test_restore_review(self, api): + responses.add(responses.POST, HOST + "/api/v2/review/456/restore/", json={}, status=200) + result = api.restore_review(456) + assert hasattr(result, "status_code") + + @responses.activate + def test_delete_review(self, api): + responses.add(responses.PATCH, HOST + "/api/v1/review/456/", json={}) + api.delete_review(456) + body = json.loads(responses.calls[0].request.body) + assert body["active"] is False + + +class TestReviewSections: + @responses.activate + def test_create_section(self, api): + responses.add(responses.POST, HOST + "/api/v2/review/456/sections/create/", json={"name": "Section 1"}) + result = api.create_review_section(456, "Section 1", [1, 2, 3]) + body = json.loads(responses.calls[0].request.body) + assert body["name"] == "Section 1" + assert body["itemIds"] == [1, 2, 3] + assert "uuid" not in body + + @responses.activate + def test_create_section_with_uuid(self, api): + responses.add(responses.POST, HOST + "/api/v2/review/456/sections/create/", json={}) + api.create_review_section(456, "Section", [1], uuid="my-uuid") + body = json.loads(responses.calls[0].request.body) + assert body["uuid"] == "my-uuid" + + @responses.activate + def test_update_sections(self, api): + data = [{"uuid": "sec-1", "name": "Updated", "itemIds": [1, 2]}] + responses.add(responses.PUT, HOST + "/api/v2/review/456/sections/bulk-update/", json={}) + api.update_review_sections(456, data) + assert responses.calls[0].request.method == "PUT" + + @responses.activate + def test_delete_section(self, api): + responses.add(responses.DELETE, HOST + "/api/v2/review/456/sections/sec-uuid-1/", json={}) + api.delete_review_section(456, "sec-uuid-1") + assert responses.calls[0].request.method == "DELETE" diff --git a/tests/test_shotgrid.py b/tests/test_shotgrid.py new file mode 100644 index 0000000..254b968 --- /dev/null +++ b/tests/test_shotgrid.py @@ -0,0 +1,130 @@ +"""Tests for Shotgrid integration methods.""" + +import json + +import pytest +import responses + +from tests.conftest import HOST + + +class TestShotgridCreateConfig: + @responses.activate + def test_success(self, api): + data = {"url": "https://sg.example.com", "username": "script_user", "key": "script_key"} + # Test endpoint + responses.add(responses.POST, HOST + "/api/v2/shotgun/config/test/", json={"ok": True}, status=200) + # Config endpoint + responses.add(responses.POST, HOST + "/api/v2/shotgun/config/", json={"id": 1}, status=200) + + result = api.shotgrid_create_config(1, syncsketch_project_id=10, data=data) + assert hasattr(result, "status_code") # raw_response=True default + assert result.status_code == 200 + + @responses.activate + def test_test_fails_raises(self, api): + data = {"url": "https://sg.example.com", "username": "user", "key": "key"} + responses.add(responses.POST, HOST + "/api/v2/shotgun/config/test/", json={}, status=400) + + with pytest.raises(Exception, match="configuration test failed"): + api.shotgrid_create_config(1, data=data) + + def test_missing_url_asserts(self, api): + with pytest.raises(AssertionError): + api.shotgrid_create_config(1, data={"username": "u", "key": "k"}) + + def test_missing_username_asserts(self, api): + with pytest.raises(AssertionError): + api.shotgrid_create_config(1, data={"url": "http://sg", "key": "k"}) + + def test_missing_key_asserts(self, api): + with pytest.raises(AssertionError): + api.shotgrid_create_config(1, data={"url": "http://sg", "username": "u"}) + + def test_non_dict_asserts(self, api): + with pytest.raises(AssertionError): + api.shotgrid_create_config(1, data="not a dict") + + +class TestShotgridGetPlaylists: + @responses.activate + def test_get_playlists(self, api): + responses.add(responses.GET, HOST + "/api/v2/shotgun/playlists/1/10/", json={"playlists": []}) + result = api.shotgrid_get_playlists(1, 10) + assert "playlists" in result + + @responses.activate + def test_with_shotgun_project_id(self, api): + responses.add(responses.GET, HOST + "/api/v2/shotgun/playlists/1/10/", json={}) + api.shotgrid_get_playlists(1, 10, shotgun_project_id=99) + assert responses.calls[0].request.params["shotgun_project_id"] == "99" + + +class TestShotgridSyncReviewNotes: + @responses.activate + def test_sync_notes(self, api): + url = HOST + "/api/v2/shotgun/sync-review-notes/review/456/" + responses.add(responses.POST, url, json={"status": "processing", "task_id": "t1"}) + result = api.shotgrid_sync_review_notes(456) + assert result["task_id"] == "t1" + + +class TestShotgridSyncNewItemNotes: + @responses.activate + def test_sync_item_notes(self, api): + url = HOST + "/api/v2/shotgun/sync-notes/project/123/review/456/789/" + responses.add(responses.POST, url, json={"comments": 3, "sketches": 1}) + result = api.shotgrid_sync_new_item_notes(123, 456, 789) + assert result["comments"] == 3 + + +class TestGetShotgridSyncReviewNotesProgress: + @responses.activate + def test_get_progress(self, api): + url = HOST + "/api/v2/shotgun/sync-review-notes/task-1/" + responses.add(responses.GET, url, json={"status": "done", "percent_complete": 100}) + result = api.get_shotgrid_sync_review_notes_progress("task-1") + assert result["percent_complete"] == 100 + + +class TestShotgridSyncReviewItems: + @responses.activate + def test_sync_items(self, api): + check_url = HOST + "/api/v2/shotgun/sync-items/project/123/check/" + responses.add( + responses.POST, + check_url, + json={ + "review_id": 456, + "items": [{"id": 1, "name": "shot1"}, {"id": 2, "name": "shot2"}], + }, + ) + # Per-item sync calls + sync_url = HOST + "/api/v2/shotgun/sync-items/project/123/review/456/" + responses.add(responses.POST, sync_url, json={"id": 101}) + responses.add(responses.POST, sync_url, json={"id": 102}) + + result = api.shotgrid_sync_review_items(123, "playlist_code", 999) + assert result["review_id"] == 456 + assert result["items"] == [101, 102] + assert result["total_items"] == 2 + assert result["status"] == "done" + + @responses.activate + def test_with_review_id(self, api): + check_url = HOST + "/api/v2/shotgun/sync-items/project/123/review/456/check/" + responses.add(responses.POST, check_url, json={"review_id": 456, "items": []}) + result = api.shotgrid_sync_review_items(123, "code", 999, review_id=456) + assert result["review_id"] == 456 + + +class TestShotgridGetProjects: + def test_raises_deprecation(self, api): + with pytest.raises(DeprecationWarning): + api.shotgrid_get_projects(123) + + +class TestGetShotgridSyncReviewItemsProgress: + def test_raises_deprecation(self, api): + with pytest.raises(DeprecationWarning): + api.get_shotgrid_sync_review_items_progress("task-1") diff --git a/tests/test_tree.py b/tests/test_tree.py new file mode 100644 index 0000000..05c5ed5 --- /dev/null +++ b/tests/test_tree.py @@ -0,0 +1,27 @@ +"""Tests for get_tree method.""" + +import responses + +from tests.conftest import HOST + + +class TestGetTree: + @responses.activate + def test_without_items(self, api): + tree_data = {"accounts": [{"id": 1, "projects": []}]} + responses.add(responses.GET, HOST + "/api/v1/person/tree/", json=tree_data) + result = api.get_tree() + assert result == tree_data + assert "fetchItems" not in responses.calls[0].request.params + + @responses.activate + def test_with_items(self, api): + responses.add(responses.GET, HOST + "/api/v1/person/tree/", json={}) + api.get_tree(withItems=True) + assert responses.calls[0].request.params["fetchItems"] == "1" + + @responses.activate + def test_raw_response(self, api): + responses.add(responses.GET, HOST + "/api/v1/person/tree/", json={}) + result = api.get_tree(raw_response=True) + assert hasattr(result, "status_code") diff --git a/tests/test_users.py b/tests/test_users.py new file mode 100644 index 0000000..5f5601e --- /dev/null +++ b/tests/test_users.py @@ -0,0 +1,146 @@ +"""Tests for user lookup and access control methods.""" + +import json + +import responses + +from tests.conftest import HOST, SAMPLE_USER, make_list_response + + +class TestGetUsersByName: + @responses.activate + def test_search_by_name(self, api): + responses.add(responses.GET, HOST + "/api/v1/simpleperson/", json=make_list_response([SAMPLE_USER])) + api.get_users_by_name("Test") + assert responses.calls[0].request.params["name"] == "Test" + + +class TestGetUserByEmail: + @responses.activate + def test_found(self, api): + responses.add( + responses.GET, + HOST + "/api/v1/simpleperson/", + json=make_list_response([SAMPLE_USER]), + ) + result = api.get_user_by_email("test@example.com") + assert result["email"] == "test@example.com" + assert responses.calls[0].request.params["email__iexact"] == "test@example.com" + + @responses.activate + def test_not_found(self, api): + responses.add( + responses.GET, + HOST + "/api/v1/simpleperson/", + json=make_list_response([]), + ) + result = api.get_user_by_email("nobody@example.com") + assert result is None + + +class TestGetUsersByProjectId: + @responses.activate + def test_get_users(self, api): + responses.add(responses.GET, HOST + "/api/v2/all-project-users/123/", json=[SAMPLE_USER]) + result = api.get_users_by_project_id(123) + assert result[0]["id"] == 42 + + +class TestGetConnectionsByUserId: + @responses.activate + def test_basic(self, api): + responses.add(responses.GET, HOST + "/api/v2/user/42/connections/account/1/", json=[]) + api.get_connections_by_user_id(42, 1) + assert "/api/v2/user/42/connections/account/1/" in responses.calls[0].request.url + + @responses.activate + def test_with_flags(self, api): + responses.add(responses.GET, HOST + "/api/v2/user/42/connections/account/1/", json=[]) + api.get_connections_by_user_id(42, 1, include_inactive=True, include_archived=False) + params = responses.calls[0].request.params + assert params["include_inactive"] == "true" + assert params["include_archived"] == "false" + + +class TestGetUserById: + @responses.activate + def test_get_by_id(self, api): + responses.add(responses.GET, HOST + "/api/v1/simpleperson/42/", json=SAMPLE_USER) + result = api.get_user_by_id(42) + assert result["id"] == 42 + + +class TestGetCurrentUser: + @responses.activate + def test_get_current_user(self, api): + responses.add(responses.GET, HOST + "/api/v1/simpleperson/currentUser/", json=SAMPLE_USER) + result = api.get_current_user() + assert result["email"] == "test@example.com" + + +class TestAddUsersToWorkspace: + @responses.activate + def test_add_users(self, api): + users = [{"email": "new@test.de", "permission": "admin"}] + responses.add(responses.POST, HOST + "/api/v2/add-users/", json={"success": True}) + api.add_users_to_workspace(1, users, note="Welcome!") + body = json.loads(responses.calls[0].request.body) + assert body["which"] == "account" + assert body["entity_id"] == 1 + assert body["note"] == "Welcome!" + assert json.loads(body["users"]) == users + + def test_non_list_returns_false(self, api): + assert api.add_users_to_workspace(1, "not a list") is False + + +class TestRemoveUsersFromWorkspace: + @responses.activate + def test_remove_users(self, api): + users = [{"email": "old@test.de"}] + responses.add(responses.POST, HOST + "/api/v2/remove-users/", json={"success": True}) + api.remove_users_from_workspace(1, users) + body = json.loads(responses.calls[0].request.body) + assert body["which"] == "account" + assert body["entity_id"] == 1 + + def test_non_list_returns_false(self, api): + assert api.remove_users_from_workspace(1, "not a list") is False + + +class TestAddUsersToProject: + @responses.activate + def test_add_users(self, api): + users = [{"email": "new@test.de", "permission": "viewer"}] + responses.add(responses.POST, HOST + "/api/v2/add-users/", json={"success": True}) + api.add_users_to_project(123, users, note="Invite") + body = json.loads(responses.calls[0].request.body) + assert body["which"] == "project" + assert body["entity_id"] == 123 + + def test_non_list_returns_false(self, api): + assert api.add_users_to_project(123, "not a list") is False + + +class TestRemoveUsersFromProject: + @responses.activate + def test_remove_users(self, api): + users = [{"email": "old@test.de"}] + responses.add(responses.POST, HOST + "/api/v2/remove-users/", json={"success": True}) + api.remove_users_from_project(123, users) + body = json.loads(responses.calls[0].request.body) + assert body["which"] == "project" + assert body["entity_id"] == 123 + + def test_non_list_returns_false(self, api): + assert api.remove_users_from_project(123, "not a list") is False + + +class TestAddUsersDeprecated: + @responses.activate + def test_delegates_to_add_users_to_project(self, api): + users = [{"email": "test@test.de", "permission": "viewer"}] + responses.add(responses.POST, HOST + "/api/v2/add-users/", json={"success": True}) + api.add_users(123, users) + body = json.loads(responses.calls[0].request.body) + assert body["which"] == "project" diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..457e847 --- /dev/null +++ b/tox.ini @@ -0,0 +1,11 @@ +[tox] +envlist = py27, py37, py38, py39, py310, py311, py312, py313, py314 +skip_missing_interpreters = true + +[testenv] +deps = + pytest>=7.0,<9.0 + pytest-cov>=4.0 + responses>=0.20.0 +commands = + pytest {posargs:tests/ --cov=syncsketch --cov-report=term-missing} From fcce7af1969e7afe6fbac5f350a37dace7ff9e4d Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 11:30:35 +0100 Subject: [PATCH 2/8] Add github action to run tests against each pythin version --- .github/workflows/tests.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..c7f60ba --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,20 @@ +name: tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: pip install -e ".[test]" + - name: Run tests + run: pytest tests/ --cov=syncsketch --cov-report=term-missing From be0914340b1a3886a6eebf93fc0c2e9f13e3792c Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 11:50:30 +0100 Subject: [PATCH 3/8] Update to the earlier python versions --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c7f60ba..64861c6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["2.7", "3.7"," "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 From 01b68946cd4308b5b752896fd6cd8e94a7b853e0 Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 11:52:21 +0100 Subject: [PATCH 4/8] syntax error --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 64861c6..3994d22 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["2.7", "3.7"," "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["2.7", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 From 4e795a1e298bf4f50aa288a16677ae3df6020204 Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 11:57:44 +0100 Subject: [PATCH 5/8] move 3.7 to a fixed version and remove 2.7 for the short term --- .github/workflows/tests.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3994d22..270d5ee 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,23 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["2.7", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: pip install -e ".[test]" + - name: Run tests + run: pytest tests/ --cov=syncsketch --cov-report=term-missing + + test-legacy: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + python-version: ["3.7"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 From 7377487a734734006014c7c875989bdc5b2978ef Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Fri, 29 May 2026 15:06:16 +0100 Subject: [PATCH 6/8] Add basic test validation for Python 2.7 Add deprecation notice for Python 2.7 and 3.7 --- .github/workflows/tests.yml | 19 +++++ README.md | 8 +- dist/syncsketch-1.0.12.0-py3-none-any.whl | Bin 20978 -> 21305 bytes dist/syncsketch-1.0.12.0.tar.gz | Bin 32266 -> 35629 bytes syncsketch.egg-info/PKG-INFO | 8 +- syncsketch.egg-info/SOURCES.txt | 1 + syncsketch/__init__.py | 12 +++ tests/README.md | 9 +++ tests/test_py27_smoke.py | 94 ++++++++++++++++++++++ 9 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 tests/test_py27_smoke.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 270d5ee..8826785 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -34,3 +34,22 @@ jobs: run: pip install -e ".[test]" - name: Run tests run: pytest tests/ --cov=syncsketch --cov-report=term-missing + + test-py27: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "2.7" + continue-on-error: true + - name: Install Python 2.7 via apt + run: | + sudo apt-get update + sudo apt-get install -y python2 + curl -sSL https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py + python2 get-pip.py + - name: Install requests + run: python2 -m pip install "requests>=2.20.0,<2.28.0" + - name: Run smoke tests + run: python2 tests/test_py27_smoke.py diff --git a/README.md b/README.md index ab53009..2962944 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,17 @@ SyncSketch is a synchronized visual review tool for the Film/TV/Games industry. #### Compatibility This library was tested with and confirmed on python versions: -- 2.7.14+ -- 3.6 -- 3.7 +- 2.7.14+ (see note below) +- 3.7 (see note below) - 3.8 - 3.9 - 3.10 - 3.11 - 3.12 - 3.13 +- 3.14 + +> **Python 2.7 & 3.7 Deprecation Notice:** Python 2.7 and 3.7 have reached end-of-life and are no longer actively supported by the Python community. While existing functionality in this library will continue to work on these versions, new features and improvements will only be tested against Python 3.8 and above. We recommend upgrading to a supported Python version. #### Installation diff --git a/dist/syncsketch-1.0.12.0-py3-none-any.whl b/dist/syncsketch-1.0.12.0-py3-none-any.whl index 3894bcac934c05afd0e6aa14c630611787b8e3f7..95a3e5835456b10a08a698fb5fcff98020c050e3 100644 GIT binary patch delta 4296 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 XPyJK>)Iasl%l!F&-(GTf0GI;++J28t literal 32266 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 **Python 2.7 & 3.7 Deprecation Notice:** Python 2.7 and 3.7 have reached end-of-life and are no longer actively supported by the Python community. While existing functionality in this library will continue to work on these versions, new features and improvements will only be tested against Python 3.8 and above. We recommend upgrading to a supported Python version. #### Installation diff --git a/syncsketch.egg-info/SOURCES.txt b/syncsketch.egg-info/SOURCES.txt index 99fdb92..dd8eacb 100644 --- a/syncsketch.egg-info/SOURCES.txt +++ b/syncsketch.egg-info/SOURCES.txt @@ -17,6 +17,7 @@ tests/test_get_json_response.py tests/test_items.py tests/test_media_upload.py tests/test_projects.py +tests/test_py27_smoke.py tests/test_real_file_io.py tests/test_reviews.py tests/test_shotgrid.py diff --git a/syncsketch/__init__.py b/syncsketch/__init__.py index 5965791..d5c1749 100644 --- a/syncsketch/__init__.py +++ b/syncsketch/__init__.py @@ -6,6 +6,18 @@ from __future__ import absolute_import +import sys +import warnings + +if sys.version_info < (3, 8): + warnings.warn( + "SyncSketch: Python %d.%d is deprecated. " + "New features will only target Python 3.8+. " + "Please upgrade." % (sys.version_info[0], sys.version_info[1]), + DeprecationWarning, + stacklevel=2, + ) + from .syncsketch import SyncSketchAPI __version__ = "1.0.12.0" diff --git a/tests/README.md b/tests/README.md index a9cf616..d6ce263 100644 --- a/tests/README.md +++ b/tests/README.md @@ -37,6 +37,15 @@ tox -e py313 Requires the target Python versions to be installed (e.g. via pyenv). Missing interpreters are skipped automatically. +## Python 2.7 Smoke Test + +The full pytest suite requires Python 3.8+. For Python 2.7, a standalone smoke test is provided that verifies import, construction, and core utilities without any test framework dependencies. + +```bash +# Requires only the `requests` package installed for Python 2.7 +python2.7 tests/test_py27_smoke.py +``` + ## Test Structure | File | Covers | diff --git a/tests/test_py27_smoke.py b/tests/test_py27_smoke.py new file mode 100644 index 0000000..7d49d07 --- /dev/null +++ b/tests/test_py27_smoke.py @@ -0,0 +1,94 @@ +""" +Minimal smoke test for Python 2.7 compatibility. + +Run directly: python2.7 tests/test_py27_smoke.py + +This verifies that the module imports and core construction works +under Python 2.7 without requiring pytest or other test dependencies. +""" + +import sys +import os + +# Ensure the package root is on the path +sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) + +from syncsketch import SyncSketchAPI + + +def test_default_auth(): + api = SyncSketchAPI("testuser", "testapikey") + assert api.api_params == {"api_key": "testapikey", "username": "testuser"} + assert api.headers == {} + assert api.HOST == "https://www.syncsketch.com" + assert api.api_version == "v1" + + +def test_expiring_token_auth(): + api = SyncSketchAPI("test@example.com", "token123", useExpiringToken=True) + assert api.api_params == {"token": "token123", "email": "test@example.com"} + + +def test_header_auth(): + api = SyncSketchAPI("testuser", "testapikey", use_header_auth=True) + assert api.headers == {"Authorization": "apikey testuser:testapikey"} + assert api.api_params == {} + + +def test_host_trailing_slash(): + api = SyncSketchAPI("u", "k", host="https://test.syncsketch.com/") + assert api.HOST == "https://test.syncsketch.com" + + +def test_join_url_path(): + assert SyncSketchAPI.join_url_path("abc") == "abc/" + assert SyncSketchAPI.join_url_path("abc", "123") == "abc/123/" + assert SyncSketchAPI.join_url_path("abc", "/123/", "/xyz/") == "abc/123/xyz/" + + +def test_get_api_base_url(): + api = SyncSketchAPI("u", "k", host="https://test.syncsketch.com") + assert api.get_api_base_url() == "https://test.syncsketch.com/api/v1/" + assert api.get_api_base_url("v2") == "https://test.syncsketch.com/api/v2/" + + +def test_backward_compat_aliases(): + # In Python 2, class attribute access wraps functions in unbound methods, + # so we compare via __func__ when available, otherwise direct identity. + def get_fn(attr): + return getattr(attr, "__func__", attr) + + assert get_fn(SyncSketchAPI.isConnected) is get_fn(SyncSketchAPI.is_connected) + assert get_fn(SyncSketchAPI.getAccounts) is get_fn(SyncSketchAPI.get_accounts) + assert get_fn(SyncSketchAPI.getProjects) is get_fn(SyncSketchAPI.get_projects) + assert get_fn(SyncSketchAPI.addProject) is get_fn(SyncSketchAPI.create_project) + assert get_fn(SyncSketchAPI.addReview) is get_fn(SyncSketchAPI.create_review) + assert get_fn(SyncSketchAPI.getItem) is get_fn(SyncSketchAPI.get_item) + assert get_fn(SyncSketchAPI.addMedia) is get_fn(SyncSketchAPI.add_media) + assert get_fn(SyncSketchAPI.getCurrentUser) is get_fn(SyncSketchAPI.get_current_user) + + +if __name__ == "__main__": + tests = [ + test_default_auth, + test_expiring_token_auth, + test_header_auth, + test_host_trailing_slash, + test_join_url_path, + test_get_api_base_url, + test_backward_compat_aliases, + ] + + passed = 0 + failed = 0 + for test in tests: + try: + test() + passed += 1 + print(" PASS %s" % test.__name__) + except Exception as e: + failed += 1 + print(" FAIL %s: %s" % (test.__name__, e)) + + print("\n%d passed, %d failed (Python %s)" % (passed, failed, sys.version.split()[0])) + sys.exit(1 if failed else 0) From a3772faea1d226ef086b58b223a5782151ca2dd4 Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Mon, 1 Jun 2026 10:52:26 +0100 Subject: [PATCH 7/8] Update security vulnerabilities (does not resolve issues with python 2.7) requires version bounds Update Readmes for testing various versions and basic publishing guide --- README.md | 30 +++++++++++++-- build/lib/syncsketch/__init__.py | 12 ++++++ build/lib/syncsketch/syncsketch.py | 43 ++++++++++++---------- dist/syncsketch-1.0.12.0-py3-none-any.whl | Bin 21305 -> 21522 bytes dist/syncsketch-1.0.12.0.tar.gz | Bin 35629 -> 35951 bytes setup.py | 9 ++++- syncsketch.egg-info/PKG-INFO | 7 +++- syncsketch.egg-info/requires.txt | 11 +++++- syncsketch/syncsketch.py | 43 ++++++++++++---------- tests/README.md | 14 +++++++ 10 files changed, 123 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 2962944..fe334fe 100644 --- a/README.md +++ b/README.md @@ -161,9 +161,7 @@ You can upload a file to the created review with the review id, we provided one item_data = s.upload_file(review['id'], 'examples/test.webm') ``` -If all steps were successful, you should see the following in the web-app. - -![alt text](https://github.com/syncsketch/python-api/blob/documentation/examples/resources/exampleResult.jpg?raw=true) +If all steps were successful, you should see the new item under the review in the web-app. ### Additional Examples @@ -229,3 +227,29 @@ projects = s.get_projects() for project in projects['objects']: print(project) ``` + +### Publishing a New Release + +1. Update the version in both `setup.py` and `syncsketch/__init__.py` (keep them in sync). + +2. Build the distribution: +```bash +python -m build +``` + +3. Verify the build artifacts in `dist/`: +```bash +ls dist/syncsketch-* +``` + +4. Upload to PyPI: +```bash +python -m twine upload dist/syncsketch-* +``` + +To test with TestPyPI first: +```bash +python -m twine upload --repository testpypi dist/syncsketch-* +``` + +Requires the `build` and `twine` packages (`pip install build twine`). diff --git a/build/lib/syncsketch/__init__.py b/build/lib/syncsketch/__init__.py index 5965791..d5c1749 100644 --- a/build/lib/syncsketch/__init__.py +++ b/build/lib/syncsketch/__init__.py @@ -6,6 +6,18 @@ from __future__ import absolute_import +import sys +import warnings + +if sys.version_info < (3, 8): + warnings.warn( + "SyncSketch: Python %d.%d is deprecated. " + "New features will only target Python 3.8+. " + "Please upgrade." % (sys.version_info[0], sys.version_info[1]), + DeprecationWarning, + stacklevel=2, + ) + from .syncsketch import SyncSketchAPI __version__ = "1.0.12.0" diff --git a/build/lib/syncsketch/syncsketch.py b/build/lib/syncsketch/syncsketch.py index 0fd34f0..e7d2967 100644 --- a/build/lib/syncsketch/syncsketch.py +++ b/build/lib/syncsketch/syncsketch.py @@ -50,7 +50,7 @@ def _worker(self): try: task_id, fn, args, kwargs = self.tasks.get(block=False) self.results[task_id] = fn(*args, **kwargs) - except: + except Exception: pass def __enter__(self): @@ -130,6 +130,13 @@ def __init__( def get_api_base_url(self, api_version=None): return self.join_url_path(self.HOST, "/api/{}/".format(api_version or self.api_version)) + _SENSITIVE_KEYS = frozenset({"api_key", "token", "username", "email", "Authorization"}) + + @staticmethod + def _redact_dict(d): + """Return a copy of dict *d* with sensitive values replaced by '***'.""" + return {k: ("***" if k in SyncSketchAPI._SENSITIVE_KEYS else v) for k, v in d.items()} + @staticmethod def join_url_path(base, *path_segments): """Takes one more more strings and returns a properly terminated url path. Handles strings regardless @@ -206,8 +213,8 @@ def _get_json_response( "{method} URL: {url}, params: {params}, headers: {headers}, status_code: {status_code}".format( method=method, url=url, - params=params, - headers=headers, + params=self._redact_dict(params), + headers=self._redact_dict(headers), status_code=r.status_code, ) ) @@ -221,8 +228,7 @@ def _get_json_response( except Exception as e: if self.debug: print(e) - - print("Error: %s" % r.text) + print("Error: %s" % r.text) return {"objects": []} @@ -958,22 +964,22 @@ def add_media( if itemParentId: get_params.update({"itemParentId": itemParentId}) - uploadURL = "%s/items/uploadToReview/%s/?%s" % ( + uploadURL = "%s/items/uploadToReview/%s/" % ( self.HOST, review_id, - urlencode(get_params), ) files = {"reviewFile": open(filepath, "rb")} r = requests.post( uploadURL, + params=get_params, files=files, data=dict(artist=artist_name, name=file_name), headers=self.headers, ) if self.debug: - print("URL: %s, params: %s" % (uploadURL, get_params)) + print("URL: %s, params: %s" % (uploadURL, self._redact_dict(get_params))) try: return json.loads(r.text) @@ -1002,15 +1008,15 @@ def add_media_by_url(self, review_id, media_url, artist_name="", noConvertFlag=F if noConvertFlag: get_params.update({"noConvertFlag": 1}) - upload_url = "%s/items/uploadToReview/%s/?%s" % ( + upload_url = "%s/items/uploadToReview/%s/" % ( self.HOST, review_id, - urlencode(get_params), ) r = requests.post( upload_url, - {"media_url": media_url, "artist": artist_name}, + params=get_params, + data={"media_url": media_url, "artist": artist_name}, headers=self.headers, ) @@ -1411,8 +1417,7 @@ def _get_s3_signed_url( """ Internal method. Use to retrieve s3 signed url for file upload in `add_media_via_s3`. """ - request_data = self.api_params.copy() - additional_request_data = { + post_data = { "review_id": review_id, "item_name": item_name, "item_data": { @@ -1422,13 +1427,12 @@ def _get_s3_signed_url( "noConvertFlag": no_convert, }, } - request_data.update(additional_request_data) request_url = "{}/uploads/get-s3-signed-url/".format(self.HOST) return self._get_json_response( url=request_url, - postData=request_data, + postData=post_data, raw_response=raw_response, ) @@ -1721,10 +1725,11 @@ def get_grease_pencil_overlays(self, review_id, item_id, homedir=None): if result.get("status") == "done": data = result.get("data") - # storing locally - local_filename = "/tmp/%s.zip" % data["fileName"] + # storing locally - sanitize fileName to prevent path traversal + safe_name = os.path.basename(data["fileName"]) + local_filename = "/tmp/%s.zip" % safe_name if homedir: - local_filename = os.path.join(homedir, "{}.zip".format(data["fileName"])) + local_filename = os.path.join(homedir, "{}.zip".format(safe_name)) r = requests.get(data["s3Path"], stream=True) with open(local_filename, "wb") as f: for chunk in r.iter_content(chunk_size=1024): @@ -1788,7 +1793,7 @@ def get_user_by_email(self, email, fields=None, raw_response=True): try: data = response.json() return data.get("objects")[0] - except: + except Exception: return None def get_users_by_project_id(self, project_id, raw_response=False): diff --git a/dist/syncsketch-1.0.12.0-py3-none-any.whl b/dist/syncsketch-1.0.12.0-py3-none-any.whl index 95a3e5835456b10a08a698fb5fcff98020c050e3..3100d1ec6698eed679c56fa4264199654576245d 100644 GIT binary patch delta 19729 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%0Af7o&NwcW)}ef delta 19429 zcmV(%K;plWr~$dA0kF>j4$51+TvNcc7(F}y00ldf-2o|oEPPX@5{Z=LnN2QhI5&M2v>!#$;r_w*d;9;sxBp#q@Z0`( zhyCxq!`H8Wld6v1KvS1lI*u+D{pb&6GG0W-`M69gzeJr)p}E8TLul-`@ZXasmt`@H zhQrHwJulPYFv_O0qO7CjqADiyIvw)w-DsSB&Z?})ccWREYI@@?T@t{!Oa0J|GR>;nZS*qJ9)Bl;LRb4%Qc~X~){u7vc^fY?EfQ8AUL;6Xz z=jCLQUC0*TSDM3;rccr@qjXkBC-nTdEMYnAHlDj}bZ1FfrG87WdM9ErX0x(@X~SMb z^>vvhxOF`k<~)t2#dtnRtLU;Q)hK(EltdMjn52Q; z_a@m*8jU7NWv>M_z>ob(o#NuJ>8Re}apGs3UIH{`c~%dHohqGN?ncw(%kZ`+Z_=_d z3gQRfca7K4z%1++t&{2o3(* zIw`Lz`19+VTm0sX8^yl|DglZ;L#& z3YICrR4&J3&q*vJ4bK_>?R5q)kQcQ%!gM;T7agZ0%~k@x_o8V!FjS-AtF-Q1Op4Ke z&EQossnVTbTTN5G%scL0c=h?*gvU4oz;)JT2&XYE1$a91MaTynnnz`lU!@%vKm)78 zZ(yYA%ys#kz;2f?^#QdZ8t})?&%5I!ox*7wL}%qZZ7Nhji*?6u!vyXw;JP#)cS8LM zXu;y%l6)}^EUf1cu|I$NoJ_={i@;)kiRov#HHxNX>i)IJa+rbDJMX&aTWr14lQD7$ zBm`En^bf7 zUY5glOeVdj;tLFcvE=C@AD!N$_2~M=`xBl<9LMzcWs!eQ^9<-y8o|q`E|AVl=Xo|l z(sY~E*8oPT(L{8bmY*{yj%z(CCX?i%D1k10PNO29AWARO&slm~seYd5O%+&Jtt73m z`jr5$V*HwA!<%%WA6yqzJ&19CQ7TxK+uPf21*58HR9zT#tc${W9DkW*z*bzH6*p*G{8cxDSl1?JZA37;R4f+bTzp3 zfmKMRQB{{T{eJXc#k`EtX_8GMSYX`PJej7!^1MKOQOD`%KVj)$kLLM*7>@#uq)O`= z7Ni1*z6iC4>)Ve$R>0KZ-XdT@aU2Dp%48A=u&Ug;7eIc!74Ju#cQfSXlF3f=({-9d z32Y4ql8S-=ZBUYlJ5C<3Ac7rK>PE*-nWRjkt29pm)Q~MruQQlfVpfC4A3wZ~h-r{O zVgm>rld1>Dl!n+tsspQk#Yee{{^RuBTX>Z6YS{ydvI#xVpl|G;8hIGK+~~4s@bIv@=W%%uQZCEoOsBgRUaA0pIuw&_BU~Zz-m0nE&Q&l#lJxgv< z1bP&gOYslR9_d>Gq(LI}Btk(uEhlh*(sG*RL@1!62pjK4e}cj&Y|FZ3dX<#;L}Mht zi9i+LK$duaDi=hGV2SB?W?#~A&uAFt4ML1T-+%n^M;jwLD;g&kqgcZ{{_Mr;)rP$| zIDGCl0*^Lq2>15O;%~iBi}XCmz2KJhiC)F{HKz4Nq{Zw%eCxW^tnKYbFUI4HDV5p{ zs1CT0T0m7(!DtaTPPat}*JXNK%O92wY-&a;abmdAnqS0y3QK2-v#`GLpM;WLX_06_g2ye^`Azv`OQ1W`%mr zAqbJPBCpaW;RqVjKNxuu-qsJHsiUM$oToE?APk|$3E+Xy^LeN=o(u86~%REF!1!Vg(Fcz;THp2!xG3+@FvLlKZMA$Fbd;YK>po@C%QXE&*Tre4Pbw_6!F6$A3LW&_R&sj_1=^ z)schUu||%}Rb&I0v(f|c*DjzpgqT4E!tPSw^X9dnw@VfS-y;C-I+G=H#6Wer>yFhO z-8{HW^Ci19U%E;2ddaA`vsGg<1_HEy45T|}ELMkHBG~7WUR<`>Y7!M>t=cmIUNgYX zVM6KJ2iy3LXL*lEydT{`fA_LO_{m@HRiE%ke1m7mna-;r+G^mr@oRO zW&>CBt16Cu1)bOFm)a>P2Ifw0iCi;eWG^UIhr~nDcu1JEnHGBG%_yr#_XbjbN7U_1 zfWzI5>iKMv?gVTAR1A^Iu3)Qw=z%+JiyWbt-{*?=28WU%1d-Yy9SdH|BJyY+Xi$Qh z%4KQXB{jx%I=aDmNp%)5V5$!+pd}U6)=$X9a>e8-!R3ff3BIA1aT*=&?;B!YM4Sh4 zw*ZW+<(mTaA>|-Qg15zdf=WcK_(5LURE0z-!h#{_NZr><9w!zN`an;A0fuV0;Ce9U z!-DhYgC0nw0Ny<{b3ol=9@p-;t+NI z-3KPZLK+2oYHKm-GED^tB4c+_r+_q>$qX=_4M6$Fv<8`{B1nVwP`Xb>qhg-d=!a0y zvEG$73<8Wo=uZJ~GVGFnwc`M~!j4W#dQT=MWvm)zKRU@rlQ~R`n-D5_IpSbtYYA!G z4#p*k@&lTYP@wl=^$h2SESU$QsP_!64lc8y;JU;!ND}}|cW{pztER+koMF{A<(~lb zxNwiF--~yZ*rK~$4P1157kh31>BoSg> z(h14FE80o~g6J9uQbJe((3l4jSo7~7E&m-3=HF?Hc^rN57f~OrIPdI5GP(gF|8ZdB zb?aHUu!FNWM*#ZN27;0ing$7aY`vvJ7-L?7SnkcP(a?^kEm#R-V!t{5Vr>I2o0$ZL=RZi2|pnT z7#|bX3RT<=JOxhTny5!mYlGL}1;z?HLDKeqlA@w+n%ty7jLS4y6mxQ~fJLUs0~}); zanR|2_Np~xSuJ>A_N%IgMAd)}htZPC7MhYhnkG=x#T=x6_g+vbAJdJ>l#Ub^2!Jfw zBw$6;YE))K)dq3QfV?g)d_np|(Gw!B1=^rRU){*t8Yn?KL#9o%px175tMV}J!)HIyoX>c1rqqKX4?DlMaG08^V=oOl{i+Rn)jpPEqCZCgRl3YwuNivc;QgoI3?Nz`g zPm`XfZr{#97tpu<;U**moIV1YeVpkHIml@S7`XMJd~TmTVOJwiw%-^V0|ks#?^Y`W=>4-;lQ6Wx1sp>wu~8_ z3}@;3B%qckY>PLMc%zzM+KgP{Ks)kPyM}Nt0*%09u>iS=b%YvbX^X}V1{x*<2rZgX zu3ayGh>HmZ`uvBgRQg+DqK_1ZHBAw@8Mr)Q>s(Tn z$pYujo>=~dZ^Bf&*i3TR4w?f}A|Val?l&O8VPk#T!dPsj^N#l^mKzpCoeyC1QRfu^ zR%;Bp;(3gF@Cx8oYiBAl&yeqGs8xB$Z90^HPOMhN%6tm8pw4%@CYBX4H!9p2;ef{3 zo26*l2M?l8n+i-OeHvaYhDf0W56XP!Hl%Ka+AkK=YS0(KVCMiER4J}5%0J&SE_v-t z@PTqSF2Qh^k%M-H$3w78UsVdIy%Wl{$%pOLfw#&CtA#za#!fGP9NfecCnxfRT~P|F055`Q6^Vu0NU09FbP?rIpC}C z-z*1Et5f3|NVgl2)v+J3qrYvac^VymN$8f8r!dCP-80erGa%xJ&%gWrzBLS=96b*7 zordQdfwyXC1AdtwJ#y*;MN%wF0YlW-U#hR`KQO?blHA z@$x7}_Mbq-*Af$LN5zK_$gJrS2y6{|N7Ry`rX%_mR-uKF0}?DA&!d3TCI^07yM&(q z%$3H4pDTB~H98~F|C0dBf~Rh>t6&U#*yW^FNV1N2}q2kNLUM-);=%cFS+ZV;mV zHW2y?ZmK;u@hylJ{|LlxXjIri=^+~kFM*-l$_9SmrlQU~7vtOc*JiG>nGYk?aw|SG z-B1<=R7QG%jo!BXlslr^Ae%ygqMV@@rm3=7jCdTt;zj-ncEY2enNTc$8Qy6m@B^50 zz^~)pP&4=1fw6~K9RmY?pgEBN$Fn9Ltz}FUv>o+odg1}7*JeF!&U=8;O{#Jwn+8&e zW(>RA(ur8VXc%atfgQT*cDwh!L$vAA3ngrg{c44Zar?fR%Qfs{uQ#)gz56G%kF``- z22sF}4gF2jMi*Y6UqK)_&{-5j(!>a|ae;_go>rL9n$TblrOzIB`IC z_-9KfP7J>JGSHUL9DZ6|7m`fASxfQk6dzBH8EF+pL6i^9Rk2Sy(T~yo()NwQ=lh@B zLrvihLnp{K7aItFdaaWqPQWT-vB78<2wK3=FUO**aiVF^ZCcyq_FPM&V>Gd;HCHf< zE4E}qTkco1UxAh~2+u|D$yJB9? z=5>_vT>9`q}Jbv#it;$=Lqj7P(k0J`zZ*4%BFT*7ghED6x27Wut_nQmcJx<)*Y; z7tzG-KC+L}W_GN{Qvy7e3zKE~99Ddb!rxU^^CAj{pA{<$)>RT%zC}{zNk#65mb)Gj z|5>klD#CMwoQD)O$H8l#d*X&pjyNpeSOprCV+wSC#hL~gS(jA~GAu+xwJnKZVs`6+ zW3!pG*{+F;axx}XO76BQaBqp>v=}y!ivG@7Gl5<__+>k2?(V)PmbmIM)an?d3RIl4 z;9E%_a8xXrQXZ9nK(Lu`i7`zvXc*Ei`*3XFFK&Seeq>X_x)7=%lodQVz!x59v_j7m zi&pl3=yy04m4vJq-PI)2qRpkLyoR@P5K#_yqvxOel6EMmPaC5PeVIl`-{Euhk3YHF zIw%+O$;}>b`0CT5ScJLDAt-iyJ5J84sEv3rWR>*B9K|+>i#Zg%nTYs*iQro%_ioOTIO@ytfGl(Lu?G^{@n5>6aRl984CJd%#f0a_{KX2m6BRVqxEv6)?gx z4M;txujkW?JjwW#kiPUfkmN$Un|80-^1x2@Q1%ORKz*5Q>HEX(;dkBt`@8P<2ff?b zo(S;Vo6k`7TlEh24}RO*f8HyTEbsn*b#~Rbma#_Hf^Og|+}p7!;fNA!D!DcwUkVQU7_=p`2VW<#8ZoniW+E_uqH`!zle6 zWL5SzKrZ;NG)H88BwZ6;y|VUnisZ-!V+M_Ny2BUIwr)dqvjM>7Df_ro>p_U|1-}@ zW$PO*y?kZ(#DyrvB|vG7Xo@pET$WgVmX=~$(QW%P#_-~#kBB#L#q=ClSI1chIL8fO zr;@IEDXR}P>iNkra<@?KOI`ULnzFq0?F7gYGQr2Ci-dkDEKABV8n_(R6Jxus)aBB*kP3M*cQJNaT}> z*D|b<{?ojm@Wf^PYLa-V;BY?g6AUVKGH!EOvLVnhV|7d_f!QrBqI*(*i@Y53x9LQB1< zk#pvgs#=q9ZwC>{eeH8@4yjb76-043t8OSzUay|cdeZ`0>fWXo9;TwCY8oIIU*!gR zE3}&8sG@u?4G49f_8y9cMrz zUQ6dPf!zZ(tSoLhmKSFao>1aOfVd`ULxR1PIIbdGndTlp$U1x@L!A(2x>j2_Dqn!H z8dFEbY|jeWvn>g>MM!OXyZ>wLOkj4>{f@DY~uPAf9)4zZ5yK_J}}S#3t9tpa2-W~OtN6+f(g#^0b$qG zY)n0f(R5QX1j?#^LPA1ErY4Xj+_VUx0a@t`ESgK+zbcQCA(Qf33i|Gl))4XBlr&N= zA3scN@+dGTlPJI*s;a_563bmDpHrrE419uSjV8q$=70jD9LkHIPIsfDvY1^IUv{I@ z>!Q9Yah|}KcDshX`KPp*G`Awj+aZK%`TLO}6*EPWcprd&g>$5e_59jY@X@Fft?#&i z{X_+k6vZx(YEoB*y5Z{*24f>dvOi;^9Iavo(5nt*C;l&34oj$1_KA!YG>L91emsK2 zyD=2WD83cS(TWHRy$m{cv0k#iiLqjaYz*+L;s1U^bpN$*vX~{FvFg3L~AWa3^3pO^Bpe>*Hh9?l+1c+rsBk4{m4DF{oLB7LS8>c#?1)`OW29KQq} z_M`9L{K1P9gv}d3-jCiSU$W_ZYG|#n;AE0cWP_rp(J-RDyJ3@!zHx(}r_qtp9%5P^ zOmm_4K(6_+wKb<>Y-u>)gopR3BIz~-2$cnTsKcT^@yd;6^C2f77`TPI>RrcIgg=c= zQw!Ymd|tl)7>QIx7xNnDHA7HJ>)RB#;zQbh^WOy;M6GlVrJ%jN3%YWLDUk_mKtj1q zfz!&L)k+pG;IuLj6AM@rFq$0CIUdc*Yu_B|0DpB3L3qgWj$VOZqd(8@cKpe%NY{p+ zhCF}rgDK37b9HBo=H7>hJ2j?zv6^VKSeo1~FwKGSeOGVvKz(a$$X@~fsbC#CCj@AJ zl$354fU`b9qXMSIO~>>wkoN5uD0` zF}FpDlM!GjxPfX^b9NKaoGe?-0JQ*r;q7R(!ui3crapc%2v?*|pq>??P34xwgOyEF z{91LdfJ?6Ev7uDKEX<=?$l`c)(OAmUI-Nxac!v*39wkL!DkV^o<~6avP+;(I`VGYt zEiqdVqamyiYUZIbWUB9ng0+Y-;3Uc6@Oi*(P`V>3z9vuv;XsZ8zXyt#>kLJI&7XE@ zLwqp9+?#9G;^M3;APr(={Y5aAlGq-#+jFM9#Cc!YUc60Q;_YGwR`7-0;N-f+O_1`x zB5F@;IRTo>Wx+=4M5^JINg!&$2!sGN+@eS!YD+=c*ey>fUSP92u_$08qcg?h0*YKH z{@2VonJ_O63rC!CQdwNIFNLjt7y-N1>f$@zfj-2fg22=y6U2k=Vr%J4z8C`I*pyVK z^{H+?vCGdp6=`u^UDbv4`yXnR*KL9 zIWnxR1EM>{S~4WjAY|7;54=k+?R`BIVj3nVG2h)@Ba4TS>T{DUxDTSsE(#tUE#L>` z2wY$)5@t&;ppBbw7gZO31*v@8=@=v3<#z#@#hlJ>tYj;7Q74ljK^F`gV^DDWR>a#C zh9j{rAjuf5-7ncDb>xil1LOP7jx9f5q682$#mHw~SR}Am>^|b; zw+D#=+sVi<_}m52a)G&c5{`A3 zCOQa+NI{vN*X9H3pJ^qoa@Yd2uCi_{t7ut*6|pd_h}5Y!qx?H{`0smIZ4Y1e?u?Z* zoS7SiNY%)|z$Hc-1LJ#xyt!f`>ry&vbU^j2B?;g6!H*<)(0aqIApA)8?K{G%eFJL- z!Z^y$5<=KwB_#KM>n(^!Ae~yPgk$+xq12F{_=SM+I|1zX{YcZ|tF(3@mCmjOPe7IB z;D<>0X|>dR9Mrp`YmjtL@Ym;=w$hR)*zgB zt4W&9ItEf(J_Zx}{dy1`G8Y4L1nv}AEYji>mzPW1KxQ_7%jdr5tI>(i1(+WLaRt_z z`7FT)ky$d-hBz*=sekkdd0Uvrf>!{3gwMyfd>np$F#O2C`c#?^DHmlEL3T-)wkyw< zZ1ZYzMV>{P(P=Iy4a;}&OBOcw&V1Rkfp{&aNZ&3ok{ZQd8Ugy}pgoU%ZvQC4;2xhP zSL|mmg5vUjAr&VkSUJU1w*v?CMFplz*ywW7gl+tz&kB$wn*F~B(k}_HPsqZCtTrBL;3jHNJ!}Xq`1wuLiP2yy z!NyQ6ibp#pRQ(to@NML{0S|DG!B=9F@8b6`W)5?IjN#(V`7ws+6B@bqTXCJePzM&! zXW?gy8y-M0dIYwz)1$~R;x+btZ6vcXf`M@js=DmBp4ska*(Qgcu8)A$MLw+&&r+n* zh;V#FgNA;o>S8~e*6QEy`jU@kU1gRlrJ|$aPRB}}X()fWJ9y??s3x`D8M%qPFN(?W zmvl6LuZyzN;5tFN;#3rJ?B#P9eJZ+j7UFb%fx-B3{?g+wscvj!BT1{RpVUr({=RdM z(4ibqx1xSJhRSm{(54R&V(ek1GQZr}aVPb%fYl$NAEKQmAUGK@R+x?GYb`Y=dIPj z1^608leHW_2^L#VnNL-;>OP>M-wAZFiJBeN>uP{Lkz8U$#?M;1^c6aE=KxC^r!})~ zaYH^5%Xl7do2iNA=4GcBVOnlQ0I_X`9tu%Ws=MdVbDEQTwREYbxW^3?v5WC*JFswr zNiw|{C()OF^yS>-AwT&p8{hW<(TmuB087D8Mi5vJ3T3U9fT%i=J|Qv9Oo4@*s=@K9 zDx3I1n3HPl`_LLxCd;mvimcZ3T3uoQUxhTFPEXg!J_ZO6Q;ufk->fJmWx zf1eLS`DCOq-?~HM-W^%v0^n&j%_d1HE(~+mV!zpoSwOaNyN$d)`HlyOvQSZfhulb? zA-Br6&!f}lnER;)?uD*P=%5eSlo6(b9k;sC39L>rO)0VshAt)73UR}YW0s?TmmVc1 zDaoej!KEE0(~>q3uQMh_jIOF?4|AYGAM;6elN!yKJ*X>f(rFCd%tsio_{11FqNWuG{!DSIYav}r&nw(i=XkQHX3)vWNiCbcD)$d~AT8XoNJI5cNc9lP* ze9EzM@BQ6*s0TRE+c3edo)6hlN;klrfv;Fx<>cM8YMN#=IDFcWF|dDzi{g|A%^sY2 zF%%bsn|8=2^XB5Lrtr%1S6G;V20;Ve|IS~$KT+n4{(t8NxwkrKOXRdE#V9gu2 z$`i>0GG7H;S4F$Z3Q`8#Ix?~Uz5+F+(p|qTe z54=Vb*c)AD$u*kQ9`~)?+)(vL~a|H9PtS{Iz6SS_B}XC;EQsUU6U zc&Y^mDPKf@%!^bd&^-DpbY94v8Kb9nX2+h8ktN5)sOpZXxX9s4(IwNochEgJ=+(t6 z8&$pWMNdqB-3T&ya%siw;wix31x6!TFeZd6Qh#xAx(zCV%9-bjGtkTHmv3LZIgZZW zMW@FvKD_*sF85K0>S+`Yhp}9Mg#bms_X-|mtYa&!JPPE2PE}fO(fj{-|KZ(#9KSqk z90qJzHNyxl^BEiwp1K?aoGKkFG~u+wBu{e&>4W`$wgFp(1qf*k>T%xCA-{VT9`&>S zvl`F|K^OM(jPkq5bL2#R;Si@G(VSxkh;V>Zw|^j^llQyGCkqiGh~D$T?}||SV-aM7 zE|knmj8-<$7YC^BIHiiD)=qFrXCF;J_gW6=34f_S`LAa;9&9uW3Z z>S$de)HcU8%@N~}DNbmcnXb`X#3+GIX1mm#OEZW3f*{37B&@KE!5uF$!tdmv2`cF8Y)FWqqCTkE^9xso=W2GL$+%!XDrz(4^+^t@c z^G|FQTVF&fkE&_Q=wx7);uRUeeg<23$oYMEqKq-v|8V^B#o6(Zsn8ZLUr=N!VWSyKBa6DSC&N{N#0YPH zs{-Vg*uz2bQ93Kr5i%x5qM0c)XaOU1G&Jy`lDpdj=Nq&mF+>trpdCRl&1f9U3t(xC zu>PtCBR4~$BFd}C=ji?=LN%sQF;OXt`7m6G zE3(I<597)xpaUad93D;6PS#D1mg;hd3eg>WLFZT%j}D!vw#-ha7CXFjg!gsIj#md zGSFQeIdV;_<*XbpD_G5DaP=O zNM;0Z%`@OTu7q!v&h{fasWeZjVyu!{G^?)VO@7jn5i^#cO3yn;GJl8aMlYda&A6(1 zvqDVO=@^WJVG?i3NqTO7ITGD+*G4E=V>~b=;26r{HX3985pmVea%^uv-p4QBy?Jx| z_UQO1+SArN1CWHyu$rYK*sPJ{LU8rM9z+k;vb2jH&WRg@;zWVDr8Y6Kow0(}A=7Q1 zYg9QDIh1uJuPrBWeRETqBFGjU4!*5wMxvLEbu(E0a)Q@#&{S=I;tET_wAy5CK0s15 z#7Iy8x-gnqT6%_Nn%^*~h8X1W-@jXGh+duh=L0oY8KRj&MQMf-9r{XWQ?!u%s^{oR z#si2rMEaNgz;dMss4xwhfM>TFJ5tgo>QRl~A9u8P&{f34kY#2jJ20AY!da>IdR z?iVXc3yQBPz^k_deC=l6smtS&wcM2s*GVvUn>~(uZx+%p@AyWTIR}&>UWi~w7T6-M zFn|Jrs&b9O-NUn_G z^-9jkB3yFL9QILW*x(N73L6|T$`iBejKX5qVTmxfFA5>Lrh(kpy+FsBb}#Et{h{bU z?h9rNYqvM{$eN;6VS58(#Ax(^gOR)GPG6L>IgMmm2=#NfNaIV(AHFlV5 zZZC8x^)|tqn9)UMM`AH9&mMSJ9W?|~KDn#JQRHoX@9lZm49Hc9JoRt}SUZ~xDe`%; zsC@II;^?jmWR^=ZL^fF=zibeM1Q1zZn;;3NUvKndZqFrq2g1XT-9C@ z{VkiZ=Nrp7!oMBGr0D;@d95^eCV86)FUhJ)J!;GWbyV;j)vk;epDgT#6o2ykD4GI6 zoH$uhr$uRn_U7EDzN^YjUfcp$UZq`3pfFCW8*){t<}-|r-kZV*dmtB;`Cj^EHi1Ta zqa>++dM`2m)1T7GtVfxkuJPO9{=xUX3 z>LO7|J0ikFfFlc>cMitk7bWJ+p6ync!gYt>1Pj5>&zOOfwD4mkiENtfchX zq_E!=<&9ax0ZBS2$mMp?S^UNrDp{%0!%hT(>K_kWd*K`N0GISo9!T5{(p{i$pTm}R= z+GGK9^nDr7EphL`9lwF&_N{kkkqPoG0l58%;=&7MpDDy+X0=G zfhe{LKKSv1D{1B|csbJmah)QfxImlK6}dYWy3ZHf#GzQ?u+V zE!qi6wz`l0H;At`atwmm?}=%D?NP6mB3e)QLEf%77~vI(YGF#hji?AV&pHmevUsf@ zBqK_sW?RC9;ULR}U#@-eQocrP18?2?oNF4rB&bOKfwC9#pdw>#!d8pp??!(tglpzV z3RuaAFY2m7tXG+4SJyS0=_l!BZRO@R;7_cIKu+v!jizy@|4>!Ee*Nfwg&2101_-#_ z)z&sI`9!Ww*e>O6hpsQ5EU&+{!(~i%-6JLqSQ?9iAmJ_ya$)G%<41C1vCS<{R_Pey zSH!{QILPNELTDW7S1n)5er5TFepPe9em6og2)Bq=jFs;RfV9w!JoN^&I(SEtuWh*M zNNz}x5Y_zyF5W19=;UaB=@I@#vp!#eKMnz!!|e!Fo<~YdI5OCvhtfB8+9s%ywv=U% zvl0I8M>X08q2Zway(g|wO_BPnpI-=>g`4qy}kYb~c(QVJlH{v_LM>mkqL^SNM{ z<9>_|UBAbFy5lt7jc1s`wL(`Oc$bW)Ssveq{ld-Zn7&@>dFa%CasPeg%aT)GcAU%} z`Uh4NMM;mLio_Upqj;L+$yHj$ZnGpV!z%WpjZ4%@upk}#IWBx#5{NB}OgeaOB!i2D}@q3zDDfRXu zv{hRV*nDkXVWt&o!$@jh&#k`c7v*1Aq_T4wb zMl0j^I5;3LKEc05GPV+$+vWJ4Rk$vG=mP2Acm;5OIlo|^MyxW=tKzc0P0F;#C}Iz` z%reX;88k1g{6JNHN=gh^+;%A4cqgzs9MB966PMXllOe)bvycfQxTKDuf$pU)u|2Ge z{P>av3iuZp6$J!5?s=)Ry(i{YD*l)(6@_45CW{p&uHbw%Ffh;jC2!n%(E_^fu@Py#8!^;aDsDlN%HKMYo(t2nA} zc^Aith*_JFNQtc&R(#PLX^X0T@6>2vT(^gRF6oOvWj#KZJ#4HoAdMQ^23lwN4LAjB zz+HA?8zQrXer$(+obh&q(wWHmq*8W>1|(+)gveE&FD(64E!#@lwIJ6$T_tl zxvyb7PgHo4ERc*gUbNf<&l|6K$(m`vhBqvI$}i`E7Yy*`wu*#_Zd}p9;XWMEg%)Ig zPcB8&KskI(;wznRVv^-IA`gvPHsm5LH5sc0DBGhxgDfU{vsXcBva7r(MfgL!OaYII zX;vf0GM<+*N`(xy8lmg%8f3|&chVN`^X40~K4yJyiv6flD4l@InLV2NuNfeMa3oXd zI44_GvTq%R*4V-~D@eZXk#G#UJ)`S?=@6Zu`G!K=)SInJ$*k8$B-QRf%pY!aGF%c4e-LIU^D?&1+3Msf&bUI@o=GQ_m>0 zXoDY4&p!MZX*wW7>e33}(BvJG*r?2uPSn-j*gd>Q&~p+)?y2D;EQ&g>=IHcQk~<;} zjq?qPay>V0!(JqBadK_(tCHzm0F{1DCi7HoP1EXf=qurFjQEG)_LjwlI^^@_m2v&Ri!wZYUA^uuxD=fss z0c$qEMY#Yr3maJul7U;EYoaK1NE^^pCPH4ViL2JaC?-M?ghXVqprA>AgCG9z?%iv^ zE+}DBB2?rf0enSBCAV@a0X=@JAYEPV^QjYe{ff%~{grku$wgq`(QM3uMjp* z;MrCvl1$B2L%hI$RoW`e6_WNjB-$-gcdu$*G#b))SzCkl3LERj#>SX$Q3qzwjg_X1 z5M!#t=959iSjFW*KmxZ0RZIv!P_3D4lk1%up?jV5fP9M2ou>kua`*@*wyc3jCTZT$ zebBS`(~fCUG3O`>P{aetIap20bW3Il)of!B3u8w~dcbXeuw5MR@y@+hpGp%VUh8ZG z)Dd3Ow1#0KAKVkK0YBD+j^N)6bJmR7LZAGUGMy~1cQ={M(tO-e{c@t&K>Uamkx=l% zV62+*?xK`Nbg`w1Zn&lD$;(r<~F$s)YBnUxtpTm2O6{b!oa zC_z9@@s=+sH0J2$HYvxIO2$pe(y2mLy;P1n1Nb#memwLV;7VN4#M@L9Ra*R%uir}t zAbxG#n>1ekVeytD(U^r~%n7IP9~LKLyCmO@lhYS}#h{4rn=u{iI17s|A~M^UMW6{0 z4NSEl(o%_W@LL$OXhsc3CTOy5ecQFHiHhBKrYQ?L%^H)0hbJ6hUdEP}0~e2R*VSW| zUBnx4!Og5gN$fmOkuUzR`1s+q`IhcPmlHV%9VErHq_MavbEWZtb8I8^tN+LPsDXfLX)XaDCrXZUwu^ z5420Ztoc&kvlErg>wU7i%+N3}b56)6{%AxMdnaNninhW57-hw?GL`F4!&ik7jIgQ$ zH`KfWgBFt8pe@~^MjIPM0>7L-v@|j<8IN5!(jSj)=kP{kziymPxU#2Pl2t8t60@51 z!m46<8k$wC7k)1q%LiRbpZqUSO9KQH000080C8}=v*JE80}*j>yB#b0;aM7r&&_Mpvho#7WQ7ym(@#nU2RJ zK_n!hrU)JZ+SPUP-|yK4KvIs=sm~uG3D{j=-=9U^Dkn4P*d#zl$PMY0=@&5SWaJ-+K*PD&3wo`Eqs&l4)5@%btHidY8cAEU#Y}BZfD~MS; zSK8@hveIr{FUG0aOj^m4l6gk5)XDQ2U#qD&TkBkx;&pD6GtQZ?F;W|;^QkDY{jXL6 z2~6JTR23G7y*NJ^9gSY*vbHM0hqZdC6@;Fs8> zZ*+$JSHHVTl1%IFG9iVr`oq)l{_xrHcjNtk3Pr@?_*m@G&ffhDqtx6yJAU#P=<%(8 zG`Ksiwa?f3lH+7s$c;{?LUOIR``g!!b~SCh(5_{zA@5zpeZ6%ZtlLtoW2I}C@{q50 z7e-6izFjS&ZCROiy^7jr(EgrfUozVb>q~KxJo-v8PA=Bkic+T66kzdKu~DGNtZ+u4 zhHmOYr_w2Li#jdbT6OBbu&TO2wG*;`$i!_WODkS}_;@1vX{Eq2#NA{z6m^;LuT162 zsX_Mu4bxRJbzb@hb)(g-9Vf}=Jsj8r!v2d1lAjpgoj&a?@!TKc*%( z)$t;))u81fvazXF6DaqaN?o_Z3=)3^m3nWJ(9Qn*&~kg@$!tehM^?zEKNpgJ@9;v| zmnMT@-Ij82k;5Zj+~6Alu_Luk?= z8mg2)0$At)q{YxQR6`R4q=h2ANu&osL=+;SN@yaWNR^26(0i`}(ghJg>4YNa`S<1? z?rtBy+1;0KW@mo0vnwg4uY^kUCtqIVtbl_<#Tc^>`xvUR-h=2R;9bN68_Ve78Q!t)!AUC^QSZP zT;Z$e3)`EZfMN)bDJziGJ(lZb7QWL9ek}Mn+n<*A3ftNFP091$GvYn zbDW9^{IDTxs4}Y&&X2J|b_kRGvTDtu@V8rlUL>=Tl`__5-47wK9B~}ln1Ic)Q(r@l zwd_w(c0z!ECTpNw$NhMPT?QG3WvpL^5&k6Zp_bjOM-1)H(b)Kg*RwtvI`yz0ilmp} z@8tuuB`ykz3o{6B28nBi1xa*>1@>q-Y0HGHg4-1rgo#qPH-?^Cf}m;d*4d{sALb$Zgeh<*RO`DVWHj&iqlJ%}Y_aSL?aH;W5zp}lwtMJPWV~~4Z zb}X_jECo_kQvN|9d)PWo$M6~7Xbh;~AaBdiQL9f2=N)E2H^GZ}MCpL$Y+@*9&IQ8= z0;+vf-nFdO*yjL7Fbd@x{~d!>@4h?Nx;qKqV<|BzxdKHahhI;#t<0Szz^ev$J03V7 zY~eOO{DEKi$~}cd8Kg!VL_=NW6~7E;Duwn0=YKdTO(bh+Kbx_8atL{)OvBAfeCN&$ zw^YRm>-OsD=xlb&Scg04HeXzJd;=Xb1XFbvlxs4BH=}PIHW~oX>9o$5j%wD8?+@$N z@+UkVkNH;h*o97oGk185k50cROwqtb9Ldy+Y?R9o;l-eeqjzaz+e+E}Bi>C9m4|1= z)N!Q9Gl^kZ=O2DgGmuVE8F1uUFw#p`C8BZ65Perfx>jS0MT3G;w49DjuB%8;fUlaC znC%j}$ebI`OkFn<>81CGDVQ`3nCM|1*X_^f0`1JtI12n|hpqNBq9zlasnN)Rk)fv% zW_|)_@Nn_>*Q_y&{#ahqjDD2Kh6+0(Efj}>D85{X?ui|kkVz>Yn;T$QySQg`p({yu}wQ6o3i){$dm)2DG3)ImxU(0ID%k5 zyG$v(1M;5h@DsZ!fif{1qnp~UVan`1%ZPe1zKP5-gzo~V*o^2ooTqWvG5{5kBKTO^ zCGjO)bmjw`b;O2@_LMUfjqirv&{c~Ra&g~TF+0S2XdYJ+_-oUlw+wc_4VLC+Q31P9 zzRL#h#CoB_@$Hbvco4%06c;UdcWi}ahm5`rwZ57%gsJL0m3QAvn5vH|smL*g(J2pK( zf!;T?IRmL+P03uTuH8*&Rp*1&iK!$TNh%yrfF)5qrY)4rmh+a{g{sI z;d`o`G!^MT6F1{!H{JBjGj|G6uMf>L2`i0F>X<{RXv!ynPE4^0EEs5z>p8|~;Nj`k zk2HOM^zc&E>0kmijX4N-v}(MH&*>0+dWy9v5giD~z`a$F3`189&K*_z9bjPI&+nR< zl)9XzQ7!JxXw$<(zMkv~X0}FuI5sm^!j!#E-`k${7)!+^vE;#8I`A<)6wQ{7h}!zX z#O`%V7m2`q`ZnbDR6xRLS0kPA;pM5NpKC%ZBDwFmf_9zK$?hWbfl!;FtIk+Deba>lXJ^TB5C-|nmW zCT8k4ah{#5ZM{xM`Aye@{~Se-->wiN2O=VEl=8M+DSV3j4y456`PFGro zf=?e0Mww-FRbP%lK_&QW=sVRls`F&WM#Q+GIExjLHonU7r}J9k1xBUBpm%Ru=ES!X z2m=}(Bb5FXPmp<}x~2aqr0`I`qot(<{hdQGCpIN)C+LWFdTD8ipA_}88;{3tCh*@N z6+5ysdNv#aAe5VPd+#LosvrB~5nC_5l-9;#WWG{Qw5~$9FLf^Nx!<0SsC8$B7fw$a z8;r(+Yie_&I7NpxcjfO}>!n`~bw9kWNPHk)R|qA`pSV^A#UBCHD!ED228m8Tw#`-%@0RTEc008S{y3W@M-BDi=5njye#b z`Jz{KL?!4euf;w+xxAtZFUYgCpkMIZcYKHcrSwgsi}d)cR$TK=7x60{#vKq))-YU; zZDJEB^N}tRwzX8?fmU$CV3J496H{AnaGl5BSE}_TIIxXnmxi5-PQ@90WHXRE-m)6$ z$aR0YQWS9#{>EhC&MUiTURhoOA=IhycorV(i|fMH4rPJa%^&N|d|5&j{qu5usgbz> zy-z97_csXkyo8;hzDdTQuT|@%7=e5$71DPQJ?w#Au}cHKNc~=dz$FX=+*k6t!_uLG z#;*ay7a2$(U2&ijo~dEtyFG5o?(J{%lCD@9%MYvEaXysZ%Qi7t_fPq~whBup_lrfM4_Z3;|qUl*-ZF=w+;VF`X(HI mCA&Y;-oK?R6CQ?t+WmDssmTNk)VcLHmtw+6_XGV;*M9+IE=o=S diff --git a/dist/syncsketch-1.0.12.0.tar.gz b/dist/syncsketch-1.0.12.0.tar.gz index 7f40fadbf82b5eed8a7508c4aab3277107d36b58..34b0f5de97fe89de58d5b21e09caff36874c5320 100644 GIT binary patch literal 35951 zcmbSS(|0ZojI8Zj+qP}nZf|Ydwr$(CZM(g-ZR^|L?w_zPIhmZ3w>%^>8G>jis7wVs zD-eLQr=790wW*7-1sxMTBRv!If5FAj3Fx}l()*uy6D4o{2MyyrkA_JY7zZ7KeMThh zWaQjNQyeJ;MSL9rHZc(lNzy)0f$5k8;HS2#heaXS#>_eAO!`&;9A)1rkV`R=`E(}GRMzmXqsg7s^rbRD+v^Y=H$zczi1^L1Rm zz4NJQ(axsV=9Y7o?tR-X?YHUoYZxH*Bqh-GdibkWd%>DxHf_0*Zv?orv3)pW_h;9E zH=gHc*N)9yJDqduhW_$*w)Q?_SX*=56>cug?3|rSvQJKSw`I#iJ|H-Wn{B3V* ze(vur1I!BpbfSLme7)2DKsyIV^tr#acemKHfA^x5 zJ==k=v$ZwkasQa}EkJvfyN>O^jAJFrvrs;2Rl881I{XK4nH4La3Wub<_&B}P{7h%_lDrAlgNCQ z*TF`-vAu!Z@P4vD0K-En&aePJD>F7Y$FGUSOYr2txHPgFwzp%ssugz{SIGnn{fXx1 zAkfrckai(PH>0@CLN65m0S(uz6w;S(Jr zc$P>BpaGTeW{ef%_`zhSY*3%gjU17Bos6yloL2H$}vauD|`A|?TW zF~J+nnAD1h*v|q&jWQmC4iQ1q?+_Z=#PX~!pAlS&lM+5K$mZlRd`crn0$&&RE8Mt&`hLH~3J?FL*R$W> z}x_RerS`Oakh2IWvdz~5HCj|-r@d_qBJ4rxdH{>{cQjr+t>Wr*Vj{R*!Scqz&PN$(aq!ebLVLSP&;<| zDnIqx+}hjRng+-}x}%ev0_AYC7VsvTQpKx2u}O;)9J$hjwo6&ji6kvu-t>TDwwKVr ziaR6hl&je}8eUQu+^Ck@A!2n#8(*$asYev5%hu!kG0;`eu2ZO#pUwR&-NEvK=UID5 z6?iOPyHeU86~cu)6r08A{;e>UJ9t5qg55B*@B=oTK zRt4V6nNd^ZQt#{nGKSBwo> zfN44(L={ne|EoIH@H}q3 z0SNX0LBCG-=wGTeD^9hBWu1O$t5@nO(e^eN+4mlc zz;h9{z@6rvyP<9Mn)|(5b<3UD&q6-&@7gQK$XbURd;XAqMDM&K9{a@$VMpc!owD~$ z{C;l31F7v@u+au^@5>$wLsapdw)~YT+Lt9;&KRK8BmI@139F&6`MPbnA=(OK?W->u z&E00n;c4sJ%`p2$-7tGIs@Z|{kzq^I{+}g=29FsYR~4R5oCroC`shVl0X^?e9keq@ zfe$Pz683XL&uXaKeQECB@-;+$-@Tm?$2}$dJ~^R}H-j>G;9i&5AFlIVzkcIRQKaSm zOhIymFPPON^I$L?CxW$4kWeGR!jh3x(zD6pL_+Bc$W|G_hT{v>pmg$NUc{5@MdHM# zjC2}LWTt+qRDD#3oFy!6Ta{+as+E8_gxeSu=e6d-7tO z8>=q84f)6t7HO~<&67Jf>KD;6*3t&HsJT5cQ30F0BO;=UI-j_p8)F~_bM?0)xKKl4 zcxO)=zDlVWhAj;~_k39qG=N-4ws@L5wI)Tn{MP|wI_Q)`lV|$oEg0)whl4(sq9Uj@ zDNXhPcnb(_C`uod3U#E7S9j6!9Mm44h$cOjCnEf-3mQTF1MEKd#;tjg(zKxaQJA6K zn~5T*G$q7SDODxd!0#w>7f9Ju4bS7tUBwxOlvx#1?uVZkrCpc9!1k{7{ z3)C${hSCoW;tzlWiHiSYaRzUYw2_w3mXWyQpdpYY=E_`P-JcYczy-R=k#oGV&%^NN ze3a>t3Mp}D17~3vV@;niZwQP*&>;G(2Q=_J%mS|0k))_}=`*4mCStmjAnpJ;Amq$i z3hX+?in0l4_^Vqjju)}E1Ye;Zq&~p*SinyT;3oqBIjU!3sb>nVV_L3dBBArO_kD`p zz+Xsx@vm6*wa50d$#09BVE*@UiX%f4Mlv3xaZ7<1DF}ce2NE`<>!^wSmSGPnZsCBg zQDVgM3J4=q0O^_uw2>&;k9fUsWJpKuOtc9qKaZU*G?!-=HxFVL&)T$9) zg;){Fx|Kh}Tf)U5D5T#Hv3`>3GR$g*XpXM%WJL(836!k$v3QSQa;sBx13K7kkVPymcre+)L|9 z6Uknq6|&=(^SK-!2a4zO{r)f%TPJ-#@F<2Q=NPyi)Bja)tSRUL6!k-6K++E+58}|; z8>H?K?+(`j74$t&F=UQv{D%D|ZsTdkI=&gd1O1ro$q1Vmx-2EC3KH`V&7|U5zk7|L zK^j?hQzVD)6ncom4Eb`}@H)1ZxrMWSR0v+cv62G+AXuymdTre3{()Q6nvZS%3Z=MI zFX>?E3(6BKDFIf2eb~)2Js~WN1Q7vjrn=?OVvItU;5|JZ=#K>_QxKEgtOM3#-SP~z%GnH^4<7y!2K1S1)Qp5{J_#J|%>bwajj1-)1kuVs_1NJN`YafS zS4-kl9%>{4rq{FuRYhe0={h>0 zl#k<~!@_K4U}fZ4Tol^EqGmVx@YB1|vdCoJgO$8$T=WQSF%Z4PzjoiLZkiB{-*Q4y37 zt-QBX13v=21JrT`3;{ZZnm^Y=HUVmfd`$vr$P2*x{!(0kh3?nWcci|x zee2pytAC}+VDT~NQ%%aND5=zxF+q<9f9E_Q3i#oXsO|-^HTuDl{8v@06U>(<$y5#u&G}<@ ze~3zyO1t^F!2^8PgA$+l7Z^cuE^osCs$CI0F(dn#7M29X0k-L*DG=k$d3z-MqgcR`4F{a|E%3V6pH z$M;|uSi*TV98Y_bQmI5aG}%nxpLyeE;eVQTMpUX;)8MLwGZuvUZ}g{5lU~0AxN(c0 z>Z4u)c;L5!LXjqoBk0V@_KBg>xnx45Ru!R%bZ`+dR0@2C-!I#Eqb6T})gD=B)m_*vQZfkA4NgYo(dj5zsqjbjm^7h{>lKvrXJ3p>4WBX|ADNFppViJ0PS=2k7^l*NK$Z)Eo?6EczBN$BD!>aI+=(EVXb!AA-<*#gte{ zbg8gbENyzrq`lg4{=$KbeMMF#eOUc~@Gt4#BB0(ba;T9#&9`}tb%C0t7CWSc8R%4^ ztMkm?&lbC(gX^i(&}KeA4GTm-#bQp{KPO+aL-5{Ynv>qAl2}7^>V^kaS9ow{9}v@@)0@8_!lWI7ItZvd;0 z0(N&ccC}9ebvORjpMaXz{xP?!f3vQ?<7__~&;9F96n@)Rd=uCn;Xn18TQ<{QdpbAl zJ@#xkI#=KE^Cp05UlkDs?}a^{HQK(K-VusYwCkWfw>EZyRr-x9y}A1`(|U@Vpj$E2 z7_-LpqrK9k7K}NPkC!oc3J-AbUA;qRiSrzn4(LzYPQ6xr^$k_ZY3}#ZoQmwoScOf7 zUv`IIcES9vz>f7xc-(3ED%=YUk!0_J0G0E!4Bg-FZlx=a)$u>R=wZJoSywB|``_K-k^P(L=C?(xx?_hmVl zV8TY5b*vmJ5Qk3gEC}$uxafrQ)xp=K)y{Gb$RM^5vDhfo+ZVS!3^0`Cd*{dA7O=xVY%=e_K)H6lI%C=sCY zO>v$b2x3BVO@(%_1s>Fafg{xncJ8xL4G(Gv8I5qmIo_F8{^9Dz^JoSME&HP#AG$hO zH}WmY4!p%5|D*V0J%Nk}o?(Rg1nzc$VnLGZcLhDrJ^wRzY78m)CQ|H; zH~NRP4w_G_)!lA!+0Oi zDJaSHJs)S^;63G|F~{fgDYSiUt-DTTMhkQ9=xI}>`0jmt(XUZwE{s%uL3@e85f+$7 zF+(nVXL*nq)}EDjd&+&pJt1|H=dooEefiXqP3hzL9?C2PeK#p=h}t?ICYaClo%LHN zdzh0}HP(}9DXw1h%uk~|+y%%o-Ps#M7|NU=#rPs?Xi>RY+&4i)`;(Aclk?Q&iY!nH zKTu=!?)d{e6|>bg8QTa5YVg(Ez^hopJ=fZ1hf_4PB1!ZU8yxN|9>JHM$%35q`~e)= zJm5)l+ba;0Nw$D~UnhyfMKOeik>{UCrYK@YE&$9o^e6U3@6%^=A2>>h*OEB>VknYq z+E}#K+G2Mz=<|!GbAz{+!GDBc-hULOh}5A1!tdA5;6>)k>(1{N2jtq7JH^`95yzby zmCVn-;Gbc=inv{bT<%@*P~Yi3_@qiDA4+>=f&xC!f>E6G)EMdD@6kwnkbPhelatsk0^?;-b5iW zr)ib|?jrfBVtmzt~l2O>fk(E5&OeX`f!`ek>C`-wluj4{B4SWKN!d9c7kRK{E5 zl>3j)uyg?j8O6Y8H769A6*|_3*V3U)!`a=OjE!=x?Y%3)=N(op5Z2ZY-80VywoGOy z&%j{hIo1zpN&1+Ixha!Oo_H#khu`g=ryhY77DROSz_kHcpi(T7LBX(M!{ZU;_lA9P zL5~sko9nDT#{kg&dKOCR0m2E-Xg%b7*-f z!|=ZQky+QfCD1}VhVS`IRuxq=!WLf`Gv^Ecwqp~cWNHaa28h=M*oy!6eBg#LhK1KSg6%cmBMl7rr8s2E8M&t> zZk#cfW9|Ds%!U`GvVnHetqZ!@ds-d${_2SP$Pq@%V?#yQua(0z4qa8fKwHD%A}}j< z>alV-2Ri&Wtb=#G6FAD60?vKrsO^71@ne`s(SL$1f`fp)(xvSr7bDB`BPfh82aSYr z(MeJaj^bYapo)8k*5G)FaEwquQ;naiYv6||3p%k=;3ITMxy%Bt;V-p^8SNK9*#^(Q z?)nu5XL2fU^q+4+H23GbdbMo_h~ZAttibShnu)ei^UwNMpR`NPI*kbEwZbubWB=L) zF@zQp_Coh@U097hx;-1PII$IQGa_3NK|hGYrniXYP_Lpwv~!1x^Otn;yNN`X*J8Pg z3wh`f#4}pbUl-SKL?aLVG%^?ggh}KBHIck9bwD3Lk9-V+H%K-!3vw6EDw1x?2M8#K ziGyLmgx`|mw+Qq&fqkLRqGU?h6oh=RDliwZZ{VB|lm-mRUb1GQxkyuUT5$}py+j(LGc@lcDKiGPTSCpfv7 z)%0ca6FHKdg^?TOyFk(}Q4=CKgb#aWYLL4Qd1p_3h9^Q@TnFMQqeB4U(Oe0*p73C zW6u#Ojistq!e%xds8%|AE3`O5*lt)TECU-uO&T%Dw)`1Bt>8CR62%c2zgcH(;|rA2h&=5L$bRki+J8u=S#PZq=Y&P{`a17$u}Fio(zj(JlRO?d!kc4VoV z7F>%-LP0es+JIWpeYi}k$W&?(I%KK1|74`O@DF@o;4LCxb;aaDw7i>)_W(cC>&3I|F8MlN>rJVEC8wX-0-rO%KxGHtYUYZ;k;5mz}ovWU~v zb&!E~T8H!y?+W(WorWhQ|NBJ!1v-9&!vlSBXAB?TebD)49nY(naQs_omM-Y6&&fTd ztvZAJQkcKL;&?qtaaujuVWz%(wpymm{-fF}9NoGuTK;l*Tg`$5_4bAu(~~-+ew0F2 zjhpVHD5%@5<_WRg6OLWBYbGaqf*8RLI99uSo`JHhNy`;jo2(+$xn+pKhF`Yj7rpSG z?)g5S06cpaNNUyr@kv}~kb$kK@_>{^@`SZC$1^nxl>qV8X~|ux*bej9YmN4U4fi88 zS2?XJT&05A#NTH^Hk@SpLZZ@PG0lRTR6Wlh>zs5} zOl%_0LcyY?iZ;K(5NuT?@&P1`G^%L1>cxd;k!Vp=lwe?j%{XodcCk|pMJ#(t=`%56 zhJ@?d>g%-d4#g>LjJKryy`jS_CZ?i777Tn^;zr9umFBqgQlS-Pmi6bZQn6wl=t{Zc zM|&k<8mwN|AiYIwIC!EtRKv=s#`n*7)5!>8;7s`XMOqWHhO)9;N(4TI0z&D4jK3r( zOBQh<+5st;`>G?VW3LNvgu;I`)GP+8q;&!!kfC7N2;-opD2u|b9_D2_Pwm)d;#?^~ z%*vMV?jxLOa0p8r%OmJ3^C&zN!?XO+HRc`sP+M7Jizeiq3Pl<*{`?^ZZz_W}c%RnM z)np?}dt*fe(Nmfl%wydpdA@Q}yWo&ocPGijbxOi1rUx}PM|_QG*dOu?WY%e9Z^6Di z4ihiGZ{4K)ccC_#1%S1B0St|O|J63amyqzOS~%!w!mtBuWy9q`aO~3ZMYG=S)6O9W z^3w(jjy!k%BE{ew}w2MJFMV91goA74Id|obWy@PsAh#$16uuU+=h+G0KgJ!yoC`hW6S&T}yK2q}|@Sj|d zph?B=uVvK?1C7C?>aLN~^JHLQE(C%H$Rq;yA=-$Q3t~1-;h&0G{AH-cY=NT0=grZJ`|UOA7yl7rjQ&6!=^d!QrC290 z6vUro-ri95Q6o12W%9gU%PrqLXC57#%Fd2JlKhOYICVoGToSPSpbhZx!LRqlw`9s*m_Mv_Zm4Ia8oJMS$%ban~aFoGmu9&-1N3N z!79m(IJTZifwbwo_q|3aE^^n->Tp5kmbhTYiLG**a>Md;)bK8v*009Qh$dqq3J>;~ zTM|zKm`DxAxQWBK;3+GLsJ5Bbct4Os8}wCRK_BM09ao=V54BEMg5kpgVP>v|keL}q zZ^4|h%2JSlvGNh^EB6x8k>j4$MsvjzOqL2*>!quKApmpaDTdS4)8qLwB+aa1$l4cE|zZB?) z4E=VL1e22L%~PPiN47&GV&_f&@-%;t5Khj2pEaZ81YOo~(OU@w60_}`y zUIM8a&2w8EbEG6PEhhoNNmHh$Wjpz`wGWN_q8_vBcT!1fk*3wPQd^Hn`hqtVe)BUa@d3$E+;glC_j+UD`nwWY&h4 zIn!5=7UI%YtLFaG^Bn$|q!i`Byn7+Y&H-us7o^MTl0Irc z5LEiJZ}9_|zDp@r!fnn?f5l9W?GFEV5D8<~C&>BsNXr32BQ^^=q8)ynB1)acN|| zK>M2ls@qJ-5VAC!maqpb@KFiF~(+$emV=LflKzQ4b{Mj!fql`E(=I>p; z)t4{5;iwwH-2ln$%srqDBCO6!0h9va7(oC(awKxlJwI!P&R0(o=0ltoh^koyOqk2; zSPj!rnV(Z*lwY;xu6AtbwRPw$7V$z(u8{1>Ex}W_2KhYIEp7wY9S_|)C``Nn9RJ5r z-sMkL1;IJ`pxc9Io#EnQR>z%X9TMi9W|DW_3I7q7oreO+tcFjFH-&;+{wjT_gc4HK z>|9_xbBAa=0cd84;Soved!oH1y*0+cSE$|LCCY>`&0z9Q9*U}4lgZ?MCDXvv-t zBkxDS)D#+(e&Z_R4N2C&LmlK}BXkAx#*+tK?&)k-6mS}7OG+~|rE@EBz2zb0SgMNBe*By_3Qa-njhs1jR^GjHz2# zCpJcHoDvL)V5<0%u*uEZvANL+lF{?6i4_qbNu?)O=Xe%II@(zTT;auE-RIJvpAQEa z;zdsXI|9KYin)z#QBKqfrAr6$C32Ja4XQD@OSh>Pjj7Txzfp^$iSC#=#`(TS;aLrf zkvLYPK@G8m^@xfgeJ0_V$ZllYEK0@upN5sBW{O0^P^{xA#TeB-S5!Jh-a2if>6c@#wS1M?MU>WH%NW$ zBM+G}qWM!ym=f;+$ctj}IeHEF;G87HNc<~e(ZX;ihOI8ns(Hix9EbAzln@1YErGAgRo$emEl&yGAtHQeJv3_$DTp%eYP z8%VjXkJIY^Bf?ymxiGb&y*C~K*A*Jafz^8H1oMvs8ev%nIsa3+9@`sq?*tsW*AEHd zTvirh@WI%P6V1FhXOpB0g$a4FGe6E`vK?a3`^X6iZzW~}L8juwH;(CH&_aF_k2RR~ zEl%IJf!=~1{j9qQBrK>5xDxVV)y9X((btcxr5+5Sq;uiYYtBIni&Kq{p+ADZAa2II zb=65bd#;@!x7O^(O#4q_!BsO=mS3?~_2PCV$JWcj3&sEHUx(tcQhd@+S!<=^Wj>6! zcHcritCsBA*<69yKL={to0e?M_4l+uD$JW+^zuA7JYMKYuuA2&sZ>{3vYrXad2^x)1PHp>$>^5~+L4AMYpK&$KqIgCsIGDT!w(_d)r#0Pd6Ksiu(g=@0*^qC{5Bkt!SUd8WM3xZ< z%wCh0m1u0Pa>>XdG_1EHB;w9GJo!VS*eWm~)$pJ5ERd7cqlXrLgaWd&v2M(>vRWCW zpo>*e68mpvWCw#jp*;#I_2X19qp>2mS3TC1ptXlpJS8Nulj2MwQ3|ER)r|qQ)3}l8 zl_-{?#F|u6z6U1z6*0_h2U>=?72cwii~vWmtuRq<61KmhElb%Z$3krf)?7fL%tx5E z2Ng{)F^d^n)L!1=6M5rH2I)|hwnN>7w@Fdib~vL{E4I`rsR(O4I?FP!N8R6*?bARa z=96`%!A?UI7vImcoJ?^^Q=7VuDQ)CuTlGT5t+z-ro9hYFyb zIwTqIK`x|LFsnHY&!Jn~u_ZD9b(ZzvkwVOyo4PiD*6?K&UUm}_CKm>?lr%oYZdX=K z>g;tvrs%W5wOA)IB^oRhoM~nmp^^Z)splyZb|pOAuT0(m^+!@!{-X{IP`**KXUub- zO_G3R_W5yLz7tHS}0XRzrD0Tdl^HKV8RVx9+a`e9Q zDt9l;p<%=m7}2U@OY_;^9wYW%RBu1rvWkJdMppRD&g5g@0NR{H^?|2OuES(U>YzKq zfEQ8YMAd2fgkWWjtcwHB%#gMOVv&M2MJm{0#Eoip)6HMB0Yl1+%bFo`9!?PCUj{djhB*0pn=xy+muv&T4c`U8S;+(#dfOavDe}>k zfZ2#V4`=#9^rw3BxGVfL?KbTtHuRMEp^&V>S>R1n+Pn5b_{lxcjkNA9*1UKl{3Q;Y z6(ux>Hf;crcw@FOLIA&&1&wu=*=e{i-2psH=9sr_%;{S(_JoTS=30VCFcA@U`aWFt zq|7it6nBFp`s}=rkVVK^YyNELi|jk4mm+N(cP>vlR*JFJIJd|XN${M=y$s{>7DSFc zn8kF%kDm8hQ^)>4ojz+lp~tw_Rp9GrQ?vQ6;o#x~&Lo7GQmr8>xs?S(v5!PXq;o(7 z$}GvTwy*o8{yT}lD<7X(;;~J)4b1XV7IkrYPtD|m0Tot-Ktp71!x@BACCMWL@D5DN zt5$|9N7{P>;Yx*pA9v#nS|}T__>LziMXo9CJ|gjWs02276x+d!^CO~tQa8u-VN?Be zL`DJRAAM45Lc>0&wojK9vROpF#KJGt#F`wC&>_iwHW4`E0LSSdM8*_NPlH{!h3kH*Pa>^3U7(q zHn3W!zsOOy*k6~?>{T{L`YY$}wyzABOMrouxk zQu69xCa?$&A3)5OULc+sDS)?Od9QI38Gz}J$xH1X?{~>)?TvyoJY2@L?RNcpulcyO zM56|+i%IGWB843{Q>IODHvcXvD~O7cIF*HngbV7;{P#iRY?@Fppx~8Gt_Phzn}L4L z)GpSUhHOYV6KJ&}+ZQ=I*|dl%3Cpny8haAY_l?aZ zl2Ah8RfA>7=;$nfp2ewev?AzEJgw$QFgb zD7k=ihHQ1}X?niUmyFRS76VKnRTqAP3n_e&QE{A=LmUC=g!;}`9)Vy^Sp{H~**k^o zSvPDOLDN=wgOC%02D z;v&-4o(c+;cd9>amxWnG2@=FFI&G(XjLgzb5RgnSH(|(FT0;kyHF7C4(IrfDCIeh< zQs||X0y~gWbte*unYT9Zh!4oONj*rLiL^8J5<;=vLR}bOZ$!G0|9uv8h#}~zj&{F3 z{OP;)lf$8p*#jj0V;JK!_C9Orz223tg3+C| zr0K0*eB(pVbD_FVC@!=QsKYH>Nee+eZQ0GC>_2s9SEby(p`$CIq}{nVHF@wEE6(Lw9D6P|iLao?3zhrrxzwV|FfmFb z$P0}S)5tq`b~eDHn*B`9(9oTe(tw++ML}yI)M(A2{I^|7({Io>RRW$7xL}@b2ay5@ zKE95ucM(Z7p>t=EK!-WvEIA~rk5FOm0yU#7uW~6{Botr*y@SJzf4j!?*2_AMb z{vi`Dz|j@Q{5n|U%j^g;Q^)fLg*OGvh5VwjCY!gK!%hQEhlZK@VOpA$x1tZUa5tVA z0^FI5Y#h27(WlPrT*R@!w1d^Qg`+g*g=RpG09X64Qaao}EgD+C4dtexd8*-oB*<_B zvupycq$Dv=pty*vchY4-$D2dFB7|B=Lnxbi=v(WM+cbrddbk{_+}NsaM;eL7J3b|% z8JWTV0a7b^2fOJZ>5U`5sY7pZ=Xe3;0^wU}mi|CHaKa~u#@gbW^EO+Wy zvlAUavI;YQkV1JM1ba^wRkZA69t>vz(FnM>jcsggBF;d1htg@aRO9;n2d93L?UmK@)6v{bDx+%C6`304(u305y%a!9~HMSB3jZQH3vBtV|=m2wOof{AP$ z#<4%PIK9|kgIQWu<1l_Pn8q>VSy)@NXXe~$v8yP9Zzd47H$UdvTESZUPDsxpS>E{G zYz+fBJD_6L!}X(z2y(Y`+!yT(xqgFZ-qm>2v#mN*e(@)&%5PAZ3xvK;`hfRD55~56 z2%z+}$e=m_3XL=ywlG6%ZWRl)h=x6Mb5~n?0Is+6v!Z&qxw1}?bqQj%0Nx}n;!|S3 z2F(_HXGH#FZze_*dbb0TE_UG=`{%-}e$q6jxf?bILoTX)fQ|{{@~_Q-c4RZpH~~S` z6oE4TNkwOS{2egDH+#OJ#0`Fa%F@r>lJtO@{H~ayjE8vOaCsz_-jlhXQjSymMzAx= z^T^A75!zIfCmyG}v&YE?jeJHRq!8#FAp07hpz0{*zr^Bt_uN2BzFs5gF>^8DK44|4 zTw1Z#nY(qJmIF6}y1fKy^S!X8BspI|nyO5Tz~gC+L2ss1L=_7)shHcRk%6lY%y0X& zX2I$9>@JoEUir=hayUe0!n(ZNR+Ck;H;Apf{BPIxE!F%*AYHLv-oJe7+xK?tQ|+3A zz6xYI%99T%j8y~fL`QY;3%kX-z9-_wtwr}eEcRF9Uz*11W%t-s2su4gdZby{k|_}? z&?a4QWew5lDF`K5=&dv!RCfsGnrSdZMgI4U(^`W6rGnyJ(8wYCWb{Hi|5^K4Vz?Kx z)+ea*$3LQboJ^bQjs@#00#{D^b*gRA8d%d=t$UPO-SaQ%s+9zKheeBps$6*p8NBa` z3~L`rawcG1sU(J1O1uhdHX@NY>@cu1>A6c}s^8}%T4;RSa-)wW3zCWTNP+|u*^&V3 z%x>L7;(RKI3LgQ7=dj>A#z7w;SCR>J06#uvbM*d2nD@KP#qHVT`_I_sqTSk8y{gDR zuIob-xrI+#9m@Zhk)qM>4J#M9-50-@qL{`WBHVu98&+tqT8Q`zGsZBS0VpLX&H#i~ zk~JW3IyQjh?V6JcS5z)oetHyfQNrbmZA`%`l(udIFkJ8_Qn3owTkXdJ6CUs(g#?@+ zRCP_(N;BejOLkqdX1#D_fBaMlbXP`KS{LHO)5Tfo@<8D970H*TZHWDdi7+tAvoncT zbf`v=it>73JX^kA2e`e>bMde9u76Teyct%^=9|3vbU+N~6_G9Kha|89HzZ%Q#LY<{tVA|Ke{2-j*gE5tnKU`?E%LHv-rmI$_^bX|N?#wpAdnY# zLamA1c^>f)1N{nu^%P9wH6s~E#G+96Rq@T>t#dbs=%MuZxpx+%3JZ?QSG%pws7Q$d+EKFuF1#vzApVM&*%=w!?vCxB8>zVJm$ zm4eRD4tqXjDXF6$X;6F0ioPcBBzo4Ee@HB`c0dnb5ICk)P{?7pepm{m%iP(oLef$$&Khisv%-C`L- zm<3-|4g|?^NOb{-8H5z;k1pDo-YAKL1}!q{Vsp?UA=-{Y?!OOlRThSW2+bhv)CKH6 zv|`5+bdGtvy@uZ$`;A^*jBMR2U!-$|5yvzmQe05TFBp5D$*Ow&9tgcQx@^$K(u!dx zPs_w_D^#ZlFMiNpdHBFkD!uug&wkjvBfhqh72# zC3W*wkEVbQxhZZVvkNWXG5WLu*-u{B-zL;DcYVm0lk~@HaZt}wkS~~Boqp-7nwBi- zIzQANkUslCZFRbc6Z+Dg-XmrZgBgFrdw5KJ6;op^l>)RLwFqGwI%^c@hNpsFxW>S_ z&=z{JZaVcQqn&8283yE4zf=`et(U;%7C-lsOPAy;?w6xr0PsUUJF6MLDQEil<+yHys?QEV?2AA3Tik~*m>ASnfZGb4Gb2+H(?~k#?;0z~V?WE$0jel3~)4k8>ae9n>^Nn@+U9Gv+ob!DMuMm^apP6V-3mM`p zF2l1#4YLjB<9)E4oPAvni|%%@y%j1urBr9ps2}`R&KDesxiK)h3|AyN7zlz+<(15F zl2~WWu(Et~L^dX*z2HVRC2@J);g7~dV2_zfp=xr;Wo7-2cD84-Ea#_o4YY$yqqv-N z2NLOh=-lO@x4&kyb#fDe8XzJnf$S7*O;$e*t=VCzC4b)gxT2GNL|NVK7>Q(nM%U5o z*jqsSz{``Xr;k(HmXhWgj!h)kUGX}yv?tJjs?;FTRi;#-6c58;BJ6?_kI})CVBld? zyZF+>03Ay&n4}`cnYW)M;!l=`?2I7&e+vG_2i-p3d0@)c8*^kI=iRp&Omkz$$s41NV;%7XL4n>Bqol0N{N^WfE?CC2tPD_eBU%T4^rG+J_%jhh zB5CZaZ+|$WqyKo8cY&+qD21p?ZwGS`v&LzRbdr-Eu3FJLl&+2Khy@wWw1%0yi$llx z3)*{0v?1-GSFt72Vn^QeS^DInMr*fTYIU6&UGMzFX1Zf+&UW`nz`ji`uuSDS^~)R$0FJ z=j;a8ymNVTTg{730^vDR38AtCI2-zZsHN`?- zy`FLqzVLLxl__g*Ahv!|ojhBfS;gBQj+-%y~M5U;o4xb>24lqa;sL+-9NFL*|&J7yf=tHB(bFW^7+T?@PA^g5aKb%c1I z5XIxAT6FJ(;sPNAHLD0M@kw4$EamP?rO|Gr)zhYU@a4RyDTmfXI8?y3N=wL&Rkho z#GHesAd_qrNHtqXF#Ul8kGoaU{IDG*!_RpzVOdbR{%x|(Lc~Y!OdpwnFC`Y}j>1-6 zT(Ut;&5~?2UUaSRlR!ox4ym*iV47&6^zP*BXO*Ac{h+_4HdpG1kA{Az(1c$zolSW| zNPCAU<5p4Z6#~m#cbW>E&q_NnI5K96hBEJ*K+>#%GE@d37lksY@gI`bi4*@d!Kj@Y zs#JkJLayn+xp z6j4c6C_+2rEkF&CgwcBMlov7oj#DY7QZWRW{zem2t1_0X zf18@D8xQ&}FPYmVp z9Lx1mdzy?dNt+1hd}U%sQ*0In!<1qTot+W4rz||#>Pqy+#O?r>xBwvu$N35Nzwx*v(>3sOPou}Os z-X}1?86sc5ts=97U8I26>kMJ+XQXe|Q)s=Sgg3qF%)2|`^OmY23!2C7Hm=BK)70|_p?6_UJr_6zzlIJ`ie?Q9wFSPHZ1?RXbsq9TB-SUTH}~Fo5_;rB z(h6g+(!e|z1S<9`*Y0SJp^K0;DQG2{7xx|=Rq*BSIPAEKIj2>~QADHOX8ffDh`N`g z((do?B*Nd+=Bm0#86gRn%(m4=B-HyVxR28#t}h9!cl~KFA4sW3h=dn!WL&gf;kawq zGh@q9gBsLOfW{dCNMS!FBoHnmjReqZl^p)3^LC_LPqFw@kFO=%@35_Pz8Ne?DCpf> z`}Q-1k<7PCTpr3YIS9le_zrbso$5^+M+bg#F zvj&SRfmw*t^nf>l**0d(tvSMpxWwhPIKG7PaT#Ko+HV4134-42@W`VvPyx#ITUY^- z?z8gPw_c0HMUM8?12jVh+M~BX0)c#ZmnXNlymh3>;oW4ATVdJ}7sg`rt-cRYmUrH& z2~y^_ID0qXS6=~$eirn%t<2B$;UU7rP(d@zfZi|N`jrcHBt%gm4z2O)WG}M4C96_- zRSC%)#gFT(N_^uT=OWRgs!R2DYWXa`K|g{S5o_-0U8+uh&nK{J8h!o1j5)q-e-ld`*0O_$2aE;@poKM-@E7P zlTnWrj5ej;6DTFJVVEC`x0=YppdO(kz<2S5#Z|G5{L6QQq9R;^4DmMd=04pNd)nf6XO~X_hi}H4M&+oqjy$MFIGn0eST7+zL!V1+R^hQda>TtVylRY8;#x@ z<(Nk5sNCkL%B~@QQ}`B3WbVF~;ci#U^bn7;&0jm0U1|ikVeHvX0Hb@pxHbiWX_%l~ zPSMO$qh|R<#9kU96sCv&k#PfJBjFio-s%}#ehnun$Dlr)a+R%k77d%Y!`-}i&V14H zk}a$;1NzrHopt*Cl<$rL)BstNm~*jc+NK?+QT!~KfHZX&b?T6kPCzC_F79ixO-i6- zAVQ_on8I`!sLV_5g{WpSYqRE@^T!D#jAV{vZ!1W0a3fLK1bapV8$oo;t!+Wl3%tGb zk=GleAbs|h{^R_aRrOlyRA>`yDP=P?3lM{BvbY-cG^de1a~1E+#Bn~0PbYYhYz5~d zP=acM_+9u;6Q;jXL;-6{rl)*M_m-?`MzF_FgSKE~1_a|(*C|Ec5J?LX`k2(QNi8S( zvb44Y!(~D??qj64z{D24Anu$f5_o<*n?n^3gH0py3c&@2IyEN5M5WLLWN7gOwO}0O zKr_TE_M>p6hb${mYH|5mks`-{l4@=0DHEZeTx+#^t1z$7*MTBHWcrE%=4AEI98;%m zp+I>_5wPjr)2O6q9$H&$OlEHP{Y=D9$$&^;vtRS4Nea^`_;hzU>b2Dh;2m zRG)b}!>u;6<4)`3%j|1lFYU?jvYqXyw96>msLTjL1}A|g^Xp?hY6eW`G~N&Gd}k?I zFtWloFfBniix@Q}jeK((cl>}A+71!p5E-cL=D|E2u9BNLgxZG_3Z75gXI%m--V^}>(#w;vc zP49hmHD~2ta@tV=&1WH{RwOrS8oRZs3&*)y0K~m|Pd?u!QLL~Uv0Q0Yl0 z)-C7}|L?E4`2jgUEh@M zis;?CyW1(sAva?@dbAlzMFAa?57Y$AUQs&#&YAt=S(N=0CBUBR{53h zSxrebK{Xl1qy{-9nUk8*e}VN=w2X?noJyz(vGhbqCQ{N!pMtt5n?CMWQ5}^v;%~U} zSWtob9ScxJBWsco+M9ShS1|{o2oQ>bZi*}jn)ecPRfZvMQ;BJlf@o!!y#(GopHyM( z=jlyzR}$$RWEXN_(^a)U3^4>_c10c*4>GE}y6UK=8t#npaie9D812iQ{$4wIc(-w< zRX-^|_%d{$S>bCm+}}DxGa6~NB+xgo)A;Z8GcpP;2cG{LgMF{jASx>PjL5m#BgpHj z%%C{n~efe1ZiV9sk4>x;?Ry)*u91hk_xgDFlh&53Xdz(E+@W}m3 zPEDe6elA`JjqD-UM)Y79?R=+;)nX+9FKH3N;^3dt78f0}swl6DA;(@Lk3vA;LgtG- zVt}B>H>R$csO^dDI0DYui(o!IT^QqcZ}anW694n-uUI50HVG~w9&E&1_QO{>PRKWqBG9Mj$ABjlLP?qc7EQzGMb&FgYE?=#QvvXHYHU@KA$ zxlMIb)Zsl*db96`Dowm_F4f~OHw{o|3a(UiKBhlzYd%~r6}}@)Umq3G6tAp5tnLgK zElU>nuElO7HzDGa4@PIOl7Gb*psr7+ZW$a@?4!eKmrX{+Yo|`+5**b7$GvaTa z4Zcyo$fw-?OZ!W;OyI;@yTdE`S@`a6X&Wur{@S!-kK^Cpv0?Yn$>H6;`D2JvH)iqQ z+&@UPIa|glYRUSre~DzWr~bCQGQbV{cOb^c{?rm+Ec>D1A~5EM5b!v@b+~xt`ML|( z&dC9PB8>WeQHc5B?BMA5F=5Yl1puTk0J@AGi!OSfo3Qr}uH!b`Ic20UMcD_!(!J?Y zDm;1d;|^S$Uu6jwGZB@Ks77u?Hs(!Uyx&F_8(uhstm9Xo zBm!!K!mI7g*4{*(xB;|4F;oLynAP?7Nqh*kwxGhM$?k=gt_D0l1q5qz`AdJQIENu4$rsS=82( z#)ZYxO5~wUIedq2=N@bR*Z%L+Lpa7aQST-Qe7%W0blX-<`hFk8x#@IUziyX!3)5$s z+0~j>jfQ5Pu$-JS)Z7127P}wi9N6C?80TxqTRa4}7^xkm=pBOtcZppw_$2ju{o{0d zaQ;MO?Yp0NlmIjPtv_wuTWca%7qR@-e?;JSi<%02#XIf53*TMoVcdJ$t>rvkKF#iJ zAJE-6>rvA10D20zaV6_ zF#LcPg>Sg^?r!sau>86!kN1jydTLBM(@I>JQQst3@Y}S1ze$fI>SAAxD7C^r+-9;x zIE20v(U!z60Ditd1w}I@moiZzgsO~ig(=DZ!Hs56HdQ)5(&Yv8scKFDBN=lgHtJoz z>Zv&BIBjl$`QI;0gEQu&!!s%?o98@*z?h+;pE?`ouL)RWUM>Xha|Ke{+mr7;b&FKW ze5P)!f)E6S>LabfV$Yy6-y&LliP4Ls|Gy!I9**Mn1>{APpJ=OhPxx(w7PcF^I8#H` z)|iPJChBfg-?S(b{V5bM#)M4w4}x6o+(1lT%Ut_KgcFO4jqPsS?CVv)8gnLP#URm0 z68_A%Gq_Mw5<2mJ(Zfhk*QRXU9rSn9dYNTZ4bzNtWuwgzct>(eom_)_6rU z7;rt25MM)o;JA6awSLVh@+FI%yGXp3wsx$gWBPRN#&RRmm63tfXn(M0EKH`2jN$yZhNNwgjyQL%+%52r7FjV65|Yumr3}RYByUV zn4{Ur9ILL(xvHR~_SYmFuw-34(xE(3rUiRZv_X86vFh0vW9@{NG%OM`y`oi}r z$8qE(sJ<2;T4xjawx)~(I_BB;KDHEdIMGCu*8qxqZfIP&Ia!FIw<_^c1@uc2zz~v_2kusRM6X`D_!EXt zbl*%Xg1QAkmOfCsWS=2hsN14+;{GyDruLu?ZxfM1Vd&+OPNgl0HjNBo=52zh1S=7( zdImZSY{!wL%f-&8KcJq<$Fa78tmP5~3@1U_sTkD$mZHQcyDL)+Z!2*jC!p|sAsNH{ zeSbU-%h^RU2r82vY|b_cZov9e9GUi^#2YBUfal9Lh9lg2h9}FfPraYpJeOODO74{(lIcIL=Y!DlY z6JV2EK))p4D1Z@)C^I=b8yl+Uru56~_Xy?a5kw2J`zSl9{mLdjW~5pfI$`%vhS`Ck zfe$e`_fkl-$qG}(@?rFUr@%t0&Qf~3Y1BBO19VLBfGsXvHzH^=-l!V!u(yN96m?M3 z#SnN;a99ZL+9~_(&bcl1=m{|#zd~&y5ek>q|$pfHfNdCX1bb=C&k5-|SR}(wZ zK42@g9dW-d`80q;$F>GZ`cKp?0$95-JfZm^o_WT`*O*%-tiWW0^TU zhw4nMhbE+y<(wokcUk>1xpJe=ua{FfTkHh!(r<;ti(cYx2SM15rDAe+xuS`t0;VQY zA>6cx{<&>a+K@pK#iQ?aSo<|Wt00356}_Z|w{RQO2MIK6aoTCIo zbS4)mr8a?H-~!J?qy&yx$TWl#=>sjVlQl=1i#=Mh*bHzx(F$28DS|jQXXd2uePCc# zK8=?&rEromQoFwxF%1zr=V%fLL0bDf8*Cs1-%Uz|XJERaaNPLU9IH>VwqZh5?Gyc_ z5-7~P3oNfJST*f~KJFvG-t|TS%ya|o-KiOzipbmz5rmOeB18t2K6i_0m4TxwLqm0= zO_(k&b&?S$Aj5?my=kZQO^fLcN(H=J`@JkWSnWnrN|R)u?|+3HoEOC4HO9@ zy3*`UVC~piveb%pbX^NV4$-e92(Tu$7b`Gv>PRV)jijzv&(h>TRFuP3c4f)oF-(&6 zpg4%){}2APGg6e6VJHw(cGhF0vV8ULW9N*HUJ|2{5 zP{OIiZGRD9Gz{P(jt=+5K~r-3nuHSXJU~GIq2O0ck90W6bm%b$h2Dtmv$4M>{G#J- z&;5w-ij(=tlC)Wiz{05`>%fh6a+gVQzW6{%d2tIROl`7lXQi_7cu=mF?oJUKL3Jpf z=yk4BmK)>Bte10+<1PaJ&4f~_sb*U^HnNqNc<^8BkNlI^Brvo?49bAv{I0TGJ3yUWaM(m$b68!c&d+TKS{lHP|3m8L*u_ll zO789L2?QcwxvmgqVW39=Fi{qBGPsxBqf?vF(=$VAxL6|IGz+(hJ}Pb>!uyGe0$yD! zlaUeQd4!CRMvJ{vsSIO{staerYe#h~J(utzj$KZH9 zCnIJOIf+0~K@+}xW%xw{xM85*5cK9VsBBu}At!r9p{p~n+-14fm(W~&T4;BhHXJ$X z(_>pJlzi4&9jkIp8a3%OYcsTK4jrnaI?WrADrISX18+kgEZas+2@QT?ja)anpmdJR zY;2*yFQ7|9WMUb-#D^_VG-!jmppaeFn4u$ZTvskeRCct^Ra zW1A|=qd3Ks&?SGgPL-vf`7igG6n|VZ*h7IRYKbqUe zGJ@mq`4v)>iNnq8uKLsdwy%y~fVIH>z<0((Ou>||$bOZF{XZI}{(xicpEX_oS-|>N z;C~*N_ksGO0cM|yCB1p=fL7cb+t2yOJHVsD&u%?p*;ltwnO!`&gFAWM?xsQ)lfef~ zRz_zb0}hTrn#*7Fbd}e7nJiy*+spPp0NbDbKY*)#^tXOv;Xt#W{h-<1fwOh^Z(8F3-K+n= zr~E$l=Q{TPwzg-_w*7RJ1Gs;b5w`)bPyK5OzB%Ur4ycgr8~ixH`i^z&bN|^}i#@KR zk2468J9P_#qee{4IYPMrbu{kCRH4oh?^qZELWIZQKT_#l@n5^IdhO!x_Aw`9?{TUp zz`YT&|6av5Q3YmFL#7O6w5k}^Qjo%0Y~%R{ay3hoSY0of0L68aijl{iJ+)=+Ag`Uw zbXJ^cz;|XdVfxH)q%FSMe7Wr`!MtWV@#Q8`hJqG-HjqICtW(^C_~6S3j^iGli;D#JM;SbGonXJHw`^gtryQkid|i@2cLUtnwpDWNe! zwRf2>{(}$DTCOf7jQa>efwOQqR?-b@bG-f40#$f% zs7z>MC!Ofs>7uN*XbjO(on2C?lcT$>PT=KPqtsXo-Dp&{&R~6jR8&Uwivj`rxu&&U zlH2A!MNLfs_G?z`fRmk-8O3j+Q)iT`c{<%NynM{P{XzDim&VOahMkUZJty8m`4}r+ zTMd>g)!Uj{N)gAG@!o<%hG{GiP`&T z8lAeHLT20f)LP^A!0@b?TDT1p^^n*p_KYs{KR~4k&2gUzDRI2_)T~xunn~bNfv6|x z)fnLSWH&n|yc|SY)yEf-M-ncpPpYE0bRs)T|1H{C*kQRPidek#CS%S~Z$78=>|iBo zN#b6ue*ufTtenQKqj5ts6%7~tDVCZKgEtM+ZV;faoUjIcL^=3qX!9ygR@>%}L=DUVV$usJ;=Q5e3+10u8;*7bhx z{C?^pjb0n*-WkF@UeKYzi$xZg5(7F`4}lvqm4G`&9xakl4Yh+7#_!v}5;>HT>J*`u zxI}JC+7!srQL!hFAS-OI^V}29kS|H-#ZnnB&Ns8$>LAjPJx?!nl08e$WL%9t zct*c_ZbQF-i_cz z$q(4ItNRvQKkL76@Ul3^T3MBAJN>P!82hOW9-J2jJ=(*f!J|=m&*mS~Da%j7Li_ z1rLYBlMT+74)?bY&`Lsi4GZqgAiV@3E|0#i!^% zY^o1PoT{y1p}}!KRn^v%I9b2K0XLkz5F=B^TlP=>(N?-y{c=jG4psjO)*i%%69cES zvru4@bwN?8V-lR8{SqNVh?_}xD_TSRv^BRNqUq0$olA*6DTkq}bPS=NO#TJSrcJ)9 zPB7uMH)#fj*PQAtOueBxotS7wcp{K%fS?WJuhIhkR-Qpe`q%%o{ShNoXd;4&R4gD_ z^YN9^G0r7TngP!|h%6?S>*T05h$UT1?^BkPjnDitTcdB!!2IM=!|<8ahk2@TyKD zW@CNAnpQ;+f)b|-&5B2P8~}L9tnxf}F?}glVRuE{G ztq5K?+2$shd8cLJac1jHOk?ESSE=P+y`wA ze5RudE$pB0*Z8j@TNl9DoWZ~PemiGD>;AL7V^ez!-~+rnHgBoJ zxIgv(;KK$no z;s7yGWuL-$WJYKWUd;P{7KY~83D$K*3j)yJP&0|Ta>^;9Gh!qR7#|`o`#jriLH#GQ zP`KKQ`Ceq|Z@p-zmIe6}OV%41rqQTicMup{%y#J%Y)`buf;@C3Z`0qXKE z(+SEF+a-yJ5dZXIrS>T@5zO)XHsmi019^{oT&cmHJQJ6u(?w3yl+NV;`T;(&|x7r=j{m4MgR?i))wUNF6rWfH6E z6A#5e;SsN%bIYU+rFd@5dbLoNRx0#NXh0 zjB~6+cDmfh)2^1{|Lq&^)KG>IO;Fb-^Ny^hI?aYkEJtXZ<&;@duUh^2X%C!zv6N%< zYY(*L(=Pbcavpk1`>O!>`m@YB_93HCLL=n#XD}zUC6sq?lAjNP%R54U@yO&M_wqTw z=>(erR_6B6?c~*8xS0^OO%V_EnOGZqm?ZA?P@JaSCy)o!^4egpvd#4Xf{7)iU)lny+Yrn;?=~YQAMXv>3XoR!gy4m<`hqu zG-=h2H@uOtWQTvHSy_%zroEOoMrT81q$+CQdn)nhVE@tb-&au~sA~}xNb!q9c`EkD zmEDk`pqjP!40z#cd6iFea{-FKm_$BE66l7acby8$k)G*w#UQTIVdXM&_Ou^{l`qS5 z((0wkZq4G!1r6ig&6lSiuZz=@$zZPMLEin|b)i&!jQzCOX<6Mr*|u{H(D4_=GO(pJ z=V2n{or{k}P&noa(sLL4H4**If!n${H=12bQMH~{0TiS~{}uJk#He{^5bh={MohO8 zY%)f~V5AhbX8t3>X~oc`08PhakL`veB-lcPO$XCN*8{v%d@Ut#@S)-Gz&zJe92DkL~i_x{ai!(>KtrXK=V=rE#B+9{e7~WNB%0ki;vj#byHj4y!H!M4I zo1T(HP=D)SOBYs@_oB=4&{pe^ubARjC54MB^3bFX5LV5!W;rGf%a!bqZ29ycsYt?H z0tLVsqVC%n_H?V*xlM1M-61B(QK9W0!LUzQ2(zHg6|R{F3VL;ErBEA(;a_@Tm#a~{ zz0gSCJ*LEH!uLr+%|A;SDu#b_ zW+XwgOX>^rY70B?kg&DoY819`a&_k4TjTxytl?H5VNOvXF+mYQ5dS+v$1m26I6HGi zoS6L^op&saYDf)+C;^Cw1^pma*ReTsE52boQZW8*4(wft`?LtB!t!dS% z`@_ZSWq&-fLR@jjjGUbx+xPq+l4Xb4mkAGRP8fHO|37D z((1_+W39V`!5b6|F7Mqh#gy0R)|fh>kHwh4h`y4Sz$wo`syD83E^3a{u zX-szKbII>nvuE#0KCa8g1o_qpeJ5*!^z$-i`JPCpqpl~$c?29{7 zbb!un!7nn9ZTt7vQA?w}hX0s(E;h39V$PutlC(FZI$lHh+VgGL9L0%yFCtr$qMreY z5)*m~n&V0X0}-{bMNj43GQ5bGZ1$P~N4l}eI2U7We?75taX4}`yUX#nDO8fGgx7&^ zr-#qkZ6G&Hu~8ql9wWv~URLt#@SxA`;;he!u7c4OJ<$jS7#MvvzChd!cChj;2mlYN z8xk~X8BZWNl^iQEWYfVMPKT=R$L&-&k{=sBTVvw4+)ay=QYf@lbUrCYO;SuY{pX{R z;KfMXDUq}$h0rwGHnO_DCT$!{YzXd3i~PB}ebGD;$GmV&bZxhMT9`uk`agZGDk)m$ zx2lq=GPC6JeH-{hy{n_!dgAKnX?58f`pQ@wUTvebCO$5uN@Yt2lExM1=fP~${@npU zSKYbTDgM<9mYlLhNA%lGH zTPLd|(GOVwn`^zEpE!&5kWyv!H;TZEQHAZUPQQ1(J7Hl`r(Rrtq&vt^g&5R?z%m*$ z#>EOrkMttlk~|^L+KnTAKwk5L*dFoUW1Mhd-Ed9z=cfFXW@B>rHZWlB*kSh(eQdPVi8~|kEr`#>iPIF=4SSil3i#Y+5gh% zi0H5}VzbZc;StSC4I39b`At6p!+PMxK{T4+-(2dy7~0y5td^iw2086H-N~2K74;Q) z{-|7+(;8Azuxy-VC$L&}_}$_;BM2{h8h(<|IBYdTE=H>aP zUDkfdsgzyBQj$b=!Z%zGaBhFsZk8z^t1E{~eri9G+y}9SG;>w(l53vxF*ke(lT}lx zcu*7!9A<%6h6Y+cJf3##e@(0Q7@yS7YUdsbfDU*^k#3Onhfk9k<~KhH*fCvBDO0Qz<#ldC+=3IFW1b}2>AgLVq{!wM!w$LKW-hIg1f1BMz) z&P6ZNsMihN@e$B={Omgm#R{(Cc;<2Z35$)Z$vY}#^aKih6&a4u0UMP^jU4#C) zgEKq}T)P(xeEFI;$OCAP1H$eFo1Io=s0+dG1-pBD4WacaGLUxEU^@A+Xw%W&)hLZmMB6>&DV&N10sjU@PAVLMUt#KWiASm0uo!(o{!2G95j z8R4huu=9y2)DC>1JN;72Qt}b<8>FyUA z53SbfF%el4SyNVH)^_j5xO-|o$3EQFS|b~z!+pm_S)1QJnwr7-UsWqw<;X{EeiE z$vcUZc$8V_Wfw_lN?%hZisNjoF9(djteNuyqCQf5z;2t!LMWz2k)?Yvg(&gn1{>Ec z*vR52YX1_cC~IQRE%GKj#%%o{CvSEl(I!JQpbR)5&Ms>{6o(8mZE z-*bX$U{Jw3DEE#A60x5sE_dTMoRJIEOySNY)JBkdLju9OaMnTjAfW&Q)MYna=ZR^0 zR{9Yx|Fz)chU0$U?9tIvW|HyPp4?Dck_V*#2+@z7J0k_=YVNDeVF<{mQ;~f{iCP^l zc}C>X!F2v{I=#|dmlDP(WFMMd4cv{L?p5nKxgiE(dr3Uz%FT~n8p5P=t(>OEG$O40c}oPhe@X>PU> zAN$Xyd@=TRe|hS5N_P+$icOZQXi*K`#Y8RrUt-*Y-#t1Z7vKsr`~sL%Zmh5GJ;vf7 z0jo0w%OI%HZ-EDcp*<*v+ty?9%&HRR_mw-S`zgf%$s)FwOdO34J>(Jkj*~q*Hx^ZA zZ(zZM#pCw`n(eUOpSBKyd_V1Z=kS6mlrUq4TII5|12kgjb;3T-ON=x+NZvK}7#^!V zxNPv_4iE)v(v3nqiyW4I|52VL)O<0(ZU!99lyZajqEq~tvfC@`F@FiXq zjAXIMA_*m3`J~IRfzO>z+l~0Fb4h>5i;af@->N5Hfm9${9V^Aq@kcwSp~Je@@(by? zOOoA?9yP-C9}xGI(d3eL$?NOw%$LgCPEI|k{mn-8byB0xS-Qu)f-;l~!ay`O$TtPz zDG;=p-%}&vkV*!L@5DU}jS1Qoe+$t04a{<%#Xm%HmPc4Q{K4CFs>eEvfBXjO_GUXe zE1u5!^&1ym9H<-Ko4@Q&>#?D=!j~BADVtnCsz4zMy~zXTy}pVBdEZt#W{k~**`0u-urP$vLuJ|y@y{f?{bv0o&}{MuEa-n(XU^`0^SNy7i;E4JbvAq-6m?nz&yJ1MqHOBar{x-p%Ip5*z{gsvZM5asVwr z8@v!#v+iJx652ncBEb+quEv5JKUfY-Ac5_(ZjH_MYzNK?!q@7y*S=peK^~z@XsQrT*Mr!ft%7OQPxQ3|s&(l((LPuBAADtG^ zHiwJLyTHaq%{<XQrzI`VTX50z6J(4_lg?0c0xkBm@E+w&89M)j{E@Y}{USQ~s(n39en*IkmE?>!F>5Sb zkBGR0x2D|BJT1y&Gtbb8dT_22v}$+#ellhOcohW5qT?kAU4NahqDrE`I`oXD#b9U^ z&w<*b&s{XV)*`uOXj)zBs!m)ju6Q(DeW()pE@ZRArm|L4i7PX(52IzfxJOM*m(X1O$%(Jma}b|rf20p> z)q}C;hIQt46@E<4;2i1>rMQnETzc_+}vfRsstVpBc5=0srUa+|+ z804-b7z7B?xOUo6-p}$8WPUWSwbCjzVHP}MR*`VKW1+3#s%Z8DM;awq!+8kr5%3dc ziG@6&ed7XP=Q_Y997+z^cg zMq~IKQzT)~`RpBZ$bsKPe9L*O2xG+HVvK2-aPNlUiKP|;yNYQB7y6rqYht~Bf@z)e zMik8!Ah%GkvooX=X5Rwc@XQ|5X8JM==L$dLe@gO;^17`kj4`%P<@rcy{ZKMSC6Z)w zpgR`l%k?m>UzE?R8vE_goAnGMC~JYbzzPWAqj9i-Rd;=e!6syE(}@j7mHz#k**o?? zf-AlKu*9sz_Kd~{^Q)+a39`ptaAunr*g9H>CJM3ZyxPkCe+8uqTJ@C;G{9b?D1!%+ z5CdcqTtpq?v?2i>%zbA(7eP+^hLp8y!VVAO6XcrMq2!p?6ut2}XtQg6!x5qDiRL&P z(c9MYTdj`&uH(O7bo@8efB3PE|E}Y|qxf%x?^>z+Ls9*QA^)GO|1iY;Kj?E2P{)67 zH2xb7K~Y~F%Rf*kCjl_5qZGu+;m=2hzZh16pa_X_g&=4$6;unLj*{0<8h?Hj2r&c# zbi_IfG!dl=1T`rx0>Q7al|y^U>J8+X)gq6XRgVy}Dp@>2Ouezhs;;3XgxMZrO8KzXTy23R@f2got|A6`m-+O1L9t)-}J6z*gJHI+a?QHv3)U zt4DLI4l=yDt&j;9zB*a+VZ=>}u9T?^5T8F7j!>f*FNKvnU5HI|Q`p@cDJFZ=7sh2fce2667XqZ^${WXHL0l zMPK3UUC*^2$mZN!spxKmIBVTUgLzgtRBGwlOdYr$mHNgC5bcIK=DHPm#71LpVmIUF zYT8@nLHorJE5q(rL`)uZKU{8~iYX_Dl_zjw!2Qs#2DiV|rAc7WFLPt_WhM zLcJwH`^CWU*%yS_uMW!qvj3D{gK1d+@W)gc4?LeDs`MF(_zhs`$Rq*SGyD;$KbD6~=+XZTin_0G}9D|;IX>egK+6)E>i8_?&RQ(buS0MS4Mkxg@$SXSt=1Ec% zWFRGPPLYX8jY>pZ9$|JFGQdR@x`JGh%fX!qS52cB}qbqZPsqz8vn13|M+vqf9&n-)$t#7 z{D+MH2yVRjweL(;3IHjH{}}WJdtv;?px1}^5B_Hz|FQA-k5jSQkey^-`<7Yo2UXoD z9|{t;jEPrMyvGOL+_^S2k1Y_pJx}9JXO>)d6V)KpIu{hMFp_l_MAnY@G%AlkmJp19 zu-(bb<5XMn(t_J;;cky{-njLYOQw=rp|woBVnnZsN0F?xns|GLJx{Eoyy8(`kdG8e z8pSbu0J&WlHKEn$^KB?F^OXIG2@G+)?XatKfM!FmoEvc&dFCu<8jO4k^7<>}w*;fb zIjllXidJwpwt|>fNZYt8CKn=sLxdJzvx6q}xDZl-sstgvb~6zip3er#VkeLpoB$w5 z5wwHWOiyCXVBcYLKCDCE_x$q1`B!{3)TID>PR2OJBhN6{h_{fn%*M-Gyo{m7X`LEx z=#Sa(U}NqZ?b!r%!l%|FxB<$ET6AgP}&=m%e6%!(1KFOPKo23VM@b+yPQ;LjwNp~b{d2in~wHyU? zG|1Zhlg9~Ws_^iqAlxD24B~r^uX7f~;NcG0kviB%%q3uW>Od8Y$iEFI3T$RRZBWD< zLM)wI!FS5vZqBpK;^E5Rq=bEo=9cIGmYoxM=lyK*{zSgk()1m+8dTj{i zkuOe4g%?P6*HfLd*ZBL$fc6vvpz=FDno0kLX|{Se0!_f022M}x`m8NP$MS7 zyC0ttz!a$=6Y6(^=F>$2!%i0w_lh0cK9U44J_*DIB>7S#T|!vPmnE)qy@bG6qKCm# z;WbcYe&R6-n3snzUFF*B?b~eW6D?>e6(Sjj83lxV;}gV8?TgGa#G3<(vKm8@8Eu8) zfDRj!2xau2aQIbkFNGKKcUp2iqYWh&G`VM#J#ta%=vLP_TG}=XUvQ9jtZP;}OA!|} z;P#Vok#H9nP3)O(kFx{eHP?ra(IdZDzRQ)EyeouShK}+M3Xen-$?+p`Q^U?Yj&QYf z$5Cw<*;=Z%u7{`cnn zf1oG8iVL4#%;mSFUyrLoXS~OKbA8!c+(fd;x-wys7T1sv@M4^j zKHJB@s;W>WOsaj3EUBVt>ltC?gr{2ntM$J+{;U3Z7X1%=wZWDunU#z3EzDfX+`3PYOYRxDt5|jQIW$3ZR<0HEhUW zs}8IoaKHs4lmLTNX_%P~umQJJCSHTNT9g3cY3eBU{_*hEa;7f?cOXH*Qs@IjO(X09 zATZF^hN-u(>gnIq;HymQGd>_)%E_meSRw3hG;*-SZ)U&MqZ@2=eU@7k*Moc~lVyp3 z5wrq9_yLY4C7jH-16Pkh;mh6;H_Z-qNsw7WGQ=4-pD?*VMsX(XT_|WHgCtQtc&;n5 zirzm0g^cNPX$8)Bb(+9zws!{*ekcdBEiUQXQFha}i?mo&oZWY? zzJeR{!k?D8K3`3(>)@r*sLkg(o-QW#$Z;vX7H^x;#}Z^ptqoocLQwL>Qq&>rPr)+@ z=qt?9&p66T?eU7hgJL3)uUP^?2sXEY(8Dz<1`kSa=Y{XvE>6G1)W`G`zP(}!jH3aS zBt>jcOP;`qD#~~QoO!53m?Stko_LS4i{Hy1N^-b{Euwn8bE-Y z*tg!Dja>PO-+s#SrH_x7WKC~630ZS#9;7#yV?%YcBe?8oc=1KCUKQ+7FliH*m{4p9 z#r1iF76gCT{&Pt!q3KeTP)uqaxp&UoUbD=Su(xK6GuWwKvcw2bUb2*9o!`4$Nps5| zkUa{fT|%f9jw5r~Y}l OKmQN8<>X@km;(UDtQo!l literal 35629 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 XPyJK>)Iasl%l!F&-(GTf0GI;++J28t diff --git a/setup.py b/setup.py index 9246a71..b35c5b5 100644 --- a/setup.py +++ b/setup.py @@ -36,10 +36,15 @@ long_description_content_type="text/markdown", url="https://github.com/syncsketch/python-api", packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), - install_requires=["requests>=2.20.0"], + install_requires=[ + 'requests>=2.20.0,<2.28; python_version < "3.0"', + 'requests>=2.20.0; python_version >= "3.7" and python_version < "3.9"', + 'requests>=2.32.0; python_version >= "3.9"', + 'urllib3>=2.6.3; python_version >= "3.9"', + ], extras_require={ "test": [ - "pytest>=7.0,<9.0", + "pytest>=9.0.3,<10.0", "pytest-cov>=4.0", "responses>=0.20.0", ], diff --git a/syncsketch.egg-info/PKG-INFO b/syncsketch.egg-info/PKG-INFO index 27385be..4820f62 100644 --- a/syncsketch.egg-info/PKG-INFO +++ b/syncsketch.egg-info/PKG-INFO @@ -23,9 +23,12 @@ Classifier: Programming Language :: Python :: 3.14 Requires-Python: >=2.7, <3.15 Description-Content-Type: text/markdown License-File: LICENSE -Requires-Dist: requests>=2.20.0 +Requires-Dist: requests<2.28,>=2.20.0; python_version < "3.0" +Requires-Dist: requests>=2.20.0; python_version >= "3.7" and python_version < "3.9" +Requires-Dist: requests>=2.32.0; python_version >= "3.9" +Requires-Dist: urllib3>=2.6.3; python_version >= "3.9" Provides-Extra: test -Requires-Dist: pytest<9.0,>=7.0; extra == "test" +Requires-Dist: pytest<10.0,>=9.0.3; extra == "test" Requires-Dist: pytest-cov>=4.0; extra == "test" Requires-Dist: responses>=0.20.0; extra == "test" Dynamic: author diff --git a/syncsketch.egg-info/requires.txt b/syncsketch.egg-info/requires.txt index ca2bfbe..2423969 100644 --- a/syncsketch.egg-info/requires.txt +++ b/syncsketch.egg-info/requires.txt @@ -1,6 +1,15 @@ + +[:python_version < "3.0"] +requests<2.28,>=2.20.0 + +[:python_version >= "3.7" and python_version < "3.9"] requests>=2.20.0 +[:python_version >= "3.9"] +requests>=2.32.0 +urllib3>=2.6.3 + [test] -pytest<9.0,>=7.0 +pytest<10.0,>=9.0.3 pytest-cov>=4.0 responses>=0.20.0 diff --git a/syncsketch/syncsketch.py b/syncsketch/syncsketch.py index 0fd34f0..e7d2967 100644 --- a/syncsketch/syncsketch.py +++ b/syncsketch/syncsketch.py @@ -50,7 +50,7 @@ def _worker(self): try: task_id, fn, args, kwargs = self.tasks.get(block=False) self.results[task_id] = fn(*args, **kwargs) - except: + except Exception: pass def __enter__(self): @@ -130,6 +130,13 @@ def __init__( def get_api_base_url(self, api_version=None): return self.join_url_path(self.HOST, "/api/{}/".format(api_version or self.api_version)) + _SENSITIVE_KEYS = frozenset({"api_key", "token", "username", "email", "Authorization"}) + + @staticmethod + def _redact_dict(d): + """Return a copy of dict *d* with sensitive values replaced by '***'.""" + return {k: ("***" if k in SyncSketchAPI._SENSITIVE_KEYS else v) for k, v in d.items()} + @staticmethod def join_url_path(base, *path_segments): """Takes one more more strings and returns a properly terminated url path. Handles strings regardless @@ -206,8 +213,8 @@ def _get_json_response( "{method} URL: {url}, params: {params}, headers: {headers}, status_code: {status_code}".format( method=method, url=url, - params=params, - headers=headers, + params=self._redact_dict(params), + headers=self._redact_dict(headers), status_code=r.status_code, ) ) @@ -221,8 +228,7 @@ def _get_json_response( except Exception as e: if self.debug: print(e) - - print("Error: %s" % r.text) + print("Error: %s" % r.text) return {"objects": []} @@ -958,22 +964,22 @@ def add_media( if itemParentId: get_params.update({"itemParentId": itemParentId}) - uploadURL = "%s/items/uploadToReview/%s/?%s" % ( + uploadURL = "%s/items/uploadToReview/%s/" % ( self.HOST, review_id, - urlencode(get_params), ) files = {"reviewFile": open(filepath, "rb")} r = requests.post( uploadURL, + params=get_params, files=files, data=dict(artist=artist_name, name=file_name), headers=self.headers, ) if self.debug: - print("URL: %s, params: %s" % (uploadURL, get_params)) + print("URL: %s, params: %s" % (uploadURL, self._redact_dict(get_params))) try: return json.loads(r.text) @@ -1002,15 +1008,15 @@ def add_media_by_url(self, review_id, media_url, artist_name="", noConvertFlag=F if noConvertFlag: get_params.update({"noConvertFlag": 1}) - upload_url = "%s/items/uploadToReview/%s/?%s" % ( + upload_url = "%s/items/uploadToReview/%s/" % ( self.HOST, review_id, - urlencode(get_params), ) r = requests.post( upload_url, - {"media_url": media_url, "artist": artist_name}, + params=get_params, + data={"media_url": media_url, "artist": artist_name}, headers=self.headers, ) @@ -1411,8 +1417,7 @@ def _get_s3_signed_url( """ Internal method. Use to retrieve s3 signed url for file upload in `add_media_via_s3`. """ - request_data = self.api_params.copy() - additional_request_data = { + post_data = { "review_id": review_id, "item_name": item_name, "item_data": { @@ -1422,13 +1427,12 @@ def _get_s3_signed_url( "noConvertFlag": no_convert, }, } - request_data.update(additional_request_data) request_url = "{}/uploads/get-s3-signed-url/".format(self.HOST) return self._get_json_response( url=request_url, - postData=request_data, + postData=post_data, raw_response=raw_response, ) @@ -1721,10 +1725,11 @@ def get_grease_pencil_overlays(self, review_id, item_id, homedir=None): if result.get("status") == "done": data = result.get("data") - # storing locally - local_filename = "/tmp/%s.zip" % data["fileName"] + # storing locally - sanitize fileName to prevent path traversal + safe_name = os.path.basename(data["fileName"]) + local_filename = "/tmp/%s.zip" % safe_name if homedir: - local_filename = os.path.join(homedir, "{}.zip".format(data["fileName"])) + local_filename = os.path.join(homedir, "{}.zip".format(safe_name)) r = requests.get(data["s3Path"], stream=True) with open(local_filename, "wb") as f: for chunk in r.iter_content(chunk_size=1024): @@ -1788,7 +1793,7 @@ def get_user_by_email(self, email, fields=None, raw_response=True): try: data = response.json() return data.get("objects")[0] - except: + except Exception: return None def get_users_by_project_id(self, project_id, raw_response=False): diff --git a/tests/README.md b/tests/README.md index d6ce263..2d9004f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -46,6 +46,20 @@ The full pytest suite requires Python 3.8+. For Python 2.7, a standalone smoke t python2.7 tests/test_py27_smoke.py ``` +### Running via Docker + +If you don't have Python 2.7 or 3.7 installed locally, you can use Docker: + +```bash +# Python 2.7 smoke tests +docker run --rm -v "$(pwd)":/app -w /app python:2.7 sh -c \ + 'pip install "requests>=2.20.0,<2.28.0" && python tests/test_py27_smoke.py' + +# Python 3.7+ full test suite (replace tag with desired version) +docker run --rm -v "$(pwd)":/app -w /app python:3.7 sh -c \ + 'pip install -e ".[test]" && pytest tests/ -v' +``` + ## Test Structure | File | Covers | From f2d4098a60ab42ed6e59c2e70b95cd85ab83fffa Mon Sep 17 00:00:00 2001 From: "andrew.parkes" Date: Mon, 1 Jun 2026 11:00:44 +0100 Subject: [PATCH 8/8] fixing actions --- setup.py | 2 +- syncsketch.egg-info/PKG-INFO | 33 ++++++++++++++++++++++++++++---- syncsketch.egg-info/requires.txt | 7 ++++++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index b35c5b5..a25354a 100644 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ ], extras_require={ "test": [ - "pytest>=9.0.3,<10.0", + "pytest>=7.0,<10.0", "pytest-cov>=4.0", "responses>=0.20.0", ], diff --git a/syncsketch.egg-info/PKG-INFO b/syncsketch.egg-info/PKG-INFO index 4820f62..4a2507f 100644 --- a/syncsketch.egg-info/PKG-INFO +++ b/syncsketch.egg-info/PKG-INFO @@ -28,7 +28,8 @@ Requires-Dist: requests>=2.20.0; python_version >= "3.7" and python_version < "3 Requires-Dist: requests>=2.32.0; python_version >= "3.9" Requires-Dist: urllib3>=2.6.3; python_version >= "3.9" Provides-Extra: test -Requires-Dist: pytest<10.0,>=9.0.3; extra == "test" +Requires-Dist: pytest<9.0,>=7.0; python_version < "3.9" and extra == "test" +Requires-Dist: pytest<10.0,>=9.0.3; python_version >= "3.9" and extra == "test" Requires-Dist: pytest-cov>=4.0; extra == "test" Requires-Dist: responses>=0.20.0; extra == "test" Dynamic: author @@ -207,9 +208,7 @@ You can upload a file to the created review with the review id, we provided one item_data = s.upload_file(review['id'], 'examples/test.webm') ``` -If all steps were successful, you should see the following in the web-app. - -![alt text](https://github.com/syncsketch/python-api/blob/documentation/examples/resources/exampleResult.jpg?raw=true) +If all steps were successful, you should see the new item under the review in the web-app. ### Additional Examples @@ -275,3 +274,29 @@ projects = s.get_projects() for project in projects['objects']: print(project) ``` + +### Publishing a New Release + +1. Update the version in both `setup.py` and `syncsketch/__init__.py` (keep them in sync). + +2. Build the distribution: +```bash +python -m build +``` + +3. Verify the build artifacts in `dist/`: +```bash +ls dist/syncsketch-* +``` + +4. Upload to PyPI: +```bash +python -m twine upload dist/syncsketch-* +``` + +To test with TestPyPI first: +```bash +python -m twine upload --repository testpypi dist/syncsketch-* +``` + +Requires the `build` and `twine` packages (`pip install build twine`). diff --git a/syncsketch.egg-info/requires.txt b/syncsketch.egg-info/requires.txt index 2423969..885fa3b 100644 --- a/syncsketch.egg-info/requires.txt +++ b/syncsketch.egg-info/requires.txt @@ -10,6 +10,11 @@ requests>=2.32.0 urllib3>=2.6.3 [test] -pytest<10.0,>=9.0.3 pytest-cov>=4.0 responses>=0.20.0 + +[test:python_version < "3.9"] +pytest<9.0,>=7.0 + +[test:python_version >= "3.9"] +pytest<10.0,>=9.0.3