diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..77c59b660 --- /dev/null +++ b/404.html @@ -0,0 +1,7 @@ + + +

404 - Not found

diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 000000000..e69de29bb diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 000000000..1cf13b9f9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.220ee61c.min.js b/assets/javascripts/bundle.220ee61c.min.js new file mode 100644 index 000000000..116072a11 --- /dev/null +++ b/assets/javascripts/bundle.220ee61c.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={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 a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}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),Y(),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 cn=Pt(Er=>{(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," "))},s=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(B,N){d.append(N,B)})}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:Er);(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(O){throw new Error("URL unable to set base "+c+" due to "+O)}}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,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{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:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="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(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},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 s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(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"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(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 s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[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 s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.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 a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.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 rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=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=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(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 Ee=="function"?Ee(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(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(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 It=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 Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=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 s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?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 It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(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)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={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,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(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:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(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,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.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,s=o._buffer,a=s.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 s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(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}(Dt);var Oe=new Sn(wn);var M=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(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 zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(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}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(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,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=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(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(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(){!Wr||!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=ba.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}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=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=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(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 to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(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 Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?M:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(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)ao(e,r)}function _(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)ao(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 so(){return location.hash.substring(1)}function Dr(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():M))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>M),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=_("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Changelog

+ +

Note: Numbers like (#123) point to closed Pull Requests on the fractal repository.

+

Unreleased

+
    +
  • Package:
      +
    • Remove exclude field, and move packages field to tool.poetry section, in pyproject.toml (#771).
    • +
    +
  • +
  • Testing:
      +
    • Improve configuration for coverage GitHub Action step (#772).
    • +
    • Add persist-credentials: false to all actions/checkout@v4 GitHub Action steps (#773).
    • +
    +
  • +
+

2.6.1

+
    +
  • Package:
      +
    • Move to poetry v2 (#770).
    • +
    • Require Python<3.13 (#770).
    • +
    +
  • +
  • Testing:
      +
    • Use default Postgres service in GitHub CI (#761).
    • +
    +
  • +
+

2.6.0

+
    +
  • Align with new task-collection endpoint in fractal-server 2.10.0 (#760).
  • +
  • Update versions of pre-commit hooks and add precommit GitHub Action (#757).
  • +
+

2.5.1

+ +

2.5.0

+
    +
  • Update task-collection commands, to align with fractal-server 2.9.0 (#738).
  • +
  • Remove (internal) obsolete do_not_separate_logs argument (#738).
  • +
  • Add group {add|remove}-user commands, and deprecate --new-user-ids argument from group update (#748).
  • +
  • Update user whoami --viewer-paths to call the new dedicated server endpoint (#748).
  • +
  • Add user set-groups commands (#753).
  • +
  • Testing:
      +
    • Align with fractal-server 2.9.0 removal of DB_ENGINE variable (#743).
    • +
    +
  • +
+

2.4.0

+
+

WARNING: This release has a breaking change in the project add-dataset command.

+
+
    +
  • Move to from positional zarr_dir argument to optional --zarr-dir argument, for project add-dataset (#736).
  • +
  • Add support for user-settings project_dir, introduced in fractal-server 2.8.0 (#736).
  • +
  • Internal:
      +
    • Update effect of include_logs for task-collection check command (#730).
    • +
    +
  • +
+

2.3.0

+
+

WARNING: Starting from this release, Python3.9 is not supported any more.

+
+
    +
  • Align with fractal-server 2.7.0 (#712).
  • +
  • Align with `fractal-server 2.7.1 and drop use of pip extras (#727).
  • +
  • Remove --new-name and --new-version options from task edit command (#712).
  • +
  • Rename source into label, for task collect-custom command (#712).
  • +
  • Do not refer to obsolete task attributes source or owner (#712, #717).
  • +
  • Add --new-ssh-settings-json option to fractal user edit (#715).
  • +
  • Add --ssh-settings-json option to fractal user register (#722).
  • +
  • Add --private option to task-creating commands (#717).
  • +
  • Drop task delete command (#717).
  • +
  • Handle missing server in fractal version (#724).
  • +
  • Testing:
      +
    • Run all tests against a single fractal-server instance (#717).
    • +
    • Run tests in random module order, based on pytest-randomly (#717).
    • +
    • Include Python3.12 in GitHub CI (#717).
    • +
    +
  • +
+

2.2.1

+
    +
  • Support new viewer-paths commands in fractal group commands (#709).
  • +
  • Make --new-user-ids optional fractal group command (#709).
  • +
  • Add --viewer-paths argument in fractal user whoami (#709).
  • +
+

2.2.0

+ +

2.1.0

+
    +
  • Align with fractal-server 2.4.0 (#695).
  • +
  • Add fractal group command (#695).
  • +
  • Testing
      +
    • Update GitHub actions for upload/download/coverage (#690, #691).
    • +
    • Switch from SQLite to Postgres in CI (#702).
    • +
    +
  • +
+

2.0.3

+
    +
  • Improve workflow import command (#686).
  • +
+

2.0.2

+
    +
  • Improve error handling in task collect-custom command (#680).
  • +
  • Documentation
      +
    • Bump mkdocstrings[python] to 0.25.2 (#682).
    • +
    +
  • +
+

2.0.1

+
    +
  • Add new command task collect-custom (#667).
  • +
  • Update poetry version for development to 1.8.2.
  • +
  • Testing:
      +
    • Update CI for fractal-server 2.1.0 compatibility (#655).
    • +
    • Remove obsolete folders from tests/data (#656).
    • +
    +
  • +
+

2.0.0

+

Major version to align with fractal-server API v2.

+

1.4.4

+
    +
  • Require user's verification to be specified when editing user's email (#620).
  • +
+

1.4.3

+
    +
  • Make fractal-client a fully synchronous client, by removing all async/await (#592).
  • +
  • Improve handling of AuthenticationError and ConnectionError, and handle uncaught Exception (#587).
  • +
  • Deprecate environment variable FRACTAL_LOGGING_LEVEL, remove flag --verbose and replace it with --debug, improve debugging of http requests (#597).
  • +
  • Testing:
      +
    • Adapt job_factory and tests to the presence of new timestamp_created attributes in fractal-server (#589).
    • +
    • Align with fractal-server 1.4.3a2 (#598).
    • +
    +
  • +
  • Documentation:
      +
    • Add info about server/client version compatibility (#591).
    • +
    +
  • +
  • Dependencies:
      +
    • Update python-dotenv to ^0.21.0 (#589).
    • +
    • Introduce automatic updates of poetry.lock (#609 and commits to main).
    • +
    +
  • +
+

1.4.2

+
    +
  • Always make new users verified, within user register command (#580).
  • +
  • Expose verification-related features in user edit command (#580).
  • +
  • Update expected status code of stop-job to 202 (#585).
  • +
  • Testing:
      +
    • Adapt job_factory to new strict response-validation models in fractal-server (#580).
    • +
    • Adapt job_factory by including the timestamp_created attribute (#582).
    • +
    +
  • +
+

1.4.1

+

We are skipping this patch release, to remain aligned with fractal-server version.

+

1.4.0

+
    +
  • Align with fractal-server 1.4.0 (#573).
  • +
  • Testing:
      +
    • Use ubuntu-22 for GitHub CI (commit e1c8bd3da670c24a0ac48b1163cd1c7833746aaf).
    • +
    +
  • +
  • Development:
      +
    • Do not include sqlmodel dependency explicitly (#577).
    • +
    • Use poetry 1.7.1 (#577).
    • +
    +
  • +
+

1.3.7

+

This release is up-to-date with fractal-server 1.3.12.

+
    +
  • Remove project new --dataset argument (#566).
  • +
  • Add project new --make-read-only argument (#566).
  • +
  • Do not use deprecated fractal-server deployment_type variable (#566).
  • +
  • Align tests with fractal-server 1.3.12, which deprecates the legacy history version (#569).
  • +
  • Automate procedure for publishing package to PyPI (#561).
  • +
+

1.3.6

+
    +
  • Main features:
      +
    • Remove client-side validation of API request/response bodies (#551).
    • +
    • Make error messages more readable for request-body validation errors (#551).
    • +
    • Include --batch option for workflow apply command (commit 06c7ff0e92602f08a98097d3597a8ce39c6ae1a8).
    • +
    • Revamp config.py, making Settings a standard Python class (#559).
    • +
    +
  • +
  • Package and repository:
      +
    • Rename repository from fractal to fractal-client.
    • +
    • Change package name from fractal to fractal-client (#555).
    • +
    • Remove fractal-common submodule (#551).
    • +
    • Remove pydantic dependency (#559).
    • +
    +
  • +
  • Tests:
      +
    • Review tests: make them stateless, improve handling of cache, remove obsolete fixtures (#559).
    • +
    +
  • +
+

1.3.5

+
    +
  • Implement more robust sorting of versions (e.g. in the presence of pre-releases), via packaging.version (#550).
  • +
+

1.3.4

+
    +
  • Add new commands dataset status and dataset history (#544).
  • +
  • Align with fractal-server/fractal-common new TaskUpdate model, that accepts version=None (#540).
  • +
  • Align with fractal-server/fractal-common new attributes in the Task model (#534).
  • +
  • Align with fractal-common new ApplyWorkflowRead model, with optional workflow_dump (#547).
  • +
  • Move documentation from sphinx to mkdocs (#532).
  • +
+

1.3.3

+
    +
  • Support workflow apply --start/--end arguments for submitting a workflow subset (#527).
  • +
  • Exclude common/tests and other files from build (#523).
  • +
  • Remove obsolete folders from tests/data (#526).
  • +
+

1.3.2

+
    +
  • Fix wrong build in 1.3.1 (include missing fractal.common submodule).
  • +
+

1.3.1

+

WARNING: wrong build, do not use

+
    +
  • Pin Pydantic to V1 (#520).
  • +
+

1.3.0

+
    +
  • Align with fractal-server 1.3.0, by updating all relevant endpoint path/query/body parameters (#479).
  • +
  • Add fractal job stop command (#485).
  • +
  • Add fractal task delete command (#510).
  • +
  • Add task ID/name/version disambiguation to task edit and workflow add-task (#499).
  • +
  • Specific changes to existing commands:
      +
    • Make project_id a required positional argument of fractal {workflow,dataset,job} commands (#479).
    • +
    • For edit commands, always prepend the new arguments with new, e.g. as in task edit ... --new-version (#498).
    • +
    • Add --type optional argument to fractal dataset new command (#479).
    • +
    • For fractal workflow apply:
        +
      • Transform project_id from option to positional argument (#479).
      • +
      • Make output_dataset_id a required positional argument (#483).
      • +
      +
    • +
    • Add --username/--new-username to fractal user subcommands (#493).
    • +
    • Remove --private option for fractal task collect (#493).
    • +
    • Add --version to fractal task {new,edit} subcommands (#493).
    • +
    • Split task-id-or-name argument of task edit and workflow add-task into two arguments (#504).
    • +
    • Add --pinned-dependency argument to task collect (#508).
    • +
    • Add --args-schema and --args-schema-version arguments to task new command (#511).
    • +
    • Add --new-args-schema and --new-args-schema-version arguments to task edit command (#511).
    • +
    • Raise warning when importing/exporting workflows with custom tasks (#513).
    • +
    +
  • +
  • Package and repository:
      +
    • Fix a bug in tests, by starting the fractal-server FastAPI app in a more standard way (#481).
    • +
    • Require pydantic version to be >=1.10.8 (#486, #490).
    • +
    • Make sqlmodel a development depedency (#493).
    • +
    • Improve handling of a ConnectError in the CI (#502).
    • +
    • Remove arbitrary kwargs from internal functions (#503).
    • +
    • Align with latest fractal-server version and update tests (#517).
    • +
    +
  • +
+

1.2.0

+ +

1.1.0

+
    +
  • Align with fractal-server 1.1.0 (#446).
  • +
  • Improve validation of API request payloads (#447).
  • +
  • Drop support for python 3.8 (#438).
  • +
  • Update _TaskBase schema from fractal-common (#431).
  • +
  • Update DatasetUpdate schema (#461).
  • +
  • Update fractal task edit command (#439 and #461).
  • +
  • Add fractal project edit command (#465).
  • +
  • Improve task-collection log formatting (#443).
  • +
  • Disable argparse abbreviation for CLI commands (#441).
  • +
+

1.0.5

+
    +
  • Minor updates to fractal workflow export (#429).
  • +
+

1.0.4

+
    +
  • Add fractal workflow {import,export} commands (#426).
  • +
  • Remove --project-id argument from fractal workflow edit commands (#426).
  • +
+

1.0.3

+
    +
  • Add fractal task new command (#421).
  • +
  • Remove obsolete -j/--json argument from fractal command (#421).
  • +
+

1.0.2

+
    +
  • Remove obsolete references to SLURM user, either as a CLI argument or an environment variable (#419).
  • +
+

1.0.1

+
    +
  • Make FRACTAL_USER/FRACTAL_PASSWORD env variables optional (#416).
  • +
+

1.0.0

+
    +
  • First version in this CHANGELOG.
  • +
+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/development/index.html b/development/index.html new file mode 100644 index 000000000..a668b080a --- /dev/null +++ b/development/index.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + + + + + + + + + + Development - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Contribute to Fractal Client development

+

The development of Fractal Client takes place on the fractal-client Github +repository. To +ask questions or to inform us of a bug or unexpected behavior, please feel free +to open an issue.

+

Set up the development environment

+

Clone repository

+

First, you should clone the repository +

git clone https://github.com/fractal-analytics-platform/fractal-client.git
+cd fractal-client
+

+

Install package

+

We use poetry to manage the development environment and the dependencies. A simple way to install it is pipx install poetry==2.0.0, or you can look at the installation section here. +Running +

poetry install [--with dev] [--with docs]
+
+will take care of installing all the dependencies in a separate environment, optionally installing also the dependencies for developement and to build the documentation.

+

Build and release

+

We also use poetry to build the package and publish it to PyPI.

+

Preliminary check-list:

+
    +
  • The main branch is checked out.
  • +
  • You reviewed dependencies, and the lock file is up to date with pyproject.toml.
  • +
  • The current HEAD of the main branch passes all the tests (note: make sure + that you are using poetry run pytest, and not simply pytest).
  • +
  • You updated the CHANGELOG.md file.
  • +
  • You updated docs/versions.md with the constraints for the new version.
  • +
+

Actual release instructions:

+
    +
  1. +

    Use one of the following +

    poetry run bumpver update --tag-num --tag-commit --commit --dry
    +poetry run bumpver update --patch --tag-commit --commit --dry
    +poetry run bumpver update --minor --tag-commit --commit --dry
    +poetry run bumpver update --set-version X.Y.Z --tag-commit --commit --dry
    +
    +to test updating the version bump.

    +
  2. +
  3. +

    If the previous step looks good, remove --dry and re-run to actually bump the +version. This will trigger a dedicated GitHub action to build the new package +and publish it to PyPI.

    +
  4. +
+

Run tests

+

Unit and integration testing of Fractal Server uses the +pytest testing framework.

+

If you installed the development dependencies, you may run +the test suite by invoking +

poetry run pytest
+
+from the main directory of the fractal-client repository. It is sometimes +useful to specify additional arguments, e.g. +
poetry run pytest -s -vvv --log-cli-level info --full-trace
+

+

Tests are also run as part of GitHub Actions Continuous +Integration +for the fractal-client repository.

+

Documentation

+

The documentations is built with mkdocs, and we bundle a module from +sphinx-argparse plugin, customized to +our needs.

+

To build the documentation locally, setup a development python environment (e.g. with poetry install --with docs) and then run one of these commands: +

poetry run mkdocs serve --config-file mkdocs.yml  # serves the docs at http://127.0.0.1:8000
+poetry run mkdocs build --config-file mkdocs.yml  # creates a build in the `site` folder
+

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/doc-requirements.txt b/doc-requirements.txt new file mode 100644 index 000000000..85a0f775b --- /dev/null +++ b/doc-requirements.txt @@ -0,0 +1,8 @@ +mkdocs==1.5.2 +mkdocs-material==9.1.21 +mkdocs-literate-nav==0.5.0 +mkdocs-autorefs==0.5.0 +mkdocs-gen-files==0.4.0 +mkdocs-section-index==0.3.5 +mkdocstrings[python]==0.25.2 +mkdocs-include-markdown-plugin==4.0.4 diff --git a/extra.css b/extra.css new file mode 100644 index 000000000..8a94704c0 --- /dev/null +++ b/extra.css @@ -0,0 +1,17 @@ +/* Custom style for blockquotes */ +blockquote { + background-color: #e7e3e3d8; /* Light gray background */ + border: 1px solid #000000; /* Black border */ + padding: 10px; + margin: 20px 0; + border-radius: 4px; + font-size: 16px; + line-height: 1.6; + box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1); /* Optional: Add a subtle shadow */ +} + +/* Style the text inside blockquotes */ +blockquote p { + margin: 0; + color: #333; /* Dark text color */ +} diff --git a/gen_ref_pages.py b/gen_ref_pages.py new file mode 100644 index 000000000..067edb714 --- /dev/null +++ b/gen_ref_pages.py @@ -0,0 +1,126 @@ +import sys +from pathlib import Path +from textwrap import fill +from typing import Any + +import mkdocs_gen_files # type: ignore[import] +from mkdocs_gen_files import Nav + +sys.path.append(Path(__file__).parent.as_posix()) # noqa: E402 +from parser import parse_parser # noqa: E402 + +sys.path.append(Path(__file__).parents[1].as_posix()) # noqa: E402 +from fractal_client.parser import parser_main # noqa + + +def to_markdown( + data: dict[str, Any], + level: int, + parent_cmd: str | None = None, +) -> str: + """ + Given a `data` object with keys `name`, `description` and `usage`, produce + a markdown string. + """ + + # Create MarkDown string for title + name = data["name"] + if parent_cmd: + title_str = "#" * (level + 2) + f" {parent_cmd} {name}\n" + else: + title_str = "#" * (level + 1) + f" {name}\n" + + # Create MarkDown string for description + description = data["description"] + description_str = f"{description}\n" + + # Create MarkDown string for usage code block + usage = data["bare_usage"].replace(Path(__file__).name, "fractal") + while " " in usage: + usage = usage.replace(" ", " ") + usage = fill( + usage, + width=80, + initial_indent="", + subsequent_indent=(" " * 8), + break_on_hyphens=False, + ) + usage_str = f"```\n{usage}\n```\n" + + # Create MarkDown string for action groups + action_groups_strings = [] + if "action_groups" in data.keys(): + for group in data["action_groups"]: + title = group["title"] + + if title == "Commands": + continue + elif title == "Valid sub-commands": + action_groups_strings.append( + "#" * (level + 2) + " Sub-commands" + ) + elif title in [ + "Named Arguments", + "Positional Arguments", + ]: + options = group["options"] + action_groups_strings.append("#" * (level + 3) + f" {title}\n") + for opt in options: + opt_name = ",".join(opt["name"]) + opt_help = opt["help"] + default = str(opt["default"]) + if (default == "None") or ("==SUPPRESS==" in default): + default = "" + else: + default = f" *Default*: `{default}`." + action_groups_strings.append( + f"- **`{opt_name}`**: {opt_help}{default}\n" + ) + else: + raise NotImplementedError(title) + + action_groups_str = "\n".join(action_groups_strings) + + # Combine strings together + md_string = ( + "\n".join( + ( + title_str, + description_str, + usage_str, + action_groups_str, + ) + ) + + "\n" + ) + + return md_string + + +nav = Nav() + +# Parse main parser +main = parse_parser(parser_main) + +# Parser level 0 +nav[["fractal"]] = "fractal/index.md" +main["name"] = "fractal" +with mkdocs_gen_files.open("reference/fractal/index.md", "w") as f: + f.write(to_markdown(main, level=0)) + +# Parser levels 1 and 2 (commands and subcommands) +for child in main["children"]: + # Level 1 + name = child["name"] + + nav[["fractal", name]] = f"fractal/{name}/index.md" + with mkdocs_gen_files.open(f"reference/fractal/{name}/index.md", "w") as f: + f.write(to_markdown(child, level=0)) + if "children" not in child.keys(): + continue + # Level 2 + for grandchild in child["children"]: + f.write(to_markdown(grandchild, level=1, parent_cmd=name)) + +with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) diff --git a/index.html b/index.html new file mode 100644 index 000000000..1514bbd3c --- /dev/null +++ b/index.html @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + + + +
+
+
+ + + + +
+
+
+ + + + + + + + + +
+
+ + + + + + + +

Welcome to Fractal Command-line Client's documentation!

+

+ Fractal client +

+ +

Fractal is a framework developed at the BioVisionCenter to process bioimaging data at scale in the OME-Zarr format and prepare the images for interactive visualization.

+
+

This project is under active development 🔨. If you need help or found a bug, open an issue here.

+
+

This documentation concerns the Fractal Command-line Client. Find more information about Fractal in general and the other repositories at the Fractal home page.

+ +

Fractal was conceived in the Liberali Lab at the Friedrich Miescher Institute for Biomedical Research and in the Pelkmans Lab at the University of Zurich by @jluethi and @gusqgm. The Fractal project is now developed at the BioVisionCenter at the University of Zurich and the project lead is with @jluethi. The core development is done under contract by eXact lab S.r.l..

+

Unless otherwise specified, Fractal components are released under the BSD 3-Clause License, and copyright is with the BioVisionCenter at the University of Zurich.

+ + + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/install/index.html b/install/index.html new file mode 100644 index 000000000..5dbe1b594 --- /dev/null +++ b/install/index.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + Install - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Installation and usage

+

Installation

+

Fractal Client is hosted on the PyPI +index, and it can be installed with +pip via +

pip install fractal-client
+

+

Usage

+

You may invoke the Fractal Client via the custom command fractal, from the +command line (see its documentation here).

+

You must set the FRACTAL_SERVER variable, which is a fully qualified URL to +the Fractal server installation (e.g. http://localhost:8000). This can be an +environment variable or it can be stored in a an environment file +.fractal.env as in +

FRACTAL_SERVER=http://localhost:8010
+

+

Credentials

+

Most fractal commands are restricted to authenticated users, and user +credentials can be specified in multiple ways: +* Set FRACTAL_USER and FRACTAL_PASSWORD variables as environment variables; +* Add FRACTAL_USER and FRACTAL_PASSWORD variables in .fractal.env; +* Explicitly provide --user and --password arguments for fractal commands, see here.

+

Cache

+

By default, fractal caches some information (namely a valid token for the +current session on fractal-server and a list of tasks) in ~/.cache/fractal. +This destination can be customized by setting the FRACTAL_CACHE_PATH +variables.

+

Full example

+

Here is an example of a valid .fractal.env file: +

FRACTAL_USER=user@something.com
+FRACTAL_PASSWORD=myuser
+FRACTAL_SERVER=http://localhost:8010
+FRACTAL_CACHE_PATH=/some/path/fractal-cache
+

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/overrides/404.html b/overrides/404.html new file mode 100644 index 000000000..03caa9b52 --- /dev/null +++ b/overrides/404.html @@ -0,0 +1,8 @@ + +{% block content %} +

404 - Not found

+{% endblock %} diff --git a/parser.py b/parser.py new file mode 100644 index 000000000..ba14527af --- /dev/null +++ b/parser.py @@ -0,0 +1,214 @@ +""" +The current `parser.py` module belongs to the sphinx-argparse +(https://github.com/ashb/sphinx-argparse, v0.4.0). +Original Copyright 2023 Ash Berlin-Taylor +License: MIT + +The first version of the same module is from sphinx-argparse +(https://github.com/alex-rudakov/sphinx-argparse). +Original Copyright 2013 Aleksandr Rudakov +License: MIT +""" +import re +from argparse import _HelpAction +from argparse import _StoreConstAction +from argparse import _SubParsersAction + + +class NavigationException(Exception): # noqa: N818 + pass + + +def parser_navigate(parser_result, path, current_path=None): + if isinstance(path, str): + if path == "": + return parser_result + path = re.split(r"\s+", path) + current_path = current_path or [] + if len(path) == 0: + return parser_result + if "children" not in parser_result: + raise NavigationException( + "Current parser has no child elements. " + f"(path: {' '.join(current_path)})" + ) + next_hop = path.pop(0) + for child in parser_result["children"]: + # identifer is only used for aliased subcommands + identifier = ( + child["identifier"] if "identifier" in child else child["name"] + ) + if identifier == next_hop: + current_path.append(next_hop) + return parser_navigate(child, path, current_path) + raise NavigationException( + f"Current parser has no child element with name: {next_hop} " + f"(path: {' '.join(current_path)})" + ) + + +def _try_add_parser_attribute(data, parser, attribname): + attribval = getattr(parser, attribname, None) + if attribval is None: + return + if not isinstance(attribval, str): + return + if len(attribval) > 0: + data[attribname] = attribval + + +def _format_usage_without_prefix(parser): + """ + Use private argparse APIs to get the usage string without + the 'usage: ' prefix. + """ + fmt = parser._get_formatter() + fmt.add_usage( + parser.usage, + parser._actions, + parser._mutually_exclusive_groups, + prefix="", + ) + return fmt.format_help().strip() + + +def parse_parser(parser, data=None, **kwargs): + if data is None: + data = { + "name": "", + "usage": parser.format_usage().strip(), + "bare_usage": _format_usage_without_prefix(parser), + "prog": parser.prog, + } + _try_add_parser_attribute(data, parser, "description") + _try_add_parser_attribute(data, parser, "epilog") + for action in parser._get_positional_actions(): + if not isinstance(action, _SubParsersAction): + continue + helps = {} + for item in action._choices_actions: + helps[item.dest] = item.help + + # commands which share an existing parser are an alias, + # don't duplicate docs + subsection_alias = {} + subsection_alias_names = set() + for name, subaction in action._name_parser_map.items(): + if subaction not in subsection_alias: + subsection_alias[subaction] = [] + else: + subsection_alias[subaction].append(name) + subsection_alias_names.add(name) + + for name, subaction in action._name_parser_map.items(): + if name in subsection_alias_names: + continue + subalias = subsection_alias[subaction] + subaction.prog = f"{parser.prog} {name}" + subdata = { + "name": name + if not subalias + else f"{name} ({', '.join(subalias)})", + "help": helps.get(name, ""), + "usage": subaction.format_usage().strip(), + "bare_usage": _format_usage_without_prefix(subaction), + } + if subalias: + subdata["identifier"] = name + parse_parser(subaction, subdata, **kwargs) + data.setdefault("children", []).append(subdata) + + show_defaults = True + if kwargs.get("skip_default_values", False) is True: + show_defaults = False + show_defaults_const = show_defaults + if kwargs.get("skip_default_const_values", False) is True: + show_defaults_const = False + + # argparse stores the different groups as a list in parser._action_groups + # the first element of the list holds the positional arguments, the + # second the option arguments not in groups, and subsequent elements + # argument groups with positional and optional parameters + action_groups = [] + for action_group in parser._action_groups: + options_list = [] + for action in action_group._group_actions: + if isinstance(action, _HelpAction): + continue + + # Quote default values for string/None types + default = action.default + if ( + action.default not in ["", None, True, False] + and action.type in [None, str] + and isinstance(action.default, str) + ): + default = f'"{default}"' + + # fill in any formatters, like %(default)s + format_dict = dict( + vars(action), prog=data.get("prog", ""), default=default + ) + format_dict["default"] = default + help_str = action.help or "" # Ensure we don't print None + try: + help_str = help_str % format_dict + except Exception: # nosec + pass + + # Options have the option_strings set, positional arguments don't + name = action.option_strings + if name == []: + if action.metavar is None: + name = [action.dest] + else: + name = [action.metavar] + # Skip lines for subcommands + if name == ["==SUPPRESS=="]: + continue + + if isinstance(action, _StoreConstAction): + option = { + "name": name, + "default": default + if show_defaults_const + else "==SUPPRESS==", + "help": help_str, + } + else: + option = { + "name": name, + "default": default if show_defaults else "==SUPPRESS==", + "help": help_str, + } + if action.choices: + option["choices"] = action.choices + if "==SUPPRESS==" not in option["help"]: + options_list.append(option) + + if len(options_list) == 0: + continue + + # Upper case "Positional Arguments" and "Optional Arguments" titles + # Since python-3.10 'optional arguments' changed to 'options' + # more info: https://github.com/python/cpython/pull/23858 + if ( + action_group.title == "optional arguments" + or action_group.title == "options" + ): + action_group.title = "Named Arguments" + if action_group.title == "positional arguments": + action_group.title = "Positional Arguments" + + group = { + "title": action_group.title, + "description": action_group.description, + "options": options_list, + } + + action_groups.append(group) + + if len(action_groups) > 0: + data["action_groups"] = action_groups + + return data diff --git a/reference/SUMMARY/index.html b/reference/SUMMARY/index.html new file mode 100644 index 000000000..113d08720 --- /dev/null +++ b/reference/SUMMARY/index.html @@ -0,0 +1,557 @@ + + + + + + + + + + + + + + + + + + SUMMARY - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/dataset/index.html b/reference/fractal/dataset/index.html new file mode 100644 index 000000000..84aadc16a --- /dev/null +++ b/reference/fractal/dataset/index.html @@ -0,0 +1,719 @@ + + + + + + + + + + + + + + + + + + + + + + Dataset - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

dataset

+

Dataset commands.

+
fractal dataset [-h] {edit,show,delete} ...
+
+

Sub-commands

+

dataset edit

+

Edit dataset.

+
fractal dataset edit [-h] [--new-name NEW_NAME] [--filters FILTERS]  project_id
+        dataset_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    dataset_id: Dataset ID.

    +
  • +
+

Named Arguments

+
    +
  • +

    --new-name: New name of dataset.

    +
  • +
  • +

    --filters: Path to JSON file with new metadata to replace the current ones.

    +
  • +
+

dataset show

+

Show dataset.

+
fractal dataset show [-h] project_id dataset_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    dataset_id: Dataset ID.

    +
  • +
+

dataset delete

+

Delete dataset.

+
fractal dataset delete [-h] project_id dataset_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    dataset_id: Dataset ID.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/group/index.html b/reference/fractal/group/index.html new file mode 100644 index 000000000..747b9659d --- /dev/null +++ b/reference/fractal/group/index.html @@ -0,0 +1,779 @@ + + + + + + + + + + + + + + + + + + + + + + Group - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

group

+

UserGroup commands.

+
fractal group [-h] {list,get,new,update,add-user,remove-user} ...
+
+

Sub-commands

+

group list

+

Get all groups.

+
fractal group list [-h] [--user-ids]
+
+

Named Arguments

+
    +
  • --user-ids: Also return the user_ids lists together with the groups Default: False.
  • +
+

group get

+

Get single group.

+
fractal group get [-h] group_id
+
+

Positional Arguments

+
    +
  • group_id: ID of the group to get.
  • +
+

group new

+

Create new group.

+
fractal group new [-h]  [--viewer-paths VIEWER_PATHS [VIEWER_PATHS ...]]  name
+
+

Positional Arguments

+
    +
  • name: Name of the new group.
  • +
+

Named Arguments

+
    +
  • --viewer-paths: ("List of group's viewer_paths (e.g --viewer-paths /something /else)",)
  • +
+

group update

+

Update single group.

+
fractal group update [-h] --new-viewer-paths NEW_VIEWER_PATHS  [NEW_VIEWER_PATHS
+        ...]  group_id
+
+

Positional Arguments

+
    +
  • group_id: ID of the group to update.
  • +
+

Named Arguments

+
    +
  • --new-viewer-paths: New list of group viewer_paths (e.g --new-viewer-paths /something /else); note that this replaces the existing one.
  • +
+

group add-user

+

Add a single user to group.

+
fractal group add-user [-h] group_id user_id
+
+

Positional Arguments

+
    +
  • +

    group_id: ID of the group to which to add the user.

    +
  • +
  • +

    user_id: ID of the user to add.

    +
  • +
+

group remove-user

+

Remove a single user from group.

+
fractal group remove-user [-h] group_id user_id
+
+

Positional Arguments

+
    +
  • +

    group_id: ID of the group to which to remove the user.

    +
  • +
  • +

    user_id: ID of the user to remove.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/index.html b/reference/fractal/index.html new file mode 100644 index 000000000..91decf2ce --- /dev/null +++ b/reference/fractal/index.html @@ -0,0 +1,590 @@ + + + + + + + + + + + + + + + + + + + + + + CLI reference - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

fractal

+

Command-line interface for Fractal Client.

+
fractal [-h] [-u USER] [-p PASSWORD] [--debug] [--batch]
+        {project,dataset,task,workflow,job,version,user,group} ...
+
+

Named Arguments

+
    +
  • +

    -u,--user: User email address for login (overrides configuration file).

    +
  • +
  • +

    -p,--password: User password (overrides configuration file).

    +
  • +
  • +

    --debug: Change minimal logging level from INFO to DEBUG. Default: False.

    +
  • +
  • +

    --batch: Return output suitable for scripting, e.g., only the ID of items created instead of the full object. Default: False.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/job/index.html b/reference/fractal/job/index.html new file mode 100644 index 000000000..d96b0c8a9 --- /dev/null +++ b/reference/fractal/job/index.html @@ -0,0 +1,778 @@ + + + + + + + + + + + + + + + + + + + + + + Job - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

job

+

Job commands.

+
fractal job [-h] {list,show,download-logs,stop,submit} ...
+
+

Sub-commands

+

job list

+

List jobs for given project.

+
fractal job list [-h] project_id
+
+

Positional Arguments

+
    +
  • project_id: Project ID.
  • +
+

job show

+

Query status of workflow-execution job.

+
fractal job show [-h] project_id job_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    job_id: Job ID.

    +
  • +
+

job download-logs

+

Download full folder of workflow-execution job.

+
fractal job download-logs [-h] --output OUTPUT_FOLDER  project_id job_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    job_id: Job ID.

    +
  • +
+

Named Arguments

+
    +
  • --output: Path of the output folder.
  • +
+

job stop

+

Stop workflow-execution job.

+
fractal job stop [-h] project_id job_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    job_id: Job ID.

    +
  • +
+

job submit

+

Submit a job.

+
fractal job submit [-h] [--start FIRST_TASK_INDEX]  [--end LAST_TASK_INDEX] [-w
+        WORKER_INIT]  project_id workflow_id dataset_id
+
+

Positional Arguments

+
    +
  • +

    project_id:

    +
  • +
  • +

    workflow_id:

    +
  • +
  • +

    dataset_id:

    +
  • +
+

Named Arguments

+
    +
  • +

    --start: Positional index of the first task to be executed (starting from 0).

    +
  • +
  • +

    --end: Positional index of the last task to be executed (starting from 0).

    +
  • +
  • +

    -w,--worker-init: Command to be run before starting a worker.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/project/index.html b/reference/fractal/project/index.html new file mode 100644 index 000000000..24db82816 --- /dev/null +++ b/reference/fractal/project/index.html @@ -0,0 +1,775 @@ + + + + + + + + + + + + + + + + + + + + + + Project - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

project

+

Project commands.

+
fractal project [-h] {new,list,show,delete,add-dataset,edit} ...
+
+

Sub-commands

+

project new

+

Create new project.

+
fractal project new [-h] name
+
+

Positional Arguments

+
    +
  • name: Name of new project.
  • +
+

project list

+

List projects.

+
fractal project list [-h]
+
+

project show

+

Show details of single project.

+
fractal project show [-h] project_id
+
+

Positional Arguments

+
    +
  • project_id: ID of project to show.
  • +
+

project delete

+

Delete project.

+
fractal project delete [-h] project_id
+
+

Positional Arguments

+
    +
  • project_id: ID of project to delete.
  • +
+

project add-dataset

+

Add dataset to project.

+
fractal project add-dataset [-h] [--zarr-dir ZARR_DIR]  [--filters FILTERS]
+        project_id dataset_name
+
+

Positional Arguments

+
    +
  • +

    project_id: ID of project to add the new dataset to.

    +
  • +
  • +

    dataset_name: Name of new dataset.

    +
  • +
+

Named Arguments

+
    +
  • +

    --zarr-dir: Path to zarr dir.

    +
  • +
  • +

    --filters: Path to JSON file with filters.

    +
  • +
+

project edit

+

Edit details of a single project.

+
fractal project edit [-h] [--new-name NEW_NAME] project_id
+
+

Positional Arguments

+
    +
  • project_id: ID of the project to edit.
  • +
+

Named Arguments

+
    +
  • --new-name: New project name.
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/task/index.html b/reference/fractal/task/index.html new file mode 100644 index 000000000..4ba5653e6 --- /dev/null +++ b/reference/fractal/task/index.html @@ -0,0 +1,866 @@ + + + + + + + + + + + + + + + + + + + + + + Task - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

task

+

Task commands.

+
fractal task [-h]  {list,collect,collect-custom,check-collection,new,edit}  ...
+
+

Sub-commands

+

task list

+

List tasks.

+
fractal task list [-h]
+
+

task collect

+

Install and collect all tasks from a pip-installable package.

+
fractal task collect [-h] [--python-version PYTHON_VERSION]  [--package-version
+        PACKAGE_VERSION]  [--package-extras PACKAGE_EXTRAS]
+        [--pinned-dependency PINNED_DEPENDENCY]  [--private]  package
+
+

Positional Arguments

+
    +
  • package: Package name or absolute path to local package.
  • +
+

Named Arguments

+
    +
  • +

    --python-version: Select the python version to use for this package.

    +
  • +
  • +

    --package-version: Select the package version.

    +
  • +
  • +

    --package-extras: Comma separated list of extra components for the package to be installed, e.g., collect fractal-tasks-core --package-extras=torch,tensorflow will trigger the installation of fractal-tasks-core[torch,tensorflow].

    +
  • +
  • +

    --pinned-dependency: Package/version pair representing a pinned-version dependency, in the form collect fractal-tasks-core --pinned-dependency pydantic=1.10.0. Include --pinned-dependency multiple times to pin several packages to specific versions.

    +
  • +
  • +

    --private: Make task group private. Default: False.

    +
  • +
+

task collect-custom

+

Collect all tasks from a custom Python interpreter.

+
fractal task collect-custom [-h] [--version VERSION]  (--package-name
+        PACKAGE_NAME | --package-root PACKAGE_ROOT)  [--private]  label
+        python_interpreter manifest
+
+

Positional Arguments

+
    +
  • +

    label: A common label identifying this package.

    +
  • +
  • +

    python_interpreter: Absolute path to the Python interpreter to be used for running tasks.

    +
  • +
  • +

    manifest: Local path of the Manifest of the Fractal task package.

    +
  • +
+

Named Arguments

+
    +
  • +

    --version: Version of tasks to be collected.

    +
  • +
  • +

    --package-name: Name of the package, as used in 'import '; this is then used to extract the package directory (package_root) via 'importlib.util.find_spec '.

    +
  • +
  • +

    --package-root: The folder where the package is installed. If not provided, it will be automatically inferred based on 'package_name'.

    +
  • +
  • +

    --private: Make task group private. Default: False.

    +
  • +
+

task check-collection

+

Check status of background task collection processes.

+
fractal task check-collection [-h] [--include-logs]  task_group_activity_id
+
+

Positional Arguments

+
    +
  • task_group_activity_id: Activity ID of the collection (see output of task collect).
  • +
+

Named Arguments

+
    +
  • --include-logs: Also include task-collection logs. Default: False.
  • +
+

task new

+

Create new task.

+
fractal task new [-h] [--command-non-parallel COMMAND_NON_PARALLEL]
+        [--command-parallel COMMAND_PARALLEL]  [--version VERSION]
+        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]
+        [--args-schema-non-parallel ARGS_SCHEMA_NON_PARALLEL]
+        [--args-schema-parallel ARGS_SCHEMA_PARALLEL]  [--args-schema-version
+        ARGS_SCHEMA_VERSION]  [--private]  name
+
+

Positional Arguments

+
    +
  • name: A human readable name for the task.
  • +
+

Named Arguments

+
    +
  • +

    --command-non-parallel: The non parallel command that executes the task.

    +
  • +
  • +

    --command-parallel: The parallel command that executes the task.

    +
  • +
  • +

    --version: Task version.

    +
  • +
  • +

    --meta-non-parallel: Path to JSON file with meta non parallel arguments.

    +
  • +
  • +

    --meta-parallel: Path to JSON file with meta parallel arguments.

    +
  • +
  • +

    --args-schema-non-parallel: Path to JSON file with args non parallel arguments.

    +
  • +
  • +

    --args-schema-parallel: Path to JSON file with arg parallel arguments.

    +
  • +
  • +

    --args-schema-version: Label encoding how the task-arguments JSON Schema was generated (e.g. pydantic_v1).

    +
  • +
  • +

    --private: Make task group private. Default: False.

    +
  • +
+

task edit

+

Edit task.

+
fractal task edit [-h] (--id ID | --name NAME) [--version VERSION]
+        [--new-version NEW_VERSION]  [--command-non-parallel
+        COMMAND_NON_PARALLEL]  [--command-parallel COMMAND_PARALLEL]
+        [--input-types INPUT_TYPES]  [--output-types OUTPUT_TYPES]
+
+

Named Arguments

+
    +
  • +

    --id: ID of the task to edit.

    +
  • +
  • +

    --name: Name of the task to edit.

    +
  • +
  • +

    --version: Version of the task to edit (only accepted in combination with --name).

    +
  • +
  • +

    --new-version: New task version.

    +
  • +
  • +

    --command-non-parallel: New task non parallel command.

    +
  • +
  • +

    --command-parallel: New task parallel command.

    +
  • +
  • +

    --input-types: Path to JSON file with new input types.

    +
  • +
  • +

    --output-types: Path to JSON file with new output types.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/user/index.html b/reference/fractal/user/index.html new file mode 100644 index 000000000..458ec5daa --- /dev/null +++ b/reference/fractal/user/index.html @@ -0,0 +1,823 @@ + + + + + + + + + + + + + + + + + + + + + + User - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

user

+

User commands.

+
fractal user [-h] {whoami,register,list,show,edit,set-groups} ...
+
+

Sub-commands

+

user whoami

+

Get info on current user (fails if user is not registered).

+
fractal user whoami [-h] [--viewer-paths]
+
+

Named Arguments

+
    +
  • --viewer-paths: Include user's viewer_paths attribute. Default: False.
  • +
+

user register

+

Register a new user with the Fractal server and edit their settings (note: user creation and settings editing are two independent steps).

+
fractal user register [-h] [--project-dir PROJECT_DIR]  [--slurm-user
+        SLURM_USER] [--username USERNAME]  [--ssh-settings-json
+        SSH_SETTINGS_JSON]  [--superuser]  new_email new_password
+
+

Positional Arguments

+
    +
  • +

    new_email: Email to be used as username.

    +
  • +
  • +

    new_password: Password for the new user.

    +
  • +
+

Named Arguments

+
    +
  • +

    --project-dir: User-writeable base folder, used e.g. for default zarr_dir paths.

    +
  • +
  • +

    --slurm-user: Username to login into SLURM cluster.

    +
  • +
  • +

    --username: Username associated to the user.

    +
  • +
  • +

    --ssh-settings-json: Path to JSON file with (a subset of) following settings: ssh_host, ssh_username, ssh_private_key_path, ssh_tasks_dir, ssh_jobs_dir.

    +
  • +
  • +

    --superuser: Give superuser privileges to the new user. Default: False.

    +
  • +
+

user list

+

List all users.

+
fractal user list [-h]
+
+

user show

+

Show details of single user.

+
fractal user show [-h] user_id
+
+

Positional Arguments

+
    +
  • user_id: ID of the user.
  • +
+

user edit

+

Edit an existin user and/or their settings (note: user and settings editing are two independent steps).

+
fractal user edit [-h] [--new-email NEW_EMAIL]  [--new-password NEW_PASSWORD]
+        [--new-username NEW_USERNAME]  [--new-project-dir NEW_PROJECT_DIR]
+        [--new-slurm-user NEW_SLURM_USER]  [--new-ssh-settings-json
+        NEW_SSH_SETTINGS_JSON]  [--make-superuser | --remove-superuser]
+        [--make-verified | --remove-verified]  user_id
+
+

Positional Arguments

+
    +
  • user_id: ID of the user.
  • +
+

Named Arguments

+
    +
  • +

    --new-email: New email address.

    +
  • +
  • +

    --new-password: New password.

    +
  • +
  • +

    --new-username: New user username.

    +
  • +
  • +

    --new-project-dir: New value of project_dir.

    +
  • +
  • +

    --new-slurm-user: New SLURM username.

    +
  • +
  • +

    --new-ssh-settings-json: Path to JSON file with (a subset of) following settings: ssh_host, ssh_username, ssh_private_key_path, ssh_tasks_dir, ssh_jobs_dir.

    +
  • +
  • +

    --make-superuser: Give superuser privileges to user. Default: False.

    +
  • +
  • +

    --remove-superuser: Remove superuser privileges from user. Default: False.

    +
  • +
  • +

    --make-verified: Make user verified. Default: False.

    +
  • +
  • +

    --remove-verified: Make user unverified. Default: False.

    +
  • +
+

user set-groups

+

Reset user-group membership for an existing user.

+
fractal user set-groups [-h] user_id group_ids [group_ids ...]
+
+

Positional Arguments

+
    +
  • +

    user_id: ID of the user.

    +
  • +
  • +

    group_ids: List of the IDs of groups we want the user to be member. WARNING: this list replaces the current group memberships.

    +
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/version/index.html b/reference/fractal/version/index.html new file mode 100644 index 000000000..4d34e8da7 --- /dev/null +++ b/reference/fractal/version/index.html @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + Version - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

version

+

Print version and exit.

+
fractal version [-h]
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/reference/fractal/workflow/index.html b/reference/fractal/workflow/index.html new file mode 100644 index 000000000..d757d3b6f --- /dev/null +++ b/reference/fractal/workflow/index.html @@ -0,0 +1,968 @@ + + + + + + + + + + + + + + + + + + + + + + Workflow - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

workflow

+

Workflow commands.

+
fractal workflow [-h]
+        {list,new,show,edit,delete,add-task,edit-task,rm-task,import,export}
+        ...
+
+

Sub-commands

+

workflow list

+

List workflows for given project.

+
fractal workflow list [-h] project_id
+
+

Positional Arguments

+
    +
  • project_id: Project ID.
  • +
+

workflow new

+

Create new workflow.

+
fractal workflow new [-h] name project_id
+
+

Positional Arguments

+
    +
  • +

    name: Workflow name (must be unique, and not only made of numbers only).

    +
  • +
  • +

    project_id: Project ID.

    +
  • +
+

workflow show

+

Show workflow.

+
fractal workflow show [-h] project_id workflow_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
+

workflow edit

+

Edit workflow.

+
fractal workflow edit [-h] --new-name NEW_NAME project_id workflow_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
+

Named Arguments

+
    +
  • --new-name: New workflow name.
  • +
+

workflow delete

+

Delete workflow.

+
fractal workflow delete [-h] project_id workflow_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
+

workflow add-task

+

Add new task to specific workflow.

+
fractal workflow add-task [-h]  (--task-id TASK_ID | --task-name TASK_NAME)
+        [--task-version TASK_VERSION]  [--order ORDER]  [--args-non-parallel
+        ARGS_NON_PARALLEL]  [--args-parallel ARGS_PARALLEL]
+        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]
+        [--input-filters INPUT_FILTERS]  project_id workflow_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
+

Named Arguments

+
    +
  • +

    --task-id: ID of the task to add.

    +
  • +
  • +

    --task-name: Name of the task to add.

    +
  • +
  • +

    --task-version: Version of task to add (only accepted in combination with --task-name).

    +
  • +
  • +

    --order: Order of this task within the workflow's task list.

    +
  • +
  • +

    --args-non-parallel: Args for non parallel tasks

    +
  • +
  • +

    --args-parallel: Args for parallel tasks

    +
  • +
  • +

    --meta-non-parallel: Metadata file fornon parallel tasks

    +
  • +
  • +

    --meta-parallel: Metadata file for parallel tasks

    +
  • +
  • +

    --input-filters: Path to json file with filters.

    +
  • +
+

workflow edit-task

+

Edit task within specific workflow.

+
fractal workflow edit-task [-h] [--input-filters INPUT_FILTERS]
+        [--args-non-parallel ARGS_NON_PARALLEL]  [--args-parallel ARGS_PARALLEL]
+        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]
+        project_id workflow_id workflow_task_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
  • +

    workflow_task_id: Workflow task ID, the ID of a task inside the list of tasks.

    +
  • +
+

Named Arguments

+
    +
  • +

    --input-filters: Path to json serialised file containing the arguments overrides of the task.

    +
  • +
  • +

    --args-non-parallel: Args for non parallel tasks

    +
  • +
  • +

    --args-parallel: Args for parallel tasks

    +
  • +
  • +

    --meta-non-parallel: Metadata file fornon parallel tasks

    +
  • +
  • +

    --meta-parallel: Metadata file for parallel tasks

    +
  • +
+

workflow rm-task

+

Remove task from a specific workflow.

+
fractal workflow rm-task [-h] project_id workflow_id workflow_task_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
  • +

    workflow_task_id: Workflow task ID (the ID of a task inside the list of tasks).

    +
  • +
+

workflow import

+

Import workflow to project from file.

+
fractal workflow import [-h] --project-id PROJECT_ID --json-file  JSON_FILE
+        [--workflow-name WORKFLOW_NAME]
+
+

Named Arguments

+
    +
  • +

    --project-id: ID of the project where the workflow will be imported.

    +
  • +
  • +

    --json-file: Path to a JSON file with the workflow to be imported.

    +
  • +
  • +

    --workflow-name: Name of the new workflow (if set, overrides the one in JSON file)

    +
  • +
+

workflow export

+

Export workflow to file.

+
fractal workflow export [-h] --json-file JSON_FILE  project_id workflow_id
+
+

Positional Arguments

+
    +
  • +

    project_id: Project ID.

    +
  • +
  • +

    workflow_id: Workflow ID.

    +
  • +
+

Named Arguments

+
    +
  • --json-file: Path to the JSON file where the workflow will be exported.
  • +
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 000000000..104d69f45 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to Fractal Command-line Client's documentation!","text":"

Fractal is a framework developed at the BioVisionCenter to process bioimaging data at scale in the OME-Zarr format and prepare the images for interactive visualization.

This project is under active development \ud83d\udd28. If you need help or found a bug, open an issue here.

This documentation concerns the Fractal Command-line Client. Find more information about Fractal in general and the other repositories at the Fractal home page.

"},{"location":"#licence-and-copyright","title":"Licence and Copyright","text":"

Fractal was conceived in the Liberali Lab at the Friedrich Miescher Institute for Biomedical Research and in the Pelkmans Lab at the University of Zurich by @jluethi and @gusqgm. The Fractal project is now developed at the BioVisionCenter at the University of Zurich and the project lead is with @jluethi. The core development is done under contract by eXact lab S.r.l..

Unless otherwise specified, Fractal components are released under the BSD 3-Clause License, and copyright is with the BioVisionCenter at the University of Zurich.

"},{"location":"changelog/","title":"Changelog","text":"

Note: Numbers like (#123) point to closed Pull Requests on the fractal repository.

"},{"location":"changelog/#unreleased","title":"Unreleased","text":"
  • Package:
    • Remove exclude field, and move packages field to tool.poetry section, in pyproject.toml (#771).
  • Testing:
    • Improve configuration for coverage GitHub Action step (#772).
    • Add persist-credentials: false to all actions/checkout@v4 GitHub Action steps (#773).
"},{"location":"changelog/#261","title":"2.6.1","text":"
  • Package:
    • Move to poetry v2 (#770).
    • Require Python<3.13 (#770).
  • Testing:
    • Use default Postgres service in GitHub CI (#761).
"},{"location":"changelog/#260","title":"2.6.0","text":"
  • Align with new task-collection endpoint in fractal-server 2.10.0 (#760).
  • Update versions of pre-commit hooks and add precommit GitHub Action (#757).
"},{"location":"changelog/#251","title":"2.5.1","text":"
  • Deprecate user cache_dir , to align with fractal-server 2.9.2 (#758).
"},{"location":"changelog/#250","title":"2.5.0","text":"
  • Update task-collection commands, to align with fractal-server 2.9.0 (#738).
  • Remove (internal) obsolete do_not_separate_logs argument (#738).
  • Add group {add|remove}-user commands, and deprecate --new-user-ids argument from group update (#748).
  • Update user whoami --viewer-paths to call the new dedicated server endpoint (#748).
  • Add user set-groups commands (#753).
  • Testing:
    • Align with fractal-server 2.9.0 removal of DB_ENGINE variable (#743).
"},{"location":"changelog/#240","title":"2.4.0","text":"

WARNING: This release has a breaking change in the project add-dataset command.

  • Move to from positional zarr_dir argument to optional --zarr-dir argument, for project add-dataset (#736).
  • Add support for user-settings project_dir, introduced in fractal-server 2.8.0 (#736).
  • Internal:
    • Update effect of include_logs for task-collection check command (#730).
"},{"location":"changelog/#230","title":"2.3.0","text":"

WARNING: Starting from this release, Python3.9 is not supported any more.

  • Align with fractal-server 2.7.0 (#712).
  • Align with `fractal-server 2.7.1 and drop use of pip extras (#727).
  • Remove --new-name and --new-version options from task edit command (#712).
  • Rename source into label, for task collect-custom command (#712).
  • Do not refer to obsolete task attributes source or owner (#712, #717).
  • Add --new-ssh-settings-json option to fractal user edit (#715).
  • Add --ssh-settings-json option to fractal user register (#722).
  • Add --private option to task-creating commands (#717).
  • Drop task delete command (#717).
  • Handle missing server in fractal version (#724).
  • Testing:
    • Run all tests against a single fractal-server instance (#717).
    • Run tests in random module order, based on pytest-randomly (#717).
    • Include Python3.12 in GitHub CI (#717).
"},{"location":"changelog/#221","title":"2.2.1","text":"
  • Support new viewer-paths commands in fractal group commands (#709).
  • Make --new-user-ids optional fractal group command (#709).
  • Add --viewer-paths argument in fractal user whoami (#709).
"},{"location":"changelog/#220","title":"2.2.0","text":"
  • Align with fractal-server 2.6.0 (#705).
"},{"location":"changelog/#210","title":"2.1.0","text":"
  • Align with fractal-server 2.4.0 (#695).
  • Add fractal group command (#695).
  • Testing
    • Update GitHub actions for upload/download/coverage (#690, #691).
    • Switch from SQLite to Postgres in CI (#702).
"},{"location":"changelog/#203","title":"2.0.3","text":"
  • Improve workflow import command (#686).
"},{"location":"changelog/#202","title":"2.0.2","text":"
  • Improve error handling in task collect-custom command (#680).
  • Documentation
    • Bump mkdocstrings[python] to 0.25.2 (#682).
"},{"location":"changelog/#201","title":"2.0.1","text":"
  • Add new command task collect-custom (#667).
  • Update poetry version for development to 1.8.2.
  • Testing:
    • Update CI for fractal-server 2.1.0 compatibility (#655).
    • Remove obsolete folders from tests/data (#656).
"},{"location":"changelog/#200","title":"2.0.0","text":"

Major version to align with fractal-server API v2.

"},{"location":"changelog/#144","title":"1.4.4","text":"
  • Require user's verification to be specified when editing user's email (#620).
"},{"location":"changelog/#143","title":"1.4.3","text":"
  • Make fractal-client a fully synchronous client, by removing all async/await (#592).
  • Improve handling of AuthenticationError and ConnectionError, and handle uncaught Exception (#587).
  • Deprecate environment variable FRACTAL_LOGGING_LEVEL, remove flag --verbose and replace it with --debug, improve debugging of http requests (#597).
  • Testing:
    • Adapt job_factory and tests to the presence of new timestamp_created attributes in fractal-server (#589).
    • Align with fractal-server 1.4.3a2 (#598).
  • Documentation:
    • Add info about server/client version compatibility (#591).
  • Dependencies:
    • Update python-dotenv to ^0.21.0 (#589).
    • Introduce automatic updates of poetry.lock (#609 and commits to main).
"},{"location":"changelog/#142","title":"1.4.2","text":"
  • Always make new users verified, within user register command (#580).
  • Expose verification-related features in user edit command (#580).
  • Update expected status code of stop-job to 202 (#585).
  • Testing:
    • Adapt job_factory to new strict response-validation models in fractal-server (#580).
    • Adapt job_factory by including the timestamp_created attribute (#582).
"},{"location":"changelog/#141","title":"1.4.1","text":"

We are skipping this patch release, to remain aligned with fractal-server version.

"},{"location":"changelog/#140","title":"1.4.0","text":"
  • Align with fractal-server 1.4.0 (#573).
  • Testing:
    • Use ubuntu-22 for GitHub CI (commit e1c8bd3da670c24a0ac48b1163cd1c7833746aaf).
  • Development:
    • Do not include sqlmodel dependency explicitly (#577).
    • Use poetry 1.7.1 (#577).
"},{"location":"changelog/#137","title":"1.3.7","text":"

This release is up-to-date with fractal-server 1.3.12.

  • Remove project new --dataset argument (#566).
  • Add project new --make-read-only argument (#566).
  • Do not use deprecated fractal-server deployment_type variable (#566).
  • Align tests with fractal-server 1.3.12, which deprecates the legacy history version (#569).
  • Automate procedure for publishing package to PyPI (#561).
"},{"location":"changelog/#136","title":"1.3.6","text":"
  • Main features:
    • Remove client-side validation of API request/response bodies (#551).
    • Make error messages more readable for request-body validation errors (#551).
    • Include --batch option for workflow apply command (commit 06c7ff0e92602f08a98097d3597a8ce39c6ae1a8).
    • Revamp config.py, making Settings a standard Python class (#559).
  • Package and repository:
    • Rename repository from fractal to fractal-client.
    • Change package name from fractal to fractal-client (#555).
    • Remove fractal-common submodule (#551).
    • Remove pydantic dependency (#559).
  • Tests:
    • Review tests: make them stateless, improve handling of cache, remove obsolete fixtures (#559).
"},{"location":"changelog/#135","title":"1.3.5","text":"
  • Implement more robust sorting of versions (e.g. in the presence of pre-releases), via packaging.version (#550).
"},{"location":"changelog/#134","title":"1.3.4","text":"
  • Add new commands dataset status and dataset history (#544).
  • Align with fractal-server/fractal-common new TaskUpdate model, that accepts version=None (#540).
  • Align with fractal-server/fractal-common new attributes in the Task model (#534).
  • Align with fractal-common new ApplyWorkflowRead model, with optional workflow_dump (#547).
  • Move documentation from sphinx to mkdocs (#532).
"},{"location":"changelog/#133","title":"1.3.3","text":"
  • Support workflow apply --start/--end arguments for submitting a workflow subset (#527).
  • Exclude common/tests and other files from build (#523).
  • Remove obsolete folders from tests/data (#526).
"},{"location":"changelog/#132","title":"1.3.2","text":"
  • Fix wrong build in 1.3.1 (include missing fractal.common submodule).
"},{"location":"changelog/#131","title":"1.3.1","text":"

WARNING: wrong build, do not use

  • Pin Pydantic to V1 (#520).
"},{"location":"changelog/#130","title":"1.3.0","text":"
  • Align with fractal-server 1.3.0, by updating all relevant endpoint path/query/body parameters (#479).
  • Add fractal job stop command (#485).
  • Add fractal task delete command (#510).
  • Add task ID/name/version disambiguation to task edit and workflow add-task (#499).
  • Specific changes to existing commands:
    • Make project_id a required positional argument of fractal {workflow,dataset,job} commands (#479).
    • For edit commands, always prepend the new arguments with new, e.g. as in task edit ... --new-version (#498).
    • Add --type optional argument to fractal dataset new command (#479).
    • For fractal workflow apply:
      • Transform project_id from option to positional argument (#479).
      • Make output_dataset_id a required positional argument (#483).
    • Add --username/--new-username to fractal user subcommands (#493).
    • Remove --private option for fractal task collect (#493).
    • Add --version to fractal task {new,edit} subcommands (#493).
    • Split task-id-or-name argument of task edit and workflow add-task into two arguments (#504).
    • Add --pinned-dependency argument to task collect (#508).
    • Add --args-schema and --args-schema-version arguments to task new command (#511).
    • Add --new-args-schema and --new-args-schema-version arguments to task edit command (#511).
    • Raise warning when importing/exporting workflows with custom tasks (#513).
  • Package and repository:
    • Fix a bug in tests, by starting the fractal-server FastAPI app in a more standard way (#481).
    • Require pydantic version to be >=1.10.8 (#486, #490).
    • Make sqlmodel a development depedency (#493).
    • Improve handling of a ConnectError in the CI (#502).
    • Remove arbitrary kwargs from internal functions (#503).
    • Align with latest fractal-server version and update tests (#517).
"},{"location":"changelog/#120","title":"1.2.0","text":"
  • Align with fractal-server 1.2.0 (#472).
"},{"location":"changelog/#110","title":"1.1.0","text":"
  • Align with fractal-server 1.1.0 (#446).
  • Improve validation of API request payloads (#447).
  • Drop support for python 3.8 (#438).
  • Update _TaskBase schema from fractal-common (#431).
  • Update DatasetUpdate schema (#461).
  • Update fractal task edit command (#439 and #461).
  • Add fractal project edit command (#465).
  • Improve task-collection log formatting (#443).
  • Disable argparse abbreviation for CLI commands (#441).
"},{"location":"changelog/#105","title":"1.0.5","text":"
  • Minor updates to fractal workflow export (#429).
"},{"location":"changelog/#104","title":"1.0.4","text":"
  • Add fractal workflow {import,export} commands (#426).
  • Remove --project-id argument from fractal workflow edit commands (#426).
"},{"location":"changelog/#103","title":"1.0.3","text":"
  • Add fractal task new command (#421).
  • Remove obsolete -j/--json argument from fractal command (#421).
"},{"location":"changelog/#102","title":"1.0.2","text":"
  • Remove obsolete references to SLURM user, either as a CLI argument or an environment variable (#419).
"},{"location":"changelog/#101","title":"1.0.1","text":"
  • Make FRACTAL_USER/FRACTAL_PASSWORD env variables optional (#416).
"},{"location":"changelog/#100","title":"1.0.0","text":"
  • First version in this CHANGELOG.
"},{"location":"development/","title":"Contribute to Fractal Client development","text":"

The development of Fractal Client takes place on the fractal-client Github repository. To ask questions or to inform us of a bug or unexpected behavior, please feel free to open an issue.

"},{"location":"development/#set-up-the-development-environment","title":"Set up the development environment","text":""},{"location":"development/#clone-repository","title":"Clone repository","text":"

First, you should clone the repository

git clone https://github.com/fractal-analytics-platform/fractal-client.git\ncd fractal-client\n

"},{"location":"development/#install-package","title":"Install package","text":"

We use poetry to manage the development environment and the dependencies. A simple way to install it is pipx install poetry==2.0.0, or you can look at the installation section here. Running

poetry install [--with dev] [--with docs]\n
will take care of installing all the dependencies in a separate environment, optionally installing also the dependencies for developement and to build the documentation.

"},{"location":"development/#build-and-release","title":"Build and release","text":"

We also use poetry to build the package and publish it to PyPI.

Preliminary check-list:

  • The main branch is checked out.
  • You reviewed dependencies, and the lock file is up to date with pyproject.toml.
  • The current HEAD of the main branch passes all the tests (note: make sure that you are using poetry run pytest, and not simply pytest).
  • You updated the CHANGELOG.md file.
  • You updated docs/versions.md with the constraints for the new version.

Actual release instructions:

  1. Use one of the following

    poetry run bumpver update --tag-num --tag-commit --commit --dry\npoetry run bumpver update --patch --tag-commit --commit --dry\npoetry run bumpver update --minor --tag-commit --commit --dry\npoetry run bumpver update --set-version X.Y.Z --tag-commit --commit --dry\n
    to test updating the version bump.

  2. If the previous step looks good, remove --dry and re-run to actually bump the version. This will trigger a dedicated GitHub action to build the new package and publish it to PyPI.

"},{"location":"development/#run-tests","title":"Run tests","text":"

Unit and integration testing of Fractal Server uses the pytest testing framework.

If you installed the development dependencies, you may run the test suite by invoking

poetry run pytest\n
from the main directory of the fractal-client repository. It is sometimes useful to specify additional arguments, e.g.
poetry run pytest -s -vvv --log-cli-level info --full-trace\n

Tests are also run as part of GitHub Actions Continuous Integration for the fractal-client repository.

"},{"location":"development/#documentation","title":"Documentation","text":"

The documentations is built with mkdocs, and we bundle a module from sphinx-argparse plugin, customized to our needs.

To build the documentation locally, setup a development python environment (e.g. with poetry install --with docs) and then run one of these commands:

poetry run mkdocs serve --config-file mkdocs.yml  # serves the docs at http://127.0.0.1:8000\npoetry run mkdocs build --config-file mkdocs.yml  # creates a build in the `site` folder\n

"},{"location":"install/","title":"Installation and usage","text":""},{"location":"install/#installation","title":"Installation","text":"

Fractal Client is hosted on the PyPI index, and it can be installed with pip via

pip install fractal-client\n

"},{"location":"install/#usage","title":"Usage","text":"

You may invoke the Fractal Client via the custom command fractal, from the command line (see its documentation here).

You must set the FRACTAL_SERVER variable, which is a fully qualified URL to the Fractal server installation (e.g. http://localhost:8000). This can be an environment variable or it can be stored in a an environment file .fractal.env as in

FRACTAL_SERVER=http://localhost:8010\n

"},{"location":"install/#credentials","title":"Credentials","text":"

Most fractal commands are restricted to authenticated users, and user credentials can be specified in multiple ways: * Set FRACTAL_USER and FRACTAL_PASSWORD variables as environment variables; * Add FRACTAL_USER and FRACTAL_PASSWORD variables in .fractal.env; * Explicitly provide --user and --password arguments for fractal commands, see here.

"},{"location":"install/#cache","title":"Cache","text":"

By default, fractal caches some information (namely a valid token for the current session on fractal-server and a list of tasks) in ~/.cache/fractal. This destination can be customized by setting the FRACTAL_CACHE_PATH variables.

"},{"location":"install/#full-example","title":"Full example","text":"

Here is an example of a valid .fractal.env file:

FRACTAL_USER=user@something.com\nFRACTAL_PASSWORD=myuser\nFRACTAL_SERVER=http://localhost:8010\nFRACTAL_CACHE_PATH=/some/path/fractal-cache\n

"},{"location":"versions/","title":"Version Compatibility","text":"

During the current development phase, the latest stable releases of fractal-server and fractal-client are always considered as compatible.

The following table shows some additional compatibility constraints for each fractal-client version, which may be useful for working with a fractal-server instance which is not fully up-to-date.

WARNING: This table only shows the fractal-server-version lower bounds for each fractal-client version, but not the corresponding upper bounds.

fractal-client fractal-server 2.0.0 >=2.0.0 1.4.3 >=1.4.2 1.4.2 >=1.4.2 1.4.1 >=1.4.0 1.4.0 >=1.4.0"},{"location":"reference/SUMMARY/","title":"SUMMARY","text":"
  • fractal
    • project
    • dataset
    • task
    • workflow
    • job
    • version
    • user
    • group
"},{"location":"reference/fractal/","title":"fractal","text":"

Command-line interface for Fractal Client.

fractal [-h] [-u USER] [-p PASSWORD] [--debug] [--batch]\n        {project,dataset,task,workflow,job,version,user,group} ...\n
"},{"location":"reference/fractal/#named-arguments","title":"Named Arguments","text":"
  • -u,--user: User email address for login (overrides configuration file).

  • -p,--password: User password (overrides configuration file).

  • --debug: Change minimal logging level from INFO to DEBUG. Default: False.

  • --batch: Return output suitable for scripting, e.g., only the ID of items created instead of the full object. Default: False.

"},{"location":"reference/fractal/dataset/","title":"dataset","text":"

Dataset commands.

fractal dataset [-h] {edit,show,delete} ...\n
"},{"location":"reference/fractal/dataset/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/dataset/#dataset-edit","title":"dataset edit","text":"

Edit dataset.

fractal dataset edit [-h] [--new-name NEW_NAME] [--filters FILTERS]  project_id\n        dataset_id\n
"},{"location":"reference/fractal/dataset/#positional-arguments","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • dataset_id: Dataset ID.

"},{"location":"reference/fractal/dataset/#named-arguments","title":"Named Arguments","text":"
  • --new-name: New name of dataset.

  • --filters: Path to JSON file with new metadata to replace the current ones.

"},{"location":"reference/fractal/dataset/#dataset-show","title":"dataset show","text":"

Show dataset.

fractal dataset show [-h] project_id dataset_id\n
"},{"location":"reference/fractal/dataset/#positional-arguments_1","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • dataset_id: Dataset ID.

"},{"location":"reference/fractal/dataset/#dataset-delete","title":"dataset delete","text":"

Delete dataset.

fractal dataset delete [-h] project_id dataset_id\n
"},{"location":"reference/fractal/dataset/#positional-arguments_2","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • dataset_id: Dataset ID.

"},{"location":"reference/fractal/group/","title":"group","text":"

UserGroup commands.

fractal group [-h] {list,get,new,update,add-user,remove-user} ...\n
"},{"location":"reference/fractal/group/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/group/#group-list","title":"group list","text":"

Get all groups.

fractal group list [-h] [--user-ids]\n
"},{"location":"reference/fractal/group/#named-arguments","title":"Named Arguments","text":"
  • --user-ids: Also return the user_ids lists together with the groups Default: False.
"},{"location":"reference/fractal/group/#group-get","title":"group get","text":"

Get single group.

fractal group get [-h] group_id\n
"},{"location":"reference/fractal/group/#positional-arguments","title":"Positional Arguments","text":"
  • group_id: ID of the group to get.
"},{"location":"reference/fractal/group/#group-new","title":"group new","text":"

Create new group.

fractal group new [-h]  [--viewer-paths VIEWER_PATHS [VIEWER_PATHS ...]]  name\n
"},{"location":"reference/fractal/group/#positional-arguments_1","title":"Positional Arguments","text":"
  • name: Name of the new group.
"},{"location":"reference/fractal/group/#named-arguments_1","title":"Named Arguments","text":"
  • --viewer-paths: (\"List of group's viewer_paths (e.g --viewer-paths /something /else)\",)
"},{"location":"reference/fractal/group/#group-update","title":"group update","text":"

Update single group.

fractal group update [-h] --new-viewer-paths NEW_VIEWER_PATHS  [NEW_VIEWER_PATHS\n        ...]  group_id\n
"},{"location":"reference/fractal/group/#positional-arguments_2","title":"Positional Arguments","text":"
  • group_id: ID of the group to update.
"},{"location":"reference/fractal/group/#named-arguments_2","title":"Named Arguments","text":"
  • --new-viewer-paths: New list of group viewer_paths (e.g --new-viewer-paths /something /else); note that this replaces the existing one.
"},{"location":"reference/fractal/group/#group-add-user","title":"group add-user","text":"

Add a single user to group.

fractal group add-user [-h] group_id user_id\n
"},{"location":"reference/fractal/group/#positional-arguments_3","title":"Positional Arguments","text":"
  • group_id: ID of the group to which to add the user.

  • user_id: ID of the user to add.

"},{"location":"reference/fractal/group/#group-remove-user","title":"group remove-user","text":"

Remove a single user from group.

fractal group remove-user [-h] group_id user_id\n
"},{"location":"reference/fractal/group/#positional-arguments_4","title":"Positional Arguments","text":"
  • group_id: ID of the group to which to remove the user.

  • user_id: ID of the user to remove.

"},{"location":"reference/fractal/job/","title":"job","text":"

Job commands.

fractal job [-h] {list,show,download-logs,stop,submit} ...\n
"},{"location":"reference/fractal/job/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/job/#job-list","title":"job list","text":"

List jobs for given project.

fractal job list [-h] project_id\n
"},{"location":"reference/fractal/job/#positional-arguments","title":"Positional Arguments","text":"
  • project_id: Project ID.
"},{"location":"reference/fractal/job/#job-show","title":"job show","text":"

Query status of workflow-execution job.

fractal job show [-h] project_id job_id\n
"},{"location":"reference/fractal/job/#positional-arguments_1","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • job_id: Job ID.

"},{"location":"reference/fractal/job/#job-download-logs","title":"job download-logs","text":"

Download full folder of workflow-execution job.

fractal job download-logs [-h] --output OUTPUT_FOLDER  project_id job_id\n
"},{"location":"reference/fractal/job/#positional-arguments_2","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • job_id: Job ID.

"},{"location":"reference/fractal/job/#named-arguments","title":"Named Arguments","text":"
  • --output: Path of the output folder.
"},{"location":"reference/fractal/job/#job-stop","title":"job stop","text":"

Stop workflow-execution job.

fractal job stop [-h] project_id job_id\n
"},{"location":"reference/fractal/job/#positional-arguments_3","title":"Positional Arguments","text":"
  • project_id: Project ID.

  • job_id: Job ID.

"},{"location":"reference/fractal/job/#job-submit","title":"job submit","text":"

Submit a job.

fractal job submit [-h] [--start FIRST_TASK_INDEX]  [--end LAST_TASK_INDEX] [-w\n        WORKER_INIT]  project_id workflow_id dataset_id\n
"},{"location":"reference/fractal/job/#positional-arguments_4","title":"Positional Arguments","text":"
  • project_id:

  • workflow_id:

  • dataset_id:

"},{"location":"reference/fractal/job/#named-arguments_1","title":"Named Arguments","text":"
  • --start: Positional index of the first task to be executed (starting from 0).

  • --end: Positional index of the last task to be executed (starting from 0).

  • -w,--worker-init: Command to be run before starting a worker.

"},{"location":"reference/fractal/project/","title":"project","text":"

Project commands.

fractal project [-h] {new,list,show,delete,add-dataset,edit} ...\n
"},{"location":"reference/fractal/project/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/project/#project-new","title":"project new","text":"

Create new project.

fractal project new [-h] name\n
"},{"location":"reference/fractal/project/#positional-arguments","title":"Positional Arguments","text":"
  • name: Name of new project.
"},{"location":"reference/fractal/project/#project-list","title":"project list","text":"

List projects.

fractal project list [-h]\n
"},{"location":"reference/fractal/project/#project-show","title":"project show","text":"

Show details of single project.

fractal project show [-h] project_id\n
"},{"location":"reference/fractal/project/#positional-arguments_1","title":"Positional Arguments","text":"
  • project_id: ID of project to show.
"},{"location":"reference/fractal/project/#project-delete","title":"project delete","text":"

Delete project.

fractal project delete [-h] project_id\n
"},{"location":"reference/fractal/project/#positional-arguments_2","title":"Positional Arguments","text":"
  • project_id: ID of project to delete.
"},{"location":"reference/fractal/project/#project-add-dataset","title":"project add-dataset","text":"

Add dataset to project.

fractal project add-dataset [-h] [--zarr-dir ZARR_DIR]  [--filters FILTERS]\n        project_id dataset_name\n
"},{"location":"reference/fractal/project/#positional-arguments_3","title":"Positional Arguments","text":"
  • project_id: ID of project to add the new dataset to.

  • dataset_name: Name of new dataset.

"},{"location":"reference/fractal/project/#named-arguments","title":"Named Arguments","text":"
  • --zarr-dir: Path to zarr dir.

  • --filters: Path to JSON file with filters.

"},{"location":"reference/fractal/project/#project-edit","title":"project edit","text":"

Edit details of a single project.

fractal project edit [-h] [--new-name NEW_NAME] project_id\n
"},{"location":"reference/fractal/project/#positional-arguments_4","title":"Positional Arguments","text":"
  • project_id: ID of the project to edit.
"},{"location":"reference/fractal/project/#named-arguments_1","title":"Named Arguments","text":"
  • --new-name: New project name.
"},{"location":"reference/fractal/task/","title":"task","text":"

Task commands.

fractal task [-h]  {list,collect,collect-custom,check-collection,new,edit}  ...\n
"},{"location":"reference/fractal/task/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/task/#task-list","title":"task list","text":"

List tasks.

fractal task list [-h]\n
"},{"location":"reference/fractal/task/#task-collect","title":"task collect","text":"

Install and collect all tasks from a pip-installable package.

fractal task collect [-h] [--python-version PYTHON_VERSION]  [--package-version\n        PACKAGE_VERSION]  [--package-extras PACKAGE_EXTRAS]\n        [--pinned-dependency PINNED_DEPENDENCY]  [--private]  package\n
"},{"location":"reference/fractal/task/#positional-arguments","title":"Positional Arguments","text":"
  • package: Package name or absolute path to local package.
"},{"location":"reference/fractal/task/#named-arguments","title":"Named Arguments","text":"
  • --python-version: Select the python version to use for this package.

  • --package-version: Select the package version.

  • --package-extras: Comma separated list of extra components for the package to be installed, e.g., collect fractal-tasks-core --package-extras=torch,tensorflow will trigger the installation of fractal-tasks-core[torch,tensorflow].

  • --pinned-dependency: Package/version pair representing a pinned-version dependency, in the form collect fractal-tasks-core --pinned-dependency pydantic=1.10.0. Include --pinned-dependency multiple times to pin several packages to specific versions.

  • --private: Make task group private. Default: False.

"},{"location":"reference/fractal/task/#task-collect-custom","title":"task collect-custom","text":"

Collect all tasks from a custom Python interpreter.

fractal task collect-custom [-h] [--version VERSION]  (--package-name\n        PACKAGE_NAME | --package-root PACKAGE_ROOT)  [--private]  label\n        python_interpreter manifest\n
"},{"location":"reference/fractal/task/#positional-arguments_1","title":"Positional Arguments","text":"
  • label: A common label identifying this package.

  • python_interpreter: Absolute path to the Python interpreter to be used for running tasks.

  • manifest: Local path of the Manifest of the Fractal task package.

"},{"location":"reference/fractal/task/#named-arguments_1","title":"Named Arguments","text":"
  • --version: Version of tasks to be collected.

  • --package-name: Name of the package, as used in 'import '; this is then used to extract the package directory (package_root) via 'importlib.util.find_spec '.

  • --package-root: The folder where the package is installed. If not provided, it will be automatically inferred based on 'package_name'.

  • --private: Make task group private. Default: False.

  • "},{"location":"reference/fractal/task/#task-check-collection","title":"task check-collection","text":"

    Check status of background task collection processes.

    fractal task check-collection [-h] [--include-logs]  task_group_activity_id\n
    "},{"location":"reference/fractal/task/#positional-arguments_2","title":"Positional Arguments","text":"
    • task_group_activity_id: Activity ID of the collection (see output of task collect).
    "},{"location":"reference/fractal/task/#named-arguments_2","title":"Named Arguments","text":"
    • --include-logs: Also include task-collection logs. Default: False.
    "},{"location":"reference/fractal/task/#task-new","title":"task new","text":"

    Create new task.

    fractal task new [-h] [--command-non-parallel COMMAND_NON_PARALLEL]\n        [--command-parallel COMMAND_PARALLEL]  [--version VERSION]\n        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]\n        [--args-schema-non-parallel ARGS_SCHEMA_NON_PARALLEL]\n        [--args-schema-parallel ARGS_SCHEMA_PARALLEL]  [--args-schema-version\n        ARGS_SCHEMA_VERSION]  [--private]  name\n
    "},{"location":"reference/fractal/task/#positional-arguments_3","title":"Positional Arguments","text":"
    • name: A human readable name for the task.
    "},{"location":"reference/fractal/task/#named-arguments_3","title":"Named Arguments","text":"
    • --command-non-parallel: The non parallel command that executes the task.

    • --command-parallel: The parallel command that executes the task.

    • --version: Task version.

    • --meta-non-parallel: Path to JSON file with meta non parallel arguments.

    • --meta-parallel: Path to JSON file with meta parallel arguments.

    • --args-schema-non-parallel: Path to JSON file with args non parallel arguments.

    • --args-schema-parallel: Path to JSON file with arg parallel arguments.

    • --args-schema-version: Label encoding how the task-arguments JSON Schema was generated (e.g. pydantic_v1).

    • --private: Make task group private. Default: False.

    "},{"location":"reference/fractal/task/#task-edit","title":"task edit","text":"

    Edit task.

    fractal task edit [-h] (--id ID | --name NAME) [--version VERSION]\n        [--new-version NEW_VERSION]  [--command-non-parallel\n        COMMAND_NON_PARALLEL]  [--command-parallel COMMAND_PARALLEL]\n        [--input-types INPUT_TYPES]  [--output-types OUTPUT_TYPES]\n
    "},{"location":"reference/fractal/task/#named-arguments_4","title":"Named Arguments","text":"
    • --id: ID of the task to edit.

    • --name: Name of the task to edit.

    • --version: Version of the task to edit (only accepted in combination with --name).

    • --new-version: New task version.

    • --command-non-parallel: New task non parallel command.

    • --command-parallel: New task parallel command.

    • --input-types: Path to JSON file with new input types.

    • --output-types: Path to JSON file with new output types.

    "},{"location":"reference/fractal/user/","title":"user","text":"

    User commands.

    fractal user [-h] {whoami,register,list,show,edit,set-groups} ...\n
    "},{"location":"reference/fractal/user/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/user/#user-whoami","title":"user whoami","text":"

    Get info on current user (fails if user is not registered).

    fractal user whoami [-h] [--viewer-paths]\n
    "},{"location":"reference/fractal/user/#named-arguments","title":"Named Arguments","text":"
    • --viewer-paths: Include user's viewer_paths attribute. Default: False.
    "},{"location":"reference/fractal/user/#user-register","title":"user register","text":"

    Register a new user with the Fractal server and edit their settings (note: user creation and settings editing are two independent steps).

    fractal user register [-h] [--project-dir PROJECT_DIR]  [--slurm-user\n        SLURM_USER] [--username USERNAME]  [--ssh-settings-json\n        SSH_SETTINGS_JSON]  [--superuser]  new_email new_password\n
    "},{"location":"reference/fractal/user/#positional-arguments","title":"Positional Arguments","text":"
    • new_email: Email to be used as username.

    • new_password: Password for the new user.

    "},{"location":"reference/fractal/user/#named-arguments_1","title":"Named Arguments","text":"
    • --project-dir: User-writeable base folder, used e.g. for default zarr_dir paths.

    • --slurm-user: Username to login into SLURM cluster.

    • --username: Username associated to the user.

    • --ssh-settings-json: Path to JSON file with (a subset of) following settings: ssh_host, ssh_username, ssh_private_key_path, ssh_tasks_dir, ssh_jobs_dir.

    • --superuser: Give superuser privileges to the new user. Default: False.

    "},{"location":"reference/fractal/user/#user-list","title":"user list","text":"

    List all users.

    fractal user list [-h]\n
    "},{"location":"reference/fractal/user/#user-show","title":"user show","text":"

    Show details of single user.

    fractal user show [-h] user_id\n
    "},{"location":"reference/fractal/user/#positional-arguments_1","title":"Positional Arguments","text":"
    • user_id: ID of the user.
    "},{"location":"reference/fractal/user/#user-edit","title":"user edit","text":"

    Edit an existin user and/or their settings (note: user and settings editing are two independent steps).

    fractal user edit [-h] [--new-email NEW_EMAIL]  [--new-password NEW_PASSWORD]\n        [--new-username NEW_USERNAME]  [--new-project-dir NEW_PROJECT_DIR]\n        [--new-slurm-user NEW_SLURM_USER]  [--new-ssh-settings-json\n        NEW_SSH_SETTINGS_JSON]  [--make-superuser | --remove-superuser]\n        [--make-verified | --remove-verified]  user_id\n
    "},{"location":"reference/fractal/user/#positional-arguments_2","title":"Positional Arguments","text":"
    • user_id: ID of the user.
    "},{"location":"reference/fractal/user/#named-arguments_2","title":"Named Arguments","text":"
    • --new-email: New email address.

    • --new-password: New password.

    • --new-username: New user username.

    • --new-project-dir: New value of project_dir.

    • --new-slurm-user: New SLURM username.

    • --new-ssh-settings-json: Path to JSON file with (a subset of) following settings: ssh_host, ssh_username, ssh_private_key_path, ssh_tasks_dir, ssh_jobs_dir.

    • --make-superuser: Give superuser privileges to user. Default: False.

    • --remove-superuser: Remove superuser privileges from user. Default: False.

    • --make-verified: Make user verified. Default: False.

    • --remove-verified: Make user unverified. Default: False.

    "},{"location":"reference/fractal/user/#user-set-groups","title":"user set-groups","text":"

    Reset user-group membership for an existing user.

    fractal user set-groups [-h] user_id group_ids [group_ids ...]\n
    "},{"location":"reference/fractal/user/#positional-arguments_3","title":"Positional Arguments","text":"
    • user_id: ID of the user.

    • group_ids: List of the IDs of groups we want the user to be member. WARNING: this list replaces the current group memberships.

    "},{"location":"reference/fractal/version/","title":"version","text":"

    Print version and exit.

    fractal version [-h]\n
    "},{"location":"reference/fractal/workflow/","title":"workflow","text":"

    Workflow commands.

    fractal workflow [-h]\n        {list,new,show,edit,delete,add-task,edit-task,rm-task,import,export}\n        ...\n
    "},{"location":"reference/fractal/workflow/#sub-commands","title":"Sub-commands","text":""},{"location":"reference/fractal/workflow/#workflow-list","title":"workflow list","text":"

    List workflows for given project.

    fractal workflow list [-h] project_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments","title":"Positional Arguments","text":"
    • project_id: Project ID.
    "},{"location":"reference/fractal/workflow/#workflow-new","title":"workflow new","text":"

    Create new workflow.

    fractal workflow new [-h] name project_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_1","title":"Positional Arguments","text":"
    • name: Workflow name (must be unique, and not only made of numbers only).

    • project_id: Project ID.

    "},{"location":"reference/fractal/workflow/#workflow-show","title":"workflow show","text":"

    Show workflow.

    fractal workflow show [-h] project_id workflow_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_2","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    "},{"location":"reference/fractal/workflow/#workflow-edit","title":"workflow edit","text":"

    Edit workflow.

    fractal workflow edit [-h] --new-name NEW_NAME project_id workflow_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_3","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    "},{"location":"reference/fractal/workflow/#named-arguments","title":"Named Arguments","text":"
    • --new-name: New workflow name.
    "},{"location":"reference/fractal/workflow/#workflow-delete","title":"workflow delete","text":"

    Delete workflow.

    fractal workflow delete [-h] project_id workflow_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_4","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    "},{"location":"reference/fractal/workflow/#workflow-add-task","title":"workflow add-task","text":"

    Add new task to specific workflow.

    fractal workflow add-task [-h]  (--task-id TASK_ID | --task-name TASK_NAME)\n        [--task-version TASK_VERSION]  [--order ORDER]  [--args-non-parallel\n        ARGS_NON_PARALLEL]  [--args-parallel ARGS_PARALLEL]\n        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]\n        [--input-filters INPUT_FILTERS]  project_id workflow_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_5","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    "},{"location":"reference/fractal/workflow/#named-arguments_1","title":"Named Arguments","text":"
    • --task-id: ID of the task to add.

    • --task-name: Name of the task to add.

    • --task-version: Version of task to add (only accepted in combination with --task-name).

    • --order: Order of this task within the workflow's task list.

    • --args-non-parallel: Args for non parallel tasks

    • --args-parallel: Args for parallel tasks

    • --meta-non-parallel: Metadata file fornon parallel tasks

    • --meta-parallel: Metadata file for parallel tasks

    • --input-filters: Path to json file with filters.

    "},{"location":"reference/fractal/workflow/#workflow-edit-task","title":"workflow edit-task","text":"

    Edit task within specific workflow.

    fractal workflow edit-task [-h] [--input-filters INPUT_FILTERS]\n        [--args-non-parallel ARGS_NON_PARALLEL]  [--args-parallel ARGS_PARALLEL]\n        [--meta-non-parallel META_NON_PARALLEL]  [--meta-parallel META_PARALLEL]\n        project_id workflow_id workflow_task_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_6","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    • workflow_task_id: Workflow task ID, the ID of a task inside the list of tasks.

    "},{"location":"reference/fractal/workflow/#named-arguments_2","title":"Named Arguments","text":"
    • --input-filters: Path to json serialised file containing the arguments overrides of the task.

    • --args-non-parallel: Args for non parallel tasks

    • --args-parallel: Args for parallel tasks

    • --meta-non-parallel: Metadata file fornon parallel tasks

    • --meta-parallel: Metadata file for parallel tasks

    "},{"location":"reference/fractal/workflow/#workflow-rm-task","title":"workflow rm-task","text":"

    Remove task from a specific workflow.

    fractal workflow rm-task [-h] project_id workflow_id workflow_task_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_7","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    • workflow_task_id: Workflow task ID (the ID of a task inside the list of tasks).

    "},{"location":"reference/fractal/workflow/#workflow-import","title":"workflow import","text":"

    Import workflow to project from file.

    fractal workflow import [-h] --project-id PROJECT_ID --json-file  JSON_FILE\n        [--workflow-name WORKFLOW_NAME]\n
    "},{"location":"reference/fractal/workflow/#named-arguments_3","title":"Named Arguments","text":"
    • --project-id: ID of the project where the workflow will be imported.

    • --json-file: Path to a JSON file with the workflow to be imported.

    • --workflow-name: Name of the new workflow (if set, overrides the one in JSON file)

    "},{"location":"reference/fractal/workflow/#workflow-export","title":"workflow export","text":"

    Export workflow to file.

    fractal workflow export [-h] --json-file JSON_FILE  project_id workflow_id\n
    "},{"location":"reference/fractal/workflow/#positional-arguments_8","title":"Positional Arguments","text":"
    • project_id: Project ID.

    • workflow_id: Workflow ID.

    "},{"location":"reference/fractal/workflow/#named-arguments_4","title":"Named Arguments","text":"
    • --json-file: Path to the JSON file where the workflow will be exported.
    "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..0f8724efd --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 000000000..4dd65023d Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/versions/index.html b/versions/index.html new file mode 100644 index 000000000..1415fcea0 --- /dev/null +++ b/versions/index.html @@ -0,0 +1,606 @@ + + + + + + + + + + + + + + + + + + + + + + Version compatibility - Fractal Client + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    Version Compatibility

    +

    During the current development phase, the latest stable releases of +fractal-server and fractal-client are always considered as compatible.

    +

    The following table shows some additional compatibility constraints for each +fractal-client version, which may be useful for working with a +fractal-server instance which is not fully up-to-date.

    +
    +

    WARNING: This table only shows the fractal-server-version lower bounds +for each fractal-client version, but not the corresponding upper bounds.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    fractal-clientfractal-server
    2.0.0>=2.0.0
    1.4.3>=1.4.2
    1.4.2>=1.4.2
    1.4.1>=1.4.0
    1.4.0>=1.4.0
    + + + + + + +
    +
    + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file