From d78d30fd2f5c7e1c905271b8e32cbbbdbe11cc39 Mon Sep 17 00:00:00 2001 From: Adakar Date: Tue, 19 Sep 2023 06:11:45 +0000 Subject: [PATCH] Deployed 4bf07dd with MkDocs version: 1.4.2 --- .nojekyll | 0 404.html | 493 ++ assets/_mkdocstrings.css | 64 + assets/favicon.ico | Bin 0 -> 93062 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.51d95adb.min.js | 29 + assets/javascripts/bundle.51d95adb.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.e5c33ebb.min.js | 42 + .../workers/search.e5c33ebb.min.js.map | 8 + assets/stylesheets/main.558e4712.min.css | 1 + assets/stylesheets/main.558e4712.min.css.map | 1 + assets/stylesheets/palette.2505c338.min.css | 1 + .../stylesheets/palette.2505c338.min.css.map | 1 + index.html | 674 ++ objects.inv | Bin 0 -> 649 bytes reference/object_tree/index.html | 1490 ++++ reference/report/index.html | 1745 +++++ reference/settings/index.html | 2500 ++++++ reference/squishserver/index.html | 1653 ++++ reference/video/index.html | 804 ++ reference/vps/index.html | 754 ++ search/search_index.json | 1 + sitemap.xml | 38 + sitemap.xml.gz | Bin 0 -> 200 bytes 52 files changed, 17502 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/favicon.ico create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.51d95adb.min.js create mode 100644 assets/javascripts/bundle.51d95adb.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.e5c33ebb.min.js create mode 100644 assets/javascripts/workers/search.e5c33ebb.min.js.map create mode 100644 assets/stylesheets/main.558e4712.min.css create mode 100644 assets/stylesheets/main.558e4712.min.css.map create mode 100644 assets/stylesheets/palette.2505c338.min.css create mode 100644 assets/stylesheets/palette.2505c338.min.css.map create mode 100644 index.html create mode 100644 objects.inv create mode 100644 reference/object_tree/index.html create mode 100644 reference/report/index.html create mode 100644 reference/settings/index.html create mode 100644 reference/squishserver/index.html create mode 100644 reference/video/index.html create mode 100644 reference/vps/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..b0744cb --- /dev/null +++ b/404.html @@ -0,0 +1,493 @@ + + + + + + + + + + + + + + + + + + SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 0000000..049a254 --- /dev/null +++ b/assets/_mkdocstrings.css @@ -0,0 +1,64 @@ + +/* Avoid breaking parameter names, etc. in table cells. */ +.doc-contents td code { + word-break: normal !important; +} + +/* No line break before first paragraph of descriptions. */ +.doc-md-description, +.doc-md-description>p:first-child { + display: inline; +} + +/* Max width for docstring sections tables. */ +.doc .md-typeset__table, +.doc .md-typeset__table table { + display: table !important; + width: 100%; +} + +.doc .md-typeset__table tr { + display: table-row; +} + +/* Defaults in Spacy table style. */ +.doc-param-default { + float: right; +} + +/* Keep headings consistent. */ +h1.doc-heading, +h2.doc-heading, +h3.doc-heading, +h4.doc-heading, +h5.doc-heading, +h6.doc-heading { + font-weight: 400; + line-height: 1.5; + color: inherit; + text-transform: none; +} + +h1.doc-heading { + font-size: 1.6rem; +} + +h2.doc-heading { + font-size: 1.2rem; +} + +h3.doc-heading { + font-size: 1.15rem; +} + +h4.doc-heading { + font-size: 1.10rem; +} + +h5.doc-heading { + font-size: 1.05rem; +} + +h6.doc-heading { + font-size: 1rem; +} \ No newline at end of file diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..378ec817689ac9b397d44a1b41205b1ea332cc7f GIT binary patch literal 93062 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 IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.51d95adb.min.js b/assets/javascripts/bundle.51d95adb.min.js new file mode 100644 index 0000000..b20ec68 --- /dev/null +++ b/assets/javascripts/bundle.51d95adb.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Hi=Object.create;var xr=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var $i=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Ii=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,an=Object.prototype.propertyIsEnumerable;var on=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&on(e,r,t[r]);if(kt)for(var r of kt(t))an.call(t,r)&&on(e,r,t[r]);return e};var sn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&an.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Fi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $i(t))!Er.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=Pi(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Hi(Ii(e)):{},Fi(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=Ht((wr,cn)=>{(function(e,t){typeof wr=="object"&&typeof cn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function f(T){var Ke=T.type,We=T.tagName;return!!(We==="INPUT"&&a[Ke]&&!T.readOnly||We==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function c(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(T){n=!1}function d(T){s(T.target)&&(n||f(T.target))&&c(T.target)}function h(T){s(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),B())}function B(){document.addEventListener("mousemove",z),document.addEventListener("mousedown",z),document.addEventListener("mouseup",z),document.addEventListener("pointermove",z),document.addEventListener("pointerdown",z),document.addEventListener("pointerup",z),document.addEventListener("touchmove",z),document.addEventListener("touchstart",z),document.addEventListener("touchend",z)}function re(){document.removeEventListener("mousemove",z),document.removeEventListener("mousedown",z),document.removeEventListener("mouseup",z),document.removeEventListener("pointermove",z),document.removeEventListener("pointerdown",z),document.removeEventListener("pointerup",z),document.removeEventListener("touchmove",z),document.removeEventListener("touchstart",z),document.removeEventListener("touchend",z)}function z(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,re())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),B(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var un=Ht(Sr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(re,z){d.append(z,re)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+c+" due to "+T)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,B=!0,re=this;["append","delete","set"].forEach(function(T){var Ke=h[T];h[T]=function(){Ke.apply(h,arguments),v&&(B=!1,re.search=h.toString(),B=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var z=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==z&&(z=this.search,B&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(f){Object.defineProperty(a,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){s(f)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr)});var Qr=Ht((Lt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ki}});var a=i(279),s=i.n(a),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var w=p()(O);return m("cut"),w},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",w=document.createElement("textarea");w.style.fontSize="12pt",w.style.border="0",w.style.padding="0",w.style.margin="0",w.style.position="absolute",w.style[O?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return w.style.top="".concat(k,"px"),w.setAttribute("readonly",""),w.value=j,w}var B=function(O,w){var k=v(O);w.container.appendChild(k);var F=p()(k);return m("copy"),k.remove(),F},re=function(O){var w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof O=="string"?k=B(O,w):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?k=B(O.value,w):(k=p()(O),m("copy")),k},z=re;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(w){return typeof w}:T=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},T(j)}var Ke=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=O.action,k=w===void 0?"copy":w,F=O.container,q=O.target,Le=O.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Le)return z(Le,{container:F});if(q)return k==="cut"?h(q):z(q,{container:F})},We=Ke;function Ie(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(w){return typeof w}:Ie=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},Ie(j)}function Ti(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function nn(j,O){for(var w=0;w0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Ie(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var q=this;this.listener=c()(F,"click",function(Le){return q.onClick(Le)})}},{key:"onClick",value:function(F){var q=F.delegateTarget||F.currentTarget,Le=this.action(q)||"copy",Rt=We({action:Le,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Le,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return yr("action",F)}},{key:"defaultTarget",value:function(F){var q=yr("target",F);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(F){return yr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return z(F,q)}},{key:"cut",value:function(F){return h(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof F=="string"?[F]:F,Le=!!document.queryCommandSupported;return q.forEach(function(Rt){Le=Le&&!!document.queryCommandSupported(Rt)}),Le}}]),w}(s()),ki=Ri},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,f){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(f))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return s(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return u(m,d,h);if(a.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return s(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),a=f.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var f=this;function c(){f.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=s.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var is=/["'&<>]/;Jo.exports=as;function as(e){var t=""+e,r=is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||s(m,d)})})}function s(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof Xe?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){s("next",m)}function u(m){s("throw",m)}function p(m,d){m(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof xe=="function"?xe(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(a){return new Promise(function(s,f){a=e[i](a),o(s,f,a.done,a.value)})}}function o(i,a,s,f){Promise.resolve(f).then(function(c){i({value:c,done:s})},a)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Fe=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=xe(a),f=s.next();!f.done;f=s.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=xe(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{dn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)dn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Or=Fe.EMPTY;function It(e){return e instanceof Fe||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function dn(e){A(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?Or:(this.currentObservers=null,s.push(r),new Fe(function(){n.currentObservers=null,De(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new wn(r,n)},t}(U);var wn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Or},t}(E);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,f=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var On=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var we=new On(Tn);var R=new U(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function kr(e){return e[e.length-1]}function Qe(e){return A(kr(e))?e.pop():void 0}function Se(e){return Dt(kr(e))?e.pop():void 0}function Vt(e,t){return typeof kr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ki();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return ln(this,arguments,function(){var r,n,o,i;return Pt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,Xe(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,Xe(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function $(e){if(e instanceof U)return e;if(e!=null){if(Nt(e))return Qi(e);if(pt(e))return Yi(e);if(zt(e))return Gi(e);if(qt(e))return _n(e);if(Yt(e))return Bi(e);if(Bt(e))return Ji(e)}throw Kt(e)}function Qi(e){return new U(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Yi(e){return new U(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?_(function(o,i){return e(o,i,n)}):me,Oe(1),r?He(t):zn(function(){return new Xt}))}}function Nn(){for(var e=[],t=0;t=2,!0))}function fe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,f=s===void 0?!0:s;return function(c){var u,p,m,d=0,h=!1,v=!1,B=function(){p==null||p.unsubscribe(),p=void 0},re=function(){B(),u=m=void 0,h=v=!1},z=function(){var T=u;re(),T==null||T.unsubscribe()};return g(function(T,Ke){d++,!v&&!h&&B();var We=m=m!=null?m:r();Ke.add(function(){d--,d===0&&!v&&!h&&(p=jr(z,f))}),We.subscribe(Ke),!u&&d>0&&(u=new et({next:function(Ie){return We.next(Ie)},error:function(Ie){v=!0,B(),p=jr(re,o,Ie),We.error(Ie)},complete:function(){h=!0,B(),p=jr(re,a),We.complete()}}),$(T).subscribe(u))})(c)}}function jr(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function V(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),N(e===_e()),Y())}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function Yn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,we),l(()=>Be(e)),N(Be(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,we),l(()=>rr(e)),N(rr(e)))}var Bn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),xa?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ya.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Jn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Zn=typeof WeakMap!="undefined"?new WeakMap:new Bn,eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ea.getInstance(),n=new Ra(t,r,this);Zn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){eo.prototype[e]=function(){var t;return(t=Zn.get(this))[e].apply(t,arguments)}});var ka=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:eo}(),to=ka;var ro=new E,Ha=I(()=>H(new to(e=>{for(let t of e)ro.next(t)}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){return Ha.pipe(S(t=>t.observe(e)),x(t=>ro.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(()=>de(e)))),N(de(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var no=new E,Pa=I(()=>H(new IntersectionObserver(e=>{for(let t of e)no.next(t)},{threshold:0}))).pipe(x(e=>L(Te,H(e)).pipe(C(()=>e.disconnect()))),J(1));function sr(e){return Pa.pipe(S(t=>t.observe(e)),x(t=>no.pipe(_(({target:r})=>r===e),C(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function oo(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=de(e),o=bt(e);return r>=o.height-n.height-t}),Y())}var cr={drawer:V("[data-md-toggle=drawer]"),search:V("[data-md-toggle=search]")};function io(e){return cr[e].checked}function qe(e,t){cr[e].checked!==t&&cr[e].click()}function je(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),N(t.checked))}function $a(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ia(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(N(!1))}function ao(){let e=b(window,"keydown").pipe(_(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:io("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),_(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!$a(n,r)}return!0}),fe());return Ia().pipe(x(t=>t?R:e))}function Me(){return new URL(location.href)}function ot(e){location.href=e.href}function so(){return new E}function co(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)co(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)co(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function fo(){return location.hash.substring(1)}function uo(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Fa(){return b(window,"hashchange").pipe(l(fo),N(fo()),_(e=>e.length>0),J(1))}function po(){return Fa().pipe(l(e=>se(`[id="${e}"]`)),_(e=>typeof e!="undefined"))}function Nr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function lo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(N(e.matches))}function qr(e,t){return e.pipe(x(r=>r?t():R))}function ur(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(ce(()=>R),x(r=>r.status!==200?Tt(()=>new Error(r.statusText)):H(r)))}function Ue(e,t){return ur(e,t).pipe(x(r=>r.json()),J(1))}function mo(e,t){let r=new DOMParser;return ur(e,t).pipe(x(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=M("script",{src:e});return I(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(x(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),C(()=>document.head.removeChild(t)),Oe(1))))}function ho(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function bo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(ho),N(ho()))}function vo(){return{width:innerWidth,height:innerHeight}}function go(){return b(window,"resize",{passive:!0}).pipe(l(vo),N(vo()))}function yo(){return Q([bo(),go()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(X("size")),o=Q([n,r]).pipe(l(()=>Be(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:a,size:s},{x:f,y:c}])=>({offset:{x:a.x-f,y:a.y-c+i},size:s})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class{constructor(n){this.url=n,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.m=a=>{a.source===this.w&&(a.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:a.data})),this.onmessage&&this.onmessage(a))},this.e=(a,s,f,c,u)=>{if(s===this.url.toString()){let p=new ErrorEvent("error",{message:a,filename:s,lineno:f,colno:c,error:u});this.dispatchEvent(p),this.onerror&&this.onerror(p)}};let o=new EventTarget;this.addEventListener=o.addEventListener.bind(o),this.removeEventListener=o.removeEventListener.bind(o),this.dispatchEvent=o.dispatchEvent.bind(o);let i=document.createElement("iframe");i.width=i.height=i.frameBorder="0",document.body.appendChild(this.iframe=i),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Squish - version +PyPI - Python Version +PyPI - License

+

SQUAPE - Squish API Python Extension

+

Python package that extends Squish Python API. It provides tools for everyday automated test cases development.

+

Requirements

+

The minimal requirement for the SQUAPE package is Squish version 6.7.0. Individual features may require a more recent Squish package.

+

Installation

+

The package is available on the Python Package Index (PyPI). +You can install it via pip with the following commands:

+
pip install squape
+
+

Content

+

The package consists of several modules:

+
    +
  • object_tree - seamless object tree navigation and search capabilities
  • +
  • report - adds features to enhance the reporting capabilities of Squish
  • +
  • settings - makes using various test settings easier and cleaner
  • +
  • squishserver - managing squishservers and (un)registering AUTs
  • +
  • video - adds features to enhance video capture capabilities of Squish
  • +
  • vps - extension of Squish verification points
  • +
+

Contribution

+

The package is created and maintained by Cyber Alpaca
+Pull requests for any issues are welcome.
+In case where you would like to introduce a new feature or a major change, please open an issue first and discuss it with our team.

+

License

+

The packages are available under The 3-Clause BSD License

+

References

+ +

Cyber Alpaca

+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..88a408147581f689e2f4b1f679ec121c0522965c GIT binary patch literal 649 zcmV;40(Si)AX9K?X>NERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGkYQB^@u zMIbF8Q*m`^b7&wzP)Q(Ad30!RZXiW?bY*UHX>V={BOq2~a&u{KZaN?^E-)@I3L_v? zXk{RBWo=<;Ze(S0Aa78b#rNMXCQiPX<{x4 zc-pm=L66%Y5QXpk6_MI&z1r*ER$A?;ZB}yH9?=-aHZ1|~FeICQU*b5`svF#z&_g0w z%=>`HV}ySWFkt1HA1GNcA+CnQ-PWmKaCN&PY?07Pym?h|^Zvu?<2(OGS;<}-70Zu^ zHdx8p*~O4nTXi)+K& z&$WGwClV-qmh%vWEd;}BNuR)W0lHj}-bU>g$B!;p^>B=9H)qB_z-k1N{bzWoB^WF~ z(zX;SI;MRY)}|-)y)&u+${8fEoJopzt(LK0*|;1&<*E$n3A`^u`u>+IHV-@XhG|H%OXeAg|+8pw#`>O?pRp#9?>>?n_gdLH5Uo!2R4AWUxo@#>Hiu zDZeH0gj=`6!Y)tH@ + + + + + + + + + + + + + + + + + + + + squape.object_tree - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

squape.object_tree

+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + +

+ children + + +

+
children(object_or_name, selector)
+
+ +
+ +

Finds direct children of the given object.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
object_or_name + any + +
+

symbolic name, real name, or object reference.

+
+
+ required +
selector + dict + +
+

The selector is a dictionary of key-value pairs, +where a key is a property of an object, and value is expected value. +An object will pass verification +if the object's property value matches the selector value. +Selectors may include functions. +The passed functions must accept exactly one argument.

+
+
+ required +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ tuple + +
+

Children objects that met the selector criteria.

+
+
+ + + +

Examples:

+
children(object_or_name, {'type' : QToolButton, 'height': 50})
+children(object_or_name, {'type' : 'Button', 'visible' : True})
+children(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})
+
+def height_filter_function(height: int) -> bool:
+    return height > 30 and height < 120
+children(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : height_filter_function}
+)
+
+ +
+ Source code in squape/object_tree.py +
18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
def children(object_or_name: any, selector: dict) -> tuple:
+    """
+    Finds direct children of the given object.
+
+    Args:
+        object_or_name (any): symbolic name, real name, or object reference.
+
+        selector (dict): The selector is a dictionary of key-value pairs,
+            where a key is a property of an object, and value is expected value.
+            An object will pass verification
+            if the object's property value matches the selector value.
+            Selectors may include functions.
+            The passed functions must accept exactly one argument.
+
+    Returns:
+        Children objects that met the selector criteria.
+
+    Examples:
+        ```python
+        children(object_or_name, {'type' : QToolButton, 'height': 50})
+        children(object_or_name, {'type' : 'Button', 'visible' : True})
+        children(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})
+
+        def height_filter_function(height: int) -> bool:
+            return height > 30 and height < 120
+        children(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : height_filter_function}
+        )
+        ```
+    """
+    object_reference = _get_object_reference(object_or_name)
+    children = object.children(object_reference)
+    return tuple(filter(lambda x: _is_matching(x, selector), children))
+
+
+
+ +
+ + +
+ + + + +

+ find + + +

+
find(object_or_name, selector=None, max_depth=None)
+
+ +
+ +

Finds descendants of the given object.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
object_or_name + any + +
+

symbolic name, real name, or object reference.

+
+
+ required +
selector + dict + +
+

The selector is a dictionary of key-value pairs, +where a key is a property of an object, and value is expected value. +An object will pass verification +if the object's property value matches the selector value. +Selectors may include functions. +The passed functions must accept exactly one argument. +Defaults to {}, which means all objects pass the verification.

+
+
+ None +
max_depth + int + +
+

defines maximum depth in the object structure that should be +while looking for children. +Defaults to None, which mean there is no depth limit.

+
+
+ None +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ tuple + +
+

Descendants of the given object that met the selector criteria.

+
+
+ + + +

Examples:

+
find(object_or_name)
+find(object_or_name, {'type' : 'ToolBar'})
+find(object_or_name, max_depth=5)
+find(object_or_name, {'visible' : True}, max_depth=3)
+find(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : lambda x: x > 25},
+    max_depth=5
+)
+
+def height_filter_function(height: int) -> bool:
+    return height > 30 and height < 120
+find(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : height_filter_function}
+)
+
+ +
+ Source code in squape/object_tree.py +
 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
def find(object_or_name: any, selector: dict = None, max_depth: int = None) -> tuple:
+    """
+    Finds descendants of the given object.
+
+    Args:
+        object_or_name (any): symbolic name, real name, or object reference.
+
+        selector (dict, optional): The selector is a dictionary of key-value pairs,
+            where a key is a property of an object, and value is expected value.
+            An object will pass verification
+            if the object's property value matches the selector value.
+            Selectors may include functions.
+            The passed functions must accept exactly one argument.
+            Defaults to {}, which means all objects pass the verification.
+
+        max_depth (int): defines maximum depth in the object structure that should be
+            while looking for children.
+            Defaults to None, which mean there is no depth limit.
+
+    Returns:
+        Descendants of the given object that met the selector criteria.
+
+    Examples:
+        ```python
+        find(object_or_name)
+        find(object_or_name, {'type' : 'ToolBar'})
+        find(object_or_name, max_depth=5)
+        find(object_or_name, {'visible' : True}, max_depth=3)
+        find(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : lambda x: x > 25},
+            max_depth=5
+        )
+
+        def height_filter_function(height: int) -> bool:
+            return height > 30 and height < 120
+        find(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : height_filter_function}
+        )
+        ```
+    """
+    if max_depth is None:
+        max_depth = math.inf
+    if max_depth <= 0:
+        return ()
+    if selector is None:
+        selector = {}
+
+    object_reference = _get_object_reference(object_or_name)
+    children = ()
+
+    for child in object.children(object_reference):
+        if _is_matching(child, selector):
+            children += (child,)
+        children += find(child, selector, max_depth - 1)
+
+    return children
+
+
+
+ +
+ + +
+ + + + +

+ find_ancestor + + +

+
find_ancestor(object_or_name, selector)
+
+ +
+ +

Find the first object's ancestor that matches the selector.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
object_or_name + any + +
+

symbolic name, real name, or object reference.

+
+
+ required +
selector + dict + +
+

The selector is a dictionary of key-value pairs, +where a key is a property of an object, and value is expected value. +An object will pass verification +if the object's property value matches the selector value. +Selectors may include functions. +The passed functions must accept exactly one argument.

+
+
+ required +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ Squish object / None + +
+

The ancestor object that matches the selector.

+
+
+ + + +

Examples:

+
find_ancestor(object_or_name)
+find_ancestor(object_or_name, {'type' : 'MyContainerType'})
+find_ancestor(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : lambda x: x > 25}
+)
+
+def height_filter_function(height: int) -> bool:
+    return height > 30 and height < 120
+find_ancestor(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : height_filter_function}
+)
+
+ +
+ Source code in squape/object_tree.py +
114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
def find_ancestor(object_or_name: any, selector: dict):
+    """
+    Find the first object's ancestor that matches the selector.
+
+    Args:
+        object_or_name (any): symbolic name, real name, or object reference.
+
+        selector (dict): The selector is a dictionary of key-value pairs,
+            where a key is a property of an object, and value is expected value.
+            An object will pass verification
+            if the object's property value matches the selector value.
+            Selectors may include functions.
+            The passed functions must accept exactly one argument.
+
+    Returns:
+        (Squish object / None): The ancestor object that matches the selector.
+
+    Examples:
+        ```python
+        find_ancestor(object_or_name)
+        find_ancestor(object_or_name, {'type' : 'MyContainerType'})
+        find_ancestor(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : lambda x: x > 25}
+        )
+
+        def height_filter_function(height: int) -> bool:
+            return height > 30 and height < 120
+        find_ancestor(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : height_filter_function}
+        )
+        ```
+    """
+    object_reference = _get_object_reference(object_or_name)
+    parent = object.parent(object_reference)
+
+    if parent is None:
+        return None
+
+    if _is_matching(object.parent(object_reference), selector):
+        return parent
+
+    return find_ancestor(parent, selector)
+
+
+
+ +
+ + +
+ + + + +

+ siblings + + +

+
siblings(object_or_name, selector=None)
+
+ +
+ +

Find the object's siblings.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
object_or_name + any + +
+

symbolic name, real name, or object reference.

+
+
+ required +
selector + dict + +
+

The selector is a dictionary of key-value pairs, +where a key is a property of an object, and value is expected value. +An object will pass verification +if the object's property value matches the selector value. +Selectors may include functions. +The passed functions must accept exactly one argument. +Defaults to {}, which means all objects pass the verification.

+
+
+ None +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ tuple + +
+

Siblings of the given object that met the selector criteria.

+
+
+ + + +

Examples:

+
siblings(object)
+siblings(object, {'enabled' : True})
+siblings(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})
+
+def height_filter_function(height: int) -> bool:
+    return height > 30 and height < 120
+siblings(
+    object_or_name,
+    {'type' : 'QToolButton', 'height' : height_filter_function}
+)
+
+ +
+ Source code in squape/object_tree.py +
160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
def siblings(object_or_name: any, selector: dict = None) -> tuple:
+    """
+    Find the object's siblings.
+
+    Args:
+        object_or_name (any): symbolic name, real name, or object reference.
+
+        selector (dict, optional): The selector is a dictionary of key-value pairs,
+            where a key is a property of an object, and value is expected value.
+            An object will pass verification
+            if the object's property value matches the selector value.
+            Selectors may include functions.
+            The passed functions must accept exactly one argument.
+            Defaults to {}, which means all objects pass the verification.
+
+    Returns:
+        Siblings of the given object that met the selector criteria.
+
+    Examples:
+        ```python
+        siblings(object)
+        siblings(object, {'enabled' : True})
+        siblings(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})
+
+        def height_filter_function(height: int) -> bool:
+            return height > 30 and height < 120
+        siblings(
+            object_or_name,
+            {'type' : 'QToolButton', 'height' : height_filter_function}
+        )
+        ```
+    """
+    if selector is None:
+        selector = {}
+    object_reference = _get_object_reference(object_or_name)
+    parent = object.parent(object_reference)
+
+    if parent is None:
+        return None
+    else:
+        siblings = list(object.children(parent))
+        siblings.remove(object_reference)
+        return tuple(filter(lambda x: _is_matching(x, selector), siblings))
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/report/index.html b/reference/report/index.html new file mode 100644 index 0000000..c60f73f --- /dev/null +++ b/reference/report/index.html @@ -0,0 +1,1745 @@ + + + + + + + + + + + + + + + + + + + + + + squape.report - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

squape.report

+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + +

+ debug + + +

+
debug(msg, details='')
+
+ +
+ +

Adds a DEBUG-level log entry with the given message and details to a test report.

+

This function adds a log message to Squish's test report at the DEBUG log level, +which allows for detailed debugging information to be recorded. +The log message will include the given message and details provided as arguments. +The message will be prefixed with the string 'DEBUG: ' to indicate its log level.

+

The log message will only be visible if the LOGLEVEL is set to DEBUG. +Otherwise, it will be ignored and not included in the test report.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
msg + str + +
+

The message to include in the log entry.

+
+
+ required +
details + str + +
+

Optional additional details to include in the log entry.

+
+
+ '' +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
def debug(msg: str, details: str = "") -> None:
+    """Adds a DEBUG-level log entry with the given message and details to a test report.
+
+    This function adds a log message to Squish's test report at the DEBUG log level,
+    which allows for detailed debugging information to be recorded.
+    The log message will include the given message and details provided as arguments.
+    The message will be prefixed with the string 'DEBUG: ' to indicate its log level.
+
+    The log message will only be visible if the LOGLEVEL is set to DEBUG.
+    Otherwise, it will be ignored and not included in the test report.
+
+    Args:
+        msg (str): The message to include in the log entry.
+        details (str): Optional additional details to include in the log entry.
+
+    Returns:
+        None
+    """
+    if __is_level_enabled(LogLevel.DEBUG):
+        test.fixateResultContext(1)
+        try:
+            _test_log(f"[DEBUG] {msg}", details)
+        finally:
+            test.restoreResultContext()
+
+
+
+ +
+ + +
+ + + + +

+ enable_loglevel_in_test_module + + +

+
enable_loglevel_in_test_module()
+
+ +
+ +

Adds support for log levels to the Squish 'test' module.

+
+

Warning

+

This function uses monkey pathching +https://en.wikipedia.org/wiki/Monkey_patch

+
+

This function overwrites some of the existing functions in the 'test' module +to support logging at different log levels. +Furthermore, it enhances the functionality of the 'test' module by adding +a new test.debug(...) function.

+

By default, the 'test' module does not support LOGLEVEL at all. +However, this function adds support for setting the log level to a higher +or lower level, depending on the needs of the developer.

+

After calling this function, the following 'test' module's functions will support +LOGLEVEL report setting: +- test.debug(...) +- test.log(...) +- test.warning(...) +- test.fail(...) +- test.fatal(...)

+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
def enable_loglevel_in_test_module() -> None:
+    """Adds support for log levels to the Squish 'test' module.
+
+    !!! warning
+        This function uses monkey pathching
+        https://en.wikipedia.org/wiki/Monkey_patch
+
+    This function overwrites some of the existing functions in the 'test' module
+    to support logging at different log levels.
+    Furthermore, it enhances the functionality of the 'test' module by adding
+    a new test.debug(...) function.
+
+    By default, the 'test' module does not support LOGLEVEL at all.
+    However, this function adds support for setting the log level to a higher
+    or lower level, depending on the needs of the developer.
+
+    After calling this function, the following 'test' module's functions will support
+    LOGLEVEL report setting:
+    - test.debug(...)
+    - test.log(...)
+    - test.warning(...)
+    - test.fail(...)
+    - test.fatal(...)
+
+    Returns:
+        None
+    """
+    test.debug = debug
+    test.log = log
+    test.warning = warning
+    test.fail = fail
+    test.fatal = fatal
+
+
+
+ +
+ + +
+ + + + +

+ fail + + +

+
fail(msg, details='')
+
+ +
+ +

Adds a fail entry with the given message and details to a test report.

+

This function adds a fail message to Squish's test report at the FAIL log level +or lower, depending on the current log level setting. +The fail message will include the given message and details provided as arguments.

+

The fail message will only be visible if the LOGLEVEL is set to FAIL or lower. +Otherwise, it will be ignored and not included in the test report.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
msg + str + +
+

The message to include in the fail entry.

+
+
+ required +
details + str + +
+

Optional additional details to include in the fail entry.

+
+
+ '' +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
def fail(msg: str, details: str = "") -> None:
+    """Adds a fail entry with the given message and details to a test report.
+
+    This function adds a fail message to Squish's test report at the FAIL log level
+    or lower, depending on the current log level setting.
+    The fail message will include the given message and details provided as arguments.
+
+    The fail message will only be visible if the LOGLEVEL is set to FAIL or lower.
+    Otherwise, it will be ignored and not included in the test report.
+
+    Args:
+        msg (str): The message to include in the fail entry.
+        details (str): Optional additional details to include in the fail entry.
+
+    Returns:
+        None
+    """
+    if __is_level_enabled(LogLevel.FAIL):
+        test.fixateResultContext(1)
+        try:
+            _test_fail(msg, details)
+        finally:
+            test.restoreResultContext()
+
+
+
+ +
+ + +
+ + + + +

+ fatal + + +

+
fatal(msg, details='')
+
+ +
+ +

Adds a fatal entry with the given message and details to a test report, +then aborts the test case execution.

+

This function adds a fatal message to Squish's test report at the FATAL log level +or lower, depending on the current log level setting. +The fatal message will include the given message and details provided as arguments.

+

The fatal message will only be visible if the LOGLEVEL is set to FATAL or lower. +Otherwise, it will be ignored and not included in the test report.

+

After adding the fatal message, the function aborts the test case execution.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
msg + str + +
+

The message to include in the fatal entry.

+
+
+ required +
details + str + +
+

Optional additional details to include in the fatal entry.

+
+
+ '' +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
def fatal(msg: str, details: str = "") -> None:
+    """Adds a fatal entry with the given message and details to a test report,
+    then aborts the test case execution.
+
+    This function adds a fatal message to Squish's test report at the FATAL log level
+    or lower, depending on the current log level setting.
+    The fatal message will include the given message and details provided as arguments.
+
+    The fatal message will only be visible if the LOGLEVEL is set to FATAL or lower.
+    Otherwise, it will be ignored and not included in the test report.
+
+    After adding the fatal message, the function aborts the test case execution.
+
+    Args:
+        msg (str): The message to include in the fatal entry.
+        details (str): Optional additional details to include in the fatal entry.
+
+    Returns:
+        None
+    """
+    if __is_level_enabled(LogLevel.FATAL):
+        test.fixateResultContext(1)
+        try:
+            squish.testSettings.throwOnFailure = True
+            _test_fatal(msg, details)
+        finally:
+            test.restoreResultContext()
+
+
+
+ +
+ + +
+ + + + +

+ log + + +

+
log(msg, details='')
+
+ +
+ +

Adds a log entry with the given message and details to a test report.

+

This function adds a log message to Squish's test report at the LOG log level +or lower, depending on the current log level setting. +The log message will include the given message and details provided as arguments.

+

The log message will only be visible if the LOGLEVEL is set to LOG or lower. +Otherwise, it will be ignored and not included in the test report.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
msg + str + +
+

The message to include in the log entry.

+
+
+ required +
details + str + +
+

Optional additional details to include in the log entry.

+
+
+ '' +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
def log(msg: str, details: str = "") -> None:
+    """Adds a log entry with the given message and details to a test report.
+
+    This function adds a log message to Squish's test report at the LOG log level
+    or lower, depending on the current log level setting.
+    The log message will include the given message and details provided as arguments.
+
+    The log message will only be visible if the LOGLEVEL is set to LOG or lower.
+    Otherwise, it will be ignored and not included in the test report.
+
+    Args:
+        msg (str): The message to include in the log entry.
+        details (str): Optional additional details to include in the log entry.
+
+    Returns:
+        None
+    """
+    if __is_level_enabled(LogLevel.LOG):
+        test.fixateResultContext(1)
+        try:
+            _test_log(msg, details)
+        finally:
+            test.restoreResultContext()
+
+
+
+ +
+ + +
+ + + + +

+ section + + +

+
section(title, description='')
+
+ +
+ +

Allows using Squish's sections as context managers +https://doc.qt.io/squish/squish-api.html#test-startsection-function +Args: + title (str): Section title + description (str): Optional additional description of the section +Examples: + python + with section("Add new person"): + squish.type(squish.waitForObject(names.forename_edit), "Bob") + squish.mouseClick(squish.waitForObject(names.ok_button))

+ +
+ Source code in squape/report.py +
250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
@contextmanager
+def section(title: str, description: str = "") -> None:
+    """Allows using Squish's sections as context managers
+    https://doc.qt.io/squish/squish-api.html#test-startsection-function
+    Args:
+        title (str): Section title
+        description (str): Optional additional description of the section
+    Examples:
+        ```python
+        with section("Add new person"):
+            squish.type(squish.waitForObject(names.forename_edit), "Bob")
+            squish.mouseClick(squish.waitForObject(names.ok_button))
+        ```
+    """
+
+    test.fixateResultContext(1)
+    test.startSection(title, description)
+    test.restoreResultContext()
+    try:
+        yield
+    except Exception:
+        raise
+    finally:
+        test.endSection()
+
+
+
+ +
+ + +
+ + + + +

+ set_level + + +

+
set_level(level)
+
+ +
+ +

Sets the Squish logging level, Level must be an int or a str.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
level + int | str + +
+

log level to set

+
+
+ required +
+ + + +

Examples:

+
>>> set_level(report.LogLevel.WARNING)
+>>> set_level("FAIL")
+
+ +
+ Source code in squape/report.py +
51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
def set_level(level) -> None:
+    """Sets the Squish logging level, Level must be an int or a str.
+
+    Args:
+        level (int|str): log level to set
+
+    Examples:
+       >>> set_level(report.LogLevel.WARNING)
+       >>> set_level("FAIL")
+    """
+    global LOGLEVEL
+    LOGLEVEL = __translate_Level(level)
+
+
+
+ +
+ + +
+ + + + +

+ warning + + +

+
warning(msg, details='')
+
+ +
+ +

Adds a warning entry with the given message and details to a test report.

+

This function adds a warning message to Squish's test report at the WARNING +log level or lower, depending on the current log level setting. +The warning message will include the given message and details provided +as arguments.

+

The warning message will only be visible if the LOGLEVEL is set to WARNING or lower. +Otherwise, it will be ignored and not included in the test report.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
msg + str + +
+

The message to include in the warning entry.

+
+
+ required +
details + str + +
+

Optional additional details to include in the warning entry.

+
+
+ '' +
+ + + +

Returns:

+ + + + + + + + + + + + + +
TypeDescription
+ None + +
+

None

+
+
+ +
+ Source code in squape/report.py +
136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
def warning(msg: str, details: str = "") -> None:
+    """Adds a warning entry with the given message and details to a test report.
+
+    This function adds a warning message to Squish's test report at the WARNING
+    log level or lower, depending on the current log level setting.
+    The warning message will include the given message and details provided
+    as arguments.
+
+    The warning message will only be visible if the LOGLEVEL is set to WARNING or lower.
+    Otherwise, it will be ignored and not included in the test report.
+
+    Args:
+        msg (str): The message to include in the warning entry.
+        details (str): Optional additional details to include in the warning entry.
+
+    Returns:
+        None
+    """
+    if __is_level_enabled(LogLevel.WARNING):
+        test.fixateResultContext(1)
+        try:
+            _test_warning(msg, details)
+        finally:
+            test.restoreResultContext()
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/settings/index.html b/reference/settings/index.html new file mode 100644 index 0000000..e6413fb --- /dev/null +++ b/reference/settings/index.html @@ -0,0 +1,2500 @@ + + + + + + + + + + + + + + + + + + + + + + squape.settings - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + + +

squape.settings

+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + +

+ breakOnFailure + + +

+
breakOnFailure(enabled=True)
+
+ +
+ +

Allows using breakOnFailure test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-breakonfailure

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether to enable the debugger to stop +on every failed verification

+
+
+ True +
+ + + +

Examples:

+
with breakOnFailure():
+    # code with verifications
+
+ +
+ Source code in squape/settings.py +
319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
@contextmanager
+def breakOnFailure(enabled: bool = True) -> None:
+    """Allows using breakOnFailure test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-breakonfailure
+
+    Args:
+        enabled (bool): Whether to enable the debugger to stop
+            on every failed verification
+
+    Examples:
+        ```python
+        with breakOnFailure():
+            # code with verifications
+        ```
+    """
+    with _ctx_settings("breakOnFailure", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ defaultOcrLanguage + + +

+
defaultOcrLanguage(language)
+
+ +
+ +

Allows using defaultOcrLanguage test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-defaultocrlanguage

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
language + str + +
+

string text representing the Language to be used +for OCR Text search

+
+
+ required +
+ + + +

Examples:

+
with defaultOcrLanguage("Polish"):
+    waitForOcrText("Dom")
+    waitForOcrText("Miasto")
+
+ +
+ Source code in squape/settings.py +
299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
@contextmanager
+def defaultOcrLanguage(language: str) -> None:
+    """Allows using defaultOcrLanguage test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-defaultocrlanguage
+
+    Args:
+        language (str): string text representing the Language to be used
+            for OCR Text search
+
+    Examples:
+        ```python
+        with defaultOcrLanguage("Polish"):
+            waitForOcrText("Dom")
+            waitForOcrText("Miasto")
+        ```
+    """
+    with _ctx_settings("defaultOcrLanguage", language):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageNotFoundDebugging + + +

+
imageNotFoundDebugging(enabled)
+
+ +
+ +

Allows using imageNotFoundDebugging test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagenotfounddebugging

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether to enable debugging when image is not found.

+
+
+ required +
+ + + +

Examples:

+
with imageNotFoundDebugging(False):
+    waitForImage("image1.png")
+    waitForImage("image2.png")
+
+ +
+ Source code in squape/settings.py +
261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
@contextmanager
+def imageNotFoundDebugging(enabled: bool) -> None:
+    """Allows using imageNotFoundDebugging test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagenotfounddebugging
+
+    Args:
+        enabled (bool): Whether to enable debugging when image is not found.
+
+    Examples:
+        ```python
+        with imageNotFoundDebugging(False):
+            waitForImage("image1.png")
+            waitForImage("image2.png")
+        ```
+    """
+    with _ctx_settings("imageNotFoundDebugging", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageSearchMaxScale + + +

+
imageSearchMaxScale(max_scale)
+
+ +
+ +

Allows using imageSearchMaxScale test setting as context managers. +https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchmaxscale

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
max_scale + float + +
+

A float value indicating the maximum scale for image search.

+
+
+ required +
+ + + +

Examples:

+
with imageSearchMultiscale(), imageSearchMaxScale(150):
+    test.imagePresent("image1.png")
+    test.imagePresent("image2.png")
+
+ +
+ Source code in squape/settings.py +
204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
@contextmanager
+def imageSearchMaxScale(max_scale: float) -> None:
+    """Allows using imageSearchMaxScale test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchmaxscale
+
+    Args:
+        max_scale (float): A float value indicating the maximum scale for image search.
+
+    Examples:
+        ```python
+        with imageSearchMultiscale(), imageSearchMaxScale(150):
+            test.imagePresent("image1.png")
+            test.imagePresent("image2.png")
+        ```
+    """
+    with _ctx_settings("imageSearchMaxScale", max_scale):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageSearchMinScale + + +

+
imageSearchMinScale(min_scale)
+
+ +
+ +

Allows using imageSearchMinScale test setting as context managers. +https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchminscale

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
min_scale + float + +
+

A float value indicating the minimum scale for image search.

+
+
+ required +
+ + + +

Examples:

+
with imageSearchMultiscale(), imageSearchMinScale(75):
+    test.imagePresent("image1.png")
+    test.imagePresent("image2.png")
+
+ +
+ Source code in squape/settings.py +
185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
@contextmanager
+def imageSearchMinScale(min_scale: float) -> None:
+    """Allows using imageSearchMinScale test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchminscale
+
+    Args:
+        min_scale (float): A float value indicating the minimum scale for image search.
+
+    Examples:
+        ```python
+        with imageSearchMultiscale(), imageSearchMinScale(75):
+            test.imagePresent("image1.png")
+            test.imagePresent("image2.png")
+        ```
+    """
+    with _ctx_settings("imageSearchMinScale", min_scale):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageSearchMultiscale + + +

+
imageSearchMultiscale(enabled=True)
+
+ +
+ +

Allows using imageSearchMultiscale test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchmultiscale

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether multi-scale image search is enabled. Defaulting to True

+
+
+ True +
+ + + +

Examples:

+
with imageSearchMultiscale(), imageSearchMaxScale(150):
+    test.imagePresent("image1.png")
+    test.imagePresent("image2.png")
+
+ +
+ Source code in squape/settings.py +
166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
@contextmanager
+def imageSearchMultiscale(enabled: bool = True) -> None:
+    """Allows using imageSearchMultiscale test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchmultiscale
+
+    Args:
+        enabled (bool): Whether multi-scale image search is enabled. Defaulting to True
+
+    Examples:
+        ```python
+        with imageSearchMultiscale(), imageSearchMaxScale(150):
+            test.imagePresent("image1.png")
+            test.imagePresent("image2.png")
+        ```
+    """
+    with _ctx_settings("imageSearchMultiscale", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageSearchThreshold + + +

+
imageSearchThreshold(threshold)
+
+ +
+ +

Allows using imageSearchThreshold test setting as context managers. +https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchthreshold

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
threshold + float + +
+

the threshold for image search.

+
+
+ required +
+ + + +

Examples:

+
with imageSearchTolerant(), imageSearchThreshold(95):
+    test.imagePresent("image.png")
+
+ +
+ Source code in squape/settings.py +
148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
@contextmanager
+def imageSearchThreshold(threshold: float) -> None:
+    """Allows using imageSearchThreshold test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchthreshold
+
+    Args:
+        threshold (float): the threshold for image search.
+
+    Examples:
+        ```python
+        with imageSearchTolerant(), imageSearchThreshold(95):
+            test.imagePresent("image.png")
+        ```
+    """
+    with _ctx_settings("imageSearchThreshold", threshold):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ imageSearchTolerant + + +

+
imageSearchTolerant(enabled=True)
+
+ +
+ +

Allows using imageSearchTolerant test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchtolerant

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether image search with tolerance is enabled. +Defaulting to True.

+
+
+ True +
+ + + +

Examples:

+
with imageSearchTolerant(), imageSearchThreshold(95):
+    test.imagePresent()
+
+ +
+ Source code in squape/settings.py +
129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
@contextmanager
+def imageSearchTolerant(enabled: bool = True) -> None:
+    """Allows using imageSearchTolerant test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchtolerant
+
+    Args:
+        enabled (bool): Whether image search with tolerance is enabled.
+            Defaulting to True.
+
+    Examples:
+        ```python
+        with imageSearchTolerant(), imageSearchThreshold(95):
+            test.imagePresent()
+        ```
+    """
+    with _ctx_settings("imageSearchTolerant", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ logScreenshotOnFail + + +

+
logScreenshotOnFail(enabled=True)
+
+ +
+ +

Allows using logScreenshotOnFail test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonfail

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

A boolean value indicating whether to enable logging +of screenshots on FAIL test result. Defaulting to True.

+
+
+ True +
+ + + +

Examples:

+
with logScreenshotOnFail():
+    # code with verifications
+
+ +
+ Source code in squape/settings.py +
72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
@contextmanager
+def logScreenshotOnFail(enabled: bool = True) -> None:
+    """Allows using logScreenshotOnFail test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonfail
+
+    Args:
+        enabled (bool): A boolean value indicating whether to enable logging
+            of screenshots on FAIL test result. Defaulting to True.
+
+    Examples:
+        ```python
+        with logScreenshotOnFail():
+            # code with verifications
+        ```
+    """
+
+    with _ctx_settings("logScreenshotOnFail", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ logScreenshotOnPass + + +

+
logScreenshotOnPass(enabled=True)
+
+ +
+ +

Allows using logScreenshotOnPass test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonpass

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

A boolean value indicating whether to enable logging +of screenshots on PASS test result. Defaulting to True.

+
+
+ True +
+ + + +

Examples:

+
with logScreenshotOnPass():
+    # code with verifications
+
+ +
+ Source code in squape/settings.py +
53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
@contextmanager
+def logScreenshotOnPass(enabled: bool = True) -> None:
+    """Allows using logScreenshotOnPass test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonpass
+
+    Args:
+        enabled (bool): A boolean value indicating whether to enable logging
+            of screenshots on PASS test result. Defaulting to True.
+
+    Examples:
+        ```python
+        with logScreenshotOnPass():
+            # code with verifications
+        ```
+    """
+    with _ctx_settings("logScreenshotOnPass", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ logScreenshotOnWarning + + +

+
logScreenshotOnWarning(enabled=True)
+
+ +
+ +

Allows using logScreenshotOnWarning test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonwarning

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

A boolean value indicating whether to enable logging +of screenshots on warning log entry. Defaulting to True.

+
+
+ True +
+ + + +

Examples:

+
with logScreenshotOnWarning():
+    # code where warning messages might happen
+
+ +
+ Source code in squape/settings.py +
 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
@contextmanager
+def logScreenshotOnWarning(enabled: bool = True) -> None:
+    """Allows using logScreenshotOnWarning test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonwarning
+
+    Args:
+        enabled (bool): A boolean value indicating whether to enable logging
+            of screenshots on warning log entry. Defaulting to True.
+
+    Examples:
+        ```python
+        with logScreenshotOnWarning():
+            # code where warning messages might happen
+        ```
+    """
+    with _ctx_settings("logScreenshotOnWarning", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ objectNotFoundDebugging + + +

+
objectNotFoundDebugging(enabled)
+
+ +
+ +

Allows using objectNotFoundDebugging test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-objectnotfounddebugging

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether to enable debugging when object is not found.

+
+
+ required +
+ + + +

Examples:

+
with objectNotFoundDebugging(False):
+    waitForObject(names.obj1)
+    waitForObject(names.obj2)
+
+ +
+ Source code in squape/settings.py +
242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
@contextmanager
+def objectNotFoundDebugging(enabled: bool) -> None:
+    """Allows using objectNotFoundDebugging test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-objectnotfounddebugging
+
+    Args:
+        enabled (bool): Whether to enable debugging when object is not found.
+
+    Examples:
+        ```python
+        with objectNotFoundDebugging(False):
+            waitForObject(names.obj1)
+            waitForObject(names.obj2)
+        ```
+    """
+    with _ctx_settings("objectNotFoundDebugging", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ retryDuration + + +

+
retryDuration(duration_ms)
+
+ +
+ +

Allows using retryDuration test setting as context managers. +https://doc.qt.io/squish/squish-api.html#integer-testsettings-retryduration

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
duration_ms + int + +
+

The duration in milliseconds after which +the verification fails

+
+
+ required +
+ + + +

Examples:

+
with retryDuration(5000):
+    test.vp("VP1")
+
+ +
+ Source code in squape/settings.py +
357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
@contextmanager
+def retryDuration(duration_ms: int) -> None:
+    """Allows using retryDuration test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#integer-testsettings-retryduration
+
+    Args:
+        duration_ms (int): The duration in milliseconds after which
+            the verification fails
+
+    Examples:
+        ```python
+        with retryDuration(5000):
+            test.vp("VP1")
+        ```
+    """
+    with _ctx_settings("retryDuration", duration_ms):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ silentVerifications + + +

+
silentVerifications(enabled=True)
+
+ +
+ +

Allows using silentVerifications test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-silentverifications

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether silent verifications are enabled. Defaulting to True

+
+
+ True +
+ + + +

Examples:

+
with silentVerifications():
+    # code with test.vp statements
+
+ +
+ Source code in squape/settings.py +
111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
@contextmanager
+def silentVerifications(enabled: bool = True) -> None:
+    """Allows using silentVerifications test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-silentverifications
+
+    Args:
+        enabled (bool): Whether silent verifications are enabled. Defaulting to True
+
+    Examples:
+        ```python
+        with silentVerifications():
+            # code with test.vp statements
+        ```
+    """
+    with _ctx_settings("silentVerifications", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ textNotFoundDebugging + + +

+
textNotFoundDebugging(enabled)
+
+ +
+ +

Allows using textNotFoundDebugging test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-textnotfounddebugging

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether to enable debugging when a OCR Text is not found.

+
+
+ required +
+ + + +

Examples:

+
with textNotFoundDebugging(False):
+    waitForOcrText("Frog")
+    waitForOcrText("Alpaca")
+
+ +
+ Source code in squape/settings.py +
280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
@contextmanager
+def textNotFoundDebugging(enabled: bool) -> None:
+    """Allows using textNotFoundDebugging test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-textnotfounddebugging
+
+    Args:
+        enabled (bool): Whether to enable debugging when a OCR Text is not found.
+
+    Examples:
+        ```python
+        with textNotFoundDebugging(False):
+            waitForOcrText("Frog")
+            waitForOcrText("Alpaca")
+        ```
+    """
+    with _ctx_settings("textNotFoundDebugging", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ throwOnFailure + + +

+
throwOnFailure(enabled)
+
+ +
+ +

Allows using throwOnFailure test setting as context managers. +https://doc.qt.io/squish/squish-api.html#bool-testsettings-throwonfailure

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
enabled + bool + +
+

Whether to enable to raise a script error +on every failed verification

+
+
+ required +
+ + + +

Examples:

+
with throwOnFailure():
+    # code with verifications
+
+ +
+ Source code in squape/settings.py +
338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
@contextmanager
+def throwOnFailure(enabled: bool) -> None:
+    """Allows using throwOnFailure test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#bool-testsettings-throwonfailure
+
+    Args:
+        enabled (bool): Whether to enable to raise a script error
+            on every failed verification
+
+    Examples:
+        ```python
+        with throwOnFailure():
+            # code with verifications
+        ```
+    """
+    with _ctx_settings("throwOnFailure", enabled):
+        yield
+
+
+
+ +
+ + +
+ + + + +

+ waitForObjectTimeout + + +

+
waitForObjectTimeout(timeout_ms)
+
+ +
+ +

Allows using waitForObjectTimeout test setting as context managers. +https://doc.qt.io/squish/squish-api.html#integer-testsettings-waitforobjecttimeout

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
timeout_ms + int + +
+

A integer value indicating the timeout in ms.

+
+
+ required +
+ + + +

Examples:

+
with waitForObjectTimeout(500):
+    waitForObject(names.obj1)
+    waitForObject(names.obj2)
+
+ +
+ Source code in squape/settings.py +
223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
@contextmanager
+def waitForObjectTimeout(timeout_ms: int) -> None:
+    """Allows using waitForObjectTimeout test setting as context managers.
+    https://doc.qt.io/squish/squish-api.html#integer-testsettings-waitforobjecttimeout
+
+    Args:
+        timeout_ms (int): A integer value indicating the timeout in ms.
+
+    Examples:
+        ```python
+        with waitForObjectTimeout(500):
+            waitForObject(names.obj1)
+            waitForObject(names.obj2)
+        ```
+    """
+    with _ctx_settings("waitForObjectTimeout", timeout_ms):
+        yield
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/squishserver/index.html b/reference/squishserver/index.html new file mode 100644 index 0000000..1b9e40c --- /dev/null +++ b/reference/squishserver/index.html @@ -0,0 +1,1653 @@ + + + + + + + + + + + + + + + + + + + + + + squape.squishserver - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

squape.squishserver

+ +
+ + + + +
+ + + +
+ + + + + + + + +
+ + + + +

+ SquishServer + + +

+
SquishServer(location=None, host=None, port=None)
+
+ +
+ + +

Class to represent a local or remote squishserver

+ + + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
location + _type_ + +
+

location of the Squish package. + Defaults to the "SQUISH_PREFIX".

+
+
+ None +
host + str + +
+

host of the squishserver. + Defaults to SQUISHRUNNER_HOST if it is defined, + else "127.0.0.1".

+
+
+ None +
port + int + +
+

port of the squishserver. + Defaults to SQUISHRUNNER_PORT if it is defined, + else 4322.

+
+
+ None +
+ +
+ Source code in squape/squishserver.py +
20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
def __init__(self, location=None, host=None, port=None):
+    """Open an RemoteSystem connection to a machine with a running squishserver
+
+    Args:
+        location (_type_, optional):    location of the Squish package.
+                                        Defaults to the "SQUISH_PREFIX".
+        host (str, optional): host of the squishserver.
+                              Defaults to SQUISHRUNNER_HOST if it is defined,
+                              else "127.0.0.1".
+        port (int, optional): port of the squishserver.
+                              Defaults to SQUISHRUNNER_PORT if it is defined,
+                              else 4322.
+    """
+    if location is None:
+        try:
+            self.location = os.environ["SQUISH_PREFIX"]
+        except KeyError:
+            raise EnvironmentError(
+                "The SQUISH_PREFIX variable is not set, "
+                "and location of the squishserver "
+                f"({self.host}:{self.port}) is not specified!"
+            )
+    else:
+        self.location = location
+
+    if host is None:
+        self.host = os.environ.get("SQUISHRUNNER_HOST", "127.0.0.1")
+
+    if port is None:
+        if "SQUISHRUNNER_PORT" in os.environ:
+            self.port = int(os.environ["SQUISHRUNNER_PORT"])
+        else:
+            self.port = 4322
+
+    try:
+        self.remotesys = RemoteSystem(host, port)
+    except Exception:
+        raise SquishserverError(
+            f"Unable to connect to squishserver ({self.host}:{self.port})"
+        )
+
+
+ + + +
+ + + + + + + + + + +
+ + + + +

+ addAUT + + +

+
addAUT(aut, path)
+
+ +
+ +

Register an AUT

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the executable

+
+
+ required +
path + str + +
+

path to the executable folder

+
+
+ required +
+ +
+ Source code in squape/squishserver.py +
 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
def addAUT(self, aut: str, path: str) -> None:
+    """Register an AUT
+
+    Args:
+        aut (str): the name of the executable
+        path (str): path to the executable folder
+    """
+    log(
+        f"[Squishserver {self.host}:{self.port}] "
+        f"Registering {Path(path)/aut} AUT"
+    )
+    self._config_squishserver("addAUT", [aut, path])
+
+
+
+ +
+ + +
+ + + + +

+ addAppPath + + +

+
addAppPath(path)
+
+ +
+ +

Register an AUT path

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
path + str + +
+

the AUT path to register

+
+
+ required +
+ +
+ Source code in squape/squishserver.py +
120
+121
+122
+123
+124
+125
+126
+127
def addAppPath(self, path: str) -> None:
+    """Register an AUT path
+
+    Args:
+        path (str): the AUT path to register
+    """
+    log(f"[Squishserver {self.host}:{self.port}] " f"Registering AUT path: {path}")
+    self._config_squishserver("addAppPath", [path])
+
+
+
+ +
+ + +
+ + + + +

+ addAttachableAut + + +

+
addAttachableAut(aut, port, host='127.0.0.1')
+
+ +
+ +

Register an attachable AUT

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the attachable AUT

+
+
+ required +
port + int + +
+

port of the machine where the attachable AUT + is supposed to be running.

+
+
+ required +
host + str + +
+

host of the machine where the attachable AUT + is supposed to be running. + Defaults to "127.0.0.1".

+
+
+ '127.0.0.1' +
+ +
+ Source code in squape/squishserver.py +
141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
def addAttachableAut(self, aut: str, port: int, host: str = "127.0.0.1") -> None:
+    """Register an attachable AUT
+
+    Args:
+        aut (str): the name of the attachable AUT
+        port (int): port of the machine where the attachable AUT
+                    is supposed to be running.
+        host (str, optional):   host of the machine where the attachable AUT
+                                is supposed to be running.
+                                Defaults to "127.0.0.1".
+    """
+    log(
+        f"[Squishserver {self.host}:{self.port}] "
+        f"Registering an attachable AUT {aut}"
+    )
+    self._config_squishserver("addAttachableAUT", [aut, f"{host}:{port}"])
+
+
+
+ +
+ + +
+ + + + +

+ attachToApplication + + +

+
attachToApplication(aut)
+
+ +
+ +

Attaches to an application with given name.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the attachable AUT

+
+
+ required +
+

Returns: + (ApplicationContext): application context

+ +
+ Source code in squape/squishserver.py +
175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
def attachToApplication(self, aut: str):
+    """
+    Attaches to an application with given name.
+
+    Args:
+        aut (str): the name of the attachable AUT
+    Returns:
+        (ApplicationContext): application context
+    """
+    log(f"[Squishserver {self.host}:{self.port}] " f"Attach to application {aut}")
+    ctx = squish.attachToApplication(aut, self.host, self.port)
+    return ctx
+
+
+
+ +
+ + +
+ + + + +

+ removeAUT + + +

+
removeAUT(aut, path)
+
+ +
+ +

Remove registered AUT

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the executable

+
+
+ required +
path + str + +
+

path to the executable folder

+
+
+ required +
+ +
+ Source code in squape/squishserver.py +
107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
def removeAUT(self, aut: str, path: str) -> None:
+    """Remove registered AUT
+
+    Args:
+        aut (str): the name of the executable
+        path (str): path to the executable folder
+    """
+    log(
+        f"[Squishserver {self.host}:{self.port}] "
+        f"Removing registered {Path(path)/aut} AUT"
+    )
+    self._config_squishserver("removeAUT", [aut, path])
+
+
+
+ +
+ + +
+ + + + +

+ removeAppPath + + +

+
removeAppPath(path)
+
+ +
+ +

Remove a registered AUT path

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
path + str + +
+

the path to the AUT

+
+
+ required +
+ +
+ Source code in squape/squishserver.py +
129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
def removeAppPath(self, path: str) -> None:
+    """Remove a registered AUT path
+
+    Args:
+        path (str): the path to the AUT
+    """
+    log(
+        f"[Squishserver {self.host}:{self.port}] "
+        f"Removing registered AUT path: {path}"
+    )
+    self._config_squishserver("removeAppPath", [path])
+
+
+
+ +
+ + +
+ + + + +

+ removeAttachableAut + + +

+
removeAttachableAut(aut, port, host='127.0.0.1')
+
+ +
+ +

Remove registered attachable AUT

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the attachable AUT

+
+
+ required +
port + int + +
+

port of the machine where the attachable AUT + is supposed to be running.

+
+
+ required +
host + str + +
+

host of the machine where the attachable AUT + is supposed to be running. + Defaults to "127.0.0.1".

+
+
+ '127.0.0.1' +
+ +
+ Source code in squape/squishserver.py +
158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
def removeAttachableAut(self, aut: str, port: int, host: str = "127.0.0.1") -> None:
+    """Remove registered attachable AUT
+
+    Args:
+        aut (str): the name of the attachable AUT
+        port (int): port of the machine where the attachable AUT
+                    is supposed to be running.
+        host (str, optional):   host of the machine where the attachable AUT
+                                is supposed to be running.
+                                Defaults to "127.0.0.1".
+    """
+    log(
+        f"[Squishserver {self.host}:{self.port}] "
+        f"Removing registered attachable AUT {aut}"
+    )
+    self._config_squishserver("removeAttachableAUT", [aut, f"{host}:{port}"])
+
+
+
+ +
+ + +
+ + + + +

+ startApplication + + +

+
startApplication(aut)
+
+ +
+ +

Starts to an application with given name.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
aut + str + +
+

the name of the mapped AUT

+
+
+ required +
+

Returns: + (ApplicationContext): application context

+ +
+ Source code in squape/squishserver.py +
188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
def startApplication(self, aut: str):
+    """
+    Starts to an application with given name.
+
+    Args:
+        aut (str): the name of the mapped AUT
+    Returns:
+        (ApplicationContext): application context
+    """
+    log(f"[Squishserver {self.host}:{self.port}] " f"Start an application {aut}")
+    ctx = squish.startApplication(aut, self.host, self.port)
+    return ctx
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/video/index.html b/reference/video/index.html new file mode 100644 index 0000000..228365c --- /dev/null +++ b/reference/video/index.html @@ -0,0 +1,804 @@ + + + + + + + + + + + + + + + + + + + + + + squape.video - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

squape.video

+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + +

+ remove_videos_on_success + + +

+
remove_videos_on_success()
+
+ +
+ +

Remove all captured videos when the execution was successful (no failures)

+
+

Warning

+

Removing videos on success does not work with Squish 7.1.1 and below +when execution is triggered outside the Squish IDE.

+
+ +
+ Source code in squape/video.py +
131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
def remove_videos_on_success() -> None:
+    """
+    Remove all captured videos when the execution was successful (no failures)
+
+    !!! warning
+        Removing videos on success does not work with Squish 7.1.1 and below
+        when execution is triggered outside the Squish IDE.
+    """
+    if _failure_results_count() == 0:
+        videos_to_remove = _videos_set()
+        _replace_videos(videos_to_remove)
+
+
+
+ +
+ + +
+ + + + +

+ video_capture + + +

+
video_capture(message='', remove_on_success=False)
+
+ +
+ +

Allows using Squish's video capture as context managers. +https://doc.qt.io/squish/squish-api.html#test-startvideocapture-message +Optionally (when the execution was successful) replace captured video +with a tiny placeholder video to save test results size.

+
+

Warning

+

Removing videos on success does not work with Squish 7.1.1 and below +when execution is triggered outside the Squish IDE.

+
+

Args: + message (str): log a video n the test report using the specified message. + Defaulting to empty string. + remove_on_success (bool): Whether to replace captured video + when there were no failures. Defaulting to False.

+ + + +

Examples:

+
with video_capture(remove_on_success=True):
+    # code with actions and verifications
+
+ +
+ Source code in squape/video.py +
 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
@contextmanager
+def video_capture(message: str = "", remove_on_success: bool = False) -> None:
+    """Allows using Squish's video capture as context managers.
+    https://doc.qt.io/squish/squish-api.html#test-startvideocapture-message
+    Optionally (when the execution was successful) replace captured video
+    with a tiny placeholder video to save test results size.
+
+    !!! warning
+        Removing videos on success does not work with Squish 7.1.1 and below
+        when execution is triggered outside the Squish IDE.
+    Args:
+        message (str): log a video n the test report using the specified message.
+            Defaulting to empty string.
+        remove_on_success (bool): Whether to replace captured video
+            when there were no failures. Defaulting to False.
+
+    Examples:
+        ```python
+        with video_capture(remove_on_success=True):
+            # code with actions and verifications
+        ```
+    """
+
+    if remove_on_success:
+        initial_videos = _videos_set()
+        initial_result_count = _failure_results_count()
+
+    test.startVideoCapture(message)
+
+    try:
+        yield
+    except Exception:
+        raise
+    finally:
+        test.stopVideoCapture(message)
+
+        if remove_on_success:
+            new_failures = _failure_results_count() - initial_result_count
+            if new_failures == 0:
+                new_videos = _videos_set() - initial_videos
+                _replace_videos(new_videos)
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/vps/index.html b/reference/vps/index.html new file mode 100644 index 0000000..71b122b --- /dev/null +++ b/reference/vps/index.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + + + + + + + + squape.vps - SQUAPE - Squish API Python Extension + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

squape.vps

+ +
+ + + + +
+ + + +
+ + + + + + + + + + +
+ + + + +

+ vph_property + + +

+
vph_property(object_or_name, property_name, expected_value, msg)
+
+ +
+ +

"Highlights the object then verifies its property. +The object remains highlighted during verification to make it easier to identify +on potential screenshots.

+ + + +

Parameters:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionDefault
object_or_name + any + +
+

symbolic name, real name, or object reference

+
+
+ required +
property_name + str + +
+

name of the property to verify

+
+
+ required +
expected_value + any + +
+

expected value of the verified property

+
+
+ required +
msg + str + +
+

verification message

+
+
+ required +
+

Returns: + True if verification is positive, False otherwise

+ +
+ Source code in squape/vps.py +
18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
def vph_property(
+    object_or_name: any, property_name: str, expected_value: any, msg: str
+) -> bool:
+    """ "Highlights the object then verifies its property.
+    The object remains highlighted during verification to make it easier to identify
+    on potential screenshots.
+
+    Args:
+        object_or_name (any): symbolic name, real name, or object reference
+        property_name (str): name of the property to verify
+        expected_value (any): expected value of the verified property
+        msg (str): verification message
+    Returns:
+        True if verification is positive, False otherwise
+    """
+
+    obj = squish.waitForObjectExists(object_or_name)
+    property_value = operator.attrgetter(property_name)(obj)
+    squish.highlightObject(obj, 200, False)
+    result = test.compare(property_value, expected_value, msg)
+    time.sleep(0.200)
+    return result
+
+
+
+ +
+ + + +
+ +
+ +
+ + + + + + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..5ec4c19 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Squape","text":""},{"location":"#squape-squish-api-python-extension","title":"SQUAPE - Squish API Python Extension","text":"

Python package that extends Squish Python API. It provides tools for everyday automated test cases development.

"},{"location":"#requirements","title":"Requirements","text":"

The minimal requirement for the SQUAPE package is Squish version 6.7.0. Individual features may require a more recent Squish package.

"},{"location":"#installation","title":"Installation","text":"

The package is available on the Python Package Index (PyPI). You can install it via pip with the following commands:

pip install squape\n
"},{"location":"#content","title":"Content","text":"

The package consists of several modules:

  • object_tree - seamless object tree navigation and search capabilities
  • report - adds features to enhance the reporting capabilities of Squish
  • settings - makes using various test settings easier and cleaner
  • squishserver - managing squishservers and (un)registering AUTs
  • video - adds features to enhance video capture capabilities of Squish
  • vps - extension of Squish verification points
"},{"location":"#contribution","title":"Contribution","text":"

The package is created and maintained by Cyber Alpaca Pull requests for any issues are welcome. In case where you would like to introduce a new feature or a major change, please open an issue first and discuss it with our team.

"},{"location":"#license","title":"License","text":"

The packages are available under The 3-Clause BSD License

"},{"location":"#references","title":"References","text":"
  • Squish by the Qt Group
"},{"location":"reference/object_tree/","title":"squape.object_tree","text":""},{"location":"reference/object_tree/#squape.object_tree.children","title":"children","text":"
children(object_or_name, selector)\n

Finds direct children of the given object.

Parameters:

Name Type Description Default object_or_name any

symbolic name, real name, or object reference.

required selector dict

The selector is a dictionary of key-value pairs, where a key is a property of an object, and value is expected value. An object will pass verification if the object's property value matches the selector value. Selectors may include functions. The passed functions must accept exactly one argument.

required

Returns:

Type Description tuple

Children objects that met the selector criteria.

Examples:

children(object_or_name, {'type' : QToolButton, 'height': 50})\nchildren(object_or_name, {'type' : 'Button', 'visible' : True})\nchildren(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})\n\ndef height_filter_function(height: int) -> bool:\n    return height > 30 and height < 120\nchildren(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : height_filter_function}\n)\n
Source code in squape/object_tree.py
def children(object_or_name: any, selector: dict) -> tuple:\n\"\"\"\n    Finds direct children of the given object.\n\n    Args:\n        object_or_name (any): symbolic name, real name, or object reference.\n\n        selector (dict): The selector is a dictionary of key-value pairs,\n            where a key is a property of an object, and value is expected value.\n            An object will pass verification\n            if the object's property value matches the selector value.\n            Selectors may include functions.\n            The passed functions must accept exactly one argument.\n\n    Returns:\n        Children objects that met the selector criteria.\n\n    Examples:\n        ```python\n        children(object_or_name, {'type' : QToolButton, 'height': 50})\n        children(object_or_name, {'type' : 'Button', 'visible' : True})\n        children(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})\n\n        def height_filter_function(height: int) -> bool:\n            return height > 30 and height < 120\n        children(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : height_filter_function}\n        )\n        ```\n    \"\"\"\n    object_reference = _get_object_reference(object_or_name)\n    children = object.children(object_reference)\n    return tuple(filter(lambda x: _is_matching(x, selector), children))\n
"},{"location":"reference/object_tree/#squape.object_tree.find","title":"find","text":"
find(object_or_name, selector=None, max_depth=None)\n

Finds descendants of the given object.

Parameters:

Name Type Description Default object_or_name any

symbolic name, real name, or object reference.

required selector dict

The selector is a dictionary of key-value pairs, where a key is a property of an object, and value is expected value. An object will pass verification if the object's property value matches the selector value. Selectors may include functions. The passed functions must accept exactly one argument. Defaults to {}, which means all objects pass the verification.

None max_depth int

defines maximum depth in the object structure that should be while looking for children. Defaults to None, which mean there is no depth limit.

None

Returns:

Type Description tuple

Descendants of the given object that met the selector criteria.

Examples:

find(object_or_name)\nfind(object_or_name, {'type' : 'ToolBar'})\nfind(object_or_name, max_depth=5)\nfind(object_or_name, {'visible' : True}, max_depth=3)\nfind(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : lambda x: x > 25},\n    max_depth=5\n)\n\ndef height_filter_function(height: int) -> bool:\n    return height > 30 and height < 120\nfind(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : height_filter_function}\n)\n
Source code in squape/object_tree.py
def find(object_or_name: any, selector: dict = None, max_depth: int = None) -> tuple:\n\"\"\"\n    Finds descendants of the given object.\n\n    Args:\n        object_or_name (any): symbolic name, real name, or object reference.\n\n        selector (dict, optional): The selector is a dictionary of key-value pairs,\n            where a key is a property of an object, and value is expected value.\n            An object will pass verification\n            if the object's property value matches the selector value.\n            Selectors may include functions.\n            The passed functions must accept exactly one argument.\n            Defaults to {}, which means all objects pass the verification.\n\n        max_depth (int): defines maximum depth in the object structure that should be\n            while looking for children.\n            Defaults to None, which mean there is no depth limit.\n\n    Returns:\n        Descendants of the given object that met the selector criteria.\n\n    Examples:\n        ```python\n        find(object_or_name)\n        find(object_or_name, {'type' : 'ToolBar'})\n        find(object_or_name, max_depth=5)\n        find(object_or_name, {'visible' : True}, max_depth=3)\n        find(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : lambda x: x > 25},\n            max_depth=5\n        )\n\n        def height_filter_function(height: int) -> bool:\n            return height > 30 and height < 120\n        find(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : height_filter_function}\n        )\n        ```\n    \"\"\"\n    if max_depth is None:\n        max_depth = math.inf\n    if max_depth <= 0:\n        return ()\n    if selector is None:\n        selector = {}\n\n    object_reference = _get_object_reference(object_or_name)\n    children = ()\n\n    for child in object.children(object_reference):\n        if _is_matching(child, selector):\n            children += (child,)\n        children += find(child, selector, max_depth - 1)\n\n    return children\n
"},{"location":"reference/object_tree/#squape.object_tree.find_ancestor","title":"find_ancestor","text":"
find_ancestor(object_or_name, selector)\n

Find the first object's ancestor that matches the selector.

Parameters:

Name Type Description Default object_or_name any

symbolic name, real name, or object reference.

required selector dict

The selector is a dictionary of key-value pairs, where a key is a property of an object, and value is expected value. An object will pass verification if the object's property value matches the selector value. Selectors may include functions. The passed functions must accept exactly one argument.

required

Returns:

Type Description Squish object / None

The ancestor object that matches the selector.

Examples:

find_ancestor(object_or_name)\nfind_ancestor(object_or_name, {'type' : 'MyContainerType'})\nfind_ancestor(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : lambda x: x > 25}\n)\n\ndef height_filter_function(height: int) -> bool:\n    return height > 30 and height < 120\nfind_ancestor(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : height_filter_function}\n)\n
Source code in squape/object_tree.py
def find_ancestor(object_or_name: any, selector: dict):\n\"\"\"\n    Find the first object's ancestor that matches the selector.\n\n    Args:\n        object_or_name (any): symbolic name, real name, or object reference.\n\n        selector (dict): The selector is a dictionary of key-value pairs,\n            where a key is a property of an object, and value is expected value.\n            An object will pass verification\n            if the object's property value matches the selector value.\n            Selectors may include functions.\n            The passed functions must accept exactly one argument.\n\n    Returns:\n        (Squish object / None): The ancestor object that matches the selector.\n\n    Examples:\n        ```python\n        find_ancestor(object_or_name)\n        find_ancestor(object_or_name, {'type' : 'MyContainerType'})\n        find_ancestor(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : lambda x: x > 25}\n        )\n\n        def height_filter_function(height: int) -> bool:\n            return height > 30 and height < 120\n        find_ancestor(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : height_filter_function}\n        )\n        ```\n    \"\"\"\n    object_reference = _get_object_reference(object_or_name)\n    parent = object.parent(object_reference)\n\n    if parent is None:\n        return None\n\n    if _is_matching(object.parent(object_reference), selector):\n        return parent\n\n    return find_ancestor(parent, selector)\n
"},{"location":"reference/object_tree/#squape.object_tree.siblings","title":"siblings","text":"
siblings(object_or_name, selector=None)\n

Find the object's siblings.

Parameters:

Name Type Description Default object_or_name any

symbolic name, real name, or object reference.

required selector dict

The selector is a dictionary of key-value pairs, where a key is a property of an object, and value is expected value. An object will pass verification if the object's property value matches the selector value. Selectors may include functions. The passed functions must accept exactly one argument. Defaults to {}, which means all objects pass the verification.

None

Returns:

Type Description tuple

Siblings of the given object that met the selector criteria.

Examples:

siblings(object)\nsiblings(object, {'enabled' : True})\nsiblings(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})\n\ndef height_filter_function(height: int) -> bool:\n    return height > 30 and height < 120\nsiblings(\n    object_or_name,\n    {'type' : 'QToolButton', 'height' : height_filter_function}\n)\n
Source code in squape/object_tree.py
def siblings(object_or_name: any, selector: dict = None) -> tuple:\n\"\"\"\n    Find the object's siblings.\n\n    Args:\n        object_or_name (any): symbolic name, real name, or object reference.\n\n        selector (dict, optional): The selector is a dictionary of key-value pairs,\n            where a key is a property of an object, and value is expected value.\n            An object will pass verification\n            if the object's property value matches the selector value.\n            Selectors may include functions.\n            The passed functions must accept exactly one argument.\n            Defaults to {}, which means all objects pass the verification.\n\n    Returns:\n        Siblings of the given object that met the selector criteria.\n\n    Examples:\n        ```python\n        siblings(object)\n        siblings(object, {'enabled' : True})\n        siblings(object_or_name, {'type' : 'QToolButton', 'height' : lambda x: x > 25})\n\n        def height_filter_function(height: int) -> bool:\n            return height > 30 and height < 120\n        siblings(\n            object_or_name,\n            {'type' : 'QToolButton', 'height' : height_filter_function}\n        )\n        ```\n    \"\"\"\n    if selector is None:\n        selector = {}\n    object_reference = _get_object_reference(object_or_name)\n    parent = object.parent(object_reference)\n\n    if parent is None:\n        return None\n    else:\n        siblings = list(object.children(parent))\n        siblings.remove(object_reference)\n        return tuple(filter(lambda x: _is_matching(x, selector), siblings))\n
"},{"location":"reference/report/","title":"squape.report","text":""},{"location":"reference/report/#squape.report.debug","title":"debug","text":"
debug(msg, details='')\n

Adds a DEBUG-level log entry with the given message and details to a test report.

This function adds a log message to Squish's test report at the DEBUG log level, which allows for detailed debugging information to be recorded. The log message will include the given message and details provided as arguments. The message will be prefixed with the string 'DEBUG: ' to indicate its log level.

The log message will only be visible if the LOGLEVEL is set to DEBUG. Otherwise, it will be ignored and not included in the test report.

Parameters:

Name Type Description Default msg str

The message to include in the log entry.

required details str

Optional additional details to include in the log entry.

''

Returns:

Type Description None

None

Source code in squape/report.py
def debug(msg: str, details: str = \"\") -> None:\n\"\"\"Adds a DEBUG-level log entry with the given message and details to a test report.\n\n    This function adds a log message to Squish's test report at the DEBUG log level,\n    which allows for detailed debugging information to be recorded.\n    The log message will include the given message and details provided as arguments.\n    The message will be prefixed with the string 'DEBUG: ' to indicate its log level.\n\n    The log message will only be visible if the LOGLEVEL is set to DEBUG.\n    Otherwise, it will be ignored and not included in the test report.\n\n    Args:\n        msg (str): The message to include in the log entry.\n        details (str): Optional additional details to include in the log entry.\n\n    Returns:\n        None\n    \"\"\"\n    if __is_level_enabled(LogLevel.DEBUG):\n        test.fixateResultContext(1)\n        try:\n            _test_log(f\"[DEBUG] {msg}\", details)\n        finally:\n            test.restoreResultContext()\n
"},{"location":"reference/report/#squape.report.enable_loglevel_in_test_module","title":"enable_loglevel_in_test_module","text":"
enable_loglevel_in_test_module()\n

Adds support for log levels to the Squish 'test' module.

Warning

This function uses monkey pathching https://en.wikipedia.org/wiki/Monkey_patch

This function overwrites some of the existing functions in the 'test' module to support logging at different log levels. Furthermore, it enhances the functionality of the 'test' module by adding a new test.debug(...) function.

By default, the 'test' module does not support LOGLEVEL at all. However, this function adds support for setting the log level to a higher or lower level, depending on the needs of the developer.

After calling this function, the following 'test' module's functions will support LOGLEVEL report setting: - test.debug(...) - test.log(...) - test.warning(...) - test.fail(...) - test.fatal(...)

Returns:

Type Description None

None

Source code in squape/report.py
def enable_loglevel_in_test_module() -> None:\n\"\"\"Adds support for log levels to the Squish 'test' module.\n\n    !!! warning\n        This function uses monkey pathching\n        https://en.wikipedia.org/wiki/Monkey_patch\n\n    This function overwrites some of the existing functions in the 'test' module\n    to support logging at different log levels.\n    Furthermore, it enhances the functionality of the 'test' module by adding\n    a new test.debug(...) function.\n\n    By default, the 'test' module does not support LOGLEVEL at all.\n    However, this function adds support for setting the log level to a higher\n    or lower level, depending on the needs of the developer.\n\n    After calling this function, the following 'test' module's functions will support\n    LOGLEVEL report setting:\n    - test.debug(...)\n    - test.log(...)\n    - test.warning(...)\n    - test.fail(...)\n    - test.fatal(...)\n\n    Returns:\n        None\n    \"\"\"\n    test.debug = debug\n    test.log = log\n    test.warning = warning\n    test.fail = fail\n    test.fatal = fatal\n
"},{"location":"reference/report/#squape.report.fail","title":"fail","text":"
fail(msg, details='')\n

Adds a fail entry with the given message and details to a test report.

This function adds a fail message to Squish's test report at the FAIL log level or lower, depending on the current log level setting. The fail message will include the given message and details provided as arguments.

The fail message will only be visible if the LOGLEVEL is set to FAIL or lower. Otherwise, it will be ignored and not included in the test report.

Parameters:

Name Type Description Default msg str

The message to include in the fail entry.

required details str

Optional additional details to include in the fail entry.

''

Returns:

Type Description None

None

Source code in squape/report.py
def fail(msg: str, details: str = \"\") -> None:\n\"\"\"Adds a fail entry with the given message and details to a test report.\n\n    This function adds a fail message to Squish's test report at the FAIL log level\n    or lower, depending on the current log level setting.\n    The fail message will include the given message and details provided as arguments.\n\n    The fail message will only be visible if the LOGLEVEL is set to FAIL or lower.\n    Otherwise, it will be ignored and not included in the test report.\n\n    Args:\n        msg (str): The message to include in the fail entry.\n        details (str): Optional additional details to include in the fail entry.\n\n    Returns:\n        None\n    \"\"\"\n    if __is_level_enabled(LogLevel.FAIL):\n        test.fixateResultContext(1)\n        try:\n            _test_fail(msg, details)\n        finally:\n            test.restoreResultContext()\n
"},{"location":"reference/report/#squape.report.fatal","title":"fatal","text":"
fatal(msg, details='')\n

Adds a fatal entry with the given message and details to a test report, then aborts the test case execution.

This function adds a fatal message to Squish's test report at the FATAL log level or lower, depending on the current log level setting. The fatal message will include the given message and details provided as arguments.

The fatal message will only be visible if the LOGLEVEL is set to FATAL or lower. Otherwise, it will be ignored and not included in the test report.

After adding the fatal message, the function aborts the test case execution.

Parameters:

Name Type Description Default msg str

The message to include in the fatal entry.

required details str

Optional additional details to include in the fatal entry.

''

Returns:

Type Description None

None

Source code in squape/report.py
def fatal(msg: str, details: str = \"\") -> None:\n\"\"\"Adds a fatal entry with the given message and details to a test report,\n    then aborts the test case execution.\n\n    This function adds a fatal message to Squish's test report at the FATAL log level\n    or lower, depending on the current log level setting.\n    The fatal message will include the given message and details provided as arguments.\n\n    The fatal message will only be visible if the LOGLEVEL is set to FATAL or lower.\n    Otherwise, it will be ignored and not included in the test report.\n\n    After adding the fatal message, the function aborts the test case execution.\n\n    Args:\n        msg (str): The message to include in the fatal entry.\n        details (str): Optional additional details to include in the fatal entry.\n\n    Returns:\n        None\n    \"\"\"\n    if __is_level_enabled(LogLevel.FATAL):\n        test.fixateResultContext(1)\n        try:\n            squish.testSettings.throwOnFailure = True\n            _test_fatal(msg, details)\n        finally:\n            test.restoreResultContext()\n
"},{"location":"reference/report/#squape.report.log","title":"log","text":"
log(msg, details='')\n

Adds a log entry with the given message and details to a test report.

This function adds a log message to Squish's test report at the LOG log level or lower, depending on the current log level setting. The log message will include the given message and details provided as arguments.

The log message will only be visible if the LOGLEVEL is set to LOG or lower. Otherwise, it will be ignored and not included in the test report.

Parameters:

Name Type Description Default msg str

The message to include in the log entry.

required details str

Optional additional details to include in the log entry.

''

Returns:

Type Description None

None

Source code in squape/report.py
def log(msg: str, details: str = \"\") -> None:\n\"\"\"Adds a log entry with the given message and details to a test report.\n\n    This function adds a log message to Squish's test report at the LOG log level\n    or lower, depending on the current log level setting.\n    The log message will include the given message and details provided as arguments.\n\n    The log message will only be visible if the LOGLEVEL is set to LOG or lower.\n    Otherwise, it will be ignored and not included in the test report.\n\n    Args:\n        msg (str): The message to include in the log entry.\n        details (str): Optional additional details to include in the log entry.\n\n    Returns:\n        None\n    \"\"\"\n    if __is_level_enabled(LogLevel.LOG):\n        test.fixateResultContext(1)\n        try:\n            _test_log(msg, details)\n        finally:\n            test.restoreResultContext()\n
"},{"location":"reference/report/#squape.report.section","title":"section","text":"
section(title, description='')\n

Allows using Squish's sections as context managers https://doc.qt.io/squish/squish-api.html#test-startsection-function Args: title (str): Section title description (str): Optional additional description of the section Examples: python with section(\"Add new person\"): squish.type(squish.waitForObject(names.forename_edit), \"Bob\") squish.mouseClick(squish.waitForObject(names.ok_button))

Source code in squape/report.py
@contextmanager\ndef section(title: str, description: str = \"\") -> None:\n\"\"\"Allows using Squish's sections as context managers\n    https://doc.qt.io/squish/squish-api.html#test-startsection-function\n    Args:\n        title (str): Section title\n        description (str): Optional additional description of the section\n    Examples:\n        ```python\n        with section(\"Add new person\"):\n            squish.type(squish.waitForObject(names.forename_edit), \"Bob\")\n            squish.mouseClick(squish.waitForObject(names.ok_button))\n        ```\n    \"\"\"\n\n    test.fixateResultContext(1)\n    test.startSection(title, description)\n    test.restoreResultContext()\n    try:\n        yield\n    except Exception:\n        raise\n    finally:\n        test.endSection()\n
"},{"location":"reference/report/#squape.report.set_level","title":"set_level","text":"
set_level(level)\n

Sets the Squish logging level, Level must be an int or a str.

Parameters:

Name Type Description Default level int | str

log level to set

required

Examples:

>>> set_level(report.LogLevel.WARNING)\n>>> set_level(\"FAIL\")\n
Source code in squape/report.py
def set_level(level) -> None:\n\"\"\"Sets the Squish logging level, Level must be an int or a str.\n\n    Args:\n        level (int|str): log level to set\n\n    Examples:\n       >>> set_level(report.LogLevel.WARNING)\n       >>> set_level(\"FAIL\")\n    \"\"\"\n    global LOGLEVEL\n    LOGLEVEL = __translate_Level(level)\n
"},{"location":"reference/report/#squape.report.warning","title":"warning","text":"
warning(msg, details='')\n

Adds a warning entry with the given message and details to a test report.

This function adds a warning message to Squish's test report at the WARNING log level or lower, depending on the current log level setting. The warning message will include the given message and details provided as arguments.

The warning message will only be visible if the LOGLEVEL is set to WARNING or lower. Otherwise, it will be ignored and not included in the test report.

Parameters:

Name Type Description Default msg str

The message to include in the warning entry.

required details str

Optional additional details to include in the warning entry.

''

Returns:

Type Description None

None

Source code in squape/report.py
def warning(msg: str, details: str = \"\") -> None:\n\"\"\"Adds a warning entry with the given message and details to a test report.\n\n    This function adds a warning message to Squish's test report at the WARNING\n    log level or lower, depending on the current log level setting.\n    The warning message will include the given message and details provided\n    as arguments.\n\n    The warning message will only be visible if the LOGLEVEL is set to WARNING or lower.\n    Otherwise, it will be ignored and not included in the test report.\n\n    Args:\n        msg (str): The message to include in the warning entry.\n        details (str): Optional additional details to include in the warning entry.\n\n    Returns:\n        None\n    \"\"\"\n    if __is_level_enabled(LogLevel.WARNING):\n        test.fixateResultContext(1)\n        try:\n            _test_warning(msg, details)\n        finally:\n            test.restoreResultContext()\n
"},{"location":"reference/settings/","title":"squape.settings","text":""},{"location":"reference/settings/#squape.settings.breakOnFailure","title":"breakOnFailure","text":"
breakOnFailure(enabled=True)\n

Allows using breakOnFailure test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-breakonfailure

Parameters:

Name Type Description Default enabled bool

Whether to enable the debugger to stop on every failed verification

True

Examples:

with breakOnFailure():\n    # code with verifications\n
Source code in squape/settings.py
@contextmanager\ndef breakOnFailure(enabled: bool = True) -> None:\n\"\"\"Allows using breakOnFailure test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-breakonfailure\n\n    Args:\n        enabled (bool): Whether to enable the debugger to stop\n            on every failed verification\n\n    Examples:\n        ```python\n        with breakOnFailure():\n            # code with verifications\n        ```\n    \"\"\"\n    with _ctx_settings(\"breakOnFailure\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.defaultOcrLanguage","title":"defaultOcrLanguage","text":"
defaultOcrLanguage(language)\n

Allows using defaultOcrLanguage test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-defaultocrlanguage

Parameters:

Name Type Description Default language str

string text representing the Language to be used for OCR Text search

required

Examples:

with defaultOcrLanguage(\"Polish\"):\n    waitForOcrText(\"Dom\")\n    waitForOcrText(\"Miasto\")\n
Source code in squape/settings.py
@contextmanager\ndef defaultOcrLanguage(language: str) -> None:\n\"\"\"Allows using defaultOcrLanguage test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-defaultocrlanguage\n\n    Args:\n        language (str): string text representing the Language to be used\n            for OCR Text search\n\n    Examples:\n        ```python\n        with defaultOcrLanguage(\"Polish\"):\n            waitForOcrText(\"Dom\")\n            waitForOcrText(\"Miasto\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"defaultOcrLanguage\", language):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageNotFoundDebugging","title":"imageNotFoundDebugging","text":"
imageNotFoundDebugging(enabled)\n

Allows using imageNotFoundDebugging test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagenotfounddebugging

Parameters:

Name Type Description Default enabled bool

Whether to enable debugging when image is not found.

required

Examples:

with imageNotFoundDebugging(False):\n    waitForImage(\"image1.png\")\n    waitForImage(\"image2.png\")\n
Source code in squape/settings.py
@contextmanager\ndef imageNotFoundDebugging(enabled: bool) -> None:\n\"\"\"Allows using imageNotFoundDebugging test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagenotfounddebugging\n\n    Args:\n        enabled (bool): Whether to enable debugging when image is not found.\n\n    Examples:\n        ```python\n        with imageNotFoundDebugging(False):\n            waitForImage(\"image1.png\")\n            waitForImage(\"image2.png\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageNotFoundDebugging\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageSearchMaxScale","title":"imageSearchMaxScale","text":"
imageSearchMaxScale(max_scale)\n

Allows using imageSearchMaxScale test setting as context managers. https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchmaxscale

Parameters:

Name Type Description Default max_scale float

A float value indicating the maximum scale for image search.

required

Examples:

with imageSearchMultiscale(), imageSearchMaxScale(150):\n    test.imagePresent(\"image1.png\")\n    test.imagePresent(\"image2.png\")\n
Source code in squape/settings.py
@contextmanager\ndef imageSearchMaxScale(max_scale: float) -> None:\n\"\"\"Allows using imageSearchMaxScale test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchmaxscale\n\n    Args:\n        max_scale (float): A float value indicating the maximum scale for image search.\n\n    Examples:\n        ```python\n        with imageSearchMultiscale(), imageSearchMaxScale(150):\n            test.imagePresent(\"image1.png\")\n            test.imagePresent(\"image2.png\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageSearchMaxScale\", max_scale):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageSearchMinScale","title":"imageSearchMinScale","text":"
imageSearchMinScale(min_scale)\n

Allows using imageSearchMinScale test setting as context managers. https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchminscale

Parameters:

Name Type Description Default min_scale float

A float value indicating the minimum scale for image search.

required

Examples:

with imageSearchMultiscale(), imageSearchMinScale(75):\n    test.imagePresent(\"image1.png\")\n    test.imagePresent(\"image2.png\")\n
Source code in squape/settings.py
@contextmanager\ndef imageSearchMinScale(min_scale: float) -> None:\n\"\"\"Allows using imageSearchMinScale test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchminscale\n\n    Args:\n        min_scale (float): A float value indicating the minimum scale for image search.\n\n    Examples:\n        ```python\n        with imageSearchMultiscale(), imageSearchMinScale(75):\n            test.imagePresent(\"image1.png\")\n            test.imagePresent(\"image2.png\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageSearchMinScale\", min_scale):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageSearchMultiscale","title":"imageSearchMultiscale","text":"
imageSearchMultiscale(enabled=True)\n

Allows using imageSearchMultiscale test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchmultiscale

Parameters:

Name Type Description Default enabled bool

Whether multi-scale image search is enabled. Defaulting to True

True

Examples:

with imageSearchMultiscale(), imageSearchMaxScale(150):\n    test.imagePresent(\"image1.png\")\n    test.imagePresent(\"image2.png\")\n
Source code in squape/settings.py
@contextmanager\ndef imageSearchMultiscale(enabled: bool = True) -> None:\n\"\"\"Allows using imageSearchMultiscale test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchmultiscale\n\n    Args:\n        enabled (bool): Whether multi-scale image search is enabled. Defaulting to True\n\n    Examples:\n        ```python\n        with imageSearchMultiscale(), imageSearchMaxScale(150):\n            test.imagePresent(\"image1.png\")\n            test.imagePresent(\"image2.png\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageSearchMultiscale\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageSearchThreshold","title":"imageSearchThreshold","text":"
imageSearchThreshold(threshold)\n

Allows using imageSearchThreshold test setting as context managers. https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchthreshold

Parameters:

Name Type Description Default threshold float

the threshold for image search.

required

Examples:

with imageSearchTolerant(), imageSearchThreshold(95):\n    test.imagePresent(\"image.png\")\n
Source code in squape/settings.py
@contextmanager\ndef imageSearchThreshold(threshold: float) -> None:\n\"\"\"Allows using imageSearchThreshold test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#number-testsettings-imagesearchthreshold\n\n    Args:\n        threshold (float): the threshold for image search.\n\n    Examples:\n        ```python\n        with imageSearchTolerant(), imageSearchThreshold(95):\n            test.imagePresent(\"image.png\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageSearchThreshold\", threshold):\n        yield\n
"},{"location":"reference/settings/#squape.settings.imageSearchTolerant","title":"imageSearchTolerant","text":"
imageSearchTolerant(enabled=True)\n

Allows using imageSearchTolerant test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchtolerant

Parameters:

Name Type Description Default enabled bool

Whether image search with tolerance is enabled. Defaulting to True.

True

Examples:

with imageSearchTolerant(), imageSearchThreshold(95):\n    test.imagePresent()\n
Source code in squape/settings.py
@contextmanager\ndef imageSearchTolerant(enabled: bool = True) -> None:\n\"\"\"Allows using imageSearchTolerant test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-imagesearchtolerant\n\n    Args:\n        enabled (bool): Whether image search with tolerance is enabled.\n            Defaulting to True.\n\n    Examples:\n        ```python\n        with imageSearchTolerant(), imageSearchThreshold(95):\n            test.imagePresent()\n        ```\n    \"\"\"\n    with _ctx_settings(\"imageSearchTolerant\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.logScreenshotOnFail","title":"logScreenshotOnFail","text":"
logScreenshotOnFail(enabled=True)\n

Allows using logScreenshotOnFail test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonfail

Parameters:

Name Type Description Default enabled bool

A boolean value indicating whether to enable logging of screenshots on FAIL test result. Defaulting to True.

True

Examples:

with logScreenshotOnFail():\n    # code with verifications\n
Source code in squape/settings.py
@contextmanager\ndef logScreenshotOnFail(enabled: bool = True) -> None:\n\"\"\"Allows using logScreenshotOnFail test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonfail\n\n    Args:\n        enabled (bool): A boolean value indicating whether to enable logging\n            of screenshots on FAIL test result. Defaulting to True.\n\n    Examples:\n        ```python\n        with logScreenshotOnFail():\n            # code with verifications\n        ```\n    \"\"\"\n\n    with _ctx_settings(\"logScreenshotOnFail\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.logScreenshotOnPass","title":"logScreenshotOnPass","text":"
logScreenshotOnPass(enabled=True)\n

Allows using logScreenshotOnPass test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonpass

Parameters:

Name Type Description Default enabled bool

A boolean value indicating whether to enable logging of screenshots on PASS test result. Defaulting to True.

True

Examples:

with logScreenshotOnPass():\n    # code with verifications\n
Source code in squape/settings.py
@contextmanager\ndef logScreenshotOnPass(enabled: bool = True) -> None:\n\"\"\"Allows using logScreenshotOnPass test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonpass\n\n    Args:\n        enabled (bool): A boolean value indicating whether to enable logging\n            of screenshots on PASS test result. Defaulting to True.\n\n    Examples:\n        ```python\n        with logScreenshotOnPass():\n            # code with verifications\n        ```\n    \"\"\"\n    with _ctx_settings(\"logScreenshotOnPass\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.logScreenshotOnWarning","title":"logScreenshotOnWarning","text":"
logScreenshotOnWarning(enabled=True)\n

Allows using logScreenshotOnWarning test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonwarning

Parameters:

Name Type Description Default enabled bool

A boolean value indicating whether to enable logging of screenshots on warning log entry. Defaulting to True.

True

Examples:

with logScreenshotOnWarning():\n    # code where warning messages might happen\n
Source code in squape/settings.py
@contextmanager\ndef logScreenshotOnWarning(enabled: bool = True) -> None:\n\"\"\"Allows using logScreenshotOnWarning test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-logscreenshotonwarning\n\n    Args:\n        enabled (bool): A boolean value indicating whether to enable logging\n            of screenshots on warning log entry. Defaulting to True.\n\n    Examples:\n        ```python\n        with logScreenshotOnWarning():\n            # code where warning messages might happen\n        ```\n    \"\"\"\n    with _ctx_settings(\"logScreenshotOnWarning\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.objectNotFoundDebugging","title":"objectNotFoundDebugging","text":"
objectNotFoundDebugging(enabled)\n

Allows using objectNotFoundDebugging test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-objectnotfounddebugging

Parameters:

Name Type Description Default enabled bool

Whether to enable debugging when object is not found.

required

Examples:

with objectNotFoundDebugging(False):\n    waitForObject(names.obj1)\n    waitForObject(names.obj2)\n
Source code in squape/settings.py
@contextmanager\ndef objectNotFoundDebugging(enabled: bool) -> None:\n\"\"\"Allows using objectNotFoundDebugging test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-objectnotfounddebugging\n\n    Args:\n        enabled (bool): Whether to enable debugging when object is not found.\n\n    Examples:\n        ```python\n        with objectNotFoundDebugging(False):\n            waitForObject(names.obj1)\n            waitForObject(names.obj2)\n        ```\n    \"\"\"\n    with _ctx_settings(\"objectNotFoundDebugging\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.retryDuration","title":"retryDuration","text":"
retryDuration(duration_ms)\n

Allows using retryDuration test setting as context managers. https://doc.qt.io/squish/squish-api.html#integer-testsettings-retryduration

Parameters:

Name Type Description Default duration_ms int

The duration in milliseconds after which the verification fails

required

Examples:

with retryDuration(5000):\n    test.vp(\"VP1\")\n
Source code in squape/settings.py
@contextmanager\ndef retryDuration(duration_ms: int) -> None:\n\"\"\"Allows using retryDuration test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#integer-testsettings-retryduration\n\n    Args:\n        duration_ms (int): The duration in milliseconds after which\n            the verification fails\n\n    Examples:\n        ```python\n        with retryDuration(5000):\n            test.vp(\"VP1\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"retryDuration\", duration_ms):\n        yield\n
"},{"location":"reference/settings/#squape.settings.silentVerifications","title":"silentVerifications","text":"
silentVerifications(enabled=True)\n

Allows using silentVerifications test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-silentverifications

Parameters:

Name Type Description Default enabled bool

Whether silent verifications are enabled. Defaulting to True

True

Examples:

with silentVerifications():\n    # code with test.vp statements\n
Source code in squape/settings.py
@contextmanager\ndef silentVerifications(enabled: bool = True) -> None:\n\"\"\"Allows using silentVerifications test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-silentverifications\n\n    Args:\n        enabled (bool): Whether silent verifications are enabled. Defaulting to True\n\n    Examples:\n        ```python\n        with silentVerifications():\n            # code with test.vp statements\n        ```\n    \"\"\"\n    with _ctx_settings(\"silentVerifications\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.textNotFoundDebugging","title":"textNotFoundDebugging","text":"
textNotFoundDebugging(enabled)\n

Allows using textNotFoundDebugging test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-textnotfounddebugging

Parameters:

Name Type Description Default enabled bool

Whether to enable debugging when a OCR Text is not found.

required

Examples:

with textNotFoundDebugging(False):\n    waitForOcrText(\"Frog\")\n    waitForOcrText(\"Alpaca\")\n
Source code in squape/settings.py
@contextmanager\ndef textNotFoundDebugging(enabled: bool) -> None:\n\"\"\"Allows using textNotFoundDebugging test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-textnotfounddebugging\n\n    Args:\n        enabled (bool): Whether to enable debugging when a OCR Text is not found.\n\n    Examples:\n        ```python\n        with textNotFoundDebugging(False):\n            waitForOcrText(\"Frog\")\n            waitForOcrText(\"Alpaca\")\n        ```\n    \"\"\"\n    with _ctx_settings(\"textNotFoundDebugging\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.throwOnFailure","title":"throwOnFailure","text":"
throwOnFailure(enabled)\n

Allows using throwOnFailure test setting as context managers. https://doc.qt.io/squish/squish-api.html#bool-testsettings-throwonfailure

Parameters:

Name Type Description Default enabled bool

Whether to enable to raise a script error on every failed verification

required

Examples:

with throwOnFailure():\n    # code with verifications\n
Source code in squape/settings.py
@contextmanager\ndef throwOnFailure(enabled: bool) -> None:\n\"\"\"Allows using throwOnFailure test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#bool-testsettings-throwonfailure\n\n    Args:\n        enabled (bool): Whether to enable to raise a script error\n            on every failed verification\n\n    Examples:\n        ```python\n        with throwOnFailure():\n            # code with verifications\n        ```\n    \"\"\"\n    with _ctx_settings(\"throwOnFailure\", enabled):\n        yield\n
"},{"location":"reference/settings/#squape.settings.waitForObjectTimeout","title":"waitForObjectTimeout","text":"
waitForObjectTimeout(timeout_ms)\n

Allows using waitForObjectTimeout test setting as context managers. https://doc.qt.io/squish/squish-api.html#integer-testsettings-waitforobjecttimeout

Parameters:

Name Type Description Default timeout_ms int

A integer value indicating the timeout in ms.

required

Examples:

with waitForObjectTimeout(500):\n    waitForObject(names.obj1)\n    waitForObject(names.obj2)\n
Source code in squape/settings.py
@contextmanager\ndef waitForObjectTimeout(timeout_ms: int) -> None:\n\"\"\"Allows using waitForObjectTimeout test setting as context managers.\n    https://doc.qt.io/squish/squish-api.html#integer-testsettings-waitforobjecttimeout\n\n    Args:\n        timeout_ms (int): A integer value indicating the timeout in ms.\n\n    Examples:\n        ```python\n        with waitForObjectTimeout(500):\n            waitForObject(names.obj1)\n            waitForObject(names.obj2)\n        ```\n    \"\"\"\n    with _ctx_settings(\"waitForObjectTimeout\", timeout_ms):\n        yield\n
"},{"location":"reference/squishserver/","title":"squape.squishserver","text":""},{"location":"reference/squishserver/#squape.squishserver.SquishServer","title":"SquishServer","text":"
SquishServer(location=None, host=None, port=None)\n

Class to represent a local or remote squishserver

Parameters:

Name Type Description Default location _type_

location of the Squish package. Defaults to the \"SQUISH_PREFIX\".

None host str

host of the squishserver. Defaults to SQUISHRUNNER_HOST if it is defined, else \"127.0.0.1\".

None port int

port of the squishserver. Defaults to SQUISHRUNNER_PORT if it is defined, else 4322.

None Source code in squape/squishserver.py
def __init__(self, location=None, host=None, port=None):\n\"\"\"Open an RemoteSystem connection to a machine with a running squishserver\n\n    Args:\n        location (_type_, optional):    location of the Squish package.\n                                        Defaults to the \"SQUISH_PREFIX\".\n        host (str, optional): host of the squishserver.\n                              Defaults to SQUISHRUNNER_HOST if it is defined,\n                              else \"127.0.0.1\".\n        port (int, optional): port of the squishserver.\n                              Defaults to SQUISHRUNNER_PORT if it is defined,\n                              else 4322.\n    \"\"\"\n    if location is None:\n        try:\n            self.location = os.environ[\"SQUISH_PREFIX\"]\n        except KeyError:\n            raise EnvironmentError(\n                \"The SQUISH_PREFIX variable is not set, \"\n                \"and location of the squishserver \"\n                f\"({self.host}:{self.port}) is not specified!\"\n            )\n    else:\n        self.location = location\n\n    if host is None:\n        self.host = os.environ.get(\"SQUISHRUNNER_HOST\", \"127.0.0.1\")\n\n    if port is None:\n        if \"SQUISHRUNNER_PORT\" in os.environ:\n            self.port = int(os.environ[\"SQUISHRUNNER_PORT\"])\n        else:\n            self.port = 4322\n\n    try:\n        self.remotesys = RemoteSystem(host, port)\n    except Exception:\n        raise SquishserverError(\n            f\"Unable to connect to squishserver ({self.host}:{self.port})\"\n        )\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.addAUT","title":"addAUT","text":"
addAUT(aut, path)\n

Register an AUT

Parameters:

Name Type Description Default aut str

the name of the executable

required path str

path to the executable folder

required Source code in squape/squishserver.py
def addAUT(self, aut: str, path: str) -> None:\n\"\"\"Register an AUT\n\n    Args:\n        aut (str): the name of the executable\n        path (str): path to the executable folder\n    \"\"\"\n    log(\n        f\"[Squishserver {self.host}:{self.port}] \"\n        f\"Registering {Path(path)/aut} AUT\"\n    )\n    self._config_squishserver(\"addAUT\", [aut, path])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.addAppPath","title":"addAppPath","text":"
addAppPath(path)\n

Register an AUT path

Parameters:

Name Type Description Default path str

the AUT path to register

required Source code in squape/squishserver.py
def addAppPath(self, path: str) -> None:\n\"\"\"Register an AUT path\n\n    Args:\n        path (str): the AUT path to register\n    \"\"\"\n    log(f\"[Squishserver {self.host}:{self.port}] \" f\"Registering AUT path: {path}\")\n    self._config_squishserver(\"addAppPath\", [path])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.addAttachableAut","title":"addAttachableAut","text":"
addAttachableAut(aut, port, host='127.0.0.1')\n

Register an attachable AUT

Parameters:

Name Type Description Default aut str

the name of the attachable AUT

required port int

port of the machine where the attachable AUT is supposed to be running.

required host str

host of the machine where the attachable AUT is supposed to be running. Defaults to \"127.0.0.1\".

'127.0.0.1' Source code in squape/squishserver.py
def addAttachableAut(self, aut: str, port: int, host: str = \"127.0.0.1\") -> None:\n\"\"\"Register an attachable AUT\n\n    Args:\n        aut (str): the name of the attachable AUT\n        port (int): port of the machine where the attachable AUT\n                    is supposed to be running.\n        host (str, optional):   host of the machine where the attachable AUT\n                                is supposed to be running.\n                                Defaults to \"127.0.0.1\".\n    \"\"\"\n    log(\n        f\"[Squishserver {self.host}:{self.port}] \"\n        f\"Registering an attachable AUT {aut}\"\n    )\n    self._config_squishserver(\"addAttachableAUT\", [aut, f\"{host}:{port}\"])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.attachToApplication","title":"attachToApplication","text":"
attachToApplication(aut)\n

Attaches to an application with given name.

Parameters:

Name Type Description Default aut str

the name of the attachable AUT

required

Returns: (ApplicationContext): application context

Source code in squape/squishserver.py
def attachToApplication(self, aut: str):\n\"\"\"\n    Attaches to an application with given name.\n\n    Args:\n        aut (str): the name of the attachable AUT\n    Returns:\n        (ApplicationContext): application context\n    \"\"\"\n    log(f\"[Squishserver {self.host}:{self.port}] \" f\"Attach to application {aut}\")\n    ctx = squish.attachToApplication(aut, self.host, self.port)\n    return ctx\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.removeAUT","title":"removeAUT","text":"
removeAUT(aut, path)\n

Remove registered AUT

Parameters:

Name Type Description Default aut str

the name of the executable

required path str

path to the executable folder

required Source code in squape/squishserver.py
def removeAUT(self, aut: str, path: str) -> None:\n\"\"\"Remove registered AUT\n\n    Args:\n        aut (str): the name of the executable\n        path (str): path to the executable folder\n    \"\"\"\n    log(\n        f\"[Squishserver {self.host}:{self.port}] \"\n        f\"Removing registered {Path(path)/aut} AUT\"\n    )\n    self._config_squishserver(\"removeAUT\", [aut, path])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.removeAppPath","title":"removeAppPath","text":"
removeAppPath(path)\n

Remove a registered AUT path

Parameters:

Name Type Description Default path str

the path to the AUT

required Source code in squape/squishserver.py
def removeAppPath(self, path: str) -> None:\n\"\"\"Remove a registered AUT path\n\n    Args:\n        path (str): the path to the AUT\n    \"\"\"\n    log(\n        f\"[Squishserver {self.host}:{self.port}] \"\n        f\"Removing registered AUT path: {path}\"\n    )\n    self._config_squishserver(\"removeAppPath\", [path])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.removeAttachableAut","title":"removeAttachableAut","text":"
removeAttachableAut(aut, port, host='127.0.0.1')\n

Remove registered attachable AUT

Parameters:

Name Type Description Default aut str

the name of the attachable AUT

required port int

port of the machine where the attachable AUT is supposed to be running.

required host str

host of the machine where the attachable AUT is supposed to be running. Defaults to \"127.0.0.1\".

'127.0.0.1' Source code in squape/squishserver.py
def removeAttachableAut(self, aut: str, port: int, host: str = \"127.0.0.1\") -> None:\n\"\"\"Remove registered attachable AUT\n\n    Args:\n        aut (str): the name of the attachable AUT\n        port (int): port of the machine where the attachable AUT\n                    is supposed to be running.\n        host (str, optional):   host of the machine where the attachable AUT\n                                is supposed to be running.\n                                Defaults to \"127.0.0.1\".\n    \"\"\"\n    log(\n        f\"[Squishserver {self.host}:{self.port}] \"\n        f\"Removing registered attachable AUT {aut}\"\n    )\n    self._config_squishserver(\"removeAttachableAUT\", [aut, f\"{host}:{port}\"])\n
"},{"location":"reference/squishserver/#squape.squishserver.SquishServer.startApplication","title":"startApplication","text":"
startApplication(aut)\n

Starts to an application with given name.

Parameters:

Name Type Description Default aut str

the name of the mapped AUT

required

Returns: (ApplicationContext): application context

Source code in squape/squishserver.py
def startApplication(self, aut: str):\n\"\"\"\n    Starts to an application with given name.\n\n    Args:\n        aut (str): the name of the mapped AUT\n    Returns:\n        (ApplicationContext): application context\n    \"\"\"\n    log(f\"[Squishserver {self.host}:{self.port}] \" f\"Start an application {aut}\")\n    ctx = squish.startApplication(aut, self.host, self.port)\n    return ctx\n
"},{"location":"reference/video/","title":"squape.video","text":""},{"location":"reference/video/#squape.video.remove_videos_on_success","title":"remove_videos_on_success","text":"
remove_videos_on_success()\n

Remove all captured videos when the execution was successful (no failures)

Warning

Removing videos on success does not work with Squish 7.1.1 and below when execution is triggered outside the Squish IDE.

Source code in squape/video.py
def remove_videos_on_success() -> None:\n\"\"\"\n    Remove all captured videos when the execution was successful (no failures)\n\n    !!! warning\n        Removing videos on success does not work with Squish 7.1.1 and below\n        when execution is triggered outside the Squish IDE.\n    \"\"\"\n    if _failure_results_count() == 0:\n        videos_to_remove = _videos_set()\n        _replace_videos(videos_to_remove)\n
"},{"location":"reference/video/#squape.video.video_capture","title":"video_capture","text":"
video_capture(message='', remove_on_success=False)\n

Allows using Squish's video capture as context managers. https://doc.qt.io/squish/squish-api.html#test-startvideocapture-message Optionally (when the execution was successful) replace captured video with a tiny placeholder video to save test results size.

Warning

Removing videos on success does not work with Squish 7.1.1 and below when execution is triggered outside the Squish IDE.

Args: message (str): log a video n the test report using the specified message. Defaulting to empty string. remove_on_success (bool): Whether to replace captured video when there were no failures. Defaulting to False.

Examples:

with video_capture(remove_on_success=True):\n    # code with actions and verifications\n
Source code in squape/video.py
@contextmanager\ndef video_capture(message: str = \"\", remove_on_success: bool = False) -> None:\n\"\"\"Allows using Squish's video capture as context managers.\n    https://doc.qt.io/squish/squish-api.html#test-startvideocapture-message\n    Optionally (when the execution was successful) replace captured video\n    with a tiny placeholder video to save test results size.\n\n    !!! warning\n        Removing videos on success does not work with Squish 7.1.1 and below\n        when execution is triggered outside the Squish IDE.\n    Args:\n        message (str): log a video n the test report using the specified message.\n            Defaulting to empty string.\n        remove_on_success (bool): Whether to replace captured video\n            when there were no failures. Defaulting to False.\n\n    Examples:\n        ```python\n        with video_capture(remove_on_success=True):\n            # code with actions and verifications\n        ```\n    \"\"\"\n\n    if remove_on_success:\n        initial_videos = _videos_set()\n        initial_result_count = _failure_results_count()\n\n    test.startVideoCapture(message)\n\n    try:\n        yield\n    except Exception:\n        raise\n    finally:\n        test.stopVideoCapture(message)\n\n        if remove_on_success:\n            new_failures = _failure_results_count() - initial_result_count\n            if new_failures == 0:\n                new_videos = _videos_set() - initial_videos\n                _replace_videos(new_videos)\n
"},{"location":"reference/vps/","title":"squape.vps","text":""},{"location":"reference/vps/#squape.vps.vph_property","title":"vph_property","text":"
vph_property(object_or_name, property_name, expected_value, msg)\n

\"Highlights the object then verifies its property. The object remains highlighted during verification to make it easier to identify on potential screenshots.

Parameters:

Name Type Description Default object_or_name any

symbolic name, real name, or object reference

required property_name str

name of the property to verify

required expected_value any

expected value of the verified property

required msg str

verification message

required

Returns: True if verification is positive, False otherwise

Source code in squape/vps.py
def vph_property(\n    object_or_name: any, property_name: str, expected_value: any, msg: str\n) -> bool:\n\"\"\" \"Highlights the object then verifies its property.\n    The object remains highlighted during verification to make it easier to identify\n    on potential screenshots.\n\n    Args:\n        object_or_name (any): symbolic name, real name, or object reference\n        property_name (str): name of the property to verify\n        expected_value (any): expected value of the verified property\n        msg (str): verification message\n    Returns:\n        True if verification is positive, False otherwise\n    \"\"\"\n\n    obj = squish.waitForObjectExists(object_or_name)\n    property_value = operator.attrgetter(property_name)(obj)\n    squish.highlightObject(obj, 200, False)\n    result = test.compare(property_value, expected_value, msg)\n    time.sleep(0.200)\n    return result\n
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..5a806cb --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,38 @@ + + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + + None + 2023-09-19 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..6916fc99f0ff82c0d0238c298ceb7f68c6f77e22 GIT binary patch literal 200 zcmV;(05|_1iwFpzI|*e1|8r?{Wo=<_E_iKh0PT}a4uc>Nh4-F